拉拉维尔中间件工作奇怪



令人惊讶的是,$this->middleware('guest'(->except(['create', 'store'](在$this->middleware('auth'(->except(['index', 'show'](上正常工作;在PostsController上完美运行。两者在逻辑上的意思相同,那么为什么第一个不起作用呢?这是帖子控制器:

<?php
namespace AppHttpControllers;
use AppPost;
class PostsController extends Controller
{
public function __construct() {
$this->middleware('auth')->except(['index', 'show']);
}
public function index() {
$posts = Post::latest()->get();
return view('posts.index', compact('posts'));
}
public function show(Post $post) {
return view('posts.show', compact('post'));
}
public function create() {
return view('posts.create');
}
public function store() {
$this->validate(request(), [
'title' => 'required',
'body' => 'required'
]);
Post::create([
'title' => request('title'),
'body' => request('body'),
'user_id' => auth()->id()
]);
return redirect('/');
}
}
$this->middleware('guest')->except(['create', 'store'])

$this->middleware('auth')->except(['index', 'show']);

逻辑上的意思不一样。

第一个代码块表示"只有来宾可以执行此控制器中的所有请求,但创建和存储除外,因此每个人都可以执行这些请求(因为它们不仅限于来宾(。

第二个代码块表示"只有经过身份验证的用户才能执行此控制器中的所有请求,索引和显示除外,因此每个人都可以执行这些请求(来宾、经过身份验证的用户(。

这是因为在 Laravel 中,没有中间件 = 没有过滤器给任何人。except不会将相反的中间件筛选器应用于路由/方法。