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