0

国内没人用最新版本,没发现这个逻辑变化?都不在构造函数里判断用户登录的(没发现的你悲剧了)?
帮我看下这个官方回复:https://github.com/laravel/fr...
**我英文不好!解释下!laravel5.3很重要的改进
为什么这么做?
我应该怎么写新的逻辑?**
我需要这样改进的理由,还有我怎么解决我的逻辑!

疑问这样做就是废了__construct
那么中间件的except应该加到中间件作为一个属性比较合理!
protected $except =['login','register','oauth_callback'];
纠结:加了这个觉得不合理(多个组调用这个的话就不合理了),不加这个吧为了一个登陆写__construct又觉得不好!

目前答案:1楼的其实也可以,不过这个优雅多了
callAction说明:https://laravel.com/api/maste...
clipboard.png

clipboard.png

laravel 5.3,反正是最新的,每次都update!
现在有这3个,中间件,控制器,构造函数
有2个函数必须在构造函数里实例化。而且必须登录状态下,不登录不准实例化。
构造函数:
clipboard.png

clipboard.png

clipboard.png

中间件:

clipboard.png

clipboard.png

方法:

clipboard.png

输出:

clipboard.png


路由里

clipboard.png

clipboard.png

图片描述


自定义中间件

clipboard.png

clipboard.png

按laravel的逻辑输出:
2构造函数
1中间件
3这是推广

但是这样的话构造函数里没登录就实例化了,而且不管中间件放在哪,都是先运行构造函数再运行中间件的,
我要的结果是:
1中间件,判断登录,没登陆就跳转
2构造函数,登录后实例化
3这是推广,执行推广!
怎么修改逻辑,我要登录后才调用公用方法,没登录的跳转登录(排除注册和登录)!

大概的问题就是laravel必须先运行构函数,然后才可以调用中间件,
那我应该怎么个逻辑才可以实现我的要求的!

$this->wx_api();
$this->agent();

这2个公用的,一般都写到__construct里的吧!

我还是纳闷,按常理,路由器里定义了,判断类里有这个方法,然后这时候调用中间件,然后执行构造函数,然后是方法!怎么会这种流程呢!


粗暴方法问题,看下面的(不能在构造函数里跳转,写echo和exit在laravel你会觉得超级难看,反正我受不了,上面的演示纯粹为了看!)

http://laravelacademy.org/pos...
仔细的想了一下,发现这个完美的破坏了面向对象的职责分离的要求,并成功的提高了耦合度   
因为这句话,我才想使用中间件!(到底哪个好,我是新手,我都不知道怎么说!)


laravel 5.3是构造Middleware -> 构造Controller -> 执行中间件handle -> 执行Controller中间件 -> Controller的方法,所以中间件是在构造函数后执行的

https://josephsilber.com/post...

2016-12-02 提问
3 个回答
1

已采纳

国内我在用最新版5.3

5.3的确改变了中间件的实现逻辑

路由匹配 - 读取路由中间件 - 实例化Controller - 读取Controller中间键 - 执行中间件 - 执行action

个人不鼓励在Controller的构造函数中初始化方法,除了使用中间件调用之外,不要做任何逻辑判断的事情。

重写 CallAction 在 CallAction中逻辑判断

因为任何一个路由的匹配都会使用CallAction调取Controller里面的方法

在5.3以下 版本中,会优先执行中间件,然后初始化Controller,这是和5.3最大的区别。

1

构造函数本来就是应该先执行的,好像没什么不对。。。

我翻了下laravel5.3的文档,现在中间件都是在构造后执行,要么你换成其他低版本,要么不用中间件,或者把你原来构造函数要调用的方法都写在中间件里。

举个栗子:(注意:该特性需要laravel版本5.3.4以上)

public function __construct() {

    $this->middleware(function ($request, $next) {
        $this->wx_api();
        return $next($request);
    });
}

public function wx_api () {
    
}
0

楼主,你的编辑器主题是什么?麻烦告知,谢谢

该答案已被忽略,原因:不符合答题规范,内容不是答案,可用评论、投票替代

撰写答案

推广链接