我正在用laravel 5.1开发一个简单的web应用程序,我的开发环境是homestead。
我有一个视图生成器,可以将Auth::user()数据自动传递到与管理面板相关的视图。大多数常规管理面板页面(仪表板、设置等)使用AdminController,它扩展了laravel的Controller。特定的管理面板页面(用户、订单等)有自己的控制器(分别为Admin\UsersControllerAdmin\OrdersController),它们是扩展的AdminController
没有任何在routes中注册的用于管理面板相关路由的中间件,而是AdminController加载auth中间件(它检查注册用户是否尝试加载页面)。并且没有其他扩展AdminController的控制器重写构造函数。
我的问题是,如果用户没有登录并尝试加载管理面板页面(不管是哪个页面;仪表板、设置、用户、订单-因为视图生成器要求每个页面传递Auth::user()数据),则不会出现“您未经授权”的警告,也不会重定向到登录页面,只是抛出了一个异常,表示Auth::user()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()
    {
        //
    }
}

注:ComposerServiceProviderconfig/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/

10-09 20:11