Я пытаюсь реализовать Factory для своего контроллера:

class NumberControllerFactory implements FactoryInterface{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
    return new NumberController($container->get(Bar::class));
}

public function createService(ServiceLocatorInterface $services)
{
    return $this($services, NumberController::class);
}

}

Я получил ошибку:

Fatal error: Declaration of Number\Factory\NumberControllerFactory::__invoke() must be compatible with Zend\ServiceManager\Factory\FactoryInterface::__invoke(Interop\Container\ContainerInterface $container, $requestedName, array $options = NULL) in C:\xampp\htdocs\MyProject\module\Number\src\Number\Factory\NumberControllerFactory.php on line 10

Мне это нужно, потому что я хочу внедрить модель в контроллер, потому что диспетчер служб был удален из контроллеров в Zend 3.

Я использовал скелет, описанный в https://framework.zend.com/manual /2.4/en/ref/installation.html

В composer.json есть:

    "require": {
    "php": "^5.6 || ^7.0",
    "zendframework/zend-component-installer": "^1.0 || ^0.3 || ^1.0.0-dev@dev",
    "zendframework/zend-mvc": "^3.0.1",
    "zfcampus/zf-development-mode": "^3.0"
},

Я не понимаю этой проблемы, я прочитал много руководств, например:

https://zendframework.github.io/zend-servicemanager/migration/

Не могли бы вы мне помочь, пожалуйста?

Я предполагаю, что в настоящее время этот метод совместим с Zend \ ServiceManager \ Factory \ FactoryInterface :: __ invoke

1
Marcin.ka 25 Ноя 2016 в 19:56

2 ответа

Лучший ответ

Для внедрения модели в контроллер вам необходимо создать фабричный класс при настройке в module.config.php, как показано ниже.

 'controllers' => [
    'factories' => [
        Controller\AlbumController::class => Factory\AlbumControllerFactory::class,
    ],
 ],

Здесь AlbumController - это класс контроллера модуля Album. После этого вам нужно создать класс AlbumControllerFactory внутри модуля \ Album \ src \ Factory. В этом классе вам нужно написать код ниже:

  namespace Album\Factory;

  use Album\Controller\AlbumController;
  use Album\Model\AlbumTable;
  use Interop\Container\ContainerInterface;
  use Zend\ServiceManager\Factory\FactoryInterface;


  class AlbumControllerFactory implements FactoryInterface
  {
     public function __invoke(ContainerInterface $container,      $requestedName, array $options = null)
     {
      return new AlbumController($container->get(AlbumTable::class));
     }
  }

Вам необходимо написать приведенный ниже код внутри класса контроллера (AlbumController).

   public function __construct(AlbumTable $album) {
     $this->table = $album;
   }

Таким образом, вы можете вставить класс модели в класс контроллера.

3
Azhar Ahmad 25 Ноя 2016 в 18:05

Спасибо, Азхар.

Моя проблема заключалась в том, что когда я использовал:

         'factories' => array(
        \Number\Controller\NumberController::class => \Number\Factory\NumberControllerFactory::class
     )

Не получилось, было 404 ... Пришлось использовать:

'Number\Controller\Number' => \Number\Factory\NumberControllerFactory::class

В документации указано, что я должен использовать полное имя класса :: class.

Кто-нибудь знает, почему это не работает?

0
Marcin.ka 26 Ноя 2016 в 12:02