コントローラーを使用すると、効果的な管理のために、対応するルーティング ビジネス ロジックをコントローラー クラスにカプセル化できるため、そのロジックは次のとおりです。 Routes.php ファイルに集中しているため、コードが肥大化して保守が困難になります。すべてのコントローラー クラスは、app/Http/Controllers ディレクトリに保存されます。
基本コントローラーは、AppHttpControllersController コントローラー クラスを継承する必要があります。
<?phpnamespace App\Http\Controllers;use App\User;use App\Http\Controllers\Controller;class UserController extends Controller { public function showProfile($id) { return view('user.profile', ['user' => User::findOrFail($id)]); }}`
次の方法でコントローラーの動作をルートに割り当てます:
Route::get('user/{id}', 'UserController@showProfile');
コントローラーの動作がルートに割り当てられると、クライアントがルート デバイスの動作を要求するたびにコントロールがトリガーされます。ここで、クライアントが user/{id} ルートをリクエストするたびに、showProfile メソッドが実行され、ルート内のパラメータがこのメソッドに直接渡されます。
コントローラーのルーティングを定義する場合、コントローラーの名前空間を指定する必要はなく、クラス名のみを指定する必要があることを知っておく必要があります。これは、RouteServiceProvider ファイルに自動的にロードされる Routes.php ファイルがすでに指定されているためです。ルーティング グループ AppHttpControllers のルート名前空間;
AppHttpControllers ディレクトリ内の php 名前空間を使用してコントローラーをネストまたは整理する場合は、AppHttpControllers 部分に関連するクラス名を指定するだけで済みます。 。したがって、コントローラーのクラス名全体が AppHttpControllersPhotosAdminController である場合、次のようにコントローラー ルートを定義できます。
Route::get('foo', 'Photos\AdminController@method');
名前付きルートを定義するのと同じように、名前を付けることもできます。コントローラー ルート:
Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
ルートに名前を付けると、ルート ヘルパー メソッドを通じて名前付きルートのリソース表現アドレスをすばやく生成できます:
$url = route('name');
ミドルウェアは次のようにコントローラー ルートに割り当てることができます。
Route::get('profile', [ 'middleware' => 'auth', 'uses' => 'UserController@showProfile']);
もちろん、コントローラー クラスでミドルウェアを直接使用してミドルウェアを割り当てることもできます。また、クラス内の特定の動作のみを許可することもできます。
class UserController extends Controller { public function __construct() { $this->middleware('auth'); $this->middleware('log', ['only' => [ 'fooAction', 'barAction' ]]); $this->middleware('subscribed', ['except' => [ 'fooAction', 'barAction' ]]); }}
リソース コントローラーは、RESTful コントローラーをすばやく構築できます。職人コマンドを使用すると、以下を簡単に作成できます。
php artisan make:controller PhotoController --resource
このコマンドは、appHttpControllersPhotoController.php ファイルを生成し、リソース コントローラーには、使用可能な各リソース操作に対応するメソッドが含まれます。次の方法でリソース ルートを登録できます。
この単純な宣言により、RESTful リクエストを処理するための複数のルートが作成されます。対応するリソース コントローラーは、コマンドを通じて生成されます。これらのリクエストに対しても、対応する処理メソッドが設定されます。 .
Route::resource('photo', 'PhotoController');
リソースコントローラーによって処理される動作
有时候你可能并不想控制器处理全部的请求方式,那么你可以这么做:
Route::resource('photo', 'PhotoController', ['only' => [ 'index', 'show']]);Route::resource('photo', 'PhotoController', ['except' => [ 'create', 'store', 'update', 'destroy']]);
默认的,所有的资源控制器行为都被进行了相应的路由命名,你可以通过names参数来进行重命名:
Route::resource('photo', 'PhotoController', ['names' => [ 'create' => 'photo.build']]);
默认的,资源路由的路由参数都被命名为相应的资源名称,你可以用过parameters参数来进行重命名:
Route::resource('user', 'AdminUserController', ['parameters' => [ 'user' => 'admin_user']]);// /user/{admin_user}
有时候你可能希望资源路由的路由参数并不需要像默认的资源名称一样采取复数的形式,那么你可以通过传递parameters的选项设置为singular:
Route::resource('users.photos', 'PhotoController', [ 'parameters' => 'singular']);// /users/{user}/photos/{photo}
另外,你也可以全局设置你的资源路由参数为单数形式或者全局进行资源路由参数的命名映射:
Route::singularResourceParameters();Route::resourceParameters([ 'user' => 'person', 'photo' => 'image'])
当你对资源路由参数进行定制时,你应该清楚的知道命名的顺序优先级:
如果你必须在资源控制器中添加额外的行为去注册相应的路由,那么你一定要在使用Route::resource之前进行注册,否则该行为很可能会被资源控制器意外的覆盖掉.
Route::get('photos/popular', 'PhotoController@method');Route::resource('photos', 'PhotoController');
laravel的服务容器支持所有的laravel控制器的解析。由于这个原因,所以你可以在控制器的构造函数中添加你所需要依赖的相应类型提示,这些依赖会被自动的解析并注入进控制器实例.
<?phpnamespace App\Http\Controllers;use App\Repositories\UserRepository;class UserController extends Controller { protected $users; public function __construct(UserRepository $users) { $this->users = $users; }}
当然,你也被允许添加一些laravel contract的类型提示,只要服务容器能够正确的解析,你都可以被允许添加。
除了在构造函数中进行依赖注入,你也可以在控制器的行为方法中进行依赖注入,比如,将Illuminate\Http\Reqeust实例注入到控制器的store方法中:
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class UserController extends Controller { public function store (Request $request) { $name = $request->input('name'); }}
如果你的控制器方法也接收从路由传递过来的参数,那么他们会在其它依赖解析完毕之后被传递,比如你的路由是这么定义的:
Route::put('user/{id}', 'UserController@update');
那么你可以这么修正你的控制器行为,来进行参数的接收:
<?phpnamespace App\Http\controllers;use Illuminate\Http\Request;class UserController extends Controller { public function update (Request $request, $id) { // }}
注意:缓存路由不支持闭包函数定义的路由,如果你想使你的路由被缓存,那么你应该使用控制器来管理你的路由.
如果你所有的路由都是基于控制器的路由,那么你应该使用laravel推荐的缓存路由,你可以简单的通过artisan命令来缓存所有路由注册到同一个文件里,它会替代routes.php文件被解析,使用这种缓存注册路由的方式在某些情况下注册路由的时间将被大大的减少,从而提高了应用的响应速度。但是每次添加新的路由或者删除路由时,为了使路由生效,你需要重新生成一次缓存路由:
php artisan route:cache
你可以通过下面的方式去删除路由缓存:
php artisan route:clear