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