передача данных из промежуточного программного обеспечения для просмотра или альтернативный способ отображения определенных данных на каждой странице

#php #laravel #laravel-5 #laravel-5.2

#php #laravel #laravel-5

Вопрос:

на моем веб-сайте у меня есть довольно сложная категория, которую я должен показывать в каждом представлении (на стороне клиента), поэтому я подумал, что поместил код для создания категории в промежуточное программное обеспечение и передаю результат в views

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

 <?php

namespace AppHttpMiddleware;

use Closure;

class CtegoryMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $request->merge(array("all_categories" => "abc"));
        $request['all_categories']= 'abc';
        return $next($request);
    }
}
  

маршрут :

 Route::group(['middleware' => ['category' ]], function () {
     Route::get('/', 'HomeController@index');
});
  

но, на мой взгляд, когда я повторяю all_categories, я получаю

 Undefined variable: all_categories 
  

кстати, я проверил, повторив что-то, промежуточное программное обеспечение запускается по запросу

Комментарии:

1. Хотя переменная all_categories доступна на вашем $request компьютере, возможно, вы не передали ее в свой view в вашем контроллере?

2. @JofryHS как я уже сказал, я не хочу ничего делать в своих контроллерах, иначе я бы создал вспомогательный класс или что-то вместо этого …. я просто хочу, чтобы конкретные данные были доступны во всех моих представлениях (ну, в большинстве из них)

3. Возможно, используйте View::share() для совместного использования ваших переменных в вашем view? laravel.com/docs/5.3/views#sharing-data-with-all-views

4. спасибо, это лучше, но нет маршрутизации, и я должен загружать все категории даже в раздел администратора, который мне не нужен …. я называю этот план Б

5.Не совсем уверен, что означает «нет маршрутизации», но технически, если вы вызываете view()->share() внутри своего промежуточного программного обеспечения, оно должно использовать одну и ту же переменную во всех последующих представлениях

Ответ №1:

Я думаю, в вашем случае использования глобально доступной переменной view должно быть достаточно.

 <?php

namespace AppHttpMiddleware;

use Closure;

class CtegoryMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $request->merge(array("all_categories" => "abc"));
        $request['all_categories']= 'abc';

        /**
         * This variable is available globally on all your views, and sub-views
         */
        view()->share('global_all_categories', 'abc');

        return $next($request);
    }
}
  

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