Laravel5.1 学习笔记2, 路由
安装的说明请看文档, laravel 安装
#基本路由
你将在 app/Http/routes.php 文件定义大部分路由, 这些路由将被App\Providers\RouteServiceProvider
类所装载. 最基本的laravel路由仅仅包含一个URI和 闭包。
Route::get('/', function () {
return 'Hello World';
}); Route::post('foo/bar', function () {
return 'Hello World';
}); Route::put('foo/bar', function () {
//
}); Route::delete('foo/bar', function () {
//
});
登记一个面向多个请求方法的路由
有时候要注册一个路由给多个HTTP请求方法,需要用到 Route facade 的 match 方法
Route::match(['get', 'post'], '/', function () {
return 'Hello World';
});
Route::any('foo', function () {
return 'Hello World';
});
$url = url('foo');
#CSRF保护
插入CSRF Token到表单
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
X-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",
})
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的请求方法, 举例来说:
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
</form>
#路由参数
#必要参数 Required Parameters
你可以路由中的URI部分区段, 例如,你可以从URL中获得用户的id, 你可以这样定义路由的参数。
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
你可以按需要定义多个路由参数,
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
注意:路由参数不能包含 - 字符,使用下划线 _代替
#可选参数 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:
偶尔,需要给个路由参数,但又要求是可选的,可以在参数后加个? 问号。
Route::get('user/{name?}', function ($name = null) {
return $name;
}); Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
#正则表达式限制 Regular Expression Constraints
You may constrain the format of your route parameters using the where
method on a route instance. The where
method 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。
/**
* 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);
}
一旦pattern 被定义, 它将自动应用到所有使用那个参数名的路由
Route::get('user/{id}', function ($id) {
// 只有id为数字才会调用.
});
#命名路由
Named routes allow you to conveniently generate URLs or redirects for a specific route. You may specify a name for a route using the as
array key when defining the route:
命名路由可以方便产生URLs 或者 重定向到指定路由,你可以定义路由的名字使用 as 数组键,
Route::get('user/profile', ['as' => 'profile', function () {
//
}]);
Route::get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
路由群组和命名路由
若使用路由群组, 你可以指定一个 as 关键字在路由群组的参数数组中,这允许你为群组里的所有路由设置一个共同路由名称前缀
Route::group(['as' => 'admin::'], function () {
Route::get('dashboard', ['as' => 'dashboard', function () {
// Route named "admin::dashboard"
}]);
});
为命名路由生成URLs
一旦你为一个给定路由指定名字,你通过route 方法在生成URLs地址或重定向时就可以使用路由名字
$url = route('profile'); $redirect = redirect()->route('profile');
Route::get('user/{id}/profile', ['as' => 'profile', function ($id) {
//
}]); $url = route('profile', ['id' => 1]);
#路由群组
有时候你的许多路由有公用的需求, 例如URL区段(segments) 中间件, 命名空间等等。 你可以利用路由群组套用这些属性到多个路由, 而不用每个路由都设置一次。
将共享属性作为一个数组当做Route::group 的第一个参数。
Middleware
在数组共享属性数组的middleware 参数定义中间件列表, 这些中间件就会应用到群组内的所有路由上, 中间件将会按在列表内制定的顺序执行。
Route::group(['middleware' => ['foo', 'bar']], function()
{
Route::get('/', function()
{
// Has Foo And Bar Middleware
}); Route::get('user/profile', function()
{
// Has Foo And Bar Middleware
}); });
Namespaces
您一样可以在 group
属性数组中使用 namespace
参数,指定在这群组中控制器的命名空间:
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
});
});
注意: 在默认情况下,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
方法定义您的模型绑定:
绑定参数至模型
public function boot(Router $router)
{
parent::boot($router); $router->model('user', 'App\User');
}
Route::get('profile/{user}', function(App\User $user)
{
//
});
{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
辅助函数:
abort(404);
abort
辅助函数只是简单抛出带有特定状态代码的Symfony\Component\HttpKernel\Exception\HttpException
。
Symfony\Component\HttpKernel\Exception\NotFoundHttpException
的实体。有关如何处理 404 异常状况和自定响应的更多信息,可以参考错误章节内的文档。
Laravel5.1 学习笔记2, 路由的更多相关文章
- vue2.0学习笔记之路由(二)路由嵌套+动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue2.0学习笔记之路由(二)路由嵌套
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue学习笔记(十)路由
前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...
- Tornado学习笔记(二) 路由/post/get传参
本章我们学习 Tornado 的路由传参等问题 路由 路由的匹配 Tornado的路由匹配采用的是正则匹配 一般情况下不需要多复杂的正则,正则的基本规则如下(站长之家) 举个例子 (r'/sum/(\ ...
- laravel5.4学习--laravel基本路由
最基本的 Laravel 路由只接收一个 URI 和一个闭包,并以此提供一个非常简单且优雅的定义路由方法: Route::get('foo', function () {return 'Hello W ...
- angular2 学习笔记 ( Router 路由 )
参考 : https://angular.cn/docs/ts/latest/guide/router.html#!#can-activate-guard https://angular.cn/doc ...
- ASP.NET MVC2.0学习笔记:路由设置
Route设置 在 <Professional in ASP.NET MVC2.0>一书的第四章,主要讲述了Route的简单设置.格式化设置.约束设置.区域路由.匹配文件.路由调试以及对R ...
- Angular 学习笔记 (路由外传 - RouteReuseStrategy)
refer : https://github.com/angular/angular/issues/10929 https://stackoverflow.com/questions/41280471 ...
- nodejs学习笔记<七> 路由
// 引用模块(与C#中命名空间,Java中引用包同理) var http = require("http"); var path = require("path&quo ...
随机推荐
- Oracle中的rownum 和rowid的用法和区别
Oracle中的rownum 和rowid的用法和区别 1.rownum是伪列,是在获取查询结果集后再加上去的 (获取一条记录加一个rownum).对符合条件的结果添加一个从1开始的序列号. eg ...
- DP背包问题小总结
DP的背包问题可谓是最基础的DP了,分为01背包,完全背包,多重背包 01背包 装与不装是一个问题 01背包基本模型,背包的总体积为v,总共有n件物体,每件物品的体积为v[i],价值为w[i],每件物 ...
- [LUOGU]4932 浏览器
\(\_\_stdcall\)大佬出的题\(Orz\) 我们惊奇地发现,加入\(\_\_popcount(x)\)和\(\_\_popcount(y)\)的奇偶数性相同,那么\(\_\_popcoun ...
- Linux常用解压缩命令
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 查 询:tar -jtv -f filename.tar.bz2 解压缩:tar -jxv -f filen ...
- 42.global bucket的使用:单个品牌与所有品牌销量对比
主要知识点: _global bucket的使用 本例以搜索单个品牌和所有品牌的销量对比进行学习_global .es在进行aggregation操作时都只只是在一个scope中进行聚合等操作 ...
- CodeForces - 284C - Cows and Sequence
先上题目: C. Cows and Sequence time limit per test 3 seconds memory limit per test 256 megabytes input s ...
- 文件上传-jquery.uploadify.js
<script type="text/javascript" src="../jquery_uploadify/jquery.uploadify-3.1.min.j ...
- find -perm命令
http://www.2cto.com/os/201205/130125.html find -perm,根据文件的权限来查找文件,有三种形式: find -perm mode find -perm ...
- 【从0開始Tornado建站】发表文章和评论
先上个效果图: 这是每一个用户的主页.由于是基本功能.所以用户头像.爱好等信息都还没有,在下一阶段加上.右側"发表新文章"按钮点击后进入发表文章的页面: 之前尝试过 ...
- 天了噜,我国4G用户超过2亿了!
近期,看到工信部一组统计数据,小编整个人都不好了,数据显示,2015年5月我国4G用户净增2281.6万,总数超过2亿户. 没错,卡是换成了4G卡,还是那句话,然并卵,用的还是3G手机.开的还是2G网 ...