0

一般来说,这应该是一个相当简单的问题。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;

在尝试了很长一段时间后,似乎没有任何效果,我一直得到一个空值。从根本上说,这应该不是非常困难,但我似乎关闭了我的语法或没有使用正确的名称空间?

4

2 回答 2

1

而不是这个代码行:

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

你可以试试:

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

此代码行的作用是,如果其中存在名为的参数,它将用新值覆盖,否则它将向group$requestgroup$request

在您的控制器中,您可以获得group参数的值:

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

于 2017-07-21T05:43:30.783 回答
0

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

第一个问题是我正在使用sleepOwl 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'));

}

}
于 2017-07-21T06:30:53.757 回答