2

我一直在 zend 1 中开发一个项目,但决定转移到 zend 2 以利用诸如事件等之类的东西。

我最初的问题是我似乎找不到任何关于如何以我需要的方式使用模型的教程。

我拥有的是一个 Api 控制器,它被路由到 /api/soap

这个soap端点加载了一个类,该类具有我想通过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 的地步,这很简单使用教义...

帮助?

4

2 回答 2

3

如果您希望您的控制器能够访问 ServiceManager,那么您需要将 ServiceManager 注入其中。

在 MVC 系统中,这对您来说几乎是自动发生的,因为 ServiceManager 用于创建 Controller 的实例。当您创建EndpointControllerusing时,这不会发生在您身上new

您要么需要通过 MVC 创建此控制器,要么实例化和配置您自己的 ServiceManager 实例并将其传递给EndpointController.

或者,实例化依赖项,例如ProductTable并将它们设置到您的EndpointController.

于 2013-03-12T08:52:06.667 回答
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
于 2013-03-11T15:29:36.747 回答