2016-02-11 8 views
0

Я использую прут с Symfony2, и моя структура проекта:Как зарегистрировать расширение Twig в services.yaml?

/myprojectroot 
    /app 
     /config 
      services.yml 
     bootstrap.php 
    /src 
     /Foo 
      /Bar 
       /Util 
        myextension.php 

Я следую this documentation создать свое расширение, но я считаю, что это сведения о пространствах имен, путей и регистрации отсутствует. Я также прошел через detailed doc, но это не помогло.

services: 
    app.twig_extension: <---What is this line? Just a name? 
     class: AppBundle\Twig\AppExtension 
     public: false 
     tags: 
      - { name: twig.extension } <--- Should I ever change that? 

Мое расширение определяется как:

редактировать: я исправлял мои getFunctions() в соответствии с ответом Джейсона римлянина, но ошибка сохраняется.

namespace Foo\Bar\Util;   

class QrCodeHandler extends \Twig_Extension 
{ 
    public function getFunctions() 
    { 
     return array(
       new \Twig_SimpleFunction('genqr', 'generateQRcode'), 
     ); 
    } 

    public function generateQRcode($data) 
    { 
     //snip code... 
    } 

    public function getName() 
    { 
     return 'qr_extension'; 
    } 
} 

и мой services.yaml:

services: 
    qr_extension: 
     class: Foo\Bar\Util\QrCodeHandler 
     public: false 
     tags: 
      - { name: twig.extension } 

services.yml загружается bootstrap.php с этим кодом:

$services = $parser->parse(__DIR__ . '/config/services.yml'); 

if (isset($services['services'])) 
{ 
    foreach ($services['services'] as $name => $class) 
    { 
     $app['service.' . $name] = $app->share(function (Application $app) use($class) { 
      $service = new $class($app); 
      if (!$service instanceof ServiceInterface) 
      { 
       $errorMessage = get_class($service) . ' must implement ServiceInterface.'; 
       $app['monolog']->addError($errorMessage); 
       throw new \Exception($errorMessage); 
      } 

      return $service; 
     }); 
    } 
} 

Конечно, я спрашиваю, потому что я m получение ошибки

Twig_Error_Syntax: Функц. ионного «genqr» не существует

так что я удивляюсь, что случилось. Я полагаю, проблема в том, как я зарегистрирую ее.

Может кто-нибудь объяснить мне, что представляет собой разная часть регистрационного кода и что я должен использовать для его работы?

ответ

1

Вы неправильно объявляете свою пользовательскую функцию. Это должно быть вместо этого:

public function getFunctions() 
{ 
    return array(
     new \Twig_SimpleFunction('genqr', array($this, 'generateQRcode')), 
    ); 
} 

Это гарантирует, что метод generateQRcode вызывается из вашего класса. Что касается ваших других вопросов:

services: 
    app.twig_extension: <---What is this line? Just a name? 

Да, это просто имя службы. Просто убедитесь, что это имя уникально.

tags: 
     - { name: twig.extension } <--- Should I ever change that? 

Нет, вы никогда этого не измените. См. Symfony documentation for tagged services.

+0

Я исправил свои функции getFunctions(), но ошибка сохраняется. – 0xFF

+0

Загружает ли ваш 'app/config/config.yml' ваш файл' services.yaml'? (также измените его на 'services.yml' для согласованности) –

+0

Это не так, сервисы загружаются в bootstrap.php, я добавлю код. – 0xFF