Как получить данные, передаваемые композитором представления в определенные представления, внутри контроллера? - PullRequest
0 голосов
/ 14 октября 2018

My View Composer передает некоторые данные определенным представлениям (и, конечно, работает):

use Illuminate\View\View;
use App\Util\Helper

class PublicSettingsComposer
{
    public function compose(View $view)
    {
        $view->with('settings', Helper::readSettingsFromFile()); // json
    }
}

Соответствующий поставщик добавляется в конфигурацию и корректно предоставляет этого композитора для всех определенныхviews:

view()->compose('public.layouts.*', 'App\Http\ViewComposers\PublicSettingsComposer');

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

class BranchController extends Controller
{
    public function branches()
    {
        $settings = retrieve_settings_passed_by_PublicSettingsComposer; // This is what I need
        $headquartersId = $settings->headquartersid;
        return view('public.layouts.branches', [
            'headquarters' => Branch::find($headquartersId) // Branch is a Model
        ]);
    }
}

К вашему сведению: Я использую версию Laravel: 5,5


PS @moderators: Пожалуйста, будьте внимательны при рассмотрениимой вопрос как дубликатЯ знаю, что есть много вопросов о композиторах представлений и передаче данных в представления и получении данных из контроллеров.Однако я действительно не мог найти никаких вопросов с этим контекстом (названия часто вводят в заблуждение).

1 Ответ

0 голосов
/ 15 октября 2018

Я вижу два довольно простых решения для этого.Первый - кэшировать проанализированный файл в каждом запросе.Другой - использовать фактический кеш для этой работы.

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

class Helper
{
    protected static $cachedSettings;

    public function readSettingsFromFile()
    {
        if (!self::$cachedSettings) {
            self::$cachedSettings = // Do the parsing here. This should be your current implementation of Helper::readSettingsFromFile(). You can also put this in its own function.
        }

        return self::$cachedSettings;
    }
}

Другой вариант - использовать реальный кэш (внешний).Вы можете кэшировать анализируемый файл определенное количество раз (например, 1, 3, 5 или 10 минут или даже дольше).Или вы кешируете его навсегда и аннулируете кеш при обновлении настроек (если это происходит в вашем приложении, и вы знаете, оно было обновлено).

Это решение имеет смысл, только если ваши настройкине меняйте слишком часто, хотя.Это также немного зависит от количества запросов, которые вы ожидаете от вашего приложения.Если ваши настройки меняются не слишком часто (менее чем каждые x минут ) и ваше приложение используется часто (несколько запросов каждые x минут ), тогда это может быть жизнеспособным решением.

class Helper
{
    public function readSettingsFromFile()
    {
        return Cache::remember(function () {
            $settings = // Put your current calculation here

            return $settings;
        }, 3 * 60); // 3 * 60 = 180 seconds
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...