2016-09-01 1 views
1

최근에 코스를 통해 AngularJS 및 Zend Framework 2를 배우기 시작했습니다. 2013 년을 기억한다면, 두 가지 프레임 워크에서 몇 가지 사항이 변경되었습니다.플러그인 관리자 Zend Mvc Controller PluginManager에서 "getServiceLocator"라는 이름의 플러그인을 찾을 수 없습니다.

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

를 반환 곧, 나는 데이터베이스에 대한 연결을 테스트하고 교리 2를 사용하여 레코드를 나열하려면 다음 코드를 사용하여 문제를 건너 왔어요 또한

, 추가 정보 :

Zend\ServiceManager\Exception\ServiceNotFoundException

파일 :

내가 아는 한,이 문제는 getServiceLocator()이 최신 버전의 Zend Framework 2에서 제거되었다는 사실에서 기인합니다. 그러나 테스트를 계속할 수 있도록이 문제를 해결할 방법이 없습니다. 누군가 나를 도울 수 있니?

답변

0

당신은 업데이트 또는 작곡가에서 젠드 프레임 워크 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');는 생성자의 인자로 전달됩니다. 그래서 비슷한 방식으로, 이미 생성자를 통해 주입 Doctrine\ORM\EntityManager에 반환해야하는, 당신의 IndexController을위한 공장을 만들어야합니다 (실제 모듈 이름으로 "yourModule"를 대체하는 기억) :

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

관련 문제