控制器简介
控制器可以将相关的HTTP 请求封装到一个勒种进行处理,控制器目录在 app/Http/Controllers 目录中
定义控制器
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controlelrs\Controller;
class UserController extends Controller
{
//为指定用户显示详情
public function show($id)
{
return view('user.profile',['user' => User::findOrFail($id)]);
}
}
我们可以这样定义路由
Route::get('user/{id}','UserController@show');
如果一个请求匹配到上面URI UserController 的 show 方法就会被执行。路由参数也会传递给当前方法
单动作控制器
如果你想定义一个只处理一个动作的控制器,可以在控制器中定义 __invoke 方法。
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
class ShowProfile extends Controller
{
public function __invoke($id)
{
return view('user.profile',['users' => findOrFail($id)]);
}
}
当你为这个单动作控制器注册路由的时候,不需要指定方法:
Route::get('user/{id}','ShowProfile');
控制器中间件
中间件可以像这样分配给控制器路由
Route::get('profile','UserController@show')->middleware('auth');
但是,将中间件放在控制器构造函数中更方便,在控制器的构造函数中使用 middleware 方法你可以很轻松的分配中间件给该控制器。
class UserController extends Controller
{
//实例化一个新的UserController 实例
public function __construct()
{
$this->middleware('auth');
$this->middleware('log')->only('index');
$this->middleware('subscribed')->except('store');
}
}
在控制器中还可以使用闭包注册中间件,这为我们定义只在某个控制器中使用中间件提供了方便,无需定义完整的中间件类:
$this->middleware(function($request,$next){
return $next($request);
})
注:你还可以将中间件分配给多个控制器动作,不过,这意味着你的控制器会变得越来越臃肿,这种情况下,需要考虑将控制器分割成多个更小的控制器。