【入門】LaravelのControllerについて

Laravel

本記事では、Laravelのコントローラーについて書いています。

フロントの画面からフォームでデータが送信されたときに
LaravelではコントローラーでPOSTやGETのリクエストを受け取って、データの保存やリストの取得など、なんらかの処理をします。

Laravelのコントローラーとは?

LaravelではHTTPリクエストがあった場合に、routes/web.phproutes/api.phpのルーティング確認して、リクエストが何処に振り分けられるか決まります。
web.phpには画面のフォームからのリクエストを処理するルーティングを書きます。
api.phpにはSPAなど、ajax通信で通信する場合のルーティングを書きます。

このルーティングファイルにコントローラーとメソッドを指定します。
POSTリクエストやGETリクエストでリクエストがあった場合に、指定されたコントローラーで処理されるといった感じです。

例えば、web.phpに下記のように記載されていた場合はTestControllertestメソッドで処理するということになります。

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行で追加されました。

MethodURINameAction
GETHEADtodotodo.index | TodoController@index
POSTtodotodo.storeTodoController@store
GETHEADtodo/createtodo.create | TodoController@create
GETHEADtodo/{todo}todo.show | TodoController@show
PUTPATCHtodo/{todo}todo.update | TodoController@update
DELETEtodo/{todo}todo.destroyTodoController@destroy
GETHEADtodo/{todo}/edittodo.edit | TodoController@edit

終わりに

ここで、書いたことをまとめると…

・web.phpまたはapi.phpのルーティングファイルにコントローラーは記載する
・LaravelのコントローラーはGETやPOSTなどのHTTPリクエストを受け取って処理をする
・リクエストはRequestクラスを指定した引数で取得できる
・リクエストの値は、フォームの`name`属性で取得できる(`$request->user_name`のようにする)
・リソースコントローラーを使うと、REST APIのようにリソース指向なルートが簡単に作れる

以上になります。

こちらに掲示板のサンプルを書いているので参考にしてみてください。

コメント

タイトルとURLをコピーしました