php - Laravel 5.1 view composer 在中间件之前启动

标签 php laravel

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

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

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

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

不是先调用了auth中间件吗?如果不是,我应该怎么做才能防止抛出异常(顺便说一下,returning 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");
        }
    }
    
  • 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中注册的。

最佳答案

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

关于php - Laravel 5.1 view composer 在中间件之前启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32532764/

相关文章:

laravel - 如何允许 Laravel 数字验证为空值

javascript - 如何在 View 中显示特定的 laravel 验证错误,而不是全部

laravel - vue组件如何调用全局变量?

javascript - 获取被点击的 anchor 标签的id

php - YouTube API 网站 URL token 限制?

php - Codeigniter:如何将文件路径上传到数据库?

php - 第一次尝试 Laravel undefined variable

php - 禁用Laravel 8中的Auth Register路由?

PHP 不显示 MYSQL 查询的结果

php - Laravel 4 在用户登录后显示属于用户的帖子