路由

目录

基础介绍

Laravel应用了自PHP 5.3之后的最新特性, 让路由功能更加简单和直观. 最重要的一点是, 你可以通过阅读和参照API文档后,仅凭借路由就可以实现一个复杂Web应用的所有需求. 路由规则定义在application/routes.php文件中.

不像其他的框架, Laravel允许用两种方式来定义应用程序逻辑. 控制器是最常见实现应用程序逻辑的方式, Laravel也允许将你的逻辑控制直接嵌入到路由中. 这一方式尤其适用于小型网站, 通常这些网站只有少量的页面, 你没有必要创建一堆只是用来暴露访问方法的控制器, 或者在同一个控制其中加入一些无关方法, 通常这些方法只是实现了简单的路由而已.

在下面的示例中, 方法中的第一参数是你要"注册"的请求路由. 第二个参数是一个用来指定路由逻辑的函数. 被定义的路由参数不要包含前面的正斜线. 唯一的例外是只用一条正斜线来标识根路由.

提示: 路由按照他们被注册的先后顺序生效并执行, 所以注册的"catch-all(捕获所有)"路由规则要放在routes.php文件的最下方.

注册一个基于GET方法的根路由 "GET /":

Route::get('/', function()
{
    return "Hello World!";
});

注册一个用来匹配任何HTTP提交方式的根路由 (GET, POST, PUT, 和 DELETE):

Route::any('/', function()
{
    return "Hello World!";
});

为其他请求(根目录之外)注册路由:

Route::post('user', function()
{
    //
});

Route::put('user/(:num)', function($id)
{
    //
});

Route::delete('user/(:num)', function($id)
{
    //
});

为一个URI的不同提交方式注册相同的路由:

Router::register(array('GET', 'POST'), $uri, $callback);

通配符

强制标识URI的某段是数字:

Route::get('user/(:num)', function($id)
{
    //
});

允许URI的某段为字母或数字:

Route::get('post/(:any)', function($title)
{
    //
});

允许URI的某段为可选的:

Route::get('page/(:any?)', function($page = 'index')
{
    //
});

404事件

如果一个请求没有找到任何匹配的路由规则, 404事件将要被激活. 你可以在application/routes.php文件中找到默认的事件处理方法.

默认的404事件处理:

Event::listen('404', function()
{
    return Response::error('404');
});

你可以自由的为自己的程序改变这一配置!

更多相关:

过滤器

路由过滤器可以在路由规则生效之前或者之后被执行. 如果一个"前置"过滤器返回一个值, 则这个值就会为当作此次请求的返回值, 路由将不会被执行, 这是一种及其方便的方式. 如权限认证过滤器等等...,过滤器也被定义在application/routes.php文件之中.

注册一个过滤器:

Route::filter('filter', function()
{
    return Redirect::to('home');
});

将这个过滤器绑定要路由之上:

Route::get('blocked', array('before' => 'filter', function()
{
    return View::make('blocked');
}));

绑定一个"后置"过滤器到路由:

Route::get('download', array('after' => 'log', function()
{
    //
}));

将多个过滤器绑定要路由之上:

Route::get('create', array('before' => 'auth|csrf', function()
{
    //
}));

传递参数到过滤器:

Route::get('panel', array('before' => 'role:admin', function()
{
    //
}));

模式过滤器

有时候, 你也许想绑定一个过滤器到所有已指定的URI开头的路由之上. 例如, 你可能会想将名为"auth"的过滤器绑定到以"admin"开头的路由之上. 下面是实现方法:

定义一个基本的模式过滤器:

Route::filter('pattern: admin/*', 'auth');

全局过滤器

Laravel有两个"全局"过滤器, 一个前置过滤, 一个 后置过滤, 过滤所有应用请求. 你可以在application/routes.php文件中找到他们. 这两个过滤器是用来开启通用bundle和添加全局asset的重要地方.

提示: 后置 过滤器接受当前请求的Response对象.

路由组

路由组允许你绑定一系列的属性到一组路由之中, 让你保证代码的干净整洁.

Route::group(array('before' => 'auth'), function()
{
    Route::get('panel', function()
    {
        //
    });

    Route::get('dashboard', function()
    {
        //
    });
});

基于名字的路由

不断生成的URLs和基于路由的重定向也许会在后期的路由的改变中暴露出问题. 因此, 为路由指定一个名字, 会给你提供一个简单的可以在整个应用程序中调用路由的方式. 一旦路由有改变, 你无需更改任何的配置文件, 链接就会指定到新的路由之上.

