2012-01-09 5 views
2

Существует cookbook для добавления глобальных движений к движку шаблонов ветви, но он не делает то же самое для двигателя php. Как мне это сделать?Symfony2: глобальные переменные в php templating engine

Так что я мог бы иметь что-то вроде:

# config.yml 
someSortOfReferenceToThePHPEngineInstance: 
    calls: 
     - [ addGlobals, ["foo", "bar"] ] 
     - [ addGlobals, ["myService", "@myService"] ] 

А затем получить доступ к этим, как:

// templateName.contentType.php 
<? 
echo $foo; // echos "bar" 
echo $myService->myMethod($foo); // echos the result of modifying "bar" with "myMethod" method of "myService" service 
+0

Можете ли вы написать пример кода, как вы хотели бы это сделать? – greut

ответ

3

Я не мог найти какой-либо документации по этому вопросу для PHP двигателя ...

Однако, как это работает:

Конфигурация:

//config.yml  
parameters: 
     hello: "YO!" 

PHP Шаблон:

// index.html.php 
<?php 

print $view->container->parameters['hello']; 

Это не подходит так хорошо, как веточка конвенции ... Может быть, есть лучший путь - я не отлажена дальше ...

+0

Да, этот контейнерный объект также имеет зарегистрированные службы. мы интегрируемся со старой системой и хотим иметь тот же интерфейс, что и существующая база кода. также почему мы используем php вместо ветки. – tobymackenzie

1

Вот несколько вариантов:

  1. Если создать базовый контроллер, который все остальные наследовать, вы можете переопределить Symfony визуализирует функцию и добавить ключи к параметры аргумент, как:

    public function render($view, array $parameters = array(), Response $response = null){ 
        if(!array_key_exists("bar", $parameters){ 
         $parameters["foo"] = $this->get("foo"); 
        } 
        if(!array_key_exists("bar", $parameters){ 
         $parameters["bar"] = $this->get("bar"); 
        } 
        return parent::render($view, $parameters, $response); 
    } 
    

    Это единственный способ, которым я вижу, чтобы изменить «глобальные» переменные «в глобальном масштабе», хотя они не будут доступны в любых взглядах, предоставляемых контроллеры не создает (конечно, все это, вероятно, будет сделано в Twig в любом случае, и вы можете использовать обычные средства для добавления тэгов для добавления функциональности).

  2. рендеринга движок РНР называется «О чем помощники», которые вы можете получить доступ с помощью ключей массива $ зрения, как:

    $view["foo"]->doSomething(); 
    

    Мы создали класс для простого создания сервисов в помощниках:

    use Symfony\Component\Templating\Helper\Helper as BaseHelper; 
    
    class Helper extends BaseHelper{ 
        protected $name; 
        public $service; 
    
        public function __construct($name, $service){ 
         $this->name = $name; 
         $this->service = $service; 
        } 
        public function __get($name){ 
         if(isset($this->service->$name)){ 
          return $this->service->$name; 
         } 
        } 
        public function __call($name, $arguments){ 
         if(method_exists($this->service, $name)){ 
          return call_user_func_array(array($this->service,$name), $arguments); 
    
         } 
        } 
        public function getName(){ 
         return $this->name; 
        } 
    
    } 
    

    Тогда в нашей конфигурации под услугами, которые мы бы добавить:

    helper.foo: 
        class: %helper.class% 
        arguments: 
         name: "foo" 
         helper: "@foo" 
        tags: 
         - { name: templating.helper, alias: foo } 
    

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

0

У меня была такая же проблема. По какой-то причине эта функция доступна только для Twig templating с TwigBundle. Оба механизма Twig и PHP templating предоставляют возможность определять глобальные переменные, но для этого имеет только конфигурацию Twig. Для меня единственный реальный способ добиться этого - это то, что вы предложили в вопросе post - определить вызовы методов (и именно так регистрируются глобальные глобусы Twig).

Проблема заключается в том, что с расширениями DI вы не можете получить доступ к определению службы извне вашего внутреннего абонента, поэтому вы не можете добавлять эти вызовы из своего расширения DI. Путь для меня состоял в том, чтобы сделать это с помощью компилятора DI.

Но я также разработчик ChillDevViewHelpersBundle и так как я столкнулся с этой проблемой в большинстве моих проектов, я решил реализовать его там для общего пользования, и вы можете использовать 0.1.8 релиза для этой функции.

+0

Прохладный. Мы достаточно довольны использованием помощников (например, в моем ответе на вариант 2), но мне все еще нравится идея определить глобальные конфигурации в конфигурации, возможно, в framework.templating.globals. Может быть, если я получу шанс, я попробую свою руку при запросе на тягу к ядру – tobymackenzie

Смежные вопросы