#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-views4. спасибо, это лучше, но нет маршрутизации, и я должен загружать все категории даже в раздел администратора, который мне не нужен …. я называю этот план Б
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);
}
}
Переменная загружается один раз (если вы выполняете запрос к базе данных, запрос будет выполнен только один раз), а затем переменная сохраняется на фабрике просмотра.