Laravelで動きのメインを司るController
、ページ遷移・動作の道筋を決めるRouting
について書いていきます。
Step .1 Controllerを作る
まずはController
という、処理をまとめて記載するファイルを作ります。ここでは例としてTweetController
を作りましょう。
php artisan make:controller TweetController
すると、
app -> Http -> controllers に、TweetControllerが作成されます。
このContorollerの中に、関数として様々な処理を書き、その関数の名前を自分で付けていくことによりWebページを作成していきます。ただし、例えば「CRUD処理」などは非常によく使われるため、あらかじめある程度準備の済んだControllerが用意されています。このControllerを作りたい場合は
php artisan make:controller TweetController --resource
と、最後に--resource
をつけます。すると
①index()
: データを一覧表示
②create()
: 新規作成用のフォームを表示
③store()
: 新規作成データを保存。フォームから送信されたデータを扱う。
④show()
: 指定されたデータを個別に表示
⑤edit()
: 作成データ編集用フォームを表示
⑥update()
: 編集したデータを更新する。フォームから送信されたデータを扱う。
⑦destroy()
: データを削除
の7つ関数がデフォルトで生成されているControllerが作成されます。
作成する段階で、そのController内で使いたいテーブルとそのModel(例えばTweet.php
)が用意されている場合は
php artisan make:controller TweetController --resource --model=Tweet
とすれば、Model:「Tweet.php」がuse(紐づいた状態)された状態で作られます。
※もちろんModelとの紐付けは、作成後でもできます。
Step.2 ルーティングを行う
Laravelでは、ページ遷移・データ処理の道筋を「特定のアドレスへ」「特定のメソッドでアクセスする」ことによって実行します。
どのアドレスへ、どんなメソッド(GET/HEAD,POSTなど)でアクセスすると、どこを動かすのかを決めることをルーティングといいます。
一般的なルーティングは
routes -> web.php
にすべて記載します。
また、認証関係のルーティングは
routes -> auth.php
にまとめられています。
Step.2-1 ルーティングの書き方
①web.phpの先頭部分に、これから追加したいcontrollerをuseで紐づける。
<?php
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
// 🔽 追加
use App\Http\Controllers\TweetController;
②中段にルーティングを記載する。
※できる限りコメントを付けてまとめ、分かりやすくすると良い。
//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を作った場合--
Route::resource('tweet', TweetController::class);
とかくだけで、必要なルーティングが自動的に作成されます。
具体的に書くと、以下の7つ書いたことと同じになります。使いこなすと便利ですね。
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
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関数
などがよく使われます。
$id = $request->input("id");
return view('message.create', ['id' => $id]);
②Usersテーブルから該当のデータ(例では、idが5のデータ)を取得して、$user
へ格納する。
$user = User::find(5);
※実際には
$user = User::find($request -> send_to);
のように、$request
で送られてきたsend_toの値と同じidのデータを取ってくる、というように使うことが多い。
③データベースにデータを保存する。(storeに記載する。)
例として、Tweetテーブルに値を入れる処理を書いておく。カラムは
id(自動作成)
user_id
tweet
name
を持つテーブルであると仮定する。
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
をデータベースに保存する
次の記事