laravel 基礎(chǔ)教程 —— 控制器

HTTP 控制器

簡介

控制器允許你將相應(yīng)的路由業(yè)務(wù)邏輯封裝在控制器類中進行有效的管理,這樣你不必將所有的路由邏輯集中到routes.php文件中姻锁,導致代碼的臃腫與難以維護。
所有的控制器類都被存儲在app/Http/Controllers目錄中.

基本控制器

一個基本的控制器應(yīng)該繼承自App\Http\Controllers\Controller控制器類:

<?php

namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;

class UserController extends Controller {
  public function showProfile($id) {
    return view('user.profile', ['user' => User::findOrFail($id)]);
  }
}

我們可以通過下面的方式把控制器的行為分配到路由:

Route::get('user/{id}', 'UserController@showProfile');

一旦將控制器的行為分配到路由之后,每次客戶端請求該路由凄敢,都會觸發(fā)控制器的行為凉唐。這里即客戶端每次請求user/{id}路由庸追,showProfile方法都會被執(zhí)行,路由中的參數(shù)也會被直接傳遞到該方法中.

控制器 & 命名空間

你應(yīng)該知道我們在定義控制器路由時是不需要指定控制器的命名空間的台囱,而只需要指定到類名就可以了淡溯,這是因為在RouteServiceProvider文件中自動加載的routes.php文件已經(jīng)被指定了路由組的根命名空間App\Http\Controllers;

如果你想在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 = route('name');

控制器中間件

中間件可以這樣被分配到控制器路由中:

Route::get('profile', [
  'middleware' => 'auth',
  'uses' => 'UserController@showProfile'
]);

當然你也可以在控制器類中直接使用middleware方法來進行中間件的分配,你也可以只允許類中的某些行為受到指定中間件的約束:

class UserController extends Controller {
  public function __construct() {
    $this->middleware('auth');

    $this->middleware('log', ['only' => [
      'fooAction',
      'barAction'
    ]]);

    $this->middleware('subscribed', ['except' => [
      'fooAction',
      'barAction'
    ]]);
  }
}

RESTful 資源控制器

資源控制器可以使你快速的構(gòu)建RESTful型的控制器豺总。你可以使用artisan命令來快速的創(chuàng)建:

php artisan make:controller PhotoController --resource

該命令會生成app\Http\Controllers\PhotoController.php文件车伞,資源控制器中將包含每個可用的資源操作相應(yīng)的方法.

你可以通過下面的方式來進行資源路由的注冊:

Route::resource('photo', 'PhotoController');

這一個簡單的聲明會創(chuàng)造多條路由用來處理RESTful式的請求.相應(yīng)的通過命令生成的資源型控制器也為這些請求設(shè)置了對應(yīng)的處理方法.

資源控制器所處理的行為

請求方式 路由地址 控制器行為 路由命名
GET /photo index photo.index
GET /photo/create create photo.create
POST /photo store photo.store
GET /photo/{photo} show photo.show
GET /photo/{photo}/edit edit photo.edit
PUT/PATCH /photo/{photo} update photo.update
DELETE /photo/{photo} destroy photo.destroy

部分資源路由

有時候你可能并不想控制器處理全部的請求方式,那么你可以這么做:

Route::resource('photo', 'PhotoController', ['only' => [
  'index', 'show'
]]);

Route::resource('photo', 'PhotoController', ['except' => [
  'create', 'store', 'update', 'destroy'
]]);

命名資源路由

默認的喻喳,所有的資源控制器行為都被進行了相應(yīng)的路由命名另玖,你可以通過names參數(shù)來進行重命名:

Route::resource('photo', 'PhotoController', ['names' => [
  'create' => 'photo.build'
]]);

命名資源路由參數(shù)

默認的,資源路由的路由參數(shù)都被命名為相應(yīng)的資源名稱表伦,你可以用過parameters參數(shù)來進行重命名:

Route::resource('user', 'AdminUserController', ['parameters' => [
  'user' => 'admin_user'
]]);

// /user/{admin_user}

有時候你可能希望資源路由的路由參數(shù)并不需要像默認的資源名稱一樣采取復數(shù)的形式谦去,那么你可以通過傳遞parameters的選項設(shè)置為singular:

Route::resource('users.photos', 'PhotoController', [
  'parameters' => 'singular'
]);

// /users/{user}/photos/{photo}

另外,你也可以全局設(shè)置你的資源路由參數(shù)為單數(shù)形式或者全局進行資源路由參數(shù)的命名映射:

Route::singularResourceParameters();

Route::resourceParameters([
  'user' => 'person',
  'photo' => 'image'
])

當你對資源路由參數(shù)進行定制時蹦哼,你應(yīng)該清楚的知道命名的順序優(yōu)先級:

  1. 參數(shù)被直接的傳遞給Route::resource
  2. 通過 Router::resourceParameters 進行全局參數(shù)映射
  3. 通過parameters數(shù)組選項傳遞給Route::resource 或者 通過 Route::singularResoureParameters 進行單數(shù)形式參數(shù)設(shè)置
  4. 默認行為

資源控制器中意外的行為

