ZF2服务定位器接口不返回对象

时间:2014-04-24 19:13:47

标签: php zend-framework2

我正在尝试创建一个可以访问ZF2服务定位器的模型。

我有一个如下所示的模型类:

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


class testDelete implements ServiceLocatorAwareInterface
{
     protected $services;

   /**
   * construct function
   */
   public function  __construct ()
   {
     $router = $this->getServiceLocator()->get('Router');
    }

  public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
  {
    $this->services = $serviceLocator;
  }

  public function getServiceLocator()
  {
    return $this->services;
  }
}

在阅读教程和博客时,这应该给我一个服务定位器的实例,然后我可以使用它来调用类。但是当我打电话给它时,我收到了一条消息

致命错误:在非对象上调用成员函数get()...

有谁知道为什么会这样?

我是否需要进行某种设置才能使服务定位器界面正常工作?

2 个答案:

答案 0 :(得分:0)

看起来您需要在Modules Module.php文件的getServiceConfig()方法中设置“Router”服务:

public function getServiceConfig()
{
    return  array
            (
                'factories'     =>  array
                                    (
                                        'Router' => function($serviceManager)
                                                    {
                                                        ... your logic ...
                                                        return $Router
                                                    },
                                    ),

            );
}

您的Module.php文件将如下所示:

namespace ModuleName;

use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ServiceProviderInterface;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;

/**
 * Tables (& Databases) Used in this Module
 */
use Your\Model\ModelName;
use Your\Mapper\ModelMapperName;

class Module implements AutoloaderProviderInterface
{
    public function onBootstrap(MvcEvent $e)
    {
        $eventManager           =   $e->getApplication()->getEventManager();
        $serviceManager         =   $e->getApplication()->getServiceManager();
        $sharedManager          =   $e->getApplication()->getEventManager()->getSharedManager();
        $moduleRouteListener    =   new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);

        /**
         * Additional logic for Setting up Logging, Pre-Initializations, Exceptions etc
         */

    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function getAutoloaderConfig()
    {
        return  array
                (
                    'Zend\Loader\ClassMapAutoloader'        =>  array
                                                                (
                                                                    include __DIR__ . '/autoload_classmap.php',
                                                                ),
                    'Zend\Loader\StandardAutoloader'        =>  array
                                                                (
                                                                    'namespaces'    =>  array
                                                                                        (
                                                                                            __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                                                                                        ),
                                                                ),
                );
    }

    public function getServiceConfig()
    {
        return  array
                (
                    'factories'     =>  array
                                        (
                                            'Router' => function($serviceManager)
                                                        {
                                                            ... your logic ...
                                                            return $Router
                                                        },
                                        ),

                );
    }
}

答案 1 :(得分:0)

因为您的类实现了ServiceLocatorAware,所以服务管理器会自动将服务定位器注入其中。但是,如果服务管理器是实例化testDelete类的东西,它只能这样做。因此,您需要为testDelete设置服务。

完成后,您仍然无法从$this->getServiceLocator()调用__construct(),因为依赖项尚未注入课程。

如果您只想让路由器进入testDelete类,只需为testDelete创建一个服务,并将路由器作为依赖项传递。这比你目前要做的要容易得多。