路由
基本路由
应用中的大多数路都会定义在 app/routes.php
文件中。最简单的Laravel路由由URI和闭包回调函数组成。
基本 GET 路由
Route::get('/', function()
{
return 'Hello World';
});
基本 POST 路由
Route::post('foo/bar', function()
{
return 'Hello World';
});
注册一个可以响应任何HTTP动作的路由
Route::any('foo', function()
{
return 'Hello World';
});
仅支持HTTPS的路由
Route::get('foo', array('https', function()
{
return 'Must be over HTTPS';
}));
实际开发中经常需要根据路由生成 URL,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]+');
传递参数限定的数组
当然,必要的时候你还可以传递一个包含参数限定的数组作为参数:
Route::get('user/{id}/{name}', function($id, $name)
{
//
})
->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))
定义全局模式
如果希望在全局范围用指定正则表达式限定路由参数,可以使用 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/filter.php
文件中。
定义一个路由过滤器
Route::filter('old', function()
{
if (Input::get('age') < 200)
{
return Redirect::to('home');
}
});
如果从路由过滤器中返回了一个response,那么该response将被认为对应的是此次request,路由将不会被执行,并且,此路由中所有定义在此过滤器之后的代码也都不会被执行。
为路由绑定过滤器
Route::get('user', array('before' => 'old', function()
{
return 'You are over 200 years old!';
}));
将过滤器绑定为控制器Action
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::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, $value)
{
//
});
基于模式的过滤器
你也可以指针对URI为一组路由指定过滤器。
Route::filter('admin', function()
{
//
});
Route::when('admin/*', 'admin');
上述案例中,admin
过滤器将会应用到所有以admin/
开头的路由中。星号是通配符,将会匹配任意多个字符的组合。
还可以针对HTTP动作限定模式过滤器:
Route::when('admin/*', 'admin', array('post'));
过滤器类
过滤器的高级用法中,还可以使用类来替代闭包函数。由于过滤器类是通过IoC container实现解析的,所有,你可以在这些过滤器中利用依赖注入(dependency injection)的方法实现更好的测试能力。
定义一个过滤器类
class FooFilter {
public function filter()
{
// Filter logic...
}
}