跳到主要内容
版本:4.2

路由

基本路由

应用程序大多数的路由都会被定义在 app/routes.php 中。最简单的一个路由是由一个 URI 和闭包回调(Closure callback)构成的。

基本 GET 路由

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

基本 POST 路由

Route::post('foo/bar', function()
{
return 'Hello World';
});

在一个路由中注册多种请求

Route::match(array('GET', 'POST'), '/', function()
{
return 'Hello World';
});

在一个路由中回应所有 HTTP 请求

Route::any('foo', function()
{
return 'Hello World';
});

强制路由使用 HTTPS

Route::get('foo', array('https', function()
{
return 'Must be over HTTPS';
}));

通常情况下,您需要生成 URLs 到你的路由中,您可以使用 URL::to 方法来实现:

$url = URL::to('foo');

路由参数

Route::get('user/{id}', function($id)
{
return 'User '.$id;
});

可选路由参数

Route::get('user/{name?}', function($name = null)
{
return $name;
});

带默认值的可选路由参数

Route::get('user/{name?}', function($name = 'John')
{
return $name;
});

正规表达式路由

Route::get('user/{name}', function($name)
{
//
})
->where('name', '[A-Za-z]+');

Route::get('user/{id}', function($id)
{
//
})
->where('id', '[0-9]+');

传递数组并使用 Where 筛选

如果需要,您可以传递限制条件的数组:

Route::get('user/{id}/{name}', function($id, $name)
{
//
})
->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))

定义全局正则表达式 Pattern

如果您有常用的正则表达式 Pattern,您可以使用 pattern 方法:

Route::pattern('id', '[0-9]+');

Route::get('user/{id}', function($id)
{
// Only called if {id} is numeric.
});

获取路由参数值

如果您要在路由之外获取路由参数值,您可以使用 Route::input 方法:

Route::filter('foo', function()
{
if (Route::input('id') == 1)
{
//
}
});

路由筛选器

路由筛选器能便捷的给指定的路由提供访问限制,这对于您的站点需要认证的情况下非常有用。在 Laravel 框架中包含了数个筛选器,如 auth, auth.basic, guestcsrf 筛选器。他们都放在 app/filters.php 中。

注意

路由筛选器在应用环境为 testing 下是无效的。

定义一个路由筛选器

Route::filter('old', function()
{
if (Input::get('age') < 200)
{
return Redirect::to('home');
}
});

如果筛选器有了回应,这个回应将会直接被视为该请求的回应,且路由将不会继续被执行,任何路由的 after 筛选器都将直接被取消。

对路由加上筛选器

Route::get('user', array('before' => 'old', function()
{
return 'You are over 200 years old!';
}));

对控制器动作加上筛选器

Route::get('user', array('before' => 'old', 'uses' => 'UserController@showProfile'));

对单一路由加上多个筛选器

Route::get('user', array('before' => 'auth|old', function()
{
return 'You are authenticated and over 200 years old!';
}));

通过数组加上多个筛选器

Route::get('user', array('before' => array('auth', 'old'), function()
{
return 'You are authenticated and over 200 years old!';
}));

指定筛选器参数

Route::filter('age', function($route, $request, $value)
{
//
});

Route::get('user', array('before' => 'age:200', function()
{
return 'Hello World';
}));

在筛选器接收到一个 $response 会被当成第三个参数传递进筛选器:

Route::filter('log', function($route, $request, $response)
{
//
});

筛选器样式

您可以依据路由符合的 URI 来指定其筛选器:

Route::filter('admin', function()
{
//
});

Route::when('admin/*', 'admin');

在上面的例子中,admin 筛选器将会套用在所有以 admin/ 开头的路由中。* 通常用作通配符,他会匹配任何的字串组合。

您一样可以筛选指定的 HTTP 动作:

Route::when('admin/*', 'admin', array('post'));

筛选器类

进阶的筛选,您可以使用类来取代闭包。因为所有的类都可以通过 IoC Container 来实例化, 你可以利用依赖注入来获取更高的可测试性.

注册基于类的筛选器

Route::filter('foo', 'FooFilter');

默认下,FooFilter 类的 filter 方法将会被调用:

class FooFilter {

public function filter()
{
// Filter logic...
}

}

如果您不希望使用 filter 方法,只要指定其他方法即可:

Route::filter('foo', 'FooFilter@foo');

路由命名

路由命名在产生重定向跳转与 URLs 至路由时更为方便。您可以指定一个名称给指定的路由:

Route::get('user/profile', array('as' => 'profile', function()
{
//
}));

您一样可以为控制器动作指定一个路由名称:

Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@showProfile'));

现在您可以在产生 URLs 或重定向跳转时使用该路由名称:

$url = URL::route('profile');

$redirect = Redirect::route('profile');

您一样可以通过 currentRouteName 方法来取得正在执行中的路由名称:

$name = Route::currentRouteName();

路由群组

有时候您需要套用筛选器到一个群组的路由上。不需要为每个路由去套用筛选器,您只需使用路由群组:

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

Route::get('user/profile', function()
{
// Has Auth Filter
});
});

您一样可以在 group 数组中使用 namespace 参数,指定在这 group 中的控制器都有一个共同的命名空间:

Route::group(array('namespace' => 'Admin'), function()
{
//
});

子域名路由

Laravel 路由一样可以处理通配的子域名,并且从域名中传递您的通配符参数:

注册子域名路由

Route::group(array('domain' => '{account}.myapp.com'), function()
{

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

});

前缀路由

群组路由可以通过群组的描述数组中使用 prefix 选项,将群组内的路由加上前缀:

Route::group(array('prefix' => 'admin'), function()
{

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

});

路由模型绑定

模型绑定提供一个方便的方式将模型实体注入到您的路由中。例如,要注入一个用户 ID 您可以注入符合给定 ID 的整个用户模型实体。首先,使用 Route::model 方法可以指定作为参数的模型:

绑定参数至模型

Route::model('user', 'User');

接着,定义一个路由并包括一个 {user} 参数:

Route::get('profile/{user}', function(User $user)
{
//
});

既然我们绑定了 {user} 参数到 User 模型,则 User 实体就会被注入到路由内。因此,假定有一个请求送至 profile/1 则会注入一个 ID 为 1 的 User 实体。

注意

假如在数据库内没有任何一个模型实体符合,则会抛出 404 错误。

假如您想指定自定的「找不到」行为,您可以在 model 方法里的第三个参数指定一个 Closure:

Route::model('user', 'User', function()
{
throw new NotFoundHttpException;
});

在某些情况下,您可能会希望可以使用您自定义的路由绑定方式。这时您可以使用 Route::bind 方法来达成:

Route::bind('user', function($value, $route)
{
return User::where('name', $value)->first();
});

404 错误

有两种方式可以在路由内手动触发 404 错误。第一种是调用 App::abort 方法:

App::abort(404);

第二种,您可以抛出一个 Symfony\Component\HttpKernel\Exception\NotFoundHttpException 实体。

有关如何处理 404 异常状况和自定义回应的详细信息,可以参考 错误 章节内的说明。

控制器路由

Laravel 允许您不止可以路由至 Closures,也可以路由至控制器类,甚至可以路由至 资源控制器

更多详细信息可参考 控制器 一节内的说明。