Laravel基本的な流れ④ ControllerとRoutingの基本を抑えよう。

　Laravelで動きのメインを司る`Controller`、ページ遷移・動作の道筋を決める`Routing`について書いていきます。

## Step .1 Controllerを作る
まずは`Controller`という、処理をまとめて記載するファイルを作ります。ここでは例として`TweetController`を作りましょう。

```Terminal
php artisan make:controller TweetController
```

 すると、
app -> Http -> controllers に、TweetControllerが作成されます。

 このContorollerの中に、関数として様々な処理を書き、その関数の名前を自分で付けていくことによりWebページを作成していきます。ただし、例えば「CRUD処理」などは非常によく使われるため、あらかじめある程度準備の済んだControllerが用意されています。このControllerを作りたい場合は

```Terminal
php artisan make:controller TweetController --resource
```

と、最後に`--resource`をつけます。すると

①`index()`　　:　データを一覧表示
②`create()`　 : 　新規作成用のフォームを表示
③`store()`　　: 　新規作成データを保存。フォームから送信されたデータを扱う。
④`show()`　　    :　指定されたデータを個別に表示
⑤`edit()`　　 :　 作成データ編集用フォームを表示
⑥`update()`　:　 編集したデータを更新する。フォームから送信されたデータを扱う。
⑦`destroy()`　: データを削除

の７つ関数がデフォルトで生成されているControllerが作成されます。

:::note info
作成する段階で、そのController内で使いたいテーブルとそのModel（例えば`Tweet.php`)が用意されている場合は
```
php artisan make:controller TweetController --resource --model=Tweet
```
とすれば、Model：「Tweet.php」がuse（紐づいた状態）された状態で作られます。
※もちろんModelとの紐付けは、作成後でもできます。
:::


## Step.2 ルーティングを行う
 Laravelでは、ページ遷移・データ処理の道筋を「特定のアドレスへ」「特定のメソッドでアクセスする」ことによって実行します。

どのアドレスへ、どんなメソッド（GET/HEAD,POSTなど）でアクセスすると、どこを動かすのかを決めることをルーティングといいます。

:::note info
一般的なルーティングは
**routes -> web.php**
にすべて記載します。

また、認証関係のルーティングは
**routes -> auth.php**
にまとめられています。
:::

## Step.2-1 ルーティングの書き方
### ①web.phpの先頭部分に、これから追加したいcontrollerをuseで紐づける。

```php:web.php
<?php
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
// 🔽 追加
use App\Http\Controllers\TweetController;
```

### ②中段にルーティングを記載する。
　※できる限りコメントを付けてまとめ、分かりやすくすると良い。

```php:web.php
//Tweetを作成
Route::get('/tweet', 'App\Http\Controllers\TweetController@create')->name('tweet.create');
//Tweetを保存
Route::post('/tweet', 'App\Http\Controllers\TweetController@store')->name('tweet.store');
```
のように、
・メソッド（get/head,post)の指定
・アクセスするアドレス（'/tweet'はアドレスの末尾）
・移動するcontroller（ルートからすべて記載）
・controller内のどの関数を動かすか（@createなど）
の順に記載します。最後の「->name('tweet.create')」は、これを付けると、この名前を指定するだけでその関数へ飛べるショートカットのようなものです。必要なら付けましょう。

#### --resourceでControllerを作った場合--
```php:web.php
Route::resource('tweet', TweetController::class);
```

とかくだけで、必要なルーティングが自動的に作成されます。


