全部路由都定義在 App\Providers\RouteServiceProvider 類載入的 app/Http/routes.php文件中。php
簡單的 Laravel 路由只接受一個 URI 和一個閉包html
Route::get('foo', function () { return 'Hello, Laravel!'; });
對於常見的 HTTP 請求,Laravel 有如下幾種路由laravel
Route::get($uri, $callback); //響應 get 請求 Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback); Route::match(['get', 'post'], $uri, $callback); //響應 get, post 請求 Route::any('foo', $callback); //響應全部請求
其中,$callback 能夠是一個閉包,也能夠是一個控制器方法。實際上,在開發中有很多狀況是用做控制器方法的。數組
//單個路由參數 Route::get('user/{id}', function ($id) { return 'User '.$id; }); //多個路由參數 Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { // }); //單個路由參數(可選) Route::get('user/{id?}', function ($id = 1) { return 'User '.$id; }); //多個路由參數(可選) Route::get('posts/{post}/comments/{comment?}', function ($postId, $commentId = 1) { // }); //注意:多個參數時,只能夠對最後一個參數設置可選,其餘位置設置可選會解析錯誤 // 正則約束單個參數 Route::get('user/{name?}', function ($name = 'Jone') { return $name; })->where('name', '\w+'); //約束參數爲單詞字符(數字、字母、下劃線) // 正則約束多個參數 Route::get('user/{id}/{name}', function ($id, $name) { // })->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
使用 Artisan 命令建立 php artisan make:controller UserController 服務器
如今,在 app/Http/Controllers 這個控制器目錄下就生成了 UserController.php 的控制器文件。閉包
//命名閉包路由 Route:get('user', array('as' => 'alial', function(){}); //或 name 方法鏈 Route:get('user', function(){})->name('alias'); //命名控制器方法路由 Route:get('user', array('uses' => 'Admin\IndexController@index', 'as' => 'alias')); //或 name 方法鏈 Route:get('user', 'Admin\IndexController@index')->name('alias'));
2.1 路由前綴和命名空間app
例如,有兩條指向控制器方法的路由ide
Route::get('admin/login', 'Admin\IndexController@login'); Route::get('admin/index', 'Admin\IndexController@index');
拿第一條來講,post
參數一:admin/login 表示這個 URI 在請求網站根目錄下的 admin/login 資源,完整地址就是 http://域名/admin/login (這裏開啓了 Apache 的路由重寫,隱藏了 「index.php「 ),這個請求被映射到第二個參數中指定的控制器方法。注意,網站根目錄是入口文件所在目錄,在 Laravel 中就是 public 目錄,配置服務器時最好也指向這裏。網站
參數二:Admin\IndexController@login 表示這個控制器方法是在 App\Http\Controllers 命名空間下的,連起來就是 App\Http\Controllers\Admin\IndexController 控制器裏的 login 方法。
顯然,兩條路由的 URI 和 控制器方法 都有相同的部分,那麼,啓用路由分組能夠提取出公共部分:
// 第一個數組參數中,prefix 鍵定義 URI 的公共部分,namespace 鍵定義方法名(命名空間語法)的公共部分 Route::group(array('prefix' => 'admin', 'namespace' => 'Admin'), function(){ Route::get('login', 'IndexController@login'); Route::get('index', 'IndexController@index'); });
2.2 資源路由
資源路由就是映射到資源控制器的路由,Laravel 資源控制器內置了對資源增刪改查的 7 個方法以及 7 條路由。
首先,建立資源控制器 ArticleController
php artisan make:controller Admin/ArticleController --resource
這樣就生成了資源控制器在 app/Http/Controllers/Admin/ArticleController.php 文件(Admin 文件夾不存在時會自動建立),內置的 7 個方法以下 :
<?php namespace App\Http\Controllers\Admin; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class LinksController extends Controller { /** * 顯示一個資源的列表 * * @return \Illuminate\Http\Response */ public function index() { // } /** * 顯示一個表單來建立一個新的資源 * * @return \Illuminate\Http\Response */ public function create() { // } /** * 保存最新建立的資源 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * 顯示指定的資源 * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { // } /** * 顯示一個表單來編輯指定的資源 * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * 更新指定的資源 * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * 刪除指定的資源 * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } }
而後,定義資源路由 。這裏我仍是選擇在路由分組下定義,定義一條就好
Route::group(array('prefix' => 'admin', 'namespace' => 'Admin'), function(){ Route::get('login', 'IndexController@login'); Route::get('index', 'IndexController@index'); // 資源路由 Route::resource('article', 'ArticleController'); });
最後,查看路由。有了資源控制器 和 資源路由,就能夠看一下對以上 7 個方法的 HTTP 請求方式了。
使用 Artisan 命令 php artisan route:list 列出當前的全部路由,請求方式、URI、控制器方法、中間件都羅列出來了。
推薦閱讀:有關 Laravel 的 HTTP 路由知識點還有 路由模型綁定、表單方法僞造 和 CSRF 保護等知識,詳細請參考 Laravel 手冊-HTTP路由功能。
相關閱讀:URI 和 URL 的區別