路由
基本路由
应用程序大多数的路由都会被定义在 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
, guest
和 csrf
筛选器。他们都放在 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');