2

私はzend1でプロジェクトを開発してきましたが、イベントなどを利用するためにzend2に移行することにしました。

私の最初の問題は、モデルを使用するために必要な方法でモデルを使用する方法についてのチュートリアルが見つからないように見えることです。

私が持っているのは、/ api/soapとしてルーティングされるApiコントローラーです。

この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()が未定義であるという致命的なエラーが発生します。

私はZend2に非常に慣れていませんが、Zend 1では、これは私の開発における非常にマイナーなステップであり、zend 2を解任して、zend 1に戻るか、symfony2に切り替えるという点に到達しているように感じます。教義を使用するには...

ヘルプ?

4

2 に答える 2

3

コントローラにServiceManagerへのアクセスを許可する場合は、コントローラにServiceManagerを挿入する必要があります。

MVCシステム内では、ServiceManagerを使用してコントローラーのインスタンスを作成するため、これはほぼ自動的に行われます。EndpointControllerを使用して作成しているため、これは発生していません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ため、ゲッターとセッターを自分で定義する必要はありません。

class EndpointController implements ServiceLocatorAwareInterface
{
    use Zend\ServiceManager\ServiceLocatorInterface\ServiceLocatorAwareTrait
于 2013-03-11T15:29:36.747 に答える