Laravel: внедрение контроллера в виде другого контроллера - PullRequest
1 голос
/ 26 февраля 2020

Допустим, у меня есть NewsController::lastNews, который может получать и отображать некоторые новости.

Я хочу отображать эти новости во многих других контроллерах (HomeController, WhateverController).

Вариант 1: выборка данных на каждом контроллере: Я могу получить данные в каждом требуемом контроллере (HomeController, Wh whatController) напрямую, через службу или даже Trait, а затем передать их представление, затем @include шаблон моих новостей в шаблон контроллера, но это выглядит как не очень гладкий

Вариант 2, мой любимый до сих пор: Использование @ введите в мои шаблоны: Это очень близко к render(controller()) из Symfony, но я хочу знать, есть ли какие-либо проблемы с этим, потому что это не задокументировано для использования с контроллерами.

@inject('news', 'App\Http\Controllers\NewsController')
<div> {{ $news->lastNews(3) }} </div>

Каков рекомендуемый способ обмена данными и представлениями в Laravel? Благодаря.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Для этой цели есть View Composer. Вы можете создать файл, который будет извлекать данные, а затем указать, в каких представлениях эти данные доступны.

Вам потребуется создать ViewServiceProvider и зарегистрировать его в разделе config/app.php providers.

В ViewServiceProvider вы можете указать в методе boot(), какое представление будет иметь конкретное c представление composer

Пример ViewServiceProvider

class ViewServiceProvider extends ServiceProvider
{
    /**
    * Register any application services.
    *
    * @return void
    */
    public function register()
    {
        //
    }

    /**
    * Bootstrap any application services.
    *
    * @return void
    */
    public function boot()
    {
        View::composer('your.view.name', YourComposerName::class);
    }
}

Пример представление composer:

use Illuminate\View\View;

class YourComposerName
{
    /**
    * Bind data to the view.
    *
    * @param  View  $view
    * @return void
    */
    public function compose(View $view)
    {

        $view->with('variable_name', ['data_that_will_be_passed_to_the_view']]);
    }
}

Ссылка на документацию - Просмотр композиторов

0 голосов
/ 26 февраля 2020

Контроллеры не предназначены для определения методов * stati c. Обычно лучший способ определения методов контроллера - использовать в качестве методов только действия модели, такие как create, update, fetch, delete et c.

Ваши файлы blade никогда не должны иметь любой код php, включенный в них. В случае, если вы хотите иметь общую функциональность между различными контроллерами, Laravel имеет глобальный helpers.php файл, в котором вы можете определить свои статические / не статичные c методы. Подробнее об этом можно прочитать здесь

...