安装的说明请看文档, 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. 爬虫之cookie

    什么是cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了解决这个问题,第一次登 ...

  2. 关于img的一个小知识点

    这两天在撸代码的时候发现图片的最下面总是会留一条空白,刚开始不知道为什么,但是UI拿刀对我说去掉它,瑟瑟发抖的我找了下原因及解决方案. 原因:img 是一个inline-block标签,而这个标签的v ...

  3. Python 输出带颜色的文字方法

    输出文字带颜色 书写格式,和相关说明如下: #格式: 设置颜色:  \033[显示方式;前景色;背景色m     \033[0m 方法: 字体色 背景色 颜色 -------------------- ...

  4. Linux 系统基础优化和常用命令

    目录 Linux 系统基础优化和常用命令 软连接 tar解压命令 gzip命令 netstart命令 ps命令 kill命令 killall命令 SELinux功能 iptables防火墙 Linux ...

  5. 6.3.1 使用 pickle 模块读写二进制文件

    Python 标准库 pickle 提供的 dump() 方法 用于将数据进行序列化并写入文件(dump() 方法的protocol 参数为True 时可以实现压缩的效果),而load() 用于读取二 ...

  6. ZOJ 3199 Longest Repeated Substring

    Longest Repeated Substring Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on Z ...

  7. GROOVY简单语法实习

    慢慢的看<GROOVY IN ACTION>的一个中文节译本,根据上面的东东慢慢练习. 中文看起来确实比英文快好多...:) Book gina = new Book('Groovy in ...

  8. java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4

    java 线程  原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.Time ...

  9. [csdn markdown]使用摘记一源码高亮及图片上传和链接

    本文主要内容是体验csdn markdown的代码块高亮显示和图片链接及上传. 图片上传 上边这是标题行.仅仅须要使用一个#就能够表示.几个表示是几级标题 图片上传 本地图片上传控件 本地图片上传方式 ...

  10. 开源 免费 java CMS - FreeCMS1.9 移动APP生成栏目列表数据

    项目地址:http://www.freeteam.cn/ 生成栏目列表数据 提取当前管理网站下同意移动APP訪问的栏目列表,生成json数据到/site/网站文件夹/mobile/channels.h ...