本記事では、Laravelのコントローラーについて書いています。
フロントの画面からフォームでデータが送信されたときに
LaravelではコントローラーでPOSTやGETのリクエストを受け取って、データの保存やリストの取得など、なんらかの処理をします。
Laravelのコントローラーとは?
LaravelではHTTPリクエストがあった場合に、routes/web.php
やroutes/api.php
のルーティング確認して、リクエストが何処に振り分けられるか決まります。
web.php
には画面のフォームからのリクエストを処理するルーティングを書きます。
api.php
にはSPAなど、ajax通信で通信する場合のルーティングを書きます。
このルーティングファイルにコントローラーとメソッドを指定します。
POSTリクエストやGETリクエストでリクエストがあった場合に、指定されたコントローラーで処理されるといった感じです。
例えば、web.php
に下記のように記載されていた場合はTestController
のtest
メソッドで処理するということになります。
Route::get('/test', 'TestController@test');
Laravelのバージョン8では書き方が少し変わって、こうなっています。
Route::get('/test', [TestController::class, 'test']);
コントローラーを作る
下記のコマンドでコントローラーが作成できます。
php artisan make:controller TestController
このコマンドでコントローラーを作ると、コントローラーファイルの中身は最初は下記のようになります。
app/Http/Controllers
配下にファイルができます。
app/Http/Controllers/TestController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
//
}
Controllerクラスを継承した何も書いてないクラスが作成されます。
この中に処理をかいて、web.php
にルーティングを書いてあげれば動きます。
リクエストを受ける
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function save(Request $request) {
// $requestで受けた値を元に、何かの処理をする。
}
}
こんな感じでメソッドを書いて、Requestクラスで引数を書きます。
このように書くことで、$request
にフォームで送信した値が取得できます。
Requestクラスを使うためnamespaceの下に’use Illuminate\Http\Request;’ を追加しています。
あとは$request->user_name
や$request->password
のようにフォームのname
属性で指定した名前で値が取得できます。
取得した値を元に保存したり処理を書くことになります。
POSTリクエスト、GETリクエストどちらでもフォームのname
属性に指定した名前で値が取れます。
コントローラーについて、基本的にはこんな感じです。
リソースコントローラーについて
リソースコントローラーを作成すると、CRUDのルートを簡単に作ってくれます。
Route
クラスのresource
メソッドでルーティングファイル(web.php
or api.php
)に書くと
コントローラーがREST APIで使うような形でアクセスできるようになります。
リソースコントローラーを作成する
下記のように、プロジェクト配下でartisan
コマンドを実行します。
通常コントローラーを作成するコマンドに、--resource
を付けた形になります。
php artisan make:controller TodoController --resource
作成されたコントローラーは、このような形になります。
通常はコントローラーを作成すると、メソッドは作成されませんが--resource
をつけることで、メソッドまで作成してくれます。
通常のコントローラーを作成した後に、下記のメソッドを用意してもリソースコントローラーとして使うことができます。
--resource
オプションはメソッドを追加してくれてるという感じですね。
class TodoController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
//
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}
リソースコントローラーのルーティングを定義する
ルーティングファイル(web.php
or api.php
)に、下記のように定義することで使えるようになります。
resource
メソッドが使われていますね。
Route::resource('todo', 'TodoController');
プロジェクト配下で、artisan
コマンドを下記のように実行するとルーティングが確認できます。
php artisan route:list
結果は下記のようになります。
それぞれのルーティングが1行で追加されました。
Method | URI | Name | Action |
---|---|---|---|
GET | HEAD | todo | todo.index | TodoController@index |
POST | todo | todo.store | TodoController@store |
GET | HEAD | todo/create | todo.create | TodoController@create |
GET | HEAD | todo/{todo} | todo.show | TodoController@show |
PUT | PATCH | todo/{todo} | todo.update | TodoController@update |
DELETE | todo/{todo} | todo.destroy | TodoController@destroy |
GET | HEAD | todo/{todo}/edit | todo.edit | TodoController@edit |
終わりに
ここで、書いたことをまとめると…
・LaravelのコントローラーはGETやPOSTなどのHTTPリクエストを受け取って処理をする
・リクエストはRequestクラスを指定した引数で取得できる
・リクエストの値は、フォームの`name`属性で取得できる(`$request->user_name`のようにする)
・リソースコントローラーを使うと、REST APIのようにリソース指向なルートが簡単に作れる
以上になります。
こちらに掲示板のサンプルを書いているので参考にしてみてください。
コメント