Doctrine EntityManager в контроллере ZF3

Пожалуйста, помогите мне решить следующую проблему в ZendFramework.

Я новичок в ZF и PHP7. В течение нескольких дней я не мог использовать Doctrine EntityManager в контроллере.

Я имею:

Мой контроллер

namespace Sonun\Controller;

use Zend\Mvc\Controller\AbstractActionController,
    Doctrine\ORM\EntityManager;

class IndexController extends AbstractActionController
{
    protected $entityManager;

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

завод

    namespace Sonun\Controller;

use Sonun\Controller\IndexController,
    Zend\ServiceManager\FactoryInterface,
    Zend\ServiceManager\ServiceLocatorInterface;

class IndexControllerFactory implements FactoryInterface
{

    public function createService(ServiceLocatorInterface $sm)
    {
        $entityManager = $sm->get("Doctrine\ORM\EntityManager");
        return new IndexController($entityManager);
    }
}

module.config.php

return [

    "controllers" => [
        "invokables" => [
            "Sonun\Controller\IndexController" => "Sonun\Controller\IndexController"
        ]
    ],

    "router" => [
        "routes" => [
            "sonun" => [
                "type" => "segment",
                "options" => [
                    "route" => "/sonun/[:action/][:id/]",
                    "constraints" => [
                        "action" => "[a-zA-Z0-9_-]*",
                        "id" => "[0-9]*"
                    ],
                    "defaults" => [
                        "controller" => "Sonun\Controller\IndexController",
                        "action" => "index"
                    ]
                ]
            ]
        ]
    ],

    "view_manager" => [
        "template_path_stack" => [
            __DIR__."/../view"
        ]
    ],

    "service_manager" => [
        "factories" => [
            "Sonun\Controller\IndexController" => "Sonun\Controller\IndexControllerFactory"
        ]
    ]
]

ошибка

     Fatal error: Uncaught TypeError: Argument 1 passed to ZendDeveloperTools\Exception\SerializableException::__construct() must be an instance of Exception, instance of TypeError given, called in C:\xampp\htdocs\sonun\vendor\zendframework\zend-developer-tools\src\Collector\ExceptionCollector.php on line 45 and defined in C:\xampp\htdocs\sonun\vendor\zendframework\zend-developer-tools\src\Exception\SerializableException.php:26 Stack trace: #0 C:\xampp\htdocs\sonun\vendor\zendframework\zend-developer-tools\src\Collector\ExceptionCollector.php(45): ZendDeveloperTools\Exception\SerializableException->__construct(Object(TypeError)) #1 C:\xampp\htdocs\sonun\vendor\zendframework\zend-developer-tools\src\Profiler.php(210): ZendDeveloperTools\Collector\ExceptionCollector->collect(Object(Zend\Mvc\MvcEvent)) #2 C:\xampp\htdocs\sonun\vendor\zendframework\zend-developer-tools\src\Listener\ProfilerListener.php(93): ZendDeveloperTools\Profiler->collect(Object(Zend\Mvc\MvcEvent)) #3 C:\xampp\htdocs\sonun\vendor\zendframework\zend-eventmanag in C:\xampp\htdocs\sonun\vendor\zendframework\zend-developer-tools\src\Exception\SerializableException.php on line 26

2 ответа

Я тоже новичок в ZF3 (не все?), Но я сделаю снимок. Ваш заводской класс должен выглядеть примерно так

namespace Application\Controller\Factory;

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

class IndexControllerFactory implements FactoryInterface {

    public function __invoke(ContainerInterface $container, $requestedName, Array $options = null) {    
        $entityManager = $container->get('doctrine.entitymanager.orm_default');
        return new IndexController($entityManager);
    }

}

Обратите внимание, что в ZF3 ваши фабрики теперь должны реализовать Zend\ServiceManager\Factory\FactoryInterface т. е. реализовать __invoke() скорее, чем createService(),

В вашем module.config.php ваш контроллер не является активируемым - он сильно зависит от этого $entityManager, право? - так что вам нужно покончить с этим и заменить что-то вроде

'controllers' => [
    'factories' => [
       Controller\IndexController::class => Controller\Factory\IndexControllerFactory::class,
    ],
],

Удачи!

Конкретная ошибка, которую вы видите, испускается ZendDeveloperTools и исправляется в его выпуске 1.1.1. Бежать composer update zendframework/zend-developer-tools чтобы получить это.

Однако это не корень проблемы; этот модуль просто пытается сообщить об исключении, в данном случае ошибка типа; вам придется продолжать отлаживать оттуда.

Наконец, насколько мне известно, DoctrineModule (и связанные с ним модули) еще не совместимы с выпусками ZF v3. Возможно, вам придется переключиться на v2, пока они не конкурируют за переход.

Другие вопросы по тегам