Laravel:在另一个控制器的视图中注入一个控制器

时间:2020-02-26 13:20:06

标签: laravel laravel-blade

假设我有一个NewsController::lastNews可以提取并显示一些新闻。

我想在许多其他控制器(HomeControllerWhateverController)中显示此新闻。

选项1:获取每个控制器上的数据:我可以直接通过Service甚至是Trait来获取每个想要的控制器(HomeController,WhateverController)中的数据,然后将其传递给视图,然后@将我新闻的模板包含在控制器的模板中,但这看起来不是很顺利

到目前为止,我最喜欢的选择2:在我的模板中使用@inject:这与Symfony的render(controller())非常接近,但是我想知道与此是否有任何问题因为它没有被记录为与控制器一起使用。

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

在Laravel中共享数据和视图的推荐方式是什么? 谢谢。

2 个答案:

答案 0 :(得分:1)

View Composer用于此目的。您可以创建一个将获取数据的文件,然后指定在哪些视图中该数据可用。

您需要创建ViewServiceProvider并将其注册到config/app.php providers部分。

ViewServiceProvider中,您可以在boot()方法中指定哪种视图具有特定的视图编写器

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);
    }
}

视图编辑器示例:

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']]);
    }
}

文档链接-View Composers

答案 1 :(得分:0)

控制器并不意味着在其中定义了静态方法。通常,定义控制器方法的最佳实践是仅将模型操作(如createupdatefetchdelete等作为方法。

您的blade文件中绝对不应包含任何php代码。如果您想在不同的控制器之间共享功能,Laravel会提供一个全局helpers.php文件,您可以在其中定义静态/非静态方法。 您可以详细了解here