一、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
|
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、控制器方法、中间件都罗列出来了。