咱們以前在route文件中是使用匿名函數來進行操做的,全部操做都用匿名函數是不合理的,下面咱們來學習下控制器。php
咱們使用artisan來建立控制器:laravel
php artisan make:controller ArticlesController
執行後咱們進入目錄後就能夠看到這個控制器了:\app\Http\Controller數組
laravel的控制器是RESTFul風格的控制器 方便咱們作增刪改查的工做,咱們爲控制器綁定路由:app
Route::resource('articles', 'ArticlesController');
其實這短短的一行代碼就已經註冊了多條路由,咱們可使用artisan命令來看看:函數
php artisan route:list
咱們能夠看到,每條路由都對應着控制器裏的每個方法,咱們能夠在控制器中的方法中完成相應的業務邏輯。post
若是咱們不想要這麼多條路由怎麼辦呢?有這麼個方法:學習
// 指定只爲index 和 store方法生成路由 Route::resource('articles', 'ArticlesController', ['only'=>['index', 'store']]);
默認狀況下,全部資源控制器動做都有一個路由名稱,然而,咱們能夠經過傳入names
數組來覆蓋這些默認的名字:ui
Route::resource('articles', 'ArticlesController', ['names' => ['create' => 'articles.build']]);
在實際開發中,咱們少不了要使用路由嵌套this
好比說一篇文章下有多個評論,咱們能夠這樣嵌套:url
Route::resource('articles.comments', 'ArticlesController');
若是你不明白這是什麼意思,可使用artisan命令 php artisan route:list看下,咱們在對應的控制器中的方法:
public function show($articleId, $commentId) { // 顯示謀篇文章下的評論 }
show方法對應的路由格式是:localhost8000/articles/{articleId}/comments/{commentId}
若是咱們要註冊單條路由,就須要這樣寫:
Route::get('/articles/{id}', 'ArticlesController@showArticles');
意思是當調用這條路由時 使用控制器中的showArticles方法,對應控制器中的方法是這樣:
public function showArticles($id) { // 執行邏輯代碼 }
在route中 控制器默認的命名空間是App\Http\Controllers 當咱們的控制器在這個命名空間下 咱們只須要加上後面的部分便可:
Route::get('/get/user', '\Auth\AuthController@someMethod');
Route::get('/articles', ['uses' => 'ArticlesController@showArticles', 'as' => 'show']);
咱們可使用函數action()來查找url:
$url = action('ArticlesController@showArticles');
也可使用route()函數:
$url = route('show');
以前的章節中 咱們介紹過中間件 只是若是在控制器中如何使用呢?let's look this:
Route::get('/test/middleware', ['uses' => 'ArticlesController@method', 'middleware' => 'any']);
其實上面的例子並不經常使用,在控制器中的構造方法植入middleware更加方便:
public function __construct() { $this->middleware('someMiddleware'); // 'only'表明 只有那幾個方法使用到這個middleware $this->middleware('auth',['only'=>['index','show']]); // 'except'表明 除了那幾個方法不適用這個middleware $this->middleware('log',['except'=>['getAny']]); }
Laravel容許你只定義一個路由便可訪問控制器類中的全部動做,首先,使用Route::controller
方法定義一個路由,該controller
方法接收兩個參數,第一個參數是控制器處理的baseURI,第二個參數是控制器的類名:
Route::controller('articles','ArticlesController');
接下來咱們看看控制器中如何相應路由吧:
咱們以請求方式爲前綴命名方法
public function getIndex() { // 這個方法對應的是:GET方式 /articles 這條路由 }
public function getShow($id) { // 這個方法對應: GET方式 /articles/show/{id} 這條路由 }
public function postProfile() { // 這個方法對應: POST方式 /articles/profile 這條路由 }