与多个视图共享数据 - 重构
Posted
技术标签:
【中文标题】与多个视图共享数据 - 重构【英文标题】:Sharing Data with Multiple Views - Refactoring 【发布时间】:2021-03-19 16:40:16 【问题描述】:我正在寻找一种更好的编码方式。我一直把头撞在桌子上,因为我似乎无法弄清楚。
我有一个应用程序,其中包含多个公司,每个公司都有自己的资源。例如路线看起来像这样:
test.app/organizations/2/contacts
我在依赖 organization 变量的视图中有代码。因此,在每一个函数上,我都必须添加组织并将其与视图一起返回。
我想用 View::Share 之类的东西来简化它,但组织并不适用于每个视图。
这就是现在的样子。有没有更好的方法来做到这一点?任何指导将不胜感激!
/**
* Display a listing of the resource.
*
* @return Application|Factory|Response|View
*/
public function index(Organization $organization)
return view('app.pages.organization.contact.index', [
'organization' => $organization
]);
/**
* Return data for datatables.
*
*/
public function datatable(Organization $organization)
$query = $organization->contacts();
return DataTables::of($query)->toJson();
【问题讨论】:
您可以在中间件中完成并将其添加到请求中,您也可以在 __construct 方法中使用它。您可以扩展使用 __construct 填充属性组织的组织控制器。这里有其他方法。哪个更好?取决于您如何组织应用程序。 @N69S 我喜欢这个主意,但是如果不必在每个返回视图函数中提供组织,返回组织呢? 然后使用会话并让中间件验证值并检索组织/在会话中设置它或如果丢失则重定向。 【参考方案1】:好的,这就是我在听完顶空后发现的:)。
我创建了一个 ViewComposer 并在特定的 View Composer 中返回变量,如下所示:
protected $organization;
public function __construct(Organization $organization)
// Dependencies are automatically resolved by the service container...
$this->organization = $organization;
/**
* Bind data to the view.
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose(View $view)
$view->with('organization', $this->organization);
然后在我的 ViewServiceProvider 中,我使用通配符指定了页面,该通配符是我希望它应用到的。我很惊讶我实际上得到了这个工作。我只是希望它是最快/最少资源密集型的方式。
public function boot()
View::composer('app.pages.organization.*', OrganizationComposer::class);
【讨论】:
这没关系,是一个很好的解决方案,我很少使用ViewComposer
,但是当发生这种情况时它非常有用。以上是关于与多个视图共享数据 - 重构的主要内容,如果未能解决你的问题,请参考以下文章