2012-09-24 62 views
10

訪問它的我試圖創建ZF2一個簡單的服務,我可以訪問使用視圖助手ZF2創建簡單的服務,並通過視圖助手

第一步。我在SRC /應用/服務/ Service1.php craeted類如下

namespace Application\Service; 
    use Zend\ServiceManager\ServiceLocatorAwareInterface; 
    use Zend\ServiceManager\ServiceLocatorInterface; 

    class Service1 implements ServiceLocatorAwareInterface 
    { 

     public function __construct() 
     { 

     } 

     public function setServiceLocator(ServiceLocatorInterface $serviceLocator) 
     { 

     }  

     public function getServiceLocator() 
     { 

     } 

    } 

第二步我module.php文件,如下設置它。這樣

public function getServiceConfig() 
{  
    return array(
     'factories' => array(
      'Application\Service\Service1' => function ($sm) { 
       return new \Application\Service\Service1($sm); 
      }, 
     ) 
    ); 
} 

public function onBootstrap($e) 
{   
    $serviceManager = $e->getApplication()->getServiceManager(); 

    $serviceManager->get('viewhelpermanager')->setFactory('Abc', function ($sm) use ($e) { 
     return new \Application\View\Helper\Abc($sm); 
    }); 
} 

第三步:最後我歌廳它在我的視圖助手的src /應用/搜索/助手/ Abc.php test()方法,II評論這條線$this->sm->get('Application\Service\Service1');沒有錯誤,必須有我在服務中缺少的東西?

namespace Application\View\Helper; 

use Zend\View\Helper\AbstractHelper; 

    class Abc extends AbstractHelper 
    { 
     protected $sm; 

     public function test() 
     { 
      $this->sm->get('Application\Service\Service1'); 
     } 
     public function __construct($sm) { 
      $this->sm = $sm; 

     } 
    } 

第四步:然後我打電話看像這樣的我的測試視圖助手。

$this->Abc()->test(); 

我得到以下錯誤。

Fatal error: Call to undefined method Application\Service\Service1::setView() in vendor/zendframework/zendframework/library/Zend/View/HelperPluginManager.php on line 127 Call Stack: 

我錯過了什麼?

+0

請顯示一些更多(真實)的代碼。看起來好像你正在返回'Service1'實例而不是'Abc'。因此,視圖幫助器機制試圖將視圖實例注入到'Service1'實例中。 –

+0

我已將Service1的名稱和每個引用更改爲My1serve,但仍然出現相同的錯誤調用未定義的方法My1serve :: setView()。除了我已經顯示的問題之外,我還沒有在我的代碼中的任何其他地方使用My1serve名稱。 – Developer

+0

非常適合這個問題。沒有更多信息,我們將無法幫助您。 –

回答

5

變化在下面方法中的線$this->sm->getServiceLocator()->get('Application\Service\Service1');

class Abc extends AbstractHelper 
{ 
    protected $sm; 

    public function test() 
    { 
     $this->sm->getServiceLocator()->get('Application\Service\Service1'); 
    } 
    public function __construct($sm) { 
     $this->sm = $sm; 

    } 
} 
7

一種替代,在PHP 5.4,而無需使用特定的配置,是使用traits

提取module.config.php的:

'view_helpers' => array(
    'invokables' => array(
     'myHelper' => 'Application\View\Helper\MyHelper', 
    ), 

MyHelper.php:

<?php 
namespace Application\View\Helper; 

use Zend\ServiceManager\ServiceLocatorAwareInterface; 

class HeadScript extends \Zend\View\Helper\MyHelper implements ServiceLocatorAwareInterface 
{ 
    use \Zend\ServiceManager\ServiceLocatorAwareTrait; 

    public function __invoke() 
    { 
     $config = $this->getServiceLocator()->getServiceLocator()->get('Config'); 
     // do something with retrived config 
    } 

}