2013-03-11 48 views
2

我一直在開發一個項目中的Zend 1,但決定移動到Zend的2拿東西就像優勢等事件我如何從我自己的圖書館中的Zend 2進入getServiceLocator

我最初的問題是,我似乎無法找到任何關於如何以我需要使用它們的方式使用模型的教程。

什麼我是被路由到AS/API/SOAP的API控制器

這種肥皂端點加載具有所有我想通過SOAP暴露

namespace MyProject\Controller; 

$view = new ViewModel(); 
$view->setTerminal(true); 
$view->setTemplate('index'); 

$endpoint = new EndpointController(); 

$server = new Server(
      null, array('uri' => 'http://api.infinity-mcm.co.uk/api/soap') 
); 


$server->setObject($endpoint); 

$server->handle(); 

和方法的類我控制器,包含所有的功能是

namespace MyProject\Controller; 
class EndpointController 
{ 

    public function addSimpleProducts($products) 
    { 

    } 

} 

現在我希望能夠做的就是從這個EndpointController內訪問我的產品模型。

所以我嘗試這樣做:

protected function getProductsTable() 
{ 
    if (!$this->productsTable) { 
     $sm = $this->getServiceLocator(); 
     $this->productsTable= $sm->get('MyProject\Model\ProductsTable'); 
    } 
    return $this->productsTable; 
} 

當我運行此我得到的致命錯誤EndpointController :: getServiceLocator()是不確定的。

我對Zend 2很新,但在Zend 1中感覺這將是我發展過程中的一個非常小的步驟,我即將解僱zend 2並返回到zend 1甚至切換到symfony 2其中使用簡單的教義......

有幫助嗎?

回答

3

如果您希望您的控制器可以訪問ServiceManager,則需要將ServiceManager注入到其中。

在MVC系統中,由於ServiceManager用於創建控制器實例,所以這種情況幾乎會自動發生。這不會發生在您身上,因爲您正在使用new創建您的EndpointController

您可能需要通過MVC創建此控制器,或者實例化並配置您自己的ServiceManager實例並將其傳遞給EndpointController

或者,實例化依賴關係,如ProductTable並將它們設置爲您的EndpointController

0

要訪問你的服務定位器來實現ServiceLocatorAwareInterface

所以在任何控制器,將需要這一點,你可以做這樣的:

namespace MyProject\Controller; 

use Zend\ServiceManager\ServiceLocatorAwareInterface, 
    Zend\ServiceManager\ServiceLocatorInterface; 

class EndpointController implements ServiceLocatorAwareInterface 
{ 
    protected $sm; 

    public function addSimpleProducts($products) { 

    } 

    /** 
    * Set service locator 
    * 
    * @param ServiceLocatorInterface $serviceLocator 
    */ 
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator) { 
     $this->sm = $serviceLocator; 
    } 

    /** 
    * Get service locator 
    * 
    * @return ServiceLocatorInterface 
    */ 
    public function getServiceLocator() { 
     return $this->sm; 
    } 
} 

現在服務管理器將注入本身自動的。然後,您可以使用它像:

$someService = $this->sm->getServiceLocator()->get('someService'); 

如果你正在使用PHP 5.4+可以導入ServiceLocatorAwareTrait,這樣你就不必定義getter和setter自己。

class EndpointController implements ServiceLocatorAwareInterface 
{ 
    use Zend\ServiceManager\ServiceLocatorInterface\ServiceLocatorAwareTrait 
+0

我在我的ZF2庫中看不到'ServiceLocatorAwareTrait'。這種奢侈品可能還需要特定版本的ZF2? – 2013-03-11 15:44:12

+0

好,所以你說服務管理器應該自動注入自己,但是當我用你建議的改變運行我的代碼時,我只是調用一個非對象的成員函數get(),這是$ this-> sm->得到線... – Matthew 2013-03-11 15:58:06

+0

@MarshallHouse,它是2.1.3版本的一部分。見[github](https://github.com/zendframework/zf2/blob/release-2.1.3/library/Zend/ServiceManager/ServiceLocatorAwareTrait.php) – 2013-03-11 16:04:15

相關問題