Laravel -HTTP 控制器

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');

Paste_Image.png

只定義部分資源路由

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)
    {
        //
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末寺庄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子力崇,更是在濱河造成了極大的恐慌斗塘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亮靴,死亡現(xiàn)場離奇詭異馍盟,居然都是意外死亡,警方通過查閱死者的電腦和手機茧吊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門贞岭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搓侄,你說我怎么就攤上這事瞄桨。” “怎么了讶踪?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵讲婚,是天一觀的道長。 經常有香客問我俊柔,道長筹麸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任雏婶,我火速辦了婚禮物赶,結果婚禮上,老公的妹妹穿的比我還像新娘留晚。我一直安慰自己酵紫,他們只是感情好告嘲,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奖地,像睡著了一般橄唬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上参歹,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天仰楚,我揣著相機與錄音,去河邊找鬼犬庇。 笑死僧界,一個胖子當著我的面吹牛,可吹牛的內容都是我干的臭挽。 我是一名探鬼主播捂襟,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼欢峰!你這毒婦竟也來了葬荷?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纽帖,失蹤者是張志新(化名)和其女友劉穎闯狱,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體抛计,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡哄孤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吹截。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘦陈。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖波俄,靈堂內的尸體忽然破棺而出晨逝,到底是詐尸還是另有隱情,我是刑警寧澤懦铺,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布捉貌,位于F島的核電站,受9級特大地震影響冬念,放射性物質發(fā)生泄漏趁窃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一急前、第九天 我趴在偏房一處隱蔽的房頂上張望醒陆。 院中可真熱鬧,春花似錦裆针、人聲如沸刨摩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澡刹。三九已至呻征,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罢浇,已是汗流浹背陆赋。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留己莺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓戈轿,卻偏偏與公主長得像凌受,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子思杯,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • 介紹 不要把所有處理請求的邏輯都放到一個單獨的 routes.php 文件里胜蛉,我們可以使用控制器去組織這些行為。C...
    伊Summer閱讀 809評論 0 1
  • HTTP 控制器 簡介 控制器允許你將相應的路由業(yè)務邏輯封裝在控制器類中進行有效的管理色乾,這樣你不必將所有的路由邏輯...
    Dearmadman閱讀 3,417評論 1 3
  • 0.1配置1.模板繼承2.控制器3.git4.支付寶支付的流程5.路由6.中間件7.請求8.laravel 學習筆...
    云龍789閱讀 808評論 0 5
  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,607評論 0 121
  • 路由 路由(routing)就是通過互聯(lián)的網絡把信息從源地址傳輸到目的地址的活動誊册。路由發(fā)生在OSI網絡參考模型中的...
    Dearmadman閱讀 2,858評論 2 9