一、HTTP路由 所有路由都定義在 App\Providers\RouteServiceProvider 類載入的 app/Http/routes.php文件中。 1. 基本路由 簡單的 Laravel 路由只接受一個 URI 和一個閉包 1 2 3 Route::get('foo', functi ...
一、HTTP路由
所有路由都定義在 App\Providers\RouteServiceProvider 類載入的 app/Http/routes.php文件中。
1. 基本路由
簡單的 Laravel 路由只接受一個 URI 和一個閉包
1 2 3 |
Route::get( 'foo' , function () {
return 'Hello, Laravel!' ;
});
|
對於常見的 HTTP 請求,Laravel 有以下幾種路由
1 2 3 4 5 6 7 8 9 |
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 可以是一個閉包,也可以是一個控制器方法。實際上,在開發中有不少情況是用作控制器方法的。
2. 路由參數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//單個路由參數
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 的控制器文件。
三、高級路由
1. 命名路由
1 2 3 4 5 6 7 8 9 |
//命名閉包路由
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. 路由分組
2.1 路由首碼和命名空間
例如,有兩條指向控制器方法的路由
1 2 |
Route::get( 'admin/login' , 'Admin\IndexController@login' );
Route::get( 'admin/index' , 'Admin\IndexController@index' );
|
拿第一條來說,
參數一: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 和 控制器方法 都有相同的部分,那麼,啟用路由分組可以提取出公共部分:
1 2 3 4 5 |
// 第一個數組參數中,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
1 |
php artisan make:controller Admin/ArticleController --resource
|
這樣就生成了資源控制器在 app/Http/Controllers/Admin/ArticleController.php 文件(Admin 文件夾不存在時會自動創建),內置的 7 個方法如下 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
<?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 )
{
//
}
}
|
然後,定義資源路由 。這裡我還是選擇在路由分組下定義,定義一條就好
1 2 3 4 5 6 |
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、控制器方法、中間件都羅列出來了。