欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Laravel 5.2 二、HTTP路由、创建控制器 与 资源路由

程序员文章站 2022-04-18 14:55:10
一、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、控制器方法、中间件都罗列出来了。

Laravel 5.2 二、HTTP路由、创建控制器 与 资源路由