Laravel 5.4: передача переменной через запрос к контроллеру

Вообще говоря, это должна быть довольно простая задача. Это должно быть очень похоже на следующий вопрос о переполнении стека

Но, учитывая, что прошло два года, возможно, кое-что в синтаксисе изменилось.

Все, что я хочу сделать, это передать переменную из промежуточного программного обеспечения в контроллер, поэтому я не дублирую запросы 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;

После долгих попыток ничего не работает, и я продолжаю получать нулевое значение. По сути, это не должно быть ужасно сложно, но, похоже, у меня отключен синтаксис или я не использую правильные пространства имен?


person Chad    schedule 21.07.2017    source источник
comment
Ну, технически вы на самом деле не вызываете промежуточное программное обеспечение в конструкторе. Вы только что сказали, что промежуточное программное обеспечение CheckRole должно применяться для всех маршрутов, указывающих на методы контроллера. Ваш пример отлично работает для меня, если я вызываю dd($request-›all()) в методе контроллера, таком как index. Запрос не будет изменен ВНУТРИ конструктора.   -  person shock_gone_wild    schedule 21.07.2017


Ответы (2)


Вместо этой строки кода:

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

Вы можете попробовать:

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

Что будет делать эта строка кода, так это если параметр с именем group существует в $request, он будет перезаписан новым значением, в противном случае он добавит новый параметр group в $request

В вашем контроллере вы можете получить значение параметра group как:

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

person Rahul Gupta    schedule 21.07.2017
comment
Хорошо, когда я делаю dd($request) на странице промежуточного программного обеспечения, я вижу это в дампе. Однако, когда я пытаюсь извлечь значение на стороне контроллера, я ничего не получаю. echo "---->" . $request->get('group'); - person Chad; 21.07.2017
comment
Я отредактировал свой ответ и теперь добавил код для извлечения значения параметра в контроллере. Дайте мне знать, если у вас все еще есть проблемы. - person Rahul Gupta; 21.07.2017
comment
Пожалуйста, рассмотрите возможность принятия моего ответа и предоставления UP, если мой код действительно помог решить вашу проблему. Спасибо - person Rahul Gupta; 21.07.2017

Благодаря совместной помощи @Rahul-Gupta и @shock_gone_wild. Думаю, это были совместные усилия.

Первая проблема заключается в том, что я использую шаблон Laravel sleepingOwl. Вероятно, не лучшая идея для новичка в 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'));

}

}
person Chad    schedule 21.07.2017