我是ZendFramework3的新成员,我只是想知道是否有可能调用具有更多参数的函数,而不仅仅是工厂中的serviceManager(在我的模块类中):(是否有可能在$sm
参数旁边传递参数?)
//class Module
//getConfig()
//getServiceConfig()
public function getControllerConfig()
{
return [
'factories' => [
Controller'ModuleController::class => function ($sm) {
return new ModuleController($sm);
}
]
];
}
如果你想为所有依赖项创建一个"神奇的"工厂,您应该看看SM AbstractFactory。
在这个工厂中,你可以从$ requestdname 检查哪些是依赖项。如。你可以从类构造函数中读取依赖项,然后注入依赖项(或者从$container中再次拉出依赖项)。你也可以在config中设置你的依赖项,用这种方式为你所有的类只创建一个工厂。
您可以(当然)将其他参数传递给Factory,只要要创建的类可以优雅地处理这些参数。在下面的示例中,在Controller Directory中创建了一个工厂类。现在,这就是实例化ModuleController的工厂——modulecontrolerfactory。
<?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
]
]
//...
];