Как вывести переменную во все файлы шаблона laravel

134
02 июля 2019, 13:10

Есть таблица, которая хранит в себе адреса городов

id | name    | site      | address | phone
1  | Город 1 | site-1.ru | Адрес 1 | номер телефона 1
2  | Город 2 | site-2.ru | Адрес 2 | номер телефона 2

Есть несколько доменов, которые стоят на на одной платформе(не имеют свой корневой папки, все домены имеют 1 корневую папку с сайтом)

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

Единственное, что пришло в голову, это сделать все через кэш. Как сделал я

В роутах (web.php)

if(!cache('city_name') || !cache('city_address')) {
  $site= $_SERVER['HTTP_HOST'];
  $br = \App\City::where('site', $site)->first();
  cache(['city_name' => $br->name], 43200);
  cache(['city_address' => $br->address], 43200);
}

И в самом шаблоне выводим

{{cache('city_name')}}

Вроде бы все работает, но на сколько это правильный подход, может у Laravel для таких случаев есть свои фишки?

Не тестировал на разный адресах, проект стоит на локалке. Немного погуглив понял, что cache сохраняется на сервере, а не у клиента. Получается, что на всех адресах будет 1 city_name, правильно ли я понял?

Если да, то как быть, использовать куки?

Если не правильно указал название, поправьте пожалуйста

Answer 1

У Laravel для этого действительно есть "свои фишки":

namespace App\Http\Middleware;
use Closure;
class AddressMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(!cache('city_name') || !cache('city_address')) {
            $site= $_SERVER['HTTP_HOST'];
            $br = \App\City::where('site', $site)->first();
            cache(['city_name' => $br->name], 43200);
            cache(['city_address' => $br->address], 43200);
        }
        // здесь User ID поможет Вам кешировать локацию конкретно под пользователя
        View::share('city_name', cache('city_name' . $this->auth->user()->id));
        return $next($request);
    }
}

Но как по мне, шаринг данных во все вьюхи, как описано в документации - такое-себе решение, которое чревато болью в будущем.

Можно немного уменьшить урон от такого подхода, создав middleware и "подключить" его к необходимым роутам. Помните, что можно приатачить middleware к конкретной группе роутов или сделать вот так. Решать Вам.

READ ALSO
Из php не видит функцию javascript - как исправить?

Из php не видит функцию javascript - как исправить?

Есть магазин на wordpress+woocommerceДля того, чтобы для потенциального покупателя сделать некоторые удобные вещи во время покупки, я запоминаю его...

149
Как в laravel конвертировать array в xml?

Как в laravel конвертировать array в xml?

Как конвертировать array из модели в xml средствами laravel ?

122
Выборка из базы с заменой значения колонки MySQL

Выборка из базы с заменой значения колонки MySQL

Делаю запрос в БДЗадача стоит следующая: делаю выборку из таблицы A, в которой есть колонки price_min, price_max, weight_min, weight_max

156