与多个视图共享数据 - 重构

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,但是当发生这种情况时它非常有用。

以上是关于与多个视图共享数据 - 重构的主要内容,如果未能解决你的问题,请参考以下文章

如何从容器/父视图控制器和多个子视图控制器共享数据数组

使用 Core Data 在多个视图控制器之间共享数据

与多个 Web 应用程序共享控制器和视图

如何与多个用户共享 access 2016 数据库

请问如何将数据从 show 方法共享到两个不同的视图

使用带有分页视图的 Laravel View Composers 共享数据不起作用