首页 > 代码库 > Laravel 5.2 二、HTTP(高级)路由与创建控制器

Laravel 5.2 二、HTTP(高级)路由与创建控制器

1.HTTP路由

参照文档,所有路由都定义在 App\Providers\RouteServiceProvider 类载入的 app/Http/routes.php文件中。

1.1基本路由

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Route::match([‘get‘, ‘post‘], ‘/‘, $callback); //响应get, post请求
Route::any(‘foo‘, $callback); //响应所有请求

其中,uri是相对项目根目录的url,callback是可以是一个闭包,也可以是一个控制器动作。

如果对 uri 和 url 的区别有兴趣,可以参考 http://www.cnblogs.com/gaojing/archive/2012/02/04/2413626.html

1.2路由参数

//单个路由参数
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 = 2) {
    return $name;
})->where(‘name‘, ‘\d+‘);  //约束参数为数字

// 正则约束多个参数
Route::get(‘user/{id}/{name}‘, function ($id, $name) {
    //
})->where([‘id‘ => ‘[0-9]+‘, ‘name‘ => ‘[a-z]+‘]);

 

2.创建控制器

2.1手动创建

<?php
namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;

class IndexController extends Controller
{
    public function index($id)
    {
        return $id;
    }
}

然后在routes.php定义指向该控制器动作的路由

Route::get(‘user/{id}‘, ‘IndexController@index‘);

2.2 Artisan方法创建

cmd窗口进入项目根目录,输入

php artisan make:controller UserController

这将在app/Http/Controllers/目录下创建UserController控制器。

注意,如果在app/Http/Controllers/目录下新建后台控制器目录 Admin/ ,需要在控制器文件中修正命名空间

 

3.高级路由

3.1命名路由

//命名闭包路由
Route:get(‘user‘, array(function(){},‘as‘ => ‘alias‘); 
或
Route:get(‘user‘, array(function(){})->name(‘alias‘);

//命名控制器路由
Route:get(‘user‘, array(‘uses‘ => ‘Admin\IndexController@index‘, ‘as‘ => ‘alias‘)); 
或
Route:get(‘user‘, array(‘uses‘ => ‘Admin\IndexController@index‘})->name(‘alias‘);

3.2路由分组

3.2.1路由前缀和命名空间

例如,有两个指向后台控制器动作的路由

Route::get(‘admin/login‘, ‘Admin\IndexController@login‘);
Route::get(‘admin/index‘, ‘Admin\IndexController@index‘);

显然,URI 和 控制器动作 中都有相同的部分,那么,我们启用路由分组来看看

//prefix 定义url前缀,namespace 定义命名空间
Route::group(array(‘prefix‘ => ‘admin‘, ‘namespace‘ => ‘Admin‘), function(){
    Route::get(‘login‘, ‘IndexController@login‘);
    Route::get(‘index‘, ‘IndexController@index‘);
});

嗯,好多了,后期调整会方便些。

3.2.2资源路由

1.创建资源控制器 ArticleController

php artisan make:controller ArticleController

为它添加手动方法public function article(){}

2.定义资源路由 

这里我还是选择在路由分组下定义

Route::group(array(‘prefix‘ => ‘admin‘, ‘namespace‘ => ‘Admin‘), function(){
     Route::get(‘login‘, ‘IndexController@login‘);
     Route::get(‘index‘, ‘IndexController@index‘);
     Route::resource(‘article‘, ‘ArticleController‘);
});

3.查看路由

php artisan route:list //列出当前的所有路由

看到生成了很多的资源路由:

技术分享

这就是资源路由的好处了吧,定义一条生成很多嘛,我们只需在Admin\Article 控制器下添加上面列表中的这些方法就行了。

4.测试

在测试这些方法时,我使用了 Chrome 浏览器的 postman 插件。在测试 post 方法时,出现了CSRF错误,解决方法参考 http://www.cnblogs.com/HD/p/4555369.html

 

Laravel 5.2 二、HTTP(高级)路由与创建控制器