Laravel 5.4:通过请求将变量传递给控制器​​

时间:2017-07-21 04:52:14

标签: laravel laravel-5 laravel-middleware laravel-request laravel-controller

一般来说,这应该是一个相当简单的问题。 IT应该与Stack Overflow

上的以下问题非常相似

但是看到它已经两年了,也许有些语法已经改变了。

我想要做的就是将一个变量从中间件传递给控制器​​,所以我不会复制mysql查询。

这是我的中间件:

namespace App\Http\Middleware;

use Closure;

class CheckRole 
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next) 
    {
        $id = $request->user()->id;
        $rr = $request->user()->isSuperAdmin();

        if ($request->user()->isSuperAdmin()) {
            $request->merge(['group' => 123]);

            return $next($request);
        }

        echo "not admin";
    }
}

所以中间件工作正常,如果我在中间件上使用DD($ request),我看到我的组=>页面上的123。 (为了简单起见,现在它是123.)

所以我想把它传递给我的AdminController:

<?php

namespace SleepingOwl\Admin\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use SleepingOwl\Admin\Form\FormElements;
use SleepingOwl\Admin\Form\Columns\Column;
use SleepingOwl\Admin\Display\DisplayTable;
use Illuminate\Contracts\Support\Renderable;
use SleepingOwl\Admin\Display\DisplayTabbed;
use Illuminate\Validation\ValidationException;
use SleepingOwl\Admin\Contracts\AdminInterface;
use SleepingOwl\Admin\Model\ModelConfiguration;
use Illuminate\Contracts\Foundation\Application;
use SleepingOwl\Admin\Contracts\Form\FormInterface;
use SleepingOwl\Admin\Contracts\ModelConfigurationInterface;
use SleepingOwl\Admin\Contracts\Display\ColumnEditableInterface;

class AdminController extends Controller 
{
    /**
     * @var \DaveJamesMiller\Breadcrumbs\Manager
     */
    protected $breadcrumbs;

    /**
     * @var AdminInterface
     */
    protected $admin;

    /**
     * @var
     */
    private $parentBreadcrumb = 'home';

    /**
     * @var Application
     */
    public $app;

    /**
     * AdminController constructor.
     *
     * @param Request $request
     * @param AdminInterface $admin
     * @param Application $application
     */
    public function __construct(Request $request, AdminInterface $admin,             Application $application) 
    {
        $this->middleware('CheckRole');

因此,您可以看到我在此构造函数上调用中间件。在调用之后我应该能够做到这样的事情:

$request->get('group'); or $request->group;

经过一段时间的尝试,似乎没有任何工作,我一直得到一个空值。从根本上说,这应该不是非常困难,但我似乎关闭或不使用正确的名称空间?

2 个答案:

答案 0 :(得分:1)

而不是这段代码:

$request->merge(['group' => 123]);

您可以尝试:

$request->request->add(['group' => 123]);

此代码行将执行的操作是如果group中存在名为$request的参数,它将使用新值覆盖,否则它将添加新参数group$request

在您的控制器中,您可以将group参数的值设为:

$group = $request->group;$group = $request->input('group');

答案 1 :(得分:0)

感谢@ Rahul-Gupta和@shock_gone_wild的联合帮助。这是我猜的共同努力。

第一个问题是我正在使用sleepingOwl laravel样板。可能不是Laravel新手的最佳选择。 (不是MVC / PHP的新手)。

基于@shock_gone_wild评论,决定将我的测试移到一个简单的控制器上,而不是睡觉的猫头鹰胡说八道。 (他们有很多代码。)无论如何,我相信这有帮助。我确实在构造函数中保留了中间件,因为我没有将中间件应用于路由。

然后我跟着@ Rahul-Gupta语法。

所以这是最后的结果,希望有一天这会拯救某人......

namespace App\Http\Middleware;

use Closure;

class CheckRole {

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
 public function handle($request, Closure $next) {


 if ($request->user()->isSuperAdmin()) {
    $request->request->add(['group' => 123]);
    return $next($request);
} else {
    echo "not admin";
}
}

}

然后这是简单的控制器。

use Illuminate\Http\Request;
use App\task;
use App\User;
use App\HasRoles;

class TaskController extends Controller {

public function __construct() {
  // constructor code...
  $this->middleware('auth');
  $this->middleware('CheckRole');
}

public function index(Request $request) {

   $group = $request->input('group');
   echo "---->" . $group;

   $tasks = Task::all();

   return view('test_task', compact('tasks'));

}

}
相关问题