Symfony2: глобальные переменные в шаблонизаторе php - PullRequest
2 голосов
/ 09 января 2012

Существует кулинарная книга для добавления глобалов в движок шаблонов веток, но она не делает то же самое для движка php.Как бы я это сделал?

Так что у меня может быть что-то вроде:

# 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

Ответы [ 3 ]

3 голосов
/ 10 января 2012

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

Что работает, однако:

Config:

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

Шаблон PHP:

// index.html.php
<?php

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

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

1 голос
/ 26 апреля 2012

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

  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. У движка рендеринга PHP есть так называемые «помощники», к которым вы можете получить доступ через ключи массива $ view, например:

    $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 голосов
/ 14 января 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...