MasoniteでチョットRouting

（Python素人が、）ひっそりとMasoniteして行こう、Routing編。

[Masonite Documentation: Routing](https://docs.masoniteproject.com/the-basics/routing)

# バージョン
```bash
Python 3.10.4
Masonite version 4.14.1
```


# ファイル
```routes/web.py```がルーティングのファイル。
Laravelだと```api.php```などが他にファイルがありますが、masoniteだとroutes内は```web.py```だけ。


# Routing
Laravel7系までの書き方と似たような感じがします。
また、Laravelだとクロージャを引数として設定できると思いますが、こちらでは無理な雰囲気。

## 基本的な感じのやつ
ほぼLaravelと一緒な感じですかね。
必須パラメータは```@{name}```でいけそうです。

また、```name```等の使用も可能です。

```python
Route.get("hogehoge", "HogelcomeController@create").name("hogehoge")
Route.get("hogehoge/@id", "HogelcomeController@show")
Route.post("hogehoge", "HogelcomeController@store")
Route.put("hogehoge", "HogelcomeController@update")
Route.patch("hogehoge", "HogelcomeController@update")
Route.delete("hogehoge", "HogelcomeController@destroy")
Route.options("hogehoge", "HogelcomeController@options")
```

## match
複数HTTPメソッドを設定したい時のやつ。

```python
Route.match(["get", "post"], "hogehoge", "WelcomeController@show")
```

## resource
複数のCURDなHTTPを作ってくれる便利なやつですね。
Laravelと一緒でコントローラ名だけを指定。

```only```や```except```は無さそうな気配。

```python
Route.resource("hogehoge", "WelcomeController")
```

便利コマンド```python craft routes:list```でroutingを確認する事ができます。
※Laravelだと```php artisan route:list```かな。

```bash
+------------------------+------------------+-----------+-----------------------------------+---------------+
| URI                    | Name             | Method(s) | Controller                        | Middleware(s) |
+------------------------+------------------+-----------+-----------------------------------+---------------+
| /_exceptionite/actions |                  | POST      | ExceptioniteController@run_action |               |
| /hogehoge              | hogehoge.index   | GET/HEAD  | WelcomeController@index           | web           |
| /hogehoge              | hogehoge.store   | POST      | WelcomeController@store           | web           |
| /hogehoge/@id          | hogehoge.destroy | DELETE    | WelcomeController@destroy         | web           |
| /hogehoge/@id          | hogehoge.show    | GET/HEAD  | WelcomeController@show            | web           |
| /hogehoge/@id          | hogehoge.update  | PUT/PATCH | WelcomeController@update          | web           |
| /hogehoge/@id/edit     | hogehoge.edit    | GET/HEAD  | WelcomeController@edit            | web           |
| /hogehoge/create       | hogehoge.create  | GET/HEAD  | WelcomeController@create          | web           |
+------------------------+------------------+-----------+-----------------------------------+---------------+
```

## グループ化
グループもいけそうです。

グループで```name```を使用する場合、グループ内全てのURIに```name```を付けないとダメでした。
Laravelだとよろしくやってくれたような気がします。

他にも```middleware```と```domain```の設定ができるようです。

```python
Route.group(
    Route.get("/url/1", "WelcomeController@show").name("aaa"),
    Route.post("/url/2", "WelcomeController@show").name("bbb"),
    Route.group(
        Route.get("/url/3", "WelcomeController@show").name("ccc"),
        Route.post("/url/4", "WelcomeController@show").name("ddd"),
        prefix="fuga",
        name="fugafuga.",
    ),
    prefix="hoge",
    name="hogehoge.",
)
```
```bash
+------------------------+-----------------------+-----------+-----------------------------------+---------------+
| URI                    | Name                  | Method(s) | Controller                        | Middleware(s) |
+------------------------+-----------------------+-----------+-----------------------------------+---------------+
| /_exceptionite/actions |                       | POST      | ExceptioniteController@run_action |               |
| /hoge/fuga/url/3       | hogehoge.fugafuga.ccc | GET/HEAD  | WelcomeController@show            | web           |
| /hoge/fuga/url/4       | hogehoge.fugafuga.ddd | POST      | WelcomeController@show            | web           |
| /hoge/url/1            | hogehoge.aaa          | GET/HEAD  | WelcomeController@show            | web           |
| /hoge/url/2            | hogehoge.bbb          | POST      | WelcomeController@show            | web           |
+------------------------+-----------------------+-----------+-----------------------------------+---------------+
```

# 注意
URIの先頭に```/```は付けない方が良さそうです。
```get```や```post```などは問題ないのですが、```match```、```resource```などの特殊系は```/```が余計に追加されてしまいます。

```python
Route.get("aaa", "WelcomeController@show"),
Route.post("/bbb", "WelcomeController@show"),
Route.resource("/store", "WelcomeController"),
```

```bash
+------------------------+----------------+-----------+-----------------------------------+---------------+
| URI                    | Name           | Method(s) | Controller                        | Middleware(s) |
+------------------------+----------------+-----------+-----------------------------------+---------------+
| //store                | /store.index   | GET/HEAD  | WelcomeController@index           | web           |
| //store                | /store.store   | POST      | WelcomeController@store           | web           |
| //store/@id            | /store.destroy | DELETE    | WelcomeController@destroy         | web           |
| //store/@id            | /store.show    | GET/HEAD  | WelcomeController@show            | web           |
| //store/@id            | /store.update  | PUT/PATCH | WelcomeController@update          | web           |
| //store/@id/edit       | /store.edit    | GET/HEAD  | WelcomeController@edit            | web           |
| //store/create         | /store.create  | GET/HEAD  | WelcomeController@create          | web           |
| /_exceptionite/actions |                | POST      | ExceptioniteController@run_action |               |
| /aaa                   |                | GET/HEAD  | WelcomeController@show            | web           |
| /bbb                   |                | POST      | WelcomeController@show            | web           |
+------------------------+----------------+-----------+-----------------------------------+---------------+
```

# 終わりに
やはり色々とLaravelでした。
他にも色々とあるかと思いますが、使用する機会や学習が進んだ時に更新できたらなと。

※さて続くのか。