Вы можете (обязательно) передать другие аргументы для завода, так долго, как класс будет создан может обрабатывать аргументы изящно. В приведенном ниже примере в каталоге контроллеров был создан Factory Class. Теперь это фабрика - 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
]
]
//...
];
Это SM от v2, так или иначе вы решаете, какой следующий ... Можете ли вы вставить свою конкретную проблему? – tasmaniski
У меня нет конкретной проблемы. Я просто ищу решение для создания общего кода, который может работать со всеми модулями в моем проекте. Основная цель заключается не в создании фабрик для всех моих модулей (фабрика для каждого модуля ModuleTable, фабрика для каждого модуля ModuleTableGateway, ... я хочу параметризовать только одну фабрику для работы с каждым модулем, который у меня есть. Для этого мне нужно чтобы узнать, какой модуль управляется в моем коде.Я не могу использовать $ this-> getServiceLocator() больше, чтобы получить правильный объект (класс) из моего контроллера. Правильно, я просто хочу знать, можно ли получить ** function ($ sm, $ another) ** – Renaud