摘要:最適合入門的初級(jí)教程五路由咱會(huì)創(chuàng)建了控制器也有了接下來要搞的就是把兩者關(guān)聯(lián)起來了最適合入門的初級(jí)教程三我們講過的或者方法第一個(gè)參數(shù)就是我們要定義的路由就是我們?cè)诘刂窓谡?qǐng)求的那段第二個(gè)參數(shù)可以是一個(gè)閉包函數(shù)里面寫請(qǐng)求定義的路由時(shí)執(zhí)行的內(nèi)容上篇
最適合入門的Laravel初級(jí)教程(五) 路由咱會(huì)創(chuàng)建了;
控制器也有了;
接下來要搞的就是把兩者關(guān)聯(lián)起來了;
最適合入門的laravel初級(jí)教程(三)
我們講過 Route 的 get 或者 post 方法第一個(gè)參數(shù)就是我們要定義的路由;
就是我們?cè)诘刂窓谡?qǐng)求的那段url;
第二個(gè)參數(shù)可以是一個(gè)閉包函數(shù);
里面寫請(qǐng)求定義的路由時(shí)執(zhí)行的內(nèi)容;
上篇文章我們說過;
如果把代碼都放這個(gè)閉包函數(shù)中是臃腫且難以維護(hù)的;
所以就需要使用控制器了;
很顯然;控制器就是來替代這第二個(gè)參數(shù)的閉包函數(shù)的;
寫起來也非常簡(jiǎn)單直接寫控制器名即可;
然后用 @ 符號(hào)分割控制器和控制器的方法
Route::get("article/index", "ArticleController@index"); Route::get("article/create", "ArticleController@create"); Route::post("article/store", "ArticleController@store");
可以在控制器中寫點(diǎn)內(nèi)容;
訪問定義的路由就可以看到內(nèi)容了;
一切都是這么的完美;
但是如果你和我一樣帥;
額;不是;
如果你和我一樣懶且善于總結(jié)思考;
你會(huì)發(fā)現(xiàn)這三條路由都是以 article/ 為前綴的;
在路由中我們應(yīng)該怎么減少這種重復(fù)呢?
這就是我們接著要講的分組的概念;
路由組就是把一些有相同特性的路由放在一個(gè)組里面;
我們先來定義一個(gè)前綴路由組;
上面這3條路由就可以改造成這個(gè)樣子了;
Route::prefix("article")->group(function () { Route::get("index", "ArticleController@index"); Route::get("create", "ArticleController@create"); Route::post("store", "ArticleController@store"); });隨著項(xiàng)目的擴(kuò)大;
如果控制器都直接放在 app/Http/Controllers 目錄下的話;
那維護(hù)起來也開始略頭疼了;
于是就可以為控制器分目錄存放了;
比如說我要建一個(gè) app/Http/Controllers/Admin/ArticleController.php;
再建一個(gè) app/Http/Controllers/Home/ArticleController.php ;
命令行也是可以加目錄的;
php artisan make:controller Admin/ArticleController --resource
php artisan make:controller Home/ArticleController --resource
再在新建的控制器中寫點(diǎn)內(nèi)容加以區(qū)分;
這種多級(jí)目錄是不需要指明目錄的;
只需要指明相對(duì)于app/Http/Controllers 目錄的 namespace 即可;
Route::prefix("admin/article")->namespace("Admin")->group(function () { Route::get("index", "ArticleController@index"); Route::get("create", "ArticleController@create"); Route::post("store", "ArticleController@store"); });
group 是可以嵌套的;
那么上面這樣的路由還可以改造下;
Route::prefix("home")->namespace("Home")->group(function () { Route::prefix("article")->group(function () { Route::get("index", "ArticleController@index"); Route::get("create", "ArticleController@create"); Route::post("store", "ArticleController@store"); }); });
訪問起來就是這樣的了;
因?yàn)?Admin 目錄下我們還會(huì)創(chuàng)建更多的路由器;
所以;我們應(yīng)該使用 group 嵌套的這種方式;
比如說我們?cè)儆幸粋€(gè) app/Http/Controllers/Admin/TagController.php;
那路由就是這樣的了;
Route::prefix("home")->namespace("Home")->group(function () { Route::prefix("article")->group(function () { Route::get("index", "ArticleController@index"); Route::get("create", "ArticleController@create"); Route::post("store", "ArticleController@store"); }); Route::prefix("tag")->group(function () { Route::get("index", "TagController@index"); Route::get("create", "TagController@create"); Route::post("store", "TagController@store"); }); });
除了文檔上講的這種方式;
其實(shí)以前版本的 laravel 還有另一種定義路由組的方式;
Route::group(["prefix"=>"admin", "namespace"=>"Admin"], function () { Route::group(["prefix"=>"article"], function () { Route::get("index", "ArticleController@index"); Route::get("create", "ArticleController@create"); Route::post("store", "ArticleController@store"); }); });
就是把 prefix 和 namespace 這些都作為 group 方法的第一個(gè)參數(shù);
不過現(xiàn)在不推薦這種寫法了;
不過因?yàn)楹芏嘁郧暗捻?xiàng)目都是這樣寫的;
這里講一下讓童鞋們查看別人以前的項(xiàng)目的時(shí)候能理解而不迷茫;
為了講解的簡(jiǎn)單;
我們回到 app/Http/Controllers/ArticleController.php 文件接著往下看;
會(huì)發(fā)現(xiàn)命令行創(chuàng)建的控制器里面有個(gè) edit 方法;
public function edit($id) { // }
edit 方法有個(gè) $id 參數(shù);
這個(gè)參數(shù)是干什么用的呢?
通過名字我們很容易就明白這是用來修改數(shù)據(jù)的;
id 一般又是數(shù)據(jù)庫的自增字段;
那這就是要修改指定 id 的數(shù)據(jù)了;
但是這個(gè) id 是哪傳來的呢?
下面就到了講解路由參數(shù)的時(shí)候了;
定義路由的時(shí)候我們是可以定義路由參數(shù)的;
我們接著上面的路由加一個(gè) edit 的;
Route::prefix("article")->group(function () { Route::get("index", "ArticleController@index"); Route::get("create", "ArticleController@create"); Route::post("store", "ArticleController@store"); Route::get("edit/{id}", "ArticleController@edit"); });
我們?cè)诙x路由的時(shí)候用花括號(hào)包一個(gè)變量名;
那這個(gè)變量就可以直接傳到控制器方法中;
然后在地址欄傳什么控制器中就可以接到什么;
為了方便測(cè)試我們?cè)谶@個(gè)方法中返回 id ;
public function edit($id) { return "地址欄傳的參數(shù)是:".$id; }
攜帶著路由參數(shù)通過路由訪問這個(gè)方法;
這里面有個(gè)容易栽跟頭的地方;
就是控制器中的參數(shù)名跟路由參數(shù)名不是必須相同的;
也就是說我這樣寫也是可以的;
public function edit($a) { return "地址欄傳的參數(shù)是:".$a; }
一個(gè)路由參數(shù)的時(shí)候這倒不會(huì)覺得什么;
一旦定義多個(gè)路由參數(shù)的時(shí)候;
這個(gè)坑就真的坑了;
Route::prefix("article")->group(function () { // ... Route::get("edit/{id}/{name}", "ArticleController@edit"); });
在控制器中獲取路由參數(shù)的時(shí)候;
public function edit($name, $id) { return "id是:" . $id . "
name是:" . $name; }
訪問 http://bjyblog.test/article/edit/666a/白俊遙 ;
在你以為閉著眼都知道結(jié)果的時(shí)候;
一只碩大的幺蛾子飛了過來;
你發(fā)現(xiàn) id 和 name 沒對(duì)上;
該敲黑板畫重點(diǎn)了筒子們;
路由參數(shù)中的第一個(gè)參數(shù)對(duì)應(yīng)控制器中的第一個(gè)路由參數(shù);
以此類推;
在控制器中路由參數(shù)跟參數(shù)名是沒關(guān)系的;
只跟順序有關(guān);
再個(gè) id 一般都是純數(shù)字;
這里卻傳了字母 ;
我們應(yīng)該怎么約束下 id 呢?
laravel 方方面面都為我們考慮到了;
我們加個(gè) where 就行了;
Route::prefix("article")->group(function () { // ... Route::get("edit/{id}/{name}", "ArticleController@edit")->where("id", "[0-9]+"); });
這樣就只能傳數(shù)字了;
其實(shí)大多的表都是用 id 做主鍵的;
如果每個(gè)路由都手動(dòng)定義一遍約束;
那也是挺麻煩的;
laravel 又一次方方面面都為我們考慮到了;
找到 app/Providers/RouteServiceProvider.php 這個(gè)文件;
在 boot 方法中可以定義全局約束;
public function boot() { Route::pattern("id", "[0-9]+"); parent::boot(); }
這樣就不需要為每條帶 id 參數(shù)的路由定義約束了;
以后所有帶 id 參數(shù)的路由就只能傳數(shù)字了;
不懂這個(gè) RouteServiceProvider 的話沒關(guān)系不要糾結(jié)在這;
就先當(dāng)是固定用法;
以后慢慢懂;
路由參數(shù)?請(qǐng)求參數(shù)?傻傻分不清楚;
舉個(gè)栗子;
Route::prefix("article")->group(function () { // ... Route::get("edit/{id}/{name}", "ArticleController@edit"); });
bjyblog.test/article/edit/666/白俊遙?music=越過山丘&book=平凡世界
id 和 name 就是路由參數(shù);
music 和 book 就是請(qǐng)求參數(shù);
路由參數(shù)的獲取我們已經(jīng)會(huì)了;
那請(qǐng)求參數(shù)怎么獲取呢?
我們?cè)倩乜刂破髦修D(zhuǎn)悠轉(zhuǎn)悠還會(huì)發(fā)現(xiàn) update 方法;
public function update(Request $request, $id) { // }
這個(gè) Request $request 就是我們用來獲取請(qǐng)求參數(shù)的關(guān)鍵;
它的意思是向控制器的方法傳一個(gè) $request 它是一個(gè) Request 類;
我們可以把我們的 edit 方法也加個(gè) $request ;
public function edit(Request $request, $id, $name) { $music = $request->input("music"); $book = request()->input("book"); $str = <<name: $name
music: $music
book: $book
php; return $str; }
這個(gè) Request $request 是不會(huì)影響路由參數(shù)的順序的;
它放前放后都是可以的;
我們?cè)L問這個(gè)方法并攜帶請(qǐng)求參數(shù);
Request 類有一個(gè) input 方法;
把要獲取的參數(shù)名傳給它就可以了;
我上面示例中還用了個(gè) request() 函數(shù);
它跟 Request $request 效果是一樣的;
$request 可以方便復(fù)用;
所以在控制器中更推薦使用 $request ;
如果傳的請(qǐng)求參數(shù)比較多的時(shí)候;
這樣一個(gè)一個(gè)的獲取還是麻煩;
Request 還有個(gè) all 方法就可以獲取全部的請(qǐng)求參數(shù);
public function edit(Request $request, $id, $name) { dump($request->all()); }
dump 是 laravel 自帶的一個(gè)打印函數(shù);
就是 php 自帶的 var_dump 函數(shù)的升級(jí)版;
打印出來的效果是這樣的;
如果想打印數(shù)據(jù)并 die 掉可以使用 dd() 函數(shù);
如果只想從一大堆請(qǐng)求參數(shù)中獲取指定的請(qǐng)求參數(shù)
Request 還有個(gè) only 方法;
public function edit(Request $request, $id, $name) { dump($request->only("music", "book")); }
那如果想排除某個(gè)參數(shù)剩下的全要呢?
Request 還有個(gè) except 方法;
public function edit(Request $request, $id, $name) { dump($request->except("music")); }
再次贊美 laravel 的體貼周到;
本文為白俊遙原創(chuàng)文章,轉(zhuǎn)載無需和我聯(lián)系,但請(qǐng)注明來自白俊遙博客 https://baijunyao.com
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/26330.html
摘要:最適合入門的初級(jí)教程一為什么選擇曾經(jīng)要跟白頭到老沒想到它升了個(gè)級(jí)就拋了錨把我等拋棄了痛定思痛重新審視了一遍框架是世界上最好的語言這個(gè)沒有疑問吧如果有那絕對(duì)是個(gè)異教徒這是要被拖出去燒死的信仰的問題神圣不可侵犯那最好的語言中最流行的框架是哪個(gè)呢 最適合入門的 Laravel 初級(jí)教程 (一) 為什么選擇 laravel 曾經(jīng)要跟 thinkphp 白頭到老;沒想到它升了個(gè)級(jí)就拋了錨;把我等...
摘要:原文發(fā)表在我的個(gè)人網(wǎng)站系列入門教程四最適合中國(guó)人的教程本教程示例代碼見大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。 原文發(fā)表在我的個(gè)人網(wǎng)站:Laravel 5 系列入門教程(四)【最適合中國(guó)人的 Laravel 教程】 本教程示例代碼見:https://github.com/johnlui/Learn-Laravel-5 大家在任何地方卡住,最快捷...
摘要:最適合入門的初級(jí)教程二看這篇文章的時(shí)候你需要安裝好配置好本地環(huán)境環(huán)境搞定后咱來說的下載這里先解決一些童鞋可能有的疑惑的版本更新的那么快從到現(xiàn)在的了我應(yīng)該下載那個(gè)學(xué)習(xí)呢新出的版本的文檔資料豐富么作為一個(gè)過來人可以大膽的說學(xué)習(xí)最新版本沒問題除了 最適合入門的 Laravel 初級(jí)教程 (二) 看這篇文章的時(shí)候;你需要安裝好 composer ;配置好本地環(huán)境; 環(huán)境搞定后; 咱來說lara...
摘要:原文發(fā)表在我的個(gè)人網(wǎng)站系列入門教程三最適合中國(guó)人的教程本教程示例代碼見大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。教程三代碼快照下一步系列入門教程四最適合中國(guó)人的教程完結(jié) 原文發(fā)表在我的個(gè)人網(wǎng)站:Laravel 5 系列入門教程(三)【最適合中國(guó)人的 Laravel 教程】 本教程示例代碼見:https://github.com/johnlui/Learn-L...
摘要:原文發(fā)表在我的個(gè)人網(wǎng)站系列入門教程二最適合中國(guó)人的教程本教程示例代碼見大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。 原文發(fā)表在我的個(gè)人網(wǎng)站:Laravel 5 系列入門教程(二)【最適合中國(guó)人的 Laravel 教程】 本教程示例代碼見:https://github.com/johnlui/Learn-Laravel-5 大家在任何地方卡住,最快捷...
閱讀 2397·2021-11-18 10:02
閱讀 3582·2021-11-15 11:36
閱讀 1187·2019-08-30 14:03
閱讀 838·2019-08-30 11:08
閱讀 2828·2019-08-29 13:20
閱讀 3379·2019-08-29 12:34
閱讀 1448·2019-08-28 18:30
閱讀 1703·2019-08-26 13:34