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方法就會被執(zhí)行哨鸭。當然乳愉,路由參數也會被傳遞給這個方法。
控制器 & 命名空間
我們在定義控制器路由的時候沒有指定完整的控制器命名空間,而只是定義了 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
方法定義的路由可能無意中優(yōu)先于補充的額外路由:
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;
/**
* 創(chuàng)建新的控制器實例
*
* @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)
{
//
}
}