Php Laravel 5.1视图生成器在中间件之前启动

Php Laravel 5.1视图生成器在中间件之前启动,php,laravel,Php,Laravel,我正在用Laravel5.1开发一个简单的web应用程序,我的开发环境是Homestead 我有一个视图生成器,可以将Auth::user()数据自动传递到与管理面板相关的视图。大多数常规管理面板页面(仪表板、设置等)使用AdminController,它扩展了Laravel的Controller。特定的管理面板页面(用户、订单等)有自己的控制器(admin\userscocontroller,admin\OrdersController),它们是扩展的AdminController 对于管理面

我正在用Laravel5.1开发一个简单的web应用程序,我的开发环境是Homestead

我有一个视图生成器,可以将
Auth::user()
数据自动传递到与管理面板相关的视图。大多数常规管理面板页面(仪表板、设置等)使用
AdminController
,它扩展了Laravel的
Controller
。特定的管理面板页面(用户、订单等)有自己的控制器(
admin\userscocontroller
admin\OrdersController
),它们是扩展的
AdminController

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

我的问题是,如果用户未登录并尝试加载管理面板页面(不管是哪一个;仪表板、设置、用户、订单-因为视图生成器调用每个人传递
Auth::user()
data),则不会出现警告说“您未经授权”。或者不会重定向到登录页面,只是抛出了一个异常,表示
Auth::user()
null

auth
中间件不是先调用的吗?如果不是,我应该怎么做来防止抛出异常(
return
ing from view composer对我来说不是一个优雅的解决方案)

提前谢谢。
附录

  • 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");
        }
    }
    
    <?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);
        }
    }
    
  • Composer服务提供商

    <?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()
        {
            //
        }
    }
    

    您的
    Admin\OrdersController
    扩展了
    App\Http\Controllers\Controller
    ,此时它应该扩展
    App\Http\Controllers\Admin\AdminController
    。这就是为什么你没有得到重定向。

    哇,谢谢你的提醒,我错过了。但这不是我所寻求的解决方案。当我试图加载一个“使用”
    AdminController
    (比如Dashboard)的管理面板页面时,我仍然面临着一个特殊的问题。不应该在视图生成器之前调用中间件?我不确定,但可能是因为您正在从控制器调用中间件。我总是在路由中添加中间件,比如
    route::get('foo',['middleware'=>'auth'/*其余的*/])是,可以,并声明为。还有一个问题(因为我现在懒得深入研究文档)是用
    routes
    文件逗号分隔的方式编写的中间件吗?这看起来很奇怪,但我相信泰勒一定有原因。那就使用route中间件吧。这就解决了你的问题,对吗?是的,它解决了我的问题,答案被标记为解决方案。谢谢为了回答我关于评论的最新问题,文档中说“使用一个数组为路由分配多个中间件”。