扩展Laravel基本控制器

时间:2016-11-17 17:46:49

标签: php laravel session

我是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

2 个答案:

答案 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); }

在控制器的构造方法上。

现在这对我有用。

感谢大家的贡献。