Laravel 5:将相同的数据传递给许多视图

时间:2015-04-20 04:52:29

标签: laravel model-view-controller laravel-5

我有一个Laravel 5应用程序的一部分,其中相同的基本公司信息需要传递到每个视图中,用于导航栏包括以及在几个实例中视图的主要部分内。

我正在制作相同的三个Eloquent查询,以便将公司与URL细分相匹配,检索该公司的基本联系信息以及属于它的电话号码和链接。然后压缩它并将其传递给视图。我宁愿不必在每一个控制器方法中重复这一点。

public function showPropertyDetails($realtor, $listing) {

    $realtor = Realtor::where('accountUrl', $realtor)->first();     

    $phoneNumbers = $realtor->phoneNumbers()->orderBy('displayIndex', 'ASC')->get();

    $links = $realtor->links()->orderBy('displayIndex', 'ASC')->get();

    return view('realtorSites.showListingDetails', compact('realtor', 'phoneNumbers', 'links'));
}

我对视频作曲家很熟悉,但我还没有找到将请求网址段动态传递给作曲家的方法,我甚至不确定这是不是一个好主意。

有人可以帮我理解解决这个问题的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

如何将请求网址段传递给视图并让作曲家将其余部分计算出来?

public function showPropertyDetails($realtor, $listing) {
    return view('realtorSites.showListingDetails')
        ->with('accountUrl', $realtor);
}

然后......

View::composer('...', function ($view)
{
    $view->realtor = Realtor::where('accountUrl', $view->accountUrl)
        ->first();

    $view->phoneNumbers = $view->realtor->phoneNumbers()
        ->orderBy('displayIndex', 'ASC')->get();

    $view->links = $view->realtor->links()
        ->orderBy('displayIndex', 'ASC')->get();
}

唯一真正的挂起是,如果作曲家应用于同一请求中呈现的多个视图,则可能导致大量数据库调用。这更像是一个雄辩的ORM问题而不是其他任何东西,并通过使用惰性加载器和排序缓存结果来解决。当你大量使用关系时,我认为这是一个重要的最佳实践。

// Makes a DB call, caches nothing in the model
$model->relationship()->orderBy('foo')->get();

// Caches relationships on model and reuses if possible
$model->relationship->sortBy('foo');

答案 1 :(得分:0)

我做过类似的事情。我将创建视图,而不是只返回它,我将返回修改视图的方法,像这样:

public function index() {
  $view = view("index");
  return $this->addDetails($view);
}

private function addDetails($view) {
  $realtor = Realtor::where('accountUrl', $realtor)->first();
  return $view->with('realtor', $realtor);
}