2014-03-13 74 views
1

我一直在我的控制器中使用查詢生成器,但是希望進入利用雄辯和查詢生成器。我想知道在兩者之間傳遞變量的最佳做法。我已經通過了文檔,但仍然遇到麻煩。模型/控制器變量 - Laravel

這裏是我正在做它在我的控制器:

public function getRetailers($city) {  
    $locations = DB::table('retailers_listings') 
     ->orderBy('country', 'asc') 
     ->Where('city', $city) 
     ->get(); 

     $this->layout->header = $city; 
    $content = View::make('retailers.stores') 
     ->with('header', $this->layout->header) 
     ->with('store_listings', $locations) 

     if (Request::header('X-PJAX')) { 
     return $content; 
     } else { 
      $this->layout->content = $content; 
     } 
    } 

我會怎麼做上面有口才,有一個模型?如何將變量$ city傳遞給模型,因爲它來自視圖。更深入的建議,那麼文檔給我的將是非常好的。

回答

5

注入模型作爲控制器中的依賴項。

在這個例子中,爲了簡單起見,我指的是一個列表模型。

class HomeController extends BaseController { 

    protected $listing; 

    // Type hint your model. This is laravels automatic resolution 

    // It will automatically inject this dependency for you 

    public function __construct(Listing $listing) 
    { 
     $this->listing= $listing; 
    } 

    public function index() 
    { 
     $listings = $this->listing->whereTitle(Input::get['title'])->get(); 

     return View::make('listing' , compact($listings)); 
    } 

} 

更好的方法是使用存儲庫,它可以讓你交換存儲實現。

查看this post的更多信息。

其實你可以用在你的控制器上市模式,而不依賴注入像

Listing::all(); 

但上述做法使得它更清晰一點的問題。

UPDATE

我不知道你的應用程序究竟是如何構建的,因此我會盡量模仿。您可以更改文件和類名稱以匹配您的實施。

準備步驟

  1. 在你的應用程序文件夾中創建一個名爲Acme的新的文件夾(或任何你喜歡)。此文件夾中的生活與控制器,模型,視圖等
  2. 裏面的文件夾Acme的同級別創建一個名爲另一個文件夾
  3. 裏面的文件夾存儲庫創建一個名爲RetailerRepository.php
  4. 新文件編輯作曲家。在你的根目錄的JSON文件,並添加PRS-0部分,以自動加載我們的新聞類

    "autoload": {
    "classmap": [ "app/commands", "app/controllers", "app/models", "app/database/migrations", "app/tests/TestCase.php" ], "psr-0": { Acme": "app/Acme" } }

  5. 在控制檯運行composer dumpautoload -o,大功告成

現在讓我們做一些代碼

我假設你的ORM是

class Retailer extends Eloquent{} 

編輯您的Acme /庫/ RetailerRepository.php看起來像這樣:

<?php namespace Acme/Repositories 

use Retailer; 

class RetailerRepository { 

    public function getLocations($city) { 

    return Retailer::whereCity($city)->orderBy(‘country’, ‘asc’)->get(); 

    }  
} 

編輯控制器,看起來像這樣。我使用通用名稱,但您可以切換到自己的名稱。

<?php 

use Acme/Repositories/RetailerRepository; 

class RetailersController extends BaseController { 

    protected $repo; 

    public function __construct(RetailerReposiroty $repo) { 

    $this->repo = $repo; 
    } 

    public function index($city) { 

    // I assume that the route is 

    // Route::get('retailers/{city}','[email protected]') 

    $locations = $this->repo->getLocations($city); 

    // I keep it simple here but you can do whatever you want 

    return View::make('retailers.stores')->with('stores', $locations); 
    } 

} 

正如您現在所看到的,您的控制器不知道數據來自哪裏,但它知道如何訪問它。它不必知道你的數據在MySQL中是可用的。知道可以在某個地方使用就好了。此外,通過這種方式構建您的應用程序,現在您可以使用任何您喜歡的控制器中的存儲庫功能,只需將該存儲庫作爲構造函數中的依賴項注入即可。在一個複雜的應用程序中,您可能會使用RetailerRepositoryInterface和多個具體實現,但讓我們在此處保持簡單。

現在,您的應用是否需要提供如計費功能。在Acme下創建一個名爲Services的新文件夾,並在那裏定義您的服務提供商。不要讓業務邏輯膨脹你的控制器。結構化您的Acme文件夾,但是您想要滿足您的需求。這是你的應用程序!

有一個常見的誤解,即模型只是一個類(例如,在我們的例子中擴展Eloquent的零售商類)。這種誤解以及「脂肪模型瘦身控制器」的表達使得很多人認爲他們必須從控制器中獲取所有商業邏輯(這是絕對正確的),並將其放置在一個簡單的類中(這是絕對錯誤的)。

您的模型(MVC中的M)它不僅僅是一個類。這是一個包含域實體,數據抽象,服務提供商等的圖層。

希望我能幫上忙。

+0

這篇文章幫助我更好地理解,但你能給我一個例子,我的上述代碼? – Panoply

+0

已更新,以符合您的代碼:) – tliokos

相關問題