在ZF1中,我曾在application.ini 中声明变量
brandname = "Example"
weburl = "http://www.example.com/"
assetsurl = "http://assets.example.com/"
在引导程序中,我这样做是为了在视图中访问它们
define('BRANDNAME', $this->getApplication()->getOption("brandname"));
define('WEBURL', $this->getApplication()->getOption("weburl"));
define('ASSETSURL', $this->getApplication()->getOption("assetsurl"));
ZF2的方法是什么?我知道我可以在local.php配置文件中创建一个数组,比如:
return array(
'example' => array(
'brandname' => 'Example',
'weburl' => 'http://www.example.com/',
'asseturl' => 'http://assets.example.com/',
),
);
当我想访问控制器中的变量时,我可以进行
$config = $this->getServiceLocator()->get('Config');
$config['example']['brandname']);
到目前为止还不错。。。但是我如何访问视图中的这个变量呢?我不想在每个控制器中为它创建一个视图变量。当我在视图phtml文件中尝试上述操作时,我会得到一个错误。
ZendViewHelperPluginManager::get was unable to fetch or create an instance for getServiceLocator
有什么想法吗?
您可以创建一个sinmple视图助手来充当配置的代理(完全未经测试)。
Module.php
public function getViewHelperConfig()
{
return array(
'factories' => array(
'configItem' => function ($helperPluginManager) {
$serviceLocator = $helperPluginManager->getServiceLocator();
$viewHelper = new ViewHelperConfigItem();
$viewHelper->setServiceLocator($serviceLocator);
return $viewHelper;
}
),
);
}
ConfigItem.php
<?php
namespace ApplicationViewHelper;
use ZendViewHelperAbstractHelper;
use ZendServiceManagerServiceManager;
/**
* Returns total value (with tax)
*
*/
class ConfigItem extends AbstractHelper
{
/**
* Service Locator
* @var ServiceManager
*/
protected $serviceLocator;
/**
* __invoke
*
* @access public
* @param string
* @return String
*/
public function __invoke($value)
{
$config = $this->serviceLocator->get('config');
if(isset($config[$value])) {
return $config[$value];
}
return NULL;
// we could return a default value, or throw exception etc here
}
/**
* Setter for $serviceLocator
* @param ServiceManager $serviceLocator
*/
public function setServiceLocator(ServiceManager $serviceLocator)
{
$this->serviceLocator = $serviceLocator;
}
}
然后,你可以在你的视图中做这样的事情,当然,假设你在配置中设置了它们:)
echo $this->configItem('config_key');
echo $this->configItem('web_url');
不过,我个人倾向于每次都将价值观传递给视图,尽可能保持视图的愚蠢。
我之前在另一篇文章中回答过这个问题。
/* Inside your action controller method */
// Passing Var Data to Your Layout
$this->layout()->setVariable('stack', 'overflow');
// Passing Var Data to Your Template
$viewModel = new ViewModel(array( 'stack' => 'overflow' ));
/* In Either layout.phtml or {Your Template File}.phtml */
echo $this->stack; // Will print overview
仅此而已…无需麻烦视图助手、事件管理器、服务管理器或其他任何东西。
享受吧!