Laravel 5.1视图组件在中间件之前初始化

3
我正在使用Laravel 5.1开发一个简单的Web应用程序,并且我的开发环境是Homestead。
我有一个视图组成器来自动将Auth::user()数据传递给与管理面板相关的视图。大多数常规管理面板页面(仪表板、设置等)使用AdminController,它扩展了Laravel的Controller。特定的管理面板页面(用户、订单等)有它们自己的控制器(分别是Admin\UsersControllerAdmin\OrdersController),这些控制器都扩展了AdminController
在路由中没有任何中间件注册管理面板相关路由。相反,AdminController加载auth中间件(它检查注册的用户是否试图加载页面)。没有其他扩展AdminController的控制器覆盖构造函数。
我的问题是,如果未登录用户尝试加载管理面板页面(无论是哪一个;仪表板、设置、用户、订单 - 因为视图组成器为每个页面调用以传递Auth::user()数据),就没有警告说“您未获得授权。”或者没有重定向到登录页面,只是抛出一个异常,该异常称Auth::user()null
难道不应该首先调用auth中间件吗?如果不是,那我应该怎么做才能防止抛出异常(从视图组成器中的return并不是一个优雅的解决方案)?
提前致谢。
  • AdminController

    <?php
    
    namespace App\Http\Controllers\Admin;
    
    use Illuminate\Http\Request;
    
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    
    class AdminController extends Controller
    {
        public function __construct()
        {
            // After middlewares
            $this->middleware("auth");
            $this->middleware("admin");
    
            // Before middlewares
            $this->middleware("no-cache");
        }
    
        /**
         * Display a listing of the resource.
         *
         * @return Response
         */
        public function index()
        {
            return view("admin.index");
        }
    }
    
  • Admin\OrdersController

    <?php
    
    namespace App\Http\Controllers\Admin;
    
    use Illuminate\Http\Request;
    
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    
    use App\Order;
    
    class OrdersController extends Controller
    {
        /**
         * Display a listing of the resource.
         *
         * @return Response
         */
        public function index()
        {
            $orders = Order::with("address")->get();
    
            return view("admin.orders.index")->with("orders", $orders);
        }
    }
    
  • ComposerServiceProvider

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    use Auth;
    
    class ComposerServiceProvider extends ServiceProvider
    {
        /**
         * Bootstrap the application services.
         *
         * @return void
         */
        public function boot()
        {
            view()->composer("layouts.admin.default", function ($view) {
                $admin = Auth::user();
    
                $view->with([
                    "admin" => $admin,
                    "picture" => $admin->pictures[0]
                ]);
            });
        }
    
        /**
         * Register the application services.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }
    
注意:在 config/app.php 中注册了 ComposerServiceProvider
1个回答

2

你的Admin\OrdersController继承自App\Http\Controllers\Controller,但它应该继承自App\Http\Controllers\Admin\AdminController。这就是为什么你没有得到重定向的原因。


哇,谢谢你提醒我,我错过了这个。但这不是我寻求的解决方案。当我尝试加载一个使用“AdminController”(比如仪表盘)的管理面板页面时,我仍然遇到了我的独特问题。中间件不应该在视图组成器之前被调用吗? - ozanmuyes
1
我不确定,但可能是因为您正在从控制器调用中间件。我总是像这样将中间件添加到路由中:Route :: get('foo',['middleware' => 'auth'/*其余*/]); - Hkan
可以,也可以在这里查看:https://dev59.com/zV0Z5IYBdhLWcg3wyyx1。我还有一个问题(因为我现在感到懒得去挖文档),中间件在“routes”文件中是用逗号分隔的吗? - ozanmuyes
那看起来像是一种奇怪的行为,但我相信 Taylor 有他的理由。只需使用路由中间件即可解决您的问题,对吧? - Hkan
是的,它解决了我的问题,并将答案标记为解决方案。谢谢。回答我最新的评论问题,文档说“使用数组将多个中间件分配给路由”。 - ozanmuyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接