【问题标题】:Laravel 5.1 view composer initiates before middlewareLaravel 5.1 视图 composer 在中间件之前启动
【发布时间】:2015-12-08 13:31:44
【问题描述】:

我正在使用 Laravel 5.1 开发一个简单的 Web 应用程序,我的开发环境是 Homestead。

我有一个视图编辑器可以自动将Auth::user() 数据传递给管理面板相关视图。大多数通用管理面板页面(仪表板、设置等)使用 AdminController,它扩展了 Laravel 的 Controller。特定的管理面板页面(用户、订单等)有自己的控制器(分别为 Admin\UsersControllerAdmin\OrdersController),它们是 AdminController 的扩展。

routes 中没有为管理面板相关路由注册任何中间件,而是AdminController 加载auth 中间件(检查注册用户是否尝试加载页面)。并且没有其他扩展 AdminController 的控制器会覆盖构造函数。

我的问题是,如果用户未登录并尝试加载管理面板页面(不管是哪一个;仪表板、设置、用户、订单 - 因为视图编写器要求每一个都通过 @987654331 @data)没有警告说“你没有被授权”。或者没有重定向到登录页面,只是抛出一个异常,上面写着Auth::user()null

auth 中间件不是先调用的吗?如果不是,我应该怎么做才能防止抛出异常(顺便说一句,从视图作曲家returning 对我的观点来说不是一个优雅的解决方案)?

提前致谢。


附录
  • 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()
        {
            //
        }
    }
    

注意:ComposerServiceProvider 注册在config/app.php

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    你的Admin\OrdersController 扩展App\Http\Controllers\Controller,它应该扩展App\Http\Controllers\Admin\AdminController。这就是你没有得到重定向的原因。

    【讨论】:

    • 哇,感谢您的提醒,我错过了。但这不是我想要的解决方案。当我尝试加载“使用”AdminController(比如仪表板)的管理面板页面时,我仍然面临着我的特殊问题。中间件不应该在视图作曲家之前被调用?
    • 我不确定,但可能是因为您正在从控制器调用中间件。我总是将中间件添加到路由中,例如Route::get('foo', ['middleware' =&gt; 'auth' /* the rest */ ]);
    • 是的,也可以使用here。还有一个问题(因为我现在懒得深入研究文档)是用routes文件逗号分隔的中间件吗?
    • 这看起来是一种奇怪的行为,但我确信 Taylor 这样做是有原因的。只需使用路由中间件即可。这解决了你的问题,对吧?
    • 是的,它解决了我的问题,答案标记为解决方案。谢谢。为了回答我关于 cmets 的最新问题,文档说“使用数组将多个中间件分配给路由”。
    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 2016-02-24
    • 2016-04-10
    • 2017-01-12
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多