注册一个基于名字的路由:

Route::get('/', array('as' => 'home', function()
{
    return "Hello World";
}));

依照路由名称生成URL链接:

$url = URL::to_route('home');

跳转到一个基于名字的路由:

return Redirect::to_route('home');

一旦你已经命名了一个路由, 你可以很容易地检查出当前的请求是否满足某一个路由规则.

判定当前处理请求的路由是否有一个给定的名称:

if (Request::route()->is('home'))
{
    // The "home" route is handling the request!
}

HTTPS路由

定义路由时, 要实现基于HTTPS协议的URL生成或跳转, 你可以通过"https"属性指定使用HTTPS协议.

定义一个HTTPS路由:

Route::get('login', array('https' => true, function()
{
    return View::make('login');
}));

通过使用"secure"缩写方法实现基于HTTPS协议的路由:

Route::secure('GET', 'login', function()
{
    return View::make('login');
});

Bundle路由

Bundles是Laravel的模块化的软件包管理系统. Bundle可以被简单的配置以实现处理程序请求. 前往bundles详细介绍文档. 现在, 阅读这一章节, 并意识到路由不只是可以在bundle中被定义为功能模块也可以在bundle中被注册.

打开application/bundles.php 文件添加下面内容:

注册一个用来处理路由的bundle:

return array(

    'admin' => array('handles' => 'admin'),

);

注意这个新的在配置数组里的 handles选项!他告诉Laravel在有以"admin"开头的请求中自动加载Admin bundle.

现在为你的bundle注册一些路由规则,在你的bundle文件夹下建立routes.php文件添加下面的代码:

为bundle注册一个根路由:

Route::get('(:bundle)', function()
{
    return 'Welcome to the Admin bundle!';
});

让我们分析下这个示例. 注意(:bundle)占位符! 他将会被你注册的bundle名称所替换. 保持你的代码的D.R.Y.(不要重复你自己)允许bundle使用者在不破坏你的路由规则的前提下改变他的根路径! 牛, 这样做就对了!

当然, 你可以把(:bundle)占位符应用到到所有的路由规则,不只是根路由.

注册一个bundle路由:

Route::get('(:bundle)/panel', function()
{
    return "I handle requests to admin/panel!";
});

控制器路由

控制器提供了一个操作应用逻辑的另外一种方法. 如果你还不熟悉控制器, 你可以在阅读控制器章节之后再返回到当前位置继续阅读.

你要意识到, Laravel中所有的路由都要被明确的定义, 其中包括跳转到控制器的路由. 也就是说, 没有通过路由注册的控制器是不可以被访问到的. 可以通过控制器路由注册自动暴露控制器的所有方法. 控制器路由的注册被定义在application/routes.php文件中.

通常情况下, 你也许想注册"controllers"文件夹下的所有控制器. 你可以用一句简单的语句来实现. 如下所示:

为应用程序注册所有的控制器:

Route::controller(Controller::detect());

Controller::detect 方法返回一个所有控制器的数组.

如果你想检测一个bundle的控制器, 只需将bundle名称传入到方法中. 如过没指定bundle(参数为空)application下的directory文件夹将会被搜索.

注册"admin"bundle下的所有控制器:

Route::controller(Controller::detect('admin'));

注册名为"home"控制器:

Route::controller('home');

注册多个控制器:

Route::controller(array('dashboard.panel', 'admin'));

一旦一个controller被注册你可以通过基本的URI约定规则来访问这些方法.

http://localhost/controller/method/arguments

这种约定很像CodeIgniter和其他主流框架的约定规则, 第一个片段是控制器名称, 第二个是方法名称, 剩下的是传入到方法的参数, 如果不存在方法名称则默认的index方法将会被访问到.

对每一种情况, 此路由约定未必都可取, 所以你可以用Laravel简单, 直观的语法为控制器和方法定义特定的路由URIs.

注册一个路由指定到特定的控制器和动作:

Route::get('welcome', 'home@index');

注册一个路由并指定过滤器到特定的控制器和动作:

Route::get('welcome', array('after' => 'log', 'uses' => 'home@index'));

注册一个基于名字的路由指定到特定的控制器和动作:

Route::get('welcome', array('as' => 'home.welcome', 'uses' => 'home@index'));

CLI路由测试

你可以通过Laravel的"Artisan"命令行工具进行路由测试. 简单指定您要使用的请求方法和URI. 这条路由的回应将以var_dump的形式返回到命令行中.

通过"Artisan"命令行进行路由测试:

php artisan route:call get api/user/1