Laravel5.1 学习笔记2, 路由
2015-06-28 20:08
946 查看
安装的说明请看文档, laravel 安装
[/code]
甚或注册一个路由响应所有HTTP请求,使用 any 方法
通常情况下,你将会需要为你的路由生成URL, 你可以使用 url 辅助函数来操作
Laravel会自动在在每一位用户的session中放置随机的 token 这个token将被用来确保经过验证的用户是实际发出请求至应用程序的用户。
[/code]
上面下一行是在Blade 模板引擎的写法
你不需要手动验证POST, PUT, DELETE请求的CSRF token。 VerifyCsrfToken HTTP中间件 将保存在Session中的和请求输入的token配对来验证token。
X-CSRF-TOKEN
除了寻找 CSRF token 作为「POST」参数,中间件也检查
[/code]
现在所有的 AJAX 请求会自动加入 CSRF token:
[/code]
X-XSRF-TOKEN
Laravel 也在 cookie 中存放了名为
注意:
发送的 _method 字段对应的值会被当作HTTP的请求方法, 举例来说:
[/code]
你可以按需要定义多个路由参数,
[/code]
路由参数要用大括号包住, 当路由执行时,参数会传递给闭包,作为参数。
注意:路由参数不能包含 - 字符,使用下划线 _代替
偶尔,需要给个路由参数,但又要求是可选的,可以在参数后加个? 问号。
[/code]
你可能要限制参数的格式,用route实例的where方法,where方法接受参数名和正则表达式定义参数应该怎么样被规范
[/code]
一旦pattern 被定义, 它将自动应用到所有使用那个参数名的路由
[/code]
命名路由可以方便产生URLs 或者 重定向到指定路由,你可以定义路由的名字使用 as 数组键,
你也可以为 controller 的actions 指定 命名路由
[/code]
[/code]
[/code]
如果路由定义了参数,你可用参数作为route 方法的第二个引数传递给它,参数会自动添加到URL
[/code]
将共享属性作为一个数组当做Route::group 的第一个参数。
[/code]
[/code]
注意: 在默认情况下,
首先,使用路由的
[/code]
然后定义一个有{user}参数的路由:
[/code]
因为我们已经将
注意: 如果在数据库中找不到匹配的模型实体,将引发 404 错误。
如果您想要自定「没有找到」的行为,将闭包作为第三个参数传入
如果您想要使用您自己决定的逻辑,您应该使用
[/code]
第二,您可以手动抛出
有关如何处理 404 异常状况和自定响应的更多信息,可以参考错误章节内的文档。
#基本路由
你将在 app/Http/routes.php 文件定义大部分路由, 这些路由将被App\Providers\RouteServiceProvider类所装载. 最基本的laravel路由仅仅包含一个URI和 闭包。
[code]Route::get('/', function () { return 'Hello World'; }); Route::post('foo/bar', function () { return 'Hello World'; }); Route::put('foo/bar', function () { // }); Route::delete('foo/bar', function () { // });
[/code]
登记一个面向多个请求方法的路由
有时候要注册一个路由给多个HTTP请求方法,需要用到 Route facade 的 match 方法Route::match(['get', 'post'], '/', function () { return 'Hello World'; });
甚或注册一个路由响应所有HTTP请求,使用 any 方法
Route::any('foo', function () { return 'Hello World'; });
通常情况下,你将会需要为你的路由生成URL, 你可以使用 url 辅助函数来操作
$url = url('foo');
#CSRF保护
Laravel 提供简易方法,可以保护你的应用程序不受CSRF(跨网站请求伪造)攻击。 跨网站请求伪造是一种恶意攻击, 借以代表经过身份验证的用户执行未经授权的命令。Laravel会自动在在每一位用户的session中放置随机的 token 这个token将被用来确保经过验证的用户是实际发出请求至应用程序的用户。
插入CSRF Token到表单
[code]<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
[/code]
上面下一行是在Blade 模板引擎的写法
你不需要手动验证POST, PUT, DELETE请求的CSRF token。 VerifyCsrfToken HTTP中间件 将保存在Session中的和请求输入的token配对来验证token。
X-CSRF-TOKEN
除了寻找 CSRF token 作为「POST」参数,中间件也检查
X-XSRF-TOKEN请求头,比如,你可以把 token 存放在 meta 标签中, 然后使用 jQuery 将它加入到所有的请求头中:
[code]<meta name="csrf-token" content="{{ csrf_token() }}" /> $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
[/code]
现在所有的 AJAX 请求会自动加入 CSRF token:
[code]$.ajax({ url: "/foo/bar", })
[/code]
X-XSRF-TOKEN
Laravel 也在 cookie 中存放了名为
XSRF-TOKEN的 CSRF token。你可以使用这个 cookie 值来设置
X-XSRF-TOKEN请求头。一些 Javascript 框架,比如 Angular ,会自动设置这个值。
注意:
X-CSRF-TOKEN和
X-XSRF-TOKEN的不同点在于前者使用的是纯文本而后者是一个加密的值,因为在 Laravel 中 cookies 始终是被加密过的。如果你使用
csrf_token()函数来作为 token 的值, 你需要设置
X-CSRF-TOKEN请求头。
#方法欺骗
HTML表单没有支持PUT, PATCH 或 DELETE的请求, 所以当定义PUT,PATCH, 以及DELETE路由并在HTML表单中被调用的时候,你将需要添加隐藏的 _method 字段在表单中。发送的 _method 字段对应的值会被当作HTTP的请求方法, 举例来说:
[code]<form action="/foo/bar" method="POST"> <input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"> </form>
[/code]
#路由参数
#必要参数 Required Parameters
你可以路由中的URI部分区段, 例如,你可以从URL中获得用户的id, 你可以这样定义路由的参数。[code]Route::get('user/{id}', function ($id) { return 'User '.$id; });
你可以按需要定义多个路由参数,
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { // });
[/code]
路由参数要用大括号包住, 当路由执行时,参数会传递给闭包,作为参数。
注意:路由参数不能包含 - 字符,使用下划线 _代替
#可选参数 Optional Parameters
Occasionally you may need to specify a route parameter, but make the presence of that route parameter optional. You may do so by placing a?mark after the parameter name:
偶尔,需要给个路由参数,但又要求是可选的,可以在参数后加个? 问号。
[code]Route::get('user/{name?}', function ($name = null) { return $name; }); Route::get('user/{name?}', function ($name = 'John') { return $name; });
[/code]
#正则表达式限制 Regular Expression Constraints
You may constrain the format of your route parameters using thewheremethod on a route instance. The
wheremethod accepts the name of the parameter and a regular expression defining how the parameter should be constrained:
你可能要限制参数的格式,用route实例的where方法,where方法接受参数名和正则表达式定义参数应该怎么样被规范
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(['id' => '[0-9]+', 'name' => '[a-z]+']);
全局限制
如果你要一个路由参数始终被一个正则表达式规范, 你可以使用 pattern 方法, 你应该在你的RouteServiceProvider里的boot方法里定义这些patterns。[code]/** * Define your route model bindings, pattern filters, etc. * * @param \Illuminate\Routing\Router $router * @return void */ public function boot(Router $router) { $router->pattern('id', '[0-9]+'); parent::boot($router); }
[/code]
一旦pattern 被定义, 它将自动应用到所有使用那个参数名的路由
[code]Route::get('user/{id}', function ($id) { // 只有id为数字才会调用. });
[/code]
#命名路由
Named routes allow you to conveniently generate URLs or redirects for a specific route. You may specify a name for a route using theasarray key when defining the route:
命名路由可以方便产生URLs 或者 重定向到指定路由,你可以定义路由的名字使用 as 数组键,
Route::get('user/profile', ['as' => 'profile', function () { // }]);
你也可以为 controller 的actions 指定 命名路由
[code]Route::get('user/profile', [ 'as' => 'profile', 'uses' => 'UserController@showProfile' ]);
[/code]
路由群组和命名路由
若使用路由群组, 你可以指定一个 as 关键字在路由群组的参数数组中,这允许你为群组里的所有路由设置一个共同路由名称前缀[code]Route::group(['as' => 'admin::'], function () { Route::get('dashboard', ['as' => 'dashboard', function () { // Route named "admin::dashboard" }]); });
[/code]
为命名路由生成URLs
一旦你为一个给定路由指定名字,你通过route 方法在生成URLs地址或重定向时就可以使用路由名字[code]$url = route('profile'); $redirect = redirect()->route('profile');
[/code]
如果路由定义了参数,你可用参数作为route 方法的第二个引数传递给它,参数会自动添加到URL
[code]Route::get('user/{id}/profile', ['as' => 'profile', function ($id) { // }]); $url = route('profile', ['id' => 1]);
[/code]
#路由群组
有时候你的许多路由有公用的需求, 例如URL区段(segments) 中间件, 命名空间等等。 你可以利用路由群组套用这些属性到多个路由, 而不用每个路由都设置一次。将共享属性作为一个数组当做Route::group 的第一个参数。
Middleware
在数组共享属性数组的middleware 参数定义中间件列表, 这些中间件就会应用到群组内的所有路由上, 中间件将会按在列表内制定的顺序执行。[code]Route::group(['middleware' => ['foo', 'bar']], function() { Route::get('/', function() { // Has Foo And Bar Middleware }); Route::get('user/profile', function() { // Has Foo And Bar Middleware }); });
[/code]
Namespaces
您一样可以在group属性数组中使用
namespace参数,指定在这群组中控制器的命名空间:
[code]Route::group(['namespace' => 'Admin'], function() { // Controllers Within The "App\Http\Controllers\Admin" Namespace Route::group(['namespace' => 'User'], function() { // Controllers Within The "App\Http\Controllers\Admin\User" Namespace }); });
[/code]
注意: 在默认情况下,
RouteServiceProvider包含内置您命名空间群组的
routes.php文件,让您不须使用完整的
App\Http\Controllers命名空间前缀就可以注册控制器路由。
子域名路由
aravel 路由一样可以处理通配符的子域名,并且从域名中传递您的通配符参数:Route::group(['domain' => '{account}.myapp.com'], function() { Route::get('user/{id}', function($account, $id) { // }); });
路由前缀
群组路由可以通过群组的描述数组中使用prefix选项,将群组内的路由加上前缀:你不能通过prefix选项来传递参数到你的路由。
Route::group(['prefix' => 'admin'], function() { Route::get('users', function() { // Matches The "/admin/users" URL }); });
#路由模型绑定
Laravel 模型绑定提供方便的方式将模型实体注入到您的路由中。例如,比起注入 User ID ,你可以选择注入符合给定 ID 的 User 类实体。首先,使用路由的
model方法指定特定参数要对应的类,您应该在
RouteServiceProvider::boot方法定义您的模型绑定:
绑定参数至模型
[code]public function boot(Router $router) { parent::boot($router); $router->model('user', 'App\User'); }
[/code]
然后定义一个有{user}参数的路由:
[code]Route::get('profile/{user}', function(App\User $user) { // });
[/code]
因为我们已经将
{user}参数绑定到
App\User模型,所以
User实体将被注入到路由。所以举例来说,请求至
profile/1将注入 ID 为 1 的
User实体。
注意: 如果在数据库中找不到匹配的模型实体,将引发 404 错误。
如果您想要自定「没有找到」的行为,将闭包作为第三个参数传入
model方法:
Route::model('user', 'User', function() { throw new NotFoundHttpException; });
如果您想要使用您自己决定的逻辑,您应该使用
Route::bind方法。闭包通过
bind方法将传递 URI 区段数值,并应该返回您想要被注入路由的类实体:
Route::bind('user', function($value) { return User::where('name', $value)->first(); });
#抛出 404 错误
这里有两种方法从路由手动触发 404 错误。首先,您可以使用abort辅助函数:
[code]abort(404);
[/code]
abort辅助函数只是简单抛出带有特定状态代码的
Symfony\Component\HttpKernel\Exception\HttpException。
第二,您可以手动抛出
Symfony\Component\HttpKernel\Exception\NotFoundHttpException的实体。
有关如何处理 404 异常状况和自定响应的更多信息,可以参考错误章节内的文档。
相关文章推荐
- 《windows server 2008》FTP服务器搭建
- FTP服务器搭建
- php页面静态化—实现页面纯静态化的原理
- Thinkphp url 除去index.php
- PHP生成图形化验证码
- PHP学习笔记(七):前台用户登陆、后台匹配数据库进行校验
- 搭建 PhalconPHP 框架开发环境
- PHP学习笔记(六):通过ajax实时匹配后台的数据
- (3)Bitmap类相关——getPixels
- 使用php递归计算目录大小
- php文件下载
- php-zend studio
- YII获取刚插入数据的id主键
- PHP中的命名空间(namespace)及其使用详解
- 直接复制php的安装目录部署到其他服务器的时候,无法运行
- ubuntu安装xhprof
- PHP session机制小析
- FTP服务器搭建
- zend 快捷键
- Laravel5.1 学习笔记1, 目录结构和命名空间(待修)