Route Filters
Route Filters
The Controller's Middleware, represents a High-Level processing API, executed by the requested Controller, when it is instantiated, its requested Method is known as being valid and callable, and working in the same flow as your wanted Method.
The graph of The Controller Execution Flow is as follow:
before() -> action() -> after()
While very efficient and accurate, sometimes this design is not the best. For example, to instantiate a Controller and start its Execution Flow, only to obtain a redirect from a CSRF fault, can be costly as resources and response speed.
Better is to have a solution for Routing to handle the CSRF fault, before to even instantiate the requested Controller, right after the Route was identified; this was the used resources will be lower and response speed will be better.
Enter the Route Filters: a method to execute specified callbacks right after the correct Route was identified and before starting the execution of associated Controller.
Route Filters
How do they work? Let's say that we want a CSRF filter. In the (new) file app/Filters.php we define it as following:
Route::filter('csrf', function($route) {
if (! Csrf::isTokenValid()) {
return Redirect::to('');
}
});
We'll see that a Route Filter definition have a name as first parameter and secondly, a callback which receive a Core\Route instance, which is just current matched Route, from where being available into callback information about HTTP method, URI, captured parameters, Route callback, etc.
ATTENTION: WHEN one of the Filters returns boolean FALSE, the Routing will generate a "404 Error" for the matched Route even it is a valid matched one.
This is useful to "hide" parts of your website for non-authenticated users or to redirect to a custom "404 Error" page, for example.
Note that Route Filters are defined using "Route::filter()"
How to use this Filter? We use a new style of defining Routes:
Router::post('contact', array(
'filters' => 'csrf',
'uses' => 'App\Controllers\Contact@store'
));
WHERE the Route definition accepts an array as a second parameter and where the keys name is obvious. The key filters' assign to the value of a '|' separated string of used Route Filters, and the key 'uses' assign the associated Callback for the Route.
Running this Route definition, the Routing will be known to apply the Filter with the name 'csrf' before the Controller execution, then on CSRF fault, the Filter's callback will be executed and we go very fast into a redirect.
It's possible to apply multiple Filters to a Route, using a string containing their name separated by character '|' (pipe).
Usually, we will want to add another two Route Filters and there is a more complex example:
Route::filter('csrf', function($route) {
if (($route->method() == 'POST') && ! Csrf::isTokenValid()) {
return Redirect::to('');
}
});
Route::filter('auth', function($route) {
if (Session::get('loggedIn') == false) {
return Redirect::to('login');
}
});
Route::filter('guest', function($route) {
if (Session::get('loggedIn') != false) {
return Redirect::to('');
}
});
And an example of their usage can be:
Router::any('contact', array(
'filters' => 'guest|csrf',
'uses' => 'App\Controllers\Contact@index'
));
Router::any('login', array(
'filters' => 'guest|csrf',
'uses' => 'App\Controllers\Auth@login'
));
Router::get('logout', array(
'filters' => 'auth',
'uses' => 'App\Controllers\Auth@logout'
));
WHERE only the only Guest Users can access the Contact and Login page, with CSRF validation, while only the Authenticated Users can access the Logout action.
The alternative usage of Route Filters registering is to use a Class instead of callback, where the called method will receive the matched Route instance as a parameter. For example:
Route::filter('auth', 'App\Helpers\Filters\User@isLoggedIn');
Route::filter('guest', 'App\Helpers\Filters\User@isGuest');
Improvements
An improved Method handling when the Routes are registered and a new Router command called share(), which permit to register multiple Routes all pointing to the same Controller.
For example:
Router::share(array(
array('GET', '/'),
array('POST', '/home')
), 'App\Controllers\Home@index');
Route Filters的更多相关文章
- laravel route路由,视图和response和filter
Laravel充分利用PHP 5.3的特性,使路由变得简单并富于表达性.这使得从构建API到完整的web应用都变得尽可能容易.路由的实现代码在 application/routes.php 文件. 和 ...
- kubernetes源码解析---- apiserver路由构建解析(1)
kubernetes源码解析---- apiserver路由构建解析(1) apiserver作为k8s集群的唯一入口,内部主要实现了两个功能,一个是请求的路由和处理,简单说就是监听一个端口,把接收到 ...
- Response
Response This improved Response API, able to simplify the Framework's Response management. Practical ...
- Authentication
Authentication Introduction Configuration Storing Passwords Authenticating Users Basic Usage Introdu ...
- laravel code bright
Project RootLet’s start by taking a look at the root folder structure.• app/• bootstrap/• vendor/• p ...
- Data Center手册(4):设计
基础架构 拓扑图 Switching Path L3 routing at aggregation layer L2 switching at access layer L3 switch融合了三种功 ...
- zuul1.3源码扒一扒(1)
先开个头吧 作为偶尔点进源码的时候看到东西,或是学到,或是不解,或是惊讶,之后的一些记录.从springcloud各个组件开始吧,计划文段保持间断,只道出核心点,不过各个文段保持连续. zuul作为s ...
- 深入理解Zuul之源码解析
转载:http://blog.csdn.net/forezp/article/details/76211680 Zuul 架构图 在zuul中, 整个请求的过程是这样的,首先将请求给zuulservl ...
- spring cloud连载第三篇补充之Zuul
由于Zuul的内容较多所以单独列出一篇来讲.全是干货,如果学到东西的,动动小手给点个推荐^_^ 谢谢! 1. Router and Filter: Zuul(路由和过滤:Zuul) 路由是微服务架构 ...
随机推荐
- linux time命令参数--执行命令并计时
[命令]time — 执行命令并计时 [格式]time [-p] command [arguments...] [说明] 执行命令行"command [arguments...]" ...
- How To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu
sudo apt-get update sudo apt-get install nginxsudo mkdir -p /var/www/example.com/html sudo chown -R ...
- 【原】Redis分区
Redis高级篇 分区 为什么分区? Redis中的分区主要有两个目的: 允许用多台机器的内存存放更大的数据集.如果没有分区,那么你只能存放单台机器内存的最大值的数据集. 允许用多核和多台机器提高计算 ...
- codeforce 605B. Lazy Student
题意:n点,m条边.m条边里面标记为1的最小生成树的边,0为非最小生成树的边.给了每条边的权,如果能构成一个最小生成树则输出图,否则-1. 思路:先按权值小,为生成数边的顺序排序.(根据kruskal ...
- 相当管用了 mstha插件
http://www.i-magical.com/2010/04/feizhuliu-kill-virus-mshta-exe/ 非主流杀毒 – mshta.exe Vincent | Apr 23, ...
- STC12C5A60S2片内存储器介绍
STC12C5A60S2内部集成RAM 1280字节,其中 内部RAM(data):256 Byte 内部扩展RAM(xdata):1024 Byte 支持片外扩展RAM: 64kB STC12C5A ...
- PT100运算放大器电路
运放输出电压<=运放电源电压,电源电压能决定它的最大输出能力即动态范围,若是电源为0-5v,则输出就只能在这之间. 其次要是放大电路,反馈必须接成负反馈 由于我这次使用的电源是5V,要是采用两 ...
- position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?
这是寒冬大神提出的一个题目,刚开始看到这题的时候完全不知道从什么地方回答起好,题目内容比较广泛,找不到针对点.后来我觉得这个题目应该能拆成几个点来回答:1.'display'.'position' 和 ...
- opencv 通过摄像头捕捉头部
code: #include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\cxcore.h> ...
- SQLite使用教程4 创建数据库
http://www.runoob.com/sqlite/sqlite-create-database.html SQLite 创建数据库 SQLite 的 sqlite3 命令被用来创建新的 SQL ...