Skip to content

4.中间件middlewares

awencheong edited this page Oct 15, 2016 · 8 revisions

4. 中间件middlewares

中间件更准确一点应该是插件,它的作用是重用一些非常普遍的模块功能,比如登录验证

<?php
	app()->get("/user/info/", "User@info")
		 ->before('User@auth($app.cookies)')
		 ->after('Statis@report($app)')
  • before() 是在业务逻辑"User@info"前 调用中间件 "App\Middleware\User@auth"
  • after() 是在业务逻辑"User@info"后 调用中间件 "App\Middleware\Statis@report"
  • "Statis@report($app)" 的参数 $app 是个关键字, 表示全局的App对象, 框架能自动识别并将它传递进去
  • "User@auth($app.cookies)" 的 .cookies 表示$app->cookies,框架能自动识别并将它传递进去
  • 如果中间件的返回值 == null, 框架报错, 并且会按下面的优先级选择一个view进行渲染
    1. 如果当前业务"/user/info"设置了错误view, 选择该view;
    1. 如果设置了全局的错误view, 选择该view;
    1. 如果设置了全局普通view, 选择该view;
    1. 如果以上都没有, 选择框架默认的错误view;

我们可以把一些相关的业务放在一起统一调用中间件:

<?php
app()->before("/user/*", ["User@auth"]);
app()->before("/resource/download", ["User@auth"]);
app()->before(["/resource/detail", "/resource/list"], ["User@auth"])
  • “/user/*" 中的 * 是通配符,它既包括 /user/info, 但不包括 /user/article/detail (此功能慎用,容易把控不住)
  • "/resource/download" 跟 '/user/*' 一样被设置了前置中间件 ["User@auth"]
  • ["/resource/detail", "/resource/list"] 以数组的形式同时给这两个业务设置前置中间件
  • 后置中间件app()->after()使用方式相同
Clone this wiki locally