ZF2 Как использовать глобальные переменные в представлении
В 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, я получаю сообщение об ошибке.
Zend\View\HelperPluginManager::get was unable to fetch or create an instance for getServiceLocator
Есть идеи?
2 answers
Вы можете создать помощника для простого представления, который будет выступать в качестве прокси-сервера для вашей конфигурации (полностью не протестирован).
Module.php
public function getViewHelperConfig()
{
return array(
'factories' => array(
'configItem' => function ($helperPluginManager) {
$serviceLocator = $helperPluginManager->getServiceLocator();
$viewHelper = new View\Helper\ConfigItem();
$viewHelper->setServiceLocator($serviceLocator);
return $viewHelper;
}
),
);
}
ConfigItem.php
<?php
namespace Application\View\Helper;
use Zend\View\Helper\AbstractHelper;
use Zend\ServiceManager\ServiceManager;
/**
* 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
Вот и все... Не нужно связываться с помощниками по просмотру, менеджером событий, менеджером по обслуживанию или чем-либо еще.
Наслаждайтесь!