アクション(Action)

Actionとは

ルーティングに対応した Controllerのメソッドを、Action(アクション) といいます。アクション名はなるべくルーティングの名称にあわせると管理しやすくなります。

ルーティングの問題点と改善

プログラムの肥大化

ルーティングはシステム規模が大きくなると、多数設定しなければいけません。その分コーディングが多くなり、プログラム肥大化の原因になります。

Route::get(URL, function (Request $request) {
    //処理...
    return view(Bladeのパス);
});

Route::get(URL, function (Request $request) {
    //処理...
    return view(Bladeのパス);
});


Route::get(URL, function (Request $request) {
    //処理...
    return view(Bladeのパス);
});
...

ルーティングをシンプルにする

Routeのリクエストメソッドの第2引数は、Closures(コールバック)で処理してますが、Controllerメソッドで指定すると、Routingがシンプルになります。

Route::get(URL, コントローラメソッド);
Route::get(URL, コントローラメソッド);
Route::get(URL, コントローラメソッド);
...

Controllerファイル

make:controller

make:controller で「app/Http/Controllers/」にControllerファイルを自動作成します。

ターミナル
php artisan make:controller コントローラ名

サブフォルダの指定

サブフォルダの中にControllerを作成するときは、/ でフォルダを指定します。

ターミナル
php artisan make:controller フォルダ名/コントローラ名

コントローラの作成

HomeControllerの作成

HomeControllerを作成します。

ターミナル
php artisan make:controller HomeController

コントローラファイルの確認

app/Http/Controllers/HomeController.php が作成されました。

アクションとビューの追加

作成されたコントローラに、最低限のコードが記載されています。クラスの中に、必要に応じてActionメソッドを追加していきます。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class HomeController extends Controller
{
    //
}

about() 追加

HomeControllerクラスにaboutアクションを追加し、about ビューを表示します。

HomeController.php
class HomeController extends Controller
{
    // abount アクション
    public function about()
    {
        // about ビュー表示
        return view('about');
    }

}

ルーティング

ルーティングでコントローラアクションを実行するには、第2引数にControllerActionの配列を指定します。

Route::get(パス, [コントローラ名::class, Actionメソッド]);

ルーティング名

name() はルーティングに名前を付けるためのメソッドです。 名前を付けると、そのルートを URL 文字列ではなく名前で参照できるようになります。

Route::get(パス, [コントローラ名::class, Actionメソッド])->name(ルーティング名);

ルーティング修正

ページ ルーティング ビュー ルーティング名
トップ / resouces/views/home/index.blade.php home
About /about resouces/views/home/about.blade.php about
商品トップ /product resouces/views/product/index.blade.php product.index
商品詳細 /product/show/{id} resouces/views/product/show.blade.php product.show
検索 /search resouces/views/product/search.blade.php product.search

コントローラの利用

ルーティングファイルweb.phpHomeControllernamespace をコードアシスタントで入力します。

web.php
use App\Http\Controllers\HomeController;

アクションの設定

HomeController->about() に対して、ルーティング名 about でルーティングします。

web.php
Route::get('/about', [HomeController::class, 'about'])->name('about');

動作確認

コントローラアクションでルーティングできたか確認してみましょう。

パラメーター処理

コントローラ作成

artisanコマンドに-rオプションをつけて ProductControllerを作成します。

ターミナル
php artisan make:controller ProductController -r

コントローラーファイルでよく利用するActionメソッドが自動追加されます。

App/Http/Controllers/ProductController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProductController 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.phpProductController を利用します。

web.php
use App\Http\Controllers\ProductController;

ProductController->index() に対して、ルーティング名 product.index でルーティングします。

web.php
Route::get('/product', [ProductController::class, 'index'])->name('product.index');

ProductController->show() に対して、ルーティング名 product.show でルーティングします。

web.php
Route::get('/product/{id}', [ProductController::class, 'show'])->name('product.show');

Actionの実装

ルーティングで指定された id は、show() の引数で取得できます。

App/Http/Controllers/ProductController.php
public function show(int $id)
{

}

送信された id で商品名を取得し、ビューに受け渡します。

    public function show(int $id)
    {
        $products = [
            1 => ['name' => 'コーヒー', 'price' => 300],
            2 => ['name' => '紅茶', 'price' => 250],
            3 => ['name' => 'ほうじ茶', 'price' => 200],
        ];
        $product = "";
        if ($id > 0) $product = $products[$id];

        $data = ['product' => $product];
        return view('product.show', $data);
    }

Viewの作成

views/product/show.blade.phpを作成します。

php artisan make:view product/show
views/item/show.blade.php
<div>
    <h2>商品名</h2>
    <p>{{ $product['name'] }}</p>
    <h2>価格</h2>
    <p>&yen;{{ $product['price'] }}</p>
</div>

ブラウザで確認

/product/{id} にアクセスしてデータが表示されるか確認してみましょう。

Requestオブジェクトの利用

ルーティング

ProductController->search() に対して、ルーティング名 product.search でルーティングします。

web.php
Route::get('product/search', [ProductController::class, 'search']);

アクションの実装

コントローラーはHTTPリクエストが発生すると、ActionメソッドでRequestオブジェクトが利用できるようになっています。

App/Http/Controllers/ProductController.php
    public function search(Request $request)
    {
        //処理
    }

Viewにデータバインド

Requestオブジェクトのパラメータを連想配列にして、ビューに受け渡します。

App/Http/Controllers/ProductController.php
    public function search(Request $request)
    {
        $data = [
            'keyword' => $request->keyword,
        ];
        return view('search', $data);
    }

Laravel超入門