Php Laravel 5.1视图生成器在中间件之前启动
我正在用Laravel5.1开发一个简单的web应用程序,我的开发环境是Homestead 我有一个视图生成器,可以将Php Laravel 5.1视图生成器在中间件之前启动,php,laravel,Php,Laravel,我正在用Laravel5.1开发一个简单的web应用程序,我的开发环境是Homestead 我有一个视图生成器,可以将Auth::user()数据自动传递到与管理面板相关的视图。大多数常规管理面板页面(仪表板、设置等)使用AdminController,它扩展了Laravel的Controller。特定的管理面板页面(用户、订单等)有自己的控制器(admin\userscocontroller,admin\OrdersController),它们是扩展的AdminController 对于管理面
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
(比如Dashboard)的管理面板页面时,我仍然面临着一个特殊的问题。不应该在视图生成器之前调用中间件?我不确定,但可能是因为您正在从控制器调用中间件。我总是在路由中添加中间件,比如AdminController
route::get('foo',['middleware'=>'auth'/*其余的*/])代码>是,可以,并声明为。还有一个问题(因为我现在懒得深入研究文档)是用
文件逗号分隔的方式编写的中间件吗?这看起来很奇怪,但我相信泰勒一定有原因。那就使用route中间件吧。这就解决了你的问题,对吗?是的,它解决了我的问题,答案被标记为解决方案。谢谢为了回答我关于评论的最新问题,文档中说“使用一个数组为路由分配多个中间件”。routes