ZF3 — вызов функции с параметрами в классе модуля заводов

Я новичок в ZendFramework3, и я просто хочу знать, возможно ли вызвать функцию с большим количеством аргументов, чем просто serviceManager на фабриках (в моем классе Module): (Можно ли передать аргумент рядом с $sm аргумент?)

//class Module

//getConfig()
//getServiceConfig()

public function getControllerConfig()
{
return [
'factories' => [
Controller\ModuleController::class => function ($sm) {
return new ModuleController($sm);
}
]
];
}

1

Решение

Если вы хотите создать одну «волшебную» фабрику для всех зависимостей,
Вы должны взглянуть на SM AbstractFactory.

На этом заводе вы можете проверить $ requestedName какие будут зависимости. Например, Вы можете прочитать зависимости из конструктора класса и затем внедрить эти зависимости (или снова извлечь его из $ container). Вы также можете установить свои зависимости в config и таким образом создать только одну фабрику для всех ваших классов.

1

Другие решения

Вы можете (наверняка) передать другие Аргументы на Фабрику, если создаваемый Класс может изящно обрабатывать Аргументы. В приведенном ниже примере класс Factory был создан внутри каталога контроллера. Теперь это фабрика ModuleControllerFactory, которая создает экземпляр ModuleController.

<?php

namespace Application\Controller;

use Application\Controller\ModuleController,
Zend\ServiceManager\Factory\FactoryInterface,
Zend\ServiceManager\Factory,
Interop\Container\ContainerInterface;

class ModuleControllerFactory implements FactoryInterface {

public function __invoke(ContainerInterface $container, $requestedName, array $options=null){
// WE WANT TO PASS $variable1 to $variable12 TO THE ModuleController
$variable1      = "Variable Value 1";
$variable2      = "Variable Value 2";
$variable3      = "Variable Value 3";
return new ModuleController($container, $variable1, $variable2, $variable3);
}
}

Итак, теперь мы можем создать конструктор класса ModuleController:

  <?php

// FILE-NAME: ModuleController.php;
namespace Application\Controller;
use Interop\Container\ContainerInterface;

class ModuleController extends AbstractActionController {
/**
* ContainerInterface.
* @var ContainerInterface
*/
public $container;

/**
* @var string
*/
public $var1;

/**
* @var string
*/
public $var2;

/**
* @var string
*/
public $var3;

//  CONTAINER & VARIALBLES INJECTED IN CONSTRUCTOR
public function __construct(ContainerInterface $container, $variable1=null, $variable2=null, $variable3=null) {
$this->container    = $container;
$this->var1         = $variable1;
$this->var2         = $variable2;
$this->var3         = $variable3;
}

// JUST PLAY WITH THE INJECTED VALUES IN THE INDEX ACTION
public function indexAction() {
return new ViewModel([
'container' => $this->container,
'var1'      => $this->var1,
'var2'      => $this->var2,
'var3'      => $this->var3
]);
}}

А теперь обновите module.config.php внутри папки конфигурации вашего модуля Пример: module/Application/config/module.config.php,

<?php

namespace Application;

use Zend\Router\Http\Literal;
use Zend\Router\Http\Regex;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;

return [
//...
'router' => [
//...
],
'controllers' => [
'factories' => [
Controller\ModuleController::class => Controller\ModuleControllerFactory::class
]
]
//...

];
0

По вопросам рекламы [email protected]