:::note warm
具体的に書くと、以下の７つ書いたことと同じになります。使いこなすと便利ですね。
```php:web.php
Route::get('/tweet', 'App\Http\Controllers\TweetController@index')->name('tweet.index');
Route::post('/tweet', 'App\Http\Controllers\TweetController@store)->name('tweet.store');
Route::get('/tweet/create', 'App\Http\Controllers\TweetController@create')->name('tweet.create');
Route::get('/tweet/{tweet}', 'App\Http\Controllers\TweetController@show')->name('tweet.show');
Route::patch('/tweet/{tweet}', 'App\Http\Controllers\TweetController@update')->name('tweet.update');
Route::delete('/tweet/{tweet}', 'App\Http\Controllers\TweetController@destroy')->name('tweet.destroy');
Route::get('/tweet/{tweet}/edit', 'App\Http\Controllers\TweetController@edit')->name('tweet.edit');
```
:::

## Step.2-2 ルートの確認
 　制作を進めていくと、ルーティングもどんどん増えていきます。どこに、どうアクセスすれば何ができるのかを把握するのが難しくなってきますが、そういう時は適宜ルートの確認を行いながら進めます。
ターミナルで下のコマンドを叩きます。

```
php artisan route:list
```

すると
```
GET|HEAD        tweet .............................. tweet.index › TweetController@index
POST            tweet .................................................................................................. tweet.store › TweetController@store
GET|HEAD        tweet/create ......................................................................................... tweet.create › TweetController@create
GET|HEAD        tweet/{tweet} ............................................................................................ tweet.show › TweetController@show
PUT|PATCH       tweet/{tweet} ........................................................................................ tweet.update › TweetController@update
DELETE          tweet/{tweet} ...................................................................................... tweet.destroy › TweetController@destroy
GET|HEAD        tweet/{tweet}/edit ....................................................................................... tweet.edit › TweetController@edit
```

のように、現在設定されているルーティングが一覧で表示されます。
これは何度も使う重要コマンドです。

## Step.3 Controller内の関数を実装する。
### STEP.3-1　Controller内で使用するテーブルのModelをuseで紐づける。

例えば、tweetテーブルのModel、Tweetを紐付けたい場合は、Controllerの先頭部分に

```php:app/Http/Controllers/TweetController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
// 🔽 追加
use App\Models\Tweet;
```

という感じで記載する。

### STEP .3-2　各関数内に処理を書いていく

　ここの内容は様々です。参考までに以下にいくつかの例を挙げておきます。
こういった処理を組み合わせながらプロダクトを作っていきます。
#### ①ページの表示（create.blade.php を表示する。）
※resource -> view -> message -> create.blade.php　にcreate.blade.phpを置いているとき。
※下は`$request`で送られてきたidを、`$id`として送る方法。
　他に、複数のデータを連想配列として送る`compact関数`などがよく使われます。

```php:app/Http/Controllers/TweetController.php
$id = $request->input("id");
return view('message.create', ['id' => $id]);
```

 ②Usersテーブルから該当のデータ（例では、idが5のデータ）を取得して、`$user`へ格納する。
```php:app/Http/Controllers/TweetController.php
$user = User::find(5);
```

※実際には
```php:app/Http/Controllers/TweetController.php
$user = User::find($request -> send_to);
```
のように、`$request`で送られてきたsend_toの値と同じidのデータを取ってくる、というように使うことが多い。

#### ③データベースにデータを保存する。（storeに記載する。）
例として、Tweetテーブルに値を入れる処理を書いておく。カラムは
　id(自動作成）
　user_id
　tweet
　name
を持つテーブルであると仮定する。
```php:app/Http/Controllers/TweetController.php

public function store(MessageRequest $request)
{        
    $tweet = new Tweet();

    $tweet->user_id = auth()->user()->id;
    $tweet->tweet = $request->tweet;
    $tweet->name = $request->name;
    
    $tweet->save();
}
```
`$tweet`という新しいインスタンスを作成して

`$tweetのuser_id`にはログインしているユーザーのユーザーidを取ってきて入れる
`$tweetのtweet`には`$request`で送られてきた`tweet`を入れる
`$tweetのname`には`$request`で送られてきた`name`を入れる

`$tweet`をデータベースに保存する

次の記事

https://qiita.com/taisuke-m/items/e3e688615583ee3d3029