コントローラ
- コントローラの定義
- コントローラーと名前空間
- 単一動作コントローラー リソース モデルの指定
- フェイク フォーム メソッド
- 名前付きリソース ルーティング パラメーター
- ローカライズされたリソース URI
- 補足リソース コントローラー
- 依存性インジェクションとコントローラー
- コンストラクター インジェクション
- メソッド インジェクション
- ルート キャッシュ
- 概要
- 基本コントローラ
- コントロール デバイス ミドルウェア
- リソース コントローラーDependency Injection とコントローラー
- ルート キャッシュ
- API リソース ルーティング
コントローラ
app/Http/Controllers
ディレクトリに保存されます。メソッドなどの便利なメソッドをいくつか提供します。
<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class UserController extends Controller { /** * 显示给定用户的概要文件. * * @param int $id * @return View */ public function show($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }
次のルーティングのように、コントローラーの動作へのポインターを定義できます。
これで、リクエストが指定されたルートの URI と一致すると、 Route::get('user/{id}', 'UserController@show');
コントローラーの
show メソッドが実行されます。ルート パラメーターもこのメソッドに渡されます。 {ヒント} コントローラは
基本クラスを継承する必要はありません。ただし、コントローラーが基本クラスから継承していない場合、
、#validate、dispatch
などの一部の便利な関数を使用できなくなります。方法。
コントローラーと名前空間
コントローラー ルートを定義するときに、完全なコントローラーの名前空間を指定する必要がないことを指摘することが重要です。 RouteServiceProvider
は名前空間を含むルーティング グループにルーティング ファイルを読み込むため、指定する必要があるのは App\Http\Controllers
名前空間の後のクラス名の部分だけです。
コントローラーを App\Http\Controllers
より深いディレクトリに配置することを選択した場合は、App\Http\Controllers
に相対的な名前空間を使用する必要があります。ルート名前空間 指定されたクラス名。したがって、完全なコントローラー クラス名が App\Http\Controllers\Photos\AdminController
である場合は、次のようにルーティングに登録する必要があります:
Route::get('foo', 'Photos\AdminController@method');
単一動作コントローラー
単一の動作のみを処理するコントローラーを定義する場合は、コントローラーに __invoke## を配置できます。 # メソッド:
<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class ShowProfile extends Controller { /** * 展示给定用户的资料. * * @param int $id * @return View */ public function __invoke($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }単一の動作コントローラーのルートを登録する場合、メソッドを指定する必要はありません。
Route::get('user/{id}', 'ShowProfile');Artisan コマンドで
make:controller コマンドを渡すことができます。ツール 呼び出し可能なコントローラーを生成する
--invokable オプション:
php artisan make:controller ShowProfile --invokableコントローラー ミドルウェアMiddleware ルート ファイル内のコントローラーに割り当てることができるルート。
Route::get('profile', 'UserController@show')->middleware('auth');ただし、コントローラーのコンストラクターでミドルウェアを指定する方が便利です。コントローラーのコンストラクターで
middleware メソッドを使用すると、ミドルウェアをコントローラーのアクションに簡単に割り当てることができます。ミドルウェアをコントローラー クラスの特定のメソッドに制限することもできます。
class UserController extends Controller{ /** * Instantiate a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); $this->middleware('log')->only('index'); $this->middleware('subscribed')->except('store'); } }同時に、コントローラーではクロージャを使用してミドルウェアを登録することもできます。これは、ミドルウェア クラス全体を定義せずに、単一のコントローラーのミドルウェアを定義する便利な方法を提供します:
$this->middleware(function ($request, $next) { // ... return $next($request);});
{tip} ミドルウェアをコントローラー アクション A のサブセットに割り当てることができますが、これは、コントローラーが非常に大きくなりました。コントローラーを複数の小さなコントローラーに分割することをお勧めします。#
リソース コントローラー
Laravel リソース ルーティングは、1 行のコードで一般的な「CURD (作成、削除、変更、確認)」ルートをコントローラーに割り当てます。たとえば、アプリによって保存された「写真」に対するすべての HTTP リクエストを処理するコントローラーを作成するとします。 Artisan コマンド make:controller
を使用すると、このようなコントローラーをすばやく作成できます。
php artisan make:controller PhotoController --resource
このコマンドはコントローラー app/Http/Controllers/PhotoController.php## を生成します # 。これには、利用可能な各リソース操作のメソッドが含まれます。
Route::resource('photos', 'PhotoController');この 1 つのルート宣言により、リソース上のさまざまな動作を処理するための複数のルートが作成されます。生成されたコントローラーは、HTTP 動詞と URL を処理するための宣言的アノテーションを含む、各アクションのメソッドを保持します。 配列パラメーターを
resources メソッドに渡すことで、複数のリソース コントローラーを一度に作成できます:
Route::resources([ 'photos' => 'PhotoController', 'posts' => 'PostController' ]);
リソースコントローラー操作処理
HTTPメソッド | URI | アクション | ルート名 |
---|---|---|---|
/photos
| indexphotos.index | ||
/photos/create
| createphotos.create | ||
/photos
| storephotos.store | ||
/photos/{photo}
| showphotos.show | ||
/photos/{photo}/edit
| editphotos.edit | ||
/写真/{写真} | update | photos.update | |
DELETE | /photos/{photo} | destroy | photos.destroy |
リソース モデルの指定
ルーティング モデル バインディングを使用し、リソース コントローラー メソッドでタイプ ヒントを使用したい場合は、コントローラーの生成時に # を使用できます。 ##--model オプション:
php artisan make:controller PhotoController --resource --model=Photoフェイク フォーム メソッドHTML フォームでは
PUT、
PATCH、## を生成できないため#DELETE
リクエストを処理するため、HTTP アクションを偽装するには、非表示の _method
フィールドを追加する必要があります。この Blade ディレクティブ @method
は次のフィールドを作成できます: <form action="/foo/bar" method="POST">
@method('PUT')
</form>
Route::resource('photos', 'PhotoController')->only([
'index', 'show'
]);
Route::resource('photos', 'PhotoController')->except([
'create', 'store', 'update', 'destroy'
]);
API Resource RoutingWhen routing resource で宣言する場合API の場合、通常、create
やedit などの HTML テンプレートを表示するルートを除外する必要があります。便宜上、
apiResource メソッドを使用して、これら 2 つのルートを自動的に除外できます。
Route::apiResource('photos', 'PhotoController');
配列を
apiResources メソッドに渡すことで、すべてを一度に登録できます。複数の API リソース コントローラー: Route::apiResources([ 'photos' => 'PhotoController', 'posts' => 'PostController' ]);
create メソッドと edit メソッドを含まない API リソース コントローラーをすばやく生成するには、
make を実行します。 : --api
オプションをコントローラー コマンドに追加します:
php artisan make:controller API/PhotoController --api
名前付きリソース ルーティングnames
の配列を渡すことで、これらの名前をオーバーライドできます:Route::resource('photos', 'PhotoController')->names([ 'create' => 'photos.build' ]);
はリソースの「単数形」に基づいてリソースを作成します。 name ルートのルートパラメータ。オプション配列で
parameters パラメータを渡すことで、各リソースを簡単にオーバーライドできます。 parameters
配列はリソース名とパラメータ名の連想配列である必要があります:
上記のリストは、リソースの Route::resource('users', 'AdminUserController')->parameters([
'users' => 'admin_user'
]);
show
ルートに対して次の URl を生成します。
Illuminate\Http\Request のインスタンスをコントローラー メソッドに挿入することです。
<?php namespace App\Http\Controllers; use App\Repositories\UserRepository; class UserController extends Controller{ /** * The user repository instance. */ protected $users; /** * Create a new controller instance. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { $this->users = $users; } }コントローラーがルート パラメーターからも入力を取得する必要がある場合は、ルートの追加 パラメーターはこれらの依存関係の後に配置されます。たとえば、ルート定義は次のようになります。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ /** * Store a new user. * * @param Request $request * @return Response */ public function store(Request $request) { $name = $request->name; // } }コントローラ メソッドで次の定義を使用することで、
Illuminate\Http\Request タイプ ヒントを入力してアクセスできます。
id パラメータ:
Route::put('user/{id}', 'UserController@update');
ルート キャッシュ
{note} クロージャベースのルートはキャッシュできません。ルート キャッシュを使用します。クロージャ ルートをコントローラ ルートに変換する必要があります。
アプリケーションがコントローラーベースのルーティングのみを使用する場合は、ルート キャッシュを利用する必要があります。ルート キャッシュを使用すると、すべてのアプリケーション ルートを登録するのに必要な時間が大幅に短縮されます。場合によっては、ルート登録が 100 倍高速になることもあります。ルート キャッシュを生成するには、route:cache
:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ /** * Update the given user. * * @param Request $request * @param string $id * @return Response */ public function update(Request $request, $id) { // } }
を実行するだけです。このコマンドの実行後、各リクエストはキャッシュされたルート ファイルをロードします。新しいルートを追加する場合は、新しいルート キャッシュを生成する必要があることに注意してください。したがって、route:cache
コマンドはプロジェクトのデプロイ中にのみ実行する必要があります。
route:clear
コマンドを使用して、ルート キャッシュをクリアできます。
php artisan route:cache