@fzbing
2015-07-10T20:52:00.000000Z
字数 3591
阅读 1397
学习笔记之Lumen
你将在 app/Http/routes.php file
为你的应用定义大多数的路由. 这个文件被 bootstrap/app.php
加载.
想Laravel
,Lumen
路由仅仅支持 URI
和 Closure
.
$app->get('/', function() {
return 'Hello World';
});
$app->post('foo/bar', function() {
return 'Hello World';
});
$app->patch('foo/bar', function() {
//
});
$app->put('foo/bar', function() {
//
});
$app->delete('foo/bar', function() {
//
});
你将经常性的需要为你的路由 生成URL
,你将用url helper
这样做:
$url = url('foo');
如果你对指向Controller
的路由感兴趣,请参见文档controllers
当然你可以在路由中捕获URI的部分,作为参数.
$app->get('user/{id}', function($id) {
return 'User '.$id;
});
Note: This is the only portion of Lumen that is not directly portable to the full Laravel framework. If you choose to upgrade your Lumen application to Laravel, your regular expression constraints must be moved to a where method call on the route.
唯一一部分与Laravel不一致.
$app->get('user/{name:[A-Za-z]+}', function($name) {
//
});
路由的命名允许你方便的生成 URLs 或者跳转到指定的路由.你可以用 as
作为key的一个数组 为一个路由命名.
$app->get('user/profile', ['as' => 'profile', function() {
//
}]);
你也可以为controller actions
指定路由名
$app->get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
当生成 URL或者跳转,你也可以用路由名了.
$url = route('profile');
$redirect = redirect()->route('profile');
有时,你可能想要为 一组路由 应用中间件(middleware
).而不是为每一个路由都指定一次middleware
.你可以用 route group
.
共享属性(Shared attributes
)在一个格式化的数组中被指定,作为$app->group()
方法的第一个属性
Middleware is applied to all routes within the group by defining the list of middleware with the middleware parameter on the group attribute array. Middleware will be executed in the order you define this array:
用middleware
参数在群组属性数组(the group attribute array
)中 定义一些middleware
,中间件将被应用到所有组(group
)的路由. 中间件将按照你定义在数组中的顺序的执行.
$app->group(['middleware' => 'foo|bar'], function($app)
{
$app->get('/', function() {
// Uses Foo & Bar Middleware
});
$app->get('user/profile', function() {
// Uses Foo & Bar Middleware
});
});
你也许会在群组组属性数组(your group attribute array
)中为所有的控制器(controllers
)用命名空间参数(the namespace parameter
).
$app->group(['namespace' => 'Admin'], function() {
// Controllers Within The "App\Http\Controllers\Admin" Namespace
});
Lumen像Laravel一样,很容易的保护你的网站避免 跨网站请求伪造(cross-site request forgeries
);跨网站请求伪造是一种攻击.该攻击借由认证过的用户的执行未授权的命令.
Lumen自动在每一个用户的session
中生成一个CSRF "token"
.这个CSRF "token"
被用来是验证合法的用户一次实际的请求.
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
当然, 可以用 Blade 模板引擎 (Blade templating engine
):
<input type="hidden" name="_token" value="{{ csrf_token() }}">
除了寻找 CSRF token
作为「POST」
参数,中间件也检查 X-XSRF-TOKEN
请求头,比如,你可以把 token
存放在 meta
标签中, 然后使用 jQuery
将它加入到所有的请求头中:
<meta name="csrf-token" content="{{ csrf_token() }}" />
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
现在所有的 AJAX 请求会自动加入 CSRF token:
$.ajax({
url: "/foo/bar",
});
Laravel 也在 cookie 中存放了名为 XSRF-TOKEN
的 CSRF token。你可以使用这个 cookie 值来设置 X-XSRF-TOKEN
请求头。。一些 Javascript 框架,比如 Angular ,会自动设置这个值。
注意:
X-CSRF-TOKEN
和X-XSRF-TOKEN
的不同点在于前者使用的是纯文本而后者是一个加密的值,因为在 Lumen 中 cookies 始终是被加密过的,前提是在bootstrap/app.php
文件使全局中间件生效。
HTML 表单不支持PUT
、PATCH
或DELETE
请求。所以当定义PUT
、PATCH
以及DELETE
路由并在HTML
表单中调用的时,您将需要在表单中添加隐藏 _method
字段。
发送的_method
字段对应的值会被当做HTTP
请求方法。举例来说:
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
有两种方式从路由中手动触发一个404错误.
第一,你可以用the abort helper
:
abort(404);
The abort helper
仅仅 抛出一个指定的状态码(the specified status code
)的 Symfony\Component\HttpFoundation\Exception\HttpException
第二, 你可以手动抛出一个 Symfony\Component\HttpKernel\Exception\NotFoundHttpException
的实例.
更多的处理404异常和应用自定义错误相应(responses
)的信息,可以参见错误部分的文档.