Пожалуйста, помогите мне решить следующую проблему в 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
Я тоже новичок в 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, пока они не конкурируют за миграцию.