假设我有一个NewsController::lastNews
可以提取并显示一些新闻。
我想在许多其他控制器(HomeController
,WhateverController
)中显示此新闻。
选项1:获取每个控制器上的数据:我可以直接通过Service甚至是Trait来获取每个想要的控制器(HomeController,WhateverController)中的数据,然后将其传递给视图,然后@将我新闻的模板包含在控制器的模板中,但这看起来不是很顺利
到目前为止,我最喜欢的选择2:在我的模板中使用@inject:这与Symfony的render(controller())
非常接近,但是我想知道与此是否有任何问题因为它没有被记录为与控制器一起使用。
@inject('news', 'App\Http\Controllers\NewsController')
<div> {{ $news->lastNews(3) }} </div>
在Laravel中共享数据和视图的推荐方式是什么? 谢谢。
答案 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)
控制器并不意味着在其中定义了静态方法。通常,定义控制器方法的最佳实践是仅将模型操作(如create
,update
,fetch
,delete
等作为方法。
您的blade
文件中绝对不应包含任何php
代码。如果您想在不同的控制器之间共享功能,Laravel会提供一个全局helpers.php
文件,您可以在其中定义静态/非静态方法。
您可以详细了解here