注入模型作爲控制器中的依賴項。
在這個例子中,爲了簡單起見,我指的是一個列表模型。
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
我不知道你的應用程序究竟是如何構建的,因此我會盡量模仿。您可以更改文件和類名稱以匹配您的實施。
準備步驟
- 在你的應用程序文件夾中創建一個名爲Acme的新的文件夾(或任何你喜歡)。此文件夾中的生活與控制器,模型,視圖等
- 裏面的文件夾Acme的同級別創建一個名爲另一個文件夾庫
- 裏面的文件夾存儲庫創建一個名爲RetailerRepository.php
新文件編輯作曲家。在你的根目錄的JSON文件,並添加PRS-0部分,以自動加載我們的新聞類
"autoload": {
"classmap": [ "app/commands", "app/controllers", "app/models", "app/database/migrations", "app/tests/TestCase.php" ], "psr-0": { Acme": "app/Acme" } }
在控制檯運行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)它不僅僅是一個類。這是一個包含域實體,數據抽象,服務提供商等的圖層。
希望我能幫上忙。
這篇文章幫助我更好地理解,但你能給我一個例子,我的上述代碼? – Panoply
已更新,以符合您的代碼:) – tliokos