Расположение представлений/ресурсов для библиотеки Silex Twig

Обычно для проекта Silex у меня были бы каталоги верхнего уровня, такие как:

- app/
   - views/
- src/
- vendor/
- web/

Теперь некоторые из моих классов могут вызвать $app['twig']->render(...), и он вытащит представление из папки app/views.

Если я извлекаю библиотеку, чтобы ее можно было повторно использовать в нескольких проектах, где я должен хранить файлы ее представлений и как указать Twig, чтобы искать там?

Тот же вопрос относится к графике/таблицам стилей и т. д., которые я обычно добавляю в web/.

Наверняка они должны быть где-то в пределах vendor/my-lib, чтобы Composer мог без проблем установить файлы? Есть ли общий/лучший способ сделать это?

Обновление Для справки, вот что я в итоге сделал:

<?php

// in my \Silex\ServiceProviderInterface ...

/**
 * @var \Twig_Environment $twig
 */
$twig = $app['twig'];

// Add the paths to our twig templates here
$fsLoader = new \Twig_Loader_Filesystem(array(
    __DIR__.'/views/'
));

$twig->setLoader(new \Twig_Loader_Chain(array($twig->getLoader(), $fsLoader)));

Спасибо.


person Adam    schedule 15.08.2012    source источник


Ответы (1)


Я храню представления в src/{Library}/{Class}/View/

Я установил базовый путь Twig к src

$app->register(new TwigServiceProvider(), array(
    'twig.path' => array(
        __DIR__ . '/../src/{Library}/'
    ),
    'twig.options' => array('cache' => false, 'strict_variables' => true)
));

и при вызове рендера я прохожу путь от этой точки

$app['twig']->render('{Class}/View/{twigfile}.html.twig',$data);
person gunnx    schedule 15.08.2012
comment
Мне нравится организация этого. Правильно ли я думаю, что вы должны зарегистрировать путь для каждой библиотеки в файле начальной загрузки, что означает, что библиотека не может зарегистрировать свои собственные пути - вам нужно будет composer update и добавить путь при установке? - person Adam; 15.08.2012
comment
Я использую автозагрузчик, чтобы добавить пути к моим библиотекам в composer.json. например автозагрузка: {psr-0: {MyLibrary: src/}} - person gunnx; 15.08.2012
comment
Извините, я имел в виду пути для каждой ветки каталогов, когда вы вызываете render(), можно ли это хорошо обработать? - person Adam; 15.08.2012
comment
Да, я сделал это так, как сделал, чтобы иметь файлы с одинаковым именем, например, index.twig.html в разных папках просмотра. Если у вас не будет дубликатов, вы можете указать пути для каждого каталога при регистрации TwigProvider. - person gunnx; 15.08.2012
comment
Моя единственная проблема заключается в том, что если кто-то еще хочет использовать мою библиотеку, он должен настроить пути, когда на самом деле им не нужно ничего знать о внутренней работе моего кода. Может с доступом к $app['twig'] есть способ добавить путь - посмотрю. - person Adam; 15.08.2012
comment
Взгляните на Twig Loader в API - person gunnx; 15.08.2012
comment
Ах-ха! Twig_Loader_Filesystem::addPath($path) должен это сделать. Спасибо - person Adam; 15.08.2012