2016-09-01 9 views
1

最近、コースを通じてAngularJSとZend Framework 2の学習を開始しました。私が2013年に覚えているコースの年を考えると、両方のフレームワークでいくつかのことが変わってきました。すぐに、私は、データベースへの接続をテストするとDoctrine 2を使用してレコードを一覧表示するには、次のコードスニペットを使用して問題に出くわした:"getServiceLocator"という名前のプラグインがプラグインマネージャーZend Mvc Controller PluginManagerに見つかりません

namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class IndexController extends AbstractActionController { 
    public function indexAction() { 
     $em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); 
     $repo = $em->getRepository('Entity\Categoria'); 

     $categorias = $repo->findAll(); 

     return new ViewModel(['categories'=>$categorias]); 
    } 
} 

私が実行すると、それは次のエラーを返します::

A plugin by the name "getServiceLocator" was not found in the plugin manager Zend\Mvc\Controller\PluginManager

さらに

、追加情報:

Zend\ServiceManager\Exception\ServiceNotFoundException

ファイル:

C:\xampp\htdocs\Curso de ZF2\vendor\zendframework\zend-servicemanager\src\AbstractPluginManager.php:133 

私が知る限り、この問題はgetServiceLocator()がZend Framework 2の最新バージョンから削除されたことに由来します。しかし、これを解決してテストを続けることはできません。誰かが私を助けることができますか?

答えて

0

更新されたか、作曲からZend Frameworkの3をチェックアウトし、それはちょうどあなたの教材を機能させるためだ場合、あなたはgetServiceLocator()が利用可能である以前(2.xの)バージョンにダウングレードすることができ、まだを非推奨としている場合。それは3.0以降で削除されました。

もっと良いアプローチは、今後どのようにしなければならないのか、それを回避する方法を理解することです。基本的には、ランタイムの途中で依存関係を注入するのではなく、実際にコントローラのファクトリを登録してから、コンストラクタを使って依存関係を渡す必要があります。可能な修正は、次の質問のために受け入れ答えでも説明されている:それはコントローラにすぐに利用できるようになりますので、上記の例では

PHP Deprecated: You are retrieving the service locator from within the class ZFTool\Controller\ModuleController

は、 $db = $this->getServiceLocator()->get('Db\ApplicationAdapter');は、コンストラクタの引数として渡されます。だから、同様の方法で、あなたは(あなたの本当のモジュール名を「yourModule」を置き換えることを忘れないでください)すでにコンストラクタを介して注入 Doctrine\ORM\EntityManagerでそれを返すべき、あなたの IndexControllerのためのファクトリーを作成する必要があります。

namespace yourModule\Controller\Factory; 

use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 
use yourModule\Controller\IndexController; 

class IndexControllerFactory implements FactoryInterface { 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) { 
     return new IndexController($container->get('Doctrine\ORM\EntityManager')); 
    } 
} 

あなたが置くことができますすべてが適切に構成されている限り、Factoryクラスをどこにでも配置できます。この例では、/Module/yourModule/src/yourModule/Controller/Factory/IndexControllerFactory.phpに入れました。 、今

class IndexController extends AbstractActionController { 

    protected $em; 

    public function __construct(EntityManager $em) { 
     $this->em = $em; 
    } 

    public function indexAction() { 
     $repo = $this->em->getRepository('Entity\Categoria'); 
     $categorias = $repo->findAll(); 
     return new ViewModel(['categories'=>$categorias]); 
    } 

    ... 

} 

レジスタ:上記のクラスで

はあなたの $em変数は、移入されるだろうと(: $this->em新しいプロパティ $emとその使い方に注意してください)コントローラ内のどこからでも呼び出すことができ、呼び出されますあなたyourModuleの module.config.phpの新工場と我々は終わった:

<?php 
return [ 
    // ... other stuff 
    // ... 
    'controllers' => [ 
     'factories' => [ 
      'yourModule\Controller\Index' => 'yourModule\Controller\Factory\IndexControllerFactory', 
      ], 
    ], 
    // etc... 
]; 
// end of file 

非常に重要:ファイル意志おそらくヘクタール同様の内容ですが、配列キーとして "invokes"を使用します。依存関係や通常のコントローラのないクラスの場合は、ファクトリをキー名として使用します(コントローラファクトリを宣言しているため)。

私もこのMigration guide for Zend Framework 3を勉強することをお勧めします、それは役立つかもしれない重要な情報がたくさんあります。

PHPを互換性のあるバージョンにダウングレードすることをお勧めします。(作者を使用している場合は非常に簡単です)、ウェブ上で別の最新のコースやチュートリアルを探してみてください。バージョン間でZF2が大幅に変更されました。これは唯一のエラーではなく、学習するのではなく非常に混乱します。これがあなたのために働くかどうか私に教えてください。

+0

しかし、このクラスファクトリ "IndexController"ファイル内で行うのですか? –

+0

私はあなたの事例に合わせてもっと良い例を追加しました。ファイルや設定を置く場所などの情報もありますので、もう一度全部読んでください。あなたはあなたが持っているバージョンを言わなかったので、これはZF3.0向けです(以前の2.xバージョンでは動作しません)。あなたがすべてを追うなら、これはあなたの問題を解決するはずです。それが役に立てば幸い! – Fractalizer

関連する問題