安装的说明请看文档, 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';
});
甚或注册一个路由响应所有HTTP请求,使用 any 方法
Route::any('foo', function () {
return 'Hello World';
});
通常情况下,你将会需要为你的路由生成URL, 你可以使用 url 辅助函数来操作
$url = url('foo');
 

 

 

#CSRF保护

Laravel 提供简易方法,可以保护你的应用程序不受CSRF(跨网站请求伪造)攻击。 跨网站请求伪造是一种恶意攻击, 借以代表经过身份验证的用户执行未经授权的命令。
 
Laravel会自动在在每一位用户的session中放置随机的 token  这个token将被用来确保经过验证的用户是实际发出请求至应用程序的用户。
 

插入CSRF Token到表单

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
<input type="hidden" name="_token" value="{{ csrf_token() }}">

上面下一行是在Blade 模板引擎的写法
你不需要手动验证POST, PUT, DELETE请求的CSRF token。 VerifyCsrfToken HTTP中间件 将保存在Session中的和请求输入的token配对来验证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-TOKENX-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 () {
//
}]);
你也可以为 controller 的actions 指定 命名路由
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 方法的第二个引数传递给它,参数会自动添加到URL
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');
}

然后定义一个有{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, 路由的更多相关文章

  1. vue2.0学习笔记之路由(二)路由嵌套+动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. vue2.0学习笔记之路由(二)路由嵌套

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. vue学习笔记(十)路由

    前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...

  4. Tornado学习笔记(二) 路由/post/get传参

    本章我们学习 Tornado 的路由传参等问题 路由 路由的匹配 Tornado的路由匹配采用的是正则匹配 一般情况下不需要多复杂的正则,正则的基本规则如下(站长之家) 举个例子 (r'/sum/(\ ...

  5. laravel5.4学习--laravel基本路由

    最基本的 Laravel 路由只接收一个 URI 和一个闭包,并以此提供一个非常简单且优雅的定义路由方法: Route::get('foo', function () {return 'Hello W ...

  6. angular2 学习笔记 ( Router 路由 )

    参考 : https://angular.cn/docs/ts/latest/guide/router.html#!#can-activate-guard https://angular.cn/doc ...

  7. ASP.NET MVC2.0学习笔记:路由设置

    Route设置 在 <Professional in ASP.NET MVC2.0>一书的第四章,主要讲述了Route的简单设置.格式化设置.约束设置.区域路由.匹配文件.路由调试以及对R ...

  8. Angular 学习笔记 (路由外传 - RouteReuseStrategy)

    refer : https://github.com/angular/angular/issues/10929 https://stackoverflow.com/questions/41280471 ...

  9. nodejs学习笔记<七> 路由

    // 引用模块(与C#中命名空间,Java中引用包同理) var http = require("http"); var path = require("path&quo ...

随机推荐

  1. SOUI界面库 添加 windows系统文件图标皮肤

    最近在学习soui界面库.其中有用到SListCtrl这个控件来现在文件信息.控件用法基本上和mfc 的CListCtrl差不多.也支持图标显示.但是图标是要自己加入图标图片的.这个就有点不好弄.于是 ...

  2. SGU180 Inversions(树状数组求逆序数)

    题目: 思路:先离散化数据然后树状数组搞一下求逆序数. 离散化的方法:https://blog.csdn.net/gokou_ruri/article/details/7723378 自己对用树状数组 ...

  3. Jupyter Notebook 下安装 PHP 内核

    我最近被强烈安利了 Jupyter Notebook 这个交互式笔记本.然后试用了它自带的 Python 内核后,这个应用整体给我的感觉很不错,就去搜索了下它所支持的其它内核 Jupyter Kern ...

  4. Serial Fluent UDF on Windows

    test test Table of Contents 1. Serial UDF on Windows OS 1 Serial UDF on Windows OS Note: Udf has to ...

  5. 【codeforces 767C】Garland

    [题目链接]:http://codeforces.com/contest/767/problem/C [题意] 一棵树; 树上的每个节点都有一个权值; 让你把一棵树切掉两条边; 然后把这棵树分成了3个 ...

  6. Restful传递数组参数的两种方式

    第一种,直接传递数组 js直接传递数组 var data = ["123","456"];that.loadDictionarys(data).subscrib ...

  7. LSB、MSB是什么单位

    最低有效位 (LSB: Least Significant Bit)   最低有效位(LSB)是给这些单元值的一个二进制整数位位置,就是,决定是否这个数字是偶数或奇数.LSB有时候是指最右边的位,因为 ...

  8. Centos6.7搭建ISCSI存储服务器

    https://blog.csdn.net/yuner027/article/details/51925146

  9. pyenv-virtualenv环境搭建

    搞了个新服务器,搭个python环境 安装pyenv 直接上懒人脚本,不怕麻烦想手动装的就麻烦您自己查吧~ curl -L https://raw.githubusercontent.com/yyuu ...

  10. nyoj_111_分数加减法_201311281341

    分数加减法 时间限制:3000 ms  |           内存限制:65535 KB 难度:2   描述 编写一个C程序,实现两个分数的加减法   输入 输入包含多行数据 每行数据是一个字符串, ...