如果你必須在資源控制器中添加額外的行為去注冊相應(yīng)的路由鳄哭,那么你一定要在使用Route::resource之前進行注冊,否則該行為很可能會被資源控制器意外的覆蓋掉.

Route::get('photos/popular', 'PhotoController@method');

Route::resource('photos', 'PhotoController');

依賴注入 & 控制器

構(gòu)造器注入

laravel的服務(wù)容器支持所有的laravel控制器的解析。由于這個原因纲熏,所以你可以在控制器的構(gòu)造函數(shù)中添加你所需要依賴的相應(yīng)類型提示妆丘,這些依賴會被自動的解析并注入進控制器實例.

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller {
  protected $users;

  public function __construct(UserRepository $users) {
    $this->users = $users;
  }
}

當然,你也被允許添加一些laravel contract的類型提示局劲,只要服務(wù)容器能夠正確的解析勺拣,你都可以被允許添加。

方法注入

除了在構(gòu)造函數(shù)中進行依賴注入鱼填,你也可以在控制器的行為方法中進行依賴注入药有,比如,將Illuminate\Http\Reqeust實例注入到控制器的store方法中:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller {
  public function store (Request $request) {
    $name = $request->input('name');
  }
}

如果你的控制器方法也接收從路由傳遞過來的參數(shù)苹丸,那么他們會在其它依賴解析完畢之后被傳遞愤惰,比如你的路由是這么定義的:

Route::put('user/{id}', 'UserController@update');

那么你可以這么修正你的控制器行為,來進行參數(shù)的接收:

<?php

namespace App\Http\controllers;

use Illuminate\Http\Request;

class UserController extends Controller {
  public function update (Request $request, $id) {
    // 
  }
}

緩存路由

注意:緩存路由不支持閉包函數(shù)定義的路由,如果你想使你的路由被緩存赘理,那么你應(yīng)該使用控制器來管理你的路由.

如果你所有的路由都是基于控制器的路由宦言,那么你應(yīng)該使用laravel推薦的緩存路由,你可以簡單的通過artisan命令來緩存所有路由注冊到同一個文件里感憾,它會替代routes.php文件被解析蜡励,使用這種緩存注冊路由的方式在某些情況下注冊路由的時間將被大大的減少,從而提高了應(yīng)用的響應(yīng)速度阻桅。
但是每次添加新的路由或者刪除路由時凉倚,為了使路由生效,你需要重新生成一次緩存路由:

php artisan route:cache

你可以通過下面的方式去刪除路由緩存:

php artisan route:clear
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫂沉,一起剝皮案震驚了整個濱河市稽寒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趟章,老刑警劉巖杏糙,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慎王,死亡現(xiàn)場離奇詭異,居然都是意外死亡宏侍,警方通過查閱死者的電腦和手機赖淤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谅河,“玉大人咱旱,你說我怎么就攤上這事”了#” “怎么了吐限?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長褂始。 經(jīng)常有香客問我诸典,道長,這世上最難降的妖魔是什么崎苗? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任狐粱,我火速辦了婚禮,結(jié)果婚禮上益缠,老公的妹妹穿的比我還像新娘脑奠。我一直安慰自己基公,他們只是感情好幅慌,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布凌外。 她就那樣靜靜地躺著嘁灯,像睡著了一般私爷。 火紅的嫁衣襯著肌膚如雪寨蹋。 梳的紋絲不亂的頭發(fā)上苛骨,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天庆寺,我揣著相機與錄音涨椒,去河邊找鬼镣陕。 笑死斑司,一個胖子當著我的面吹牛渗饮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宿刮,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼互站,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了僵缺?” 一聲冷哼從身側(cè)響起胡桃,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磕潮,沒想到半個月后翠胰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體容贝,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年之景,在試婚紗的時候發(fā)現(xiàn)自己被綠了斤富。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡锻狗,死狀恐怖茂缚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屋谭,我是刑警寧澤脚囊,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站桐磁,受9級特大地震影響悔耘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜我擂,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一衬以、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧校摩,春花似錦看峻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坤塞,卻和暖如春冯勉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摹芙。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工灼狰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浮禾。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓交胚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盈电。 傳聞我的和親對象是個殘疾皇子蝴簇,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)挣轨,斷路器军熏,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 0.1配置1.模板繼承2.控制器3.git4.支付寶支付的流程5.路由6.中間件7.請求8.laravel 學習筆...
    云龍789閱讀 803評論 0 5
  • 介紹 不要把所有處理請求的邏輯都放到一個單獨的 routes.php 文件里,我們可以使用控制器去組織這些行為卷扮。C...
    伊Summer閱讀 801評論 0 1
  • 路由 路由(routing)就是通過互聯(lián)的網(wǎng)絡(luò)把信息從源地址傳輸?shù)侥康牡刂返幕顒拥磁臁B酚砂l(fā)生在OSI網(wǎng)絡(luò)參考模型中的...
    Dearmadman閱讀 2,842評論 2 9
  • 昨天工作到凌晨3點多均践,我看問題解決了我就先撤了,沒想到今天起來發(fā)現(xiàn)昨天有很多人又通宵了摩幔。早晨去把問題處理后彤委,得知項...
    任雨點閱讀 137評論 0 0