1.基本控制器
所有的 Laravel 控制器应该继承自 Laravel 自带的控制器基类 Controller
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 为指定用户显示详情
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
我们可以像这样定义指向该控制器动作的[路由]
Route::get('user/{id}', 'UserController@showProfile');
UserController的 showProfile方法就会被执行。当然,路由参数也会被传递给这个方法。
控制器 & 命名空间
我们在定义控制器路由的时候没有指定完整的控制器命名空间,而只是定义了 App\Http\Controllers之后的部分。默认情况下,RouteServiceProvider将会在一个路由群组中载入 routes.php 文件,并且该路由群组指定定了群组中路由控制器所在的命名空间。
如果你在 App\Http\Controllers
目录下选择使用 PHP 命名空间嵌套或组织控制器,只需要使用相对于App\Http\Controllers
命名空间的指定类名即可。因此,如果你的完整控制器类是App\Http\Controllers\Photos\AdminController
,你可以像这样注册路由:
Route::get('foo', 'Photos\AdminController@method');
命名控制器路由
和闭包路由一样,可以指定控制器路由的名称:
Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
你还可以使用辅助函数 route 来为已命名的控制器路由生成对应的 URL:
$url = route('name');
2.控制器[中间件]
中间件可以像这样分配给控制器路由:
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);
但是,将中间件放在控制器构造函数中更方便,在控制器的构造函数中使用 middleware方法你可以很轻松的分配中间件给该控制器。你甚至可以限定该中间件应用到该控制器类的指定方法:
class UserController extends Controller
{
/**
* 实例化一个新的 UserController 实例
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log', ['only' => ['fooAction', 'barAction']]);
$this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
}
}
3.[Controller Middleware 控制器中间件]
你可以像下面的例子一样把[中间件]指派给控制器路由:
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);
在控制器的构造函数中使用 middleware方法你可以很轻松的分配中间件给该控制器。你甚至可以限定该中间件应用到该控制器类的指定方法:
class UserController extends Controller
{
/**
* 实例化一个新的 UserController 实例
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log', ['only' => ['fooAction', 'barAction']]);
$this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
}
}
3.[RESTful]资源控制器
php artisan make:controller PhotoController --resource
该 Artisan 命令将会生成一个控制器文件
app/Http/Controllers/PhotoController.php
,这个控制器包含了每一个资源操作对应的方法。
接下来,可以为该控制器注册一个资源路由:
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']]);
补充资源控制器
如果有必要在默认资源路由之外添加额外的路由到资源控制器,应该在调用 Route::resource之前定义这些路由;否则,通过 resource
方法定义的路由可能无意中优先于补充的额外路由:
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
4.[依赖注入] & 控制器
构造函数注入
Laravel 使用服务容器解析所有的 Laravel 控制器,因此,可以在控制器的构造函数中类型声明任何依赖,这些依赖会被自动解析并注入到控制器实例中:
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;
class UserController extends Controller
{
/**
* The user repository instance.
*/
protected $users;
/**
* 创建新的控制器实例
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
}
}
方法注入
除了构造函数注入之外,还可以在控制器的动作方法中进行依赖的类型提示,例如,我们可以在某个方法中类型提示 Illuminate\Http\Request
实例:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 存储新用户
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
如果控制器方法期望输入路由参数,只需要将路由参数放到其他依赖之后
Route::put('user/{id}', 'UserController@update');
你需要通过定义控制器方法如下所示来类型示 Illuminate\Http\Request
并访问路由参数 id:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 更新指定用户
*
* @param Request $request
* @param int $id
* @return Response
* @translator http://laravelacademy.org
*/
public function update(Request $request, $id)
{
//
}
}