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

Есть идеи?

Author: Peter, 2013-07-30

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'); 

Лично я бы старался каждый раз просто передавать значения в представление, сохраняя представление как можно более тупым.

 6
Author: Andrew, 2013-07-30 16:03:17

Я уже отвечал на этот вопрос в другом посте.

/* 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

Вот и все... Не нужно связываться с помощниками по просмотру, менеджером событий, менеджером по обслуживанию или чем-либо еще.

Наслаждайтесь!

 1
Author: Timothy Perez, 2013-12-16 06:44:24