我有一个Zend Framework项目,我试图在Zend Framework 2上重写这个项目。在旧项目中,我在 application.ini
中有一些依赖于环境的设置[Prod]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 1
theme = Test
copyright = TestText
resources.db.adapter = pdo_mysql
resources.db.params.host = 127.0.0.1
resources.db.params.username = root
resources.db.params.password = adm$123
resources.db.params.dbname = test;
我控制了一些来自 aplication.ini 的值已经重新启动。
$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$aConfig = $bootstrap->getOptions();
$this->view->assign('theme', $aConfig['theme']);
$this->view->assign('copyright', $aConfig['copyright']);
我使用Zend Framework 2下载 skeleton-application ,添加新模块。但是我在新项目中如何做到类似呢?我应该在哪里以及如何描述旧项目的设置?我怎么能找回来的?
答案 0 :(得分:2)
您可以轻松地为您的ZF2模块使用AbstractOptions类。我们假设你的ZF2模块叫做应用程序。所以它存储在/ module / Application /文件夹中。
首先,您需要/ module / Application / src / Options /下的ModuleOptions类。在本课程中,您可以记下模块所需的所有设置。例如,我只在课堂上写了版权成员。
declare('strict_types=1');
namespace Application\Options;
use Zend\StdLib\AbstractOptions;
class ModuleOptions extends AbstractOptions
{
protected $copyright = 'my copyright';
public function getCopyright() : string
{
return $this->copyright;
}
public function setCopyright(string $copyright) : ModuleOptions
{
$this->copyright = $copyright;
return $this;
}
}
此外,您需要一个工厂用于您的模块选项类。这个工厂看起来像下面的例子。
declare('strict_types=1');
namespace Application\options\Factory;
use Application\Options\ModuleOptions;
use Interop\Container\ContainerInterface;
class ModuleOptionsFactory
{
public function __invoke(ContainerInterface $container) : ModuleOptions
{
$config = $container->get('config');
$options = new ModuleOptions(isset($config['my_settings']) ? $config['my_settings'] : []);
return $options;
}
}
基本上就是你所需要的一切。只需将其包装在module.config.php中,如下例所示。
...
'service_manager' => [
'factories' => [
ModuleOptions::class => ModuleOptionsFactory::class,
]
],
'my_settings' = [
'copyright' => 'another copyright text',
]
ModuleOptions类从module.config.php获取my_settings数组,并使其在服务定位器所在的任何位置都可访问。
在控制器中使用的示例
例如,您可以在控制器工厂中使用ModuleOptions类,如以下示例所示。
class IndexControllerFactory
{
public function __invoke(ContainerInterface $container)
{
$container = $container->getServiceLocator();
$options = $container->get(ModuleOptions::class);
return new IndexController($options);
}
}
您的IndexController类看起来像这样。在这个例子中,我们避免在控制器本身中调用服务定位器,因为这是一种不好的做法。我们只是将选项作为参数传递给构造函数。
class IndexController extends AbstractActionController
{
protected $options;
public function __construct(ModuleOptions $options)
{
$this->options = $options;
}
public function indexAction()
{
return [
'copyright' => $this->options->getCopyright(),
];
}
享受! ;)