Middleware
Middleware
The middleware gives a single shot to the views associated into Controllers, before executing the requested Method, and store the resulted data in a Views shared storage, from where its loaded and added for rendering execution. This style avoids multiple calling of those Hooks, as in for every rendering call.
In the Core\View there is a Method, called "share", permitting to set data variables which are shared by any called rendering method. For example, it is possible to have:
return View::share('title', 'Page Title');
Making the variable 'title' available in any rendering command.
When a request is initiated a "before" method is automatically executed, it by default executes the Views associated Hooks and share their result to Core\View. This allows to fine tune the Controller behavior, for example hosting logic to check the user authentication or do whatever pre-processing, i.e. checking access codes, without requiring to add commands to every method, simplifying the code.
A complex example of its chained usage can be:
// Into a Base Controller
protected function before()
{
// Check if the User is authorized to use the requested Method.
switch ($this->getMethod()) {
case 'login':
case 'forgot':
case 'reset':
break;
default:
if (Session::get('loggedIn') == false) {
Url::redirect('login');
}
};
// Leave to parent's Method the execution decisions.
return parent::before(); // <-- there are loaded the Views associated Hooks.
}
// Into an Admin Controller
protected function before()
{
// Check the CSRF token for select Methods over POST, e.g: add/edit/delete.
switch($this->getMethod()) {
case 'index':
case 'show':
break;
default:
if (Request::isPost() && ! Csrf::isTokenValid()) {
Url::redirect('login');
}
};
// Leave to parent's Method the execution decisions.
return parent::before(); // <-- there is checked the User Authorization.
}
Another more complex example, for a Controller for private files serving; with access authorization and limit the access time:
protected function before()
{
// Only the authorized Users can arrive to the Methods from this Controller.
if (Session::get('loggedIn') == false) {
Url::redirect('login');
}
//
if($this->getMethod() == 'files') {
$params = $this->params();
if(count($params) != 3) {
header("HTTP/1.0 400 Bad Request");
return false;
}
// The current timestamp.
$timestamp = time();
// File access validation elements.
$validation = $params[0];
$time = $params[1];
$filename = $params[2];
$clientip = $this->getIpAddress();
$hash = hash('sha256', $clientip.$filename.$time.FILES_ACCESSKEY);
if((($timestamp - $time) > FILES_VALIDITY) || ($validation != $hash)) {
header("HTTP/1.0 403 Forbidden");
return false;
}
} else if (Request::isPost()) {
// All the POST requests should have a CSRF Token there.
if (! Csrf::isTokenValid()) {
Url::redirect('login');
}
}
// Leave to parent's Method the execution decisions.
return parent::before(); // <-- there are loaded the Views associated Hooks.
}
Also, the part of Method flow execution was moved into Core\Controller::execute(), presenting the big advantage to simplify the Routing and permitting to have the before/after methods protected, safe against their execution from outside.
Finally, into Core\Controller was introduced an new method called "trans", wrapping up the Language translation. Then, permitting commands like:
// Actual style
$data['title'] = $this->language->get('welcomeText');
$data['welcomeMessage'] = $this->language->get('welcomeMessage');
// New style
$data['title'] = $this->trans('welcomeText');
$data['welcomeMessage'] = $this->trans('welcomeMessage');
Example of using "View::share()"
public function index()
{
$title = $this->trans('welcomeText');
$data['welcomeMessage'] = $this->trans('welcomeMessage');
// Make $title available in all Views rendering
View::share('title', $title);
View::renderTemplate('header'); // <-- No need for $data in this case
View::render('Welcome/Welcome', $data);
View::renderTemplate('footer'); // <-- No need for $data in this case
}
What is difference between applying pre-processing in "__constructor()" and "before()" ?
Comparative with running checks in Class Constructor, the before() method is executed WHEN the requested Method is a valid one, both as in existing and being "callable", and it have at its disposition the requested Method name and the associated Parameters; both passed to by Routing. Then, before() can accurate tune the Controller behavior, depending on requested Method.
Is required to implement the methods "before()" and "after()" in every Controller ?
No. You can safely completely ignore their existence if you don't want to fine tune the Controller's behavior via that Middleware.
What if I want a base Controller which do NOT call the Views associated Hooks ?
Just override the before() like below in a Base Controller, e.g. App\Core\Controller
namespace App\Core;
use Core\Controller as BaseController
class Controller extends BaseController
{
public function __construct()
{
parent::__construct();
}
protected function before()
{
return true;
}
}
Then use this Class as a base for your Controllers.
Middleware的更多相关文章
- 用Middleware给ASP.NET Core Web API添加自己的授权验证
Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做到完全的前后端分离.API的实现方式有很 多,可以用ASP.NET Core.也可以用ASP.NET Web ...
- [转]Writing Custom Middleware in ASP.NET Core 1.0
本文转自:https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ One of the new ...
- [转]用Middleware给ASP.NET Core Web API添加自己的授权验证
本文转自:http://www.cnblogs.com/catcher1994/p/6021046.html Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做 ...
- [译]Writing Custom Middleware in ASP.NET Core 1.0
原文: https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ Middleware是ASP. ...
- 解读ASP.NET 5 & MVC6系列(6):Middleware详解
在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如 ...
- 在ASP.NET Core使用Middleware模拟Custom Error Page功能
一.使用场景 在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAtt ...
- ASP.NET Core 开发-中间件(Middleware)
ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...
- ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析
ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...
- [ASP.NET Core] Static File Middleware
前言 本篇文章介绍ASP.NET Core里,用来处理静态档案的Middleware,为自己留个纪录也希望能帮助到有需要的开发人员. ASP.NET Core官网 结构 一个Web站台最基本的功能,就 ...
- [ASP.NET Core] Middleware
前言 本篇文章介绍ASP.NET Core里,用来处理HTTP封包的Middleware,为自己留个纪录也希望能帮助到有需要的开发人员. ASP.NET Core官网 结构 在ASP.NET Core ...
随机推荐
- iOS开发中提交带有中文或特殊字符串的参数
iOS开发中,与后台进行数据交换是一个很常见的场景. 在web开发中,对于我们提交的地址,浏览器会负责进行decode,但是在ios中,必须要自己手动来实现.否则我们拼接出的网址在包括中文.特殊字符串 ...
- Oracle ORA-00119和ORA-00132的解决方案
今天在启动服务器上的ORACLE时遇到如下错误: SQL> startup; ORA-00119: invalid specification for system parameter LOCA ...
- java jvm学习笔记八(实现jar包的代码签名)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8267669 课程源码:http://download.csdn.net/detai ...
- 如何使用spring中的Log4jConfigListener--删除
使用spring中的Log4jConfigListener有如如下好处: 1. 动态的改变记录级别和策略,不需要重启Web应用,如<Effective Enterprise Java> ...
- bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1835 [题意] 有n个村庄,每个村庄位于d[i],要求建立不多于k个基站,在第i个村庄 ...
- GCC编译源代码的四个步骤【转】
GCC编译C源代码有四个步骤:预处理---->编译---->汇编---->链接. 可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程. 下面将通过对一个程序 ...
- DOS命令关闭进程
1.开始-运行,输入cmd后回车; 2.在DOS提示符下,先用命令 tasklist 回车来获取进程的 PID(例如获取了Explorer.EXE进程的PID为1988); 3.然后再输入命令:tas ...
- 使用SVN服务器管理源码
最近在学习使用SVN管理自己的项目文件,正好有好的文章就拿来标记一下,正所谓: 站在巨人的肩膀上 天下知识为我所用 转载两篇关于使用SVN管理源码的文章. 使用SVN进行源码管理(上):http: ...
- Django – vicalloy's trac
Django – vicalloy's trac Search:
- poj1743--Musical Theme(后缀数组)
题意:求一列数字中走向相同的两个字序列,长度要求大于5 题解:相邻数字求差,原题就变成求相同的长度大于4的子串. [存疑:在保证两个子串不相交时觉得限定条件应该是大于x,但是wa了= = 不是很理解] ...