【发布时间】:2015-12-08 13:31:44
【问题描述】:
我正在使用 Laravel 5.1 开发一个简单的 Web 应用程序,我的开发环境是 Homestead。
我有一个视图编辑器可以自动将Auth::user() 数据传递给管理面板相关视图。大多数通用管理面板页面(仪表板、设置等)使用 AdminController,它扩展了 Laravel 的 Controller。特定的管理面板页面(用户、订单等)有自己的控制器(分别为 Admin\UsersController、Admin\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。
【问题讨论】: