Возвращает переменную Laravel к контроллеру

Я выполняю проверку прав пользователя, чтобы определить, могут ли они просматривать страницу или нет. Это включает в себя передачу запроса через некоторое промежуточное ПО.

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

Вот пример установки;

– routes.php

Route::get('pages/{id}', [ 'as' => 'pages', 'middleware' => 'pageUser' 'uses' => 'PagesController@view' ]); 

– PageUserMiddleware.php (класс PageUserMiddleware)

 public function handle($request, Closure $next) { //get the page $pageId = $request->route('id'); //find the page with users $page = Page::with('users')->where('id', $pageId)->first(); //check if the logged in user exists for the page if(!$page->users()->wherePivot('user_id', Auth::user()->id)->exists()) { //redirect them if they don't exist return redirect()->route('redirectRoute'); } return $next($request); } 

– PagesController.php

 public function view($id) { $page = Page::with('users')->where('id', $id)->first(); return view('pages.view', ['page' => $page]); } 

Как вы можете видеть, в обоих промежуточном программном обеспечении и контроллере повторяется Page::with('users')->where('id', $id)->first() . Мне нужно передать данные от одного к другому, чтобы не дублировать.

Related of "Возвращает переменную Laravel к контроллеру"

Я считаю, что правильный способ сделать это (в Laravel 5.x) состоит в том, чтобы добавить ваши собственные поля в свойство атрибутов.

Из комментариев исходного кода мы видим, что атрибуты используются для настраиваемых параметров:

  /** * Custom parameters. * * @var \Symfony\Component\HttpFoundation\ParameterBag * * @api */ public $attributes; 

Таким образом, вы реализуете это следующим образом;

 $request->attributes->add(['myAttribute' => 'myValue']); 

Затем вы можете получить атрибут, вызвав:

 \Request::get('myAttribute'); 

В laravel> = 5 вы можете использовать $request->merge в промежуточном программном обеспечении:

 public function handle($request, Closure $next) { $request->merge(array("myVar" => "1234")); return $next($request); } 

И в контроллере:

 public function index(Request $request) { $myVar = Request::instance()->query('myVar'); ... } 

Вместо пользовательских параметров запроса вы можете следовать шаблону инверсии управления и использовать инъекцию зависимостей.

В своем промежуточном программном средстве зарегистрируйте экземпляр вашей Page :

app()->instance(Page::class, $page);

Затем объявите, что вашему контроллеру нужен экземпляр Page :

 class PagesController { protected $page; function __construct(Page $page) { $this->page = $page; } } 

Laravel автоматически разрешит зависимость и создаст экземпляр вашего контроллера с экземпляром Page который вы связали в своем промежуточном программном обеспечении.

Я уверен, что было бы возможно передать данные из промежуточного программного обеспечения в контроллер, тогда это будет в документации Laravel.

Взгляните на это и это , это может помочь.

Короче говоря, вы можете копировать свои данные на объект запроса, который передается промежуточному программному обеспечению. Фасад аутентификации Laravel делает это тоже.

Таким образом, в вашем промежуточном программном обеспечении вы можете:

 $request->myAttribute = "myValue"; 

$ request – массив, поэтому мы можем просто добавить значение и ключ к массиву и получить запрос $ с этим ключом в контроллере.

$ request ['id'] = $ id;

Я не говорю по-английски, поэтому … извините за возможные ошибки.

Для этого вы можете использовать привязку IoC. В вашем промежуточном программном обеспечении вы можете сделать это для привязки экземпляра $ page:

 \App::instance('mi_page_var', $page); 

После этого в контроллере вы вызываете этот экземпляр:

 $page = \App::make('mi_page_var'); 

Экземпляр App :: не повторяет экземпляр класса, вместо этого возвращает экземпляр, предшествующий привязке.

Как упоминалось в одном из комментариев выше для laravel 5.3.x

 $request->attributes->add(['key => 'value'] ); 

Не работает. Но установка такой переменной в промежуточном программном обеспечении

 $request->attributes->set('key', 'value'); 

Я мог бы получить данные, используя это в моем контроллере

 $request->get('key');