php控制器教程,laravel基礎教程 -- 控制器

HTTP 控制器

簡介

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

基本控制器

一個基本的控制器應該繼承自App\Http\Controllers\Controller控制器類: User::findOrFail($id)]); }}`

我們可以通過下面的方式把控制器的行為分配到路由: Route::get('user/{id}', 'UserController@showProfile');

一旦將控制器的行為分配到路由之后,每次客戶端請求該路由,都會觸發控制器的行為。這里即客戶端每次請求user/{id}路由,showProfile方法都會被執行,路由中的參數也會被直接傳遞到該方法中.

控制器 & 命名空間

你應該知道我們在定義控制器路由時是不需要指定控制器的命名空間的,而只需要指定到類名就可以了,這是因為在RouteServiceProvider文件中自動加載的routes.php文件已經被指定了路由組的根命名空間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 資源控制器

資源控制器可以使你快速的構建RESTful型的控制器。你可以使用artisan命令來快速的創建: php artisan make:controller PhotoController --resource

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

你可以通過下面的方式來進行資源路由的注冊: Route::resource('photo', 'PhotoController');

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

資源控制器所處理的行為 請求方式 路由地址 控制器行為 路由命名

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

命名資源路由

默認的,所有的資源控制器行為都被進行了相應的路由命名,你可以通過names參數來進行重命名: Route::resource('photo', 'PhotoController', ['names' => [ 'create' => 'photo.build']]);

命名資源路由參數

默認的,資源路由的路由參數都被命名為相應的資源名稱,你可以用過parameters參數來進行重命名: Route::resource('user', 'AdminUserController', ['parameters' => [ 'user' => 'admin_user']]);// /user/{admin_user}

有時候你可能希望資源路由的路由參數并不需要像默認的資源名稱一樣采取復數的形式,那么你可以通過傳遞parameters的選項設置為singular: Route::resource('users.photos', 'PhotoController', [ 'parameters' => 'singular']);// /users/{user}/photos/{photo}

另外,你也可以全局設置你的資源路由參數為單數形式或者全局進行資源路由參數的命名映射: Route::singularResourceParameters();Route::resourceParameters([ 'user' => 'person', 'photo' => 'image'])

當你對資源路由參數進行定制時,你應該清楚的知道命名的順序優先級: 參數被直接的傳遞給Route::resource

通過 Router::resourceParameters 進行全局參數映射

通過parameters數組選項傳遞給Route::resource 或者 通過 Route::singularResoureParameters 進行單數形式參數設置

默認行為

資源控制器中意外的行為

如果你必須在資源控制器中添加額外的行為去注冊相應的路由,那么你一定要在使用Route::resource之前進行注冊,否則該行為很可能會被資源控制器意外的覆蓋掉. Route::get('photos/popular', 'PhotoController@method');Route::resource('photos', 'PhotoController');

依賴注入 & 控制器

構造器注入

laravel的服務容器支持所有的laravel控制器的解析。由于這個原因,所以你可以在控制器的構造函數中添加你所需要依賴的相應類型提示,這些依賴會被自動的解析并注入進控制器實例. users = $users; }}

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

方法注入

除了在構造函數中進行依賴注入,你也可以在控制器的行為方法中進行依賴注入,比如,將Illuminate\Http\Reqeust實例注入到控制器的store方法中: input('name'); }}

如果你的控制器方法也接收從路由傳遞過來的參數,那么他們會在其它依賴解析完畢之后被傳遞,比如你的路由是這么定義的: Route::put('user/{id}', 'UserController@update');

那么你可以這么修正你的控制器行為,來進行參數的接收: 緩存路由 注意:緩存路由不支持閉包函數定義的路由,如果你想使你的路由被緩存,那么你應該使用控制器來管理你的路由.

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

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

本文原創發布php中文網,轉載請注明出處,感謝您的尊重!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453447.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

org.apache.jasper.JasperException: Unable to compile class for JSP:

報錯信息: org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class filesSt…

i++和++i

關于自增自減運算,很多書籍沒有把問題講清楚,在C語言里是這樣的: 1.后置運算:k表示先運算,后自加。 意思是遇到k了,我先把當前的k的值拿來參加運算,后面再去管它的自加。 那么,“后面”后到什么…

什么樣的項目經歷會讓面試官眼前一亮

很多同學都問過我類似的問題: 咱們《C語言也能干大事》中講的自己動手寫windows優化大師、自己動手寫計算器等東西只是寫著玩的小玩具而已,這些能用來以后找工作時寫到簡歷中的作品嗎?看別人的簡歷寫的“圖書管理系統”、“教務選課系統”多有…

matlab采樣頻譜,Matlab對采樣數據進行頻譜分析

使用Matlab對采樣數據進行頻譜分析1、采樣數據導入Matlab采樣數據的導入至少有三種方法。第一就是手動將數據整理成Matlab支持的格式,這種方法僅適用于數據量比較小的采樣。第二種方法是使用Matlab的可視化交互操作,具體操作步驟為:File --&g…

鏈表和順序表的一些區別

順序表與鏈表是非常基本的數據結構,它們可以被統稱為線性表。 線性表(Linear List)是由 n(n≥0)個數據元素(結點)a[0],a[1],a[2]…,a[n-1] 組成的有限序列。…

ANCS推送簡介

總體原理 ANCS通過藍牙BLE 4.0實現,僅支持iPhone 4S及以上且系統版本在IOS 7以上的手機,同時在外設端需要支持藍牙4.0協議。 1、外設端進行廣播,手機打開藍牙,搜索外設,連接外設,之后進行綁定(這…

好記性不如爛筆頭,記錄幾個常用的Linux操作

作者:老王Shell公共函數庫Linux系統里有一些公共的Shell函數庫可供使用,最重要的是/etc/rc.d/init.d/functions,在/etc/init.d目錄下有很多腳本都用到了這個函數庫,里面提供了很多有用的方法,比如:killproc…

用matlab簡單電路模型,基于MATLAB的電路模型仿真應用

基于MATLAB的電路模型仿真應用實驗指導書一、實驗目的1、掌握采用M文件及SIMULINK對電路進行仿真的方法。2、熟悉POWERSYSTEM BLOCKSET 模塊集的調用、設置方法。3.進一步熟悉M腳本文件編寫的方法和技巧。二、實驗原理1、通過M文件實現電路仿真的一般仿真步驟為&…

春節期間小游戲同時在線人數最高達2800萬人/小時

微信官方發布2018年春節期間微信數據報告:除夕至初五,總共有2,297億條微信消息,28億條微信朋友圈成功發出,音視頻通話總時長175億乙分鐘。其中,90后用廣的消息發送量占總量的42.5%,80后用戶25.9%&#xff0…

C語言中* 和

&x是對x變量取地址,也就是返回的是x的地址。 int *i;這里面的*說明變量i是一個指針,存的是一個地址。 而 *i整體代表的是一個數值,例如可以int *i 5 這里整體的*i代表的是5,而i代表的是這個值存儲的地址

餐館的故事-淺析職責鏈模式

我們在餐館吃飯的時候,一般都是在拿到菜單后,選擇喜歡的菜,然后通知服務員。服務員會將我們的定單交給大廚,大廚可能會親自去做這道菜,也可能安排給小廚來做,總之,我們不用擔心他們沒有人做菜&a…

JDBC數據對象存儲

一:將查詢的結果生成對象,儲存在數組中。 1 package day31;2 3 import java.sql.Connection;4 import java.sql.PreparedStatement;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.util.ArrayList;8 9 public class java_ob…

個人工作13年的一些人生真實領悟

此文不定期的更新,想起來就寫一些,我都忘了我曾經會過什么了。你可能會在許多的文章里看到類似的,但這些是我個人的真實體會。 1 技術服從于業務 此問題以前的一個文章提過,不再多說。 適用于大多數對技術的盲目崇拜者。在絕大…

matlab非齊次方程組的通解,用matlab求非齊次線性方程組的通解?

先向大家介紹一下非齊次線性方程組。所謂非齊次線性方程組就是方程組等號右邊的常數項不全為零的線性方程組。全部等于零時,就稱為齊次線性方程組。下面我們就講解一下如何利用matlab快速求非齊次線性方程組的通解。工具/材料matlab電腦操作方法01線性方程組Axb的求…

Linux 終端仿真程序Putty

PuTTY是一個Telnet、SSH、rlogin、純TCP以及串行接口連接軟件。較早的版本僅支持Windows平臺,現在的版本中開始支持各類Unix平臺。 用linux作為桌面系統,身為工程師很多時候需要通過Telnet、SSH協議進行遠程管理,通過串口進行設備配置。Putty…

Mysql 數據庫水平分表 存儲過程

數據庫存儲量達到一定程度的時候,就需要進行分表以減輕檢索的消耗。 常用的分表方式包括水平和垂直分表。本次進行的是按照uid進行水平分表。 ##分表思路: 水平分表平均的將數據按照特定方式分配到多個表中。理論上每個表的訪問頻次和數據量都是同一水平…

中國架構師,名符其實有多少?

先說一下讀后感:我前段時間去過幾個公司面試架構師,要求還是蠻高的,要熟悉大數據量處理,要熟悉高并發,要熟悉XX體系架構,要能在關鍵技術上實現突破。總之,架構錯了,就啥都錯了。呵呵…

粗識靜態鏈表

為了彌補鏈表在內存分配上的不足,出現了靜態鏈表這么一個折中的辦法。靜態鏈表比較類似于內存池,它會預先分配一個足夠長的數組,之后鏈表節點都會保存在這個數組里,這樣就不需要頻繁的進行內存分配了。 當然,這個方法的…

php用date語句獲取時間,關于php date()函數獲取時間的設置和使用方法

date()函數是PHP自帶的時間函數,可以獲取當前服務器的時間echo date(Y-m-d H:i:s); //輸出:2020-05-18 11:02:35date()函數中可以使用的字母含義:a-"am"(上午)或者"pm"(下午)A-"AM"或者"PM"Y-年,顯示…

Django_form補充

問題1: 注冊頁面輸入為空,報錯:keyError:找不到passworddef clean(self): print("---",self.cleaned_data) # if self.cleaned_data["password"]self.cleaned_data["repeat_password"]: …