Вътрешни елементи на Twig: setCompiler

Имам проблем с правилното преминаване от компилатора по подразбиране към персонализиран компилатор. Изглежда, че може да не създавам класа или обекта правилно.

От http://twig.sensiolabs.org/doc/internals.html „По подразбиране компилаторът (Twig_Compiler) може да бъде променен чрез извикване на метода setCompiler(): $twig->setCompiler($compiler);"

Ето къде се опитвам да сменя компилатора:

\Twig_Autoloader::register();
$loader = new \Twig_Loader_Filesystem($templateDirectory);
$twig = new \Twig_Environment($loader);

$compiler = new Config_Generator_Twig_Compiler($twig);
$twig->setCompiler($compiler);

Но получавам тази грешка:

PHP Уловима фатална грешка: Аргумент 1, предаден на Twig_Node_Module::compile(), трябва да бъде екземпляр на Twig_Compiler, даден екземпляр на Config_Generator_Twig_Compiler, извикан в /config_generator/Config_Generator_Twig_Compiler.php на ред 87 и дефиниран в /config_generator/lib/Twig/Node/ Module.php на ред 36


„Config_Generator_Twig_Compiler.php“ е просто копие на Twig файла „Compiler.php“ с няколко променени реда в горната част:

<?php
require_once $rootDirectory.'/lib/Twig/CompilerInterface.php'; <---- added this line

class Config_Generator_Twig_Compiler implements Twig_CompilerInterface <---- changed from "class Twig_Compiler implements Twig_CompilerInterface"

Останалата част от този файл в момента е същата като "Compiler.php":

{...
  public function compile(Twig_NodeInterface $node, $indentation = 0)
  {
      $this->lastLine = null;
      $this->source = '';
      $this->sourceOffset = 0;
      // source code starts at 1 (as we then increment it when we encounter                                     new lines)
      $this->sourceLine = 1;
      $this->indentation = $indentation;

      if ($node instanceof Twig_Node_Module) {
          $this->filename = $node->getAttribute('filename');
      }

      $node->compile($this); <---- here's line 87

      return $this;
  }
...}

person d_edmonton    schedule 11.03.2015    source източник
comment
Променете своя клас, за да разширите оригиналния Twig_Compiler клас.   -  person Maerlyn    schedule 12.03.2015
comment
Благодаря ви, това беше моят проблем. Промених моя клас Config_Generator_Twig_Compiler на този: class Config_Generator_Twig_Compiler extends Twig_Compiler. Поради зависимостта трябваше също да добавя тези в горната част на моя скрипт, в този ред: require_once $rootDirectory.'/lib/Twig/CompilerInterface.php'; require_once $rootDirectory.'/lib/Twig/Compiler.php';   -  person d_edmonton    schedule 12.03.2015


Отговори (1)


$twig->setCompiler($object) трябва $object да се разширява или да е Twig_Compiler.
Така че вашият клас трябва да го разширява.

class Config_Generator_Twig_Compiler extends Twig_Compiler 
{

    [... your code here ...]

}

Twig_Compiler вече прилага Twig_CompilerInterface.

person Kevin Robatel    schedule 25.04.2015