2012-09-24 3 views
10

Ich versuche, einen einfachen Dienst in ZF2 zu schaffen, die ich ViewhelperZF2 Erstellung von einfachen Service und Zugang es durch Viewhelper

Schritt 1 unter Verwendung von in zugreifen kann. Ich habe eine Klasse in src/Application/Service/Service1.php craeted als

folgen
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() 
     { 

     } 

    } 

Schritt 2 Ich habe dies wie unten in module.php Datei auf.

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); 
    }); 
} 

Schritt 3 schließlich ich es aus meiner Sicht Helfer src/Anwendung/View/Helper/Aufruf abc.php test() Methode wie folgt, II Kommentar diese Zeile $this->sm->get('Application\Service\Service1'); da bin geting ist kein Fehler, muss es sein etwas, was mir im Dienst fehlt?

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; 

     } 
    } 

Step4 dann meinen Test View Helfer in einer Ansicht wie dies rufe ich.

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

Ich bekomme folgenden Fehler.

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

Was fehlt mir?

+0

Bitte zeigen Sie mehr (echten) Code an. Es sieht so aus, als würden Sie die 'Service1'-Instanz irgendwo anstelle von'Abc' zurückgeben. Daher versucht der Ansichtshilfsmechanismus die Ansichtsinstanz in die 'Service1'-Instanz zu injizieren. –

+0

Ich habe den Namen und jede Referenz von Service1 zu My1serve geändert, aber immer noch denselben Fehler erhalten Aufruf zu undefinierter Methode My1serve :: setView(). Ich habe den My1serve-Namen nirgendwo anders in meinem Code verwendet, abgesehen von dem, den ich bereits in Frage gestellt habe. – Developer

+0

Passt perfekt zum Problem. Wir können Ihnen nicht ohne ein wenig mehr Informationen helfen. –

Antwort

5

Veränderung die Linie in $this->sm->getServiceLocator()->get('Application\Service\Service1'); unten Methode

class Abc extends AbstractHelper 
{ 
    protected $sm; 

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

    } 
} 
7

Eine alternative, in PHP 5.4 nur ohne spezifische Konfiguration wäre traits zu verwenden:

Extrakt von 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 
    } 

} 
Verwandte Themen