Symfony2 Шаблонирование без запроса - PullRequest
8 голосов
/ 11 января 2012

Я пытаюсь отправить электронное письмо с ContainerAwareCommand в Symfony2.Но я получаю это исключение, когда шаблон электронной почты отображается:

$body = $this->templating->render($template, $data);

Исключение :

 ("You cannot create a service ("templating.helper.assets") of an inactive scope ("request").") 

Я обнаружил в github, что этому помощнику нужен объект запроса,Кто-нибудь знает, как я могу создать экземпляр объекта Request?

Ответы [ 4 ]

19 голосов
/ 11 января 2013

Вам нужно установить контейнер в нужную область и дать ему (поддельный) запрос. В большинстве случаев этого будет достаточно:

//before you render template add bellow code
$this->getContainer()->enterScope('request');
$this->getContainer()->set('request', new Request(), 'request');

Полная история здесь . Если вы хотите узнать подробности, прочитайте эту проблему на github .

4 голосов
/ 24 июня 2014

Проблема возникает из-за того, что вы используете в своем шаблоне функцию asset () .

По умолчанию asset () полагается на Request сервис для создания URL-адресов для ваших активов (например, необходимо знать, каков базовый путь к вашему веб-сайту или каково доменное имя, если вы используете абсолютные URL-адреса активов).

Но когда вы запускаете приложение из командной строки, Запрос .

не существует. Один способ исправить это - точно определить базовые URL-адреса для ваших активов в config.ymlкак это:

framework:
  templating:
    assets_base_urls: { http: ["http://yoursite.com"], ssl: ["http://yoursite.com"] }

Важно определить и http и ssl , потому что если вы опустите один из них asset () будет по-прежнему зависеть от службы запросов.

(Возможный) недостаток - все URL-адреса активов теперь будут абсолютными.

1 голос
/ 10 ноября 2014

После ответа BetaRide я оказался на правильном пути, но этого было недостаточно.Затем он жаловался: «Невозможно сгенерировать URL для названного маршрута», «поскольку такой маршрут не существует».

Чтобы создать действительный запрос, я изменил его, чтобы запросить корень проекта следующим образом:

$request = new Request();
$request->create('/');
$this->container->enterScope('request');
$this->container->set('request', $request, 'request');

Возможно, вам потребуется вызвать другой маршрут (защищенный root?), Root работал для меня очень хорошо.

Документы Symfony2

Бонусное добавление:

Мне пришлось сделать столько шаблонов / маршрутизации в cli с помощью команд Symfony2, что я обновил метод initializeContainer() в AppKernel.Он создает маршрут к корню сайта, устанавливает контекст маршрутизатора и подделывает логин пользователя:

protected function initializeContainer()
{
    parent::initializeContainer();
    if (PHP_SAPI == 'cli') {

        $container = $this->getContainer();

        /**
         * Fake request to home page for cli router.
         * Need to set router base url to request uri because when request object
         * is created it perceives the "/portal" part as path info only, not base
         * url and thus router will not include it in the generated url's.
         */
        $request = Request::create($container->getParameter('domain'));
        $container->enterScope('request');
        $container->set('request', $request, 'request');
        $context = new RequestContext();
        $context->fromRequest($request);
        $container->get('router')->setContext($context);
        $container->get('router')->getContext()->setBaseUrl($request->getRequestUri());

        /**
         * Fake admin user login for cli. Try database read,
         * gracefully print error message if failed and continue.
         * Continue mainly for doctrine:fixture:load when db still empty.
         */
        try {
            $user = $container->get('fos_user.user_manager')->findUserByUsername('admin');
            if ($user !== null) {
                $token = $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
                $this->getContainer()->get('security.token_storage')->setToken($token);
            }
        } catch (\Exception $e) {
            echo "Fake Admin user login failed.\n";
        }
    }
}

Возможно, вам не нужна последняя $container->get('router')->getContext()->setBaseUrl($request->getRequestUri()); часть, но я должен был это сделать, потому что мой сайтroot был по адресу domain.com/siteroot/, а маршрутизатор удалял / siteroot / away для генерации URL.

1 голос
/ 04 февраля 2012

Поскольку у вас нет запроса, вам нужно напрямую позвонить в службу шаблонов:

$this->container->get('templating')->render($template, $data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...