我是Laravel框架中的新手,我想扩展一个基本控制器,后者又扩展了控制器。但是,我发现当我这样做时,我的控制器不再识别我的会话变量。
这是我的代码
namespace App\Http\Controllers\Settings;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Auth\PermissionController;
use App\Fee;
class FeeController extends PermissionController
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
dd(session('userdata')['user_urls']);
$data['title']="Fees";
$data['fees']=Fee::all();
return view('settings.fee.index',$data);
}
这是我的PermissionController代码
<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PermissionController extends Controller {
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct(Request $request) {
if(!session('userdata')['user_urls']->contains($request->path())){
dd(session('userdata')['user_urls']);
}
}
}
但我意识到我的session('userdata')['user_urls']
在PermissionController中变为null。但是,如果我让FeeController扩展Controller,我的会话变量就完好了。
我需要在权限控制器上使用会话变量进行某些控制。
我在MAC OSX和PHP 7上运行Laravel 5.3
答案 0 :(得分:1)
我已经找到了问题所在。实际上,PermissionController未在Web中间件组中注册,因此会话不会在PermissionController中持久存在。因此,您的问题的解决方案就是创建一个名为Permission的特征而不是控制器,并在FeesContorller中使用它。
trait Permission{
public function permission(Request $request) {
if($request->session()->get('name') != null){
echo "Hello World";
}
}
}
和FeesController一样:
class FeesController extends Controller
{
use Permission;
public function index(Request $request)
{
$this->permission($request); // the method of the trait.
echo "\n".$request->session()->get('name');
}
}
<强>输出:强>
如果在会话中设置了name属性,则
Hello World
Passion Infinite
否则
No Output // null
答案 1 :(得分:0)
我用中间件解决了同样的问题。我创建了一个中间件,通过检查会话来处理请求的授权,以确保正在访问的控制器操作在会话中可用。
这是中间件
$(".make_me_collapsible").attr("data-role","collapsible");
这是控制器
namespace App\Http\Middleware;
use Closure;
class PermissionMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$currentAction = \Route::currentRouteAction();
list($nothing,$route_action) = explode('App\Http\Controllers\\', $currentAction);
$user_actions=session('userdata')['user_urls'];
if((empty($user_actions))||!$user_actions->contains($route_action)){
return redirect('denied');
}
return $next($request);
}
}
因此,我使用了控制器动作,而不是使用路由(其他一些原因)。 因此,一旦用户登录,他可以访问的所有控制器操作都会加载到会话中。当他尝试执行任何操作时,中间件会进行检查以确保允许他执行该操作。否则,他就会被赶走。
所以,我要么为路由中间件添加'权限',要么调用
namespace App\Http\Controllers\Settings;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Auth\PermissionController;
use App\Fee;
class FeeController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
$data['title']="Fees";
$data['fees']=Fee::all();
return view('settings.fee.index',$data);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create(Request $request)
{
$data['title']='New Fee';
return view('settings.fee.create',$data);
}
在控制器的构造方法上。
现在这对我有用。
感谢大家的贡献。