Подтвердить что ты не робот

RenderView в моем сервисе

Я новичок в мире symfony. Я хочу использовать рендеринг внутри моей службы, но я получил эту ошибку

Вызов метода undefined renderView

Я знаю, что renderView является ярлыком

/**
 * Returns a rendered view.
 *
 * @param string $view       The view name
 * @param array  $parameters An array of parameters to pass to the view
 *
 * @return string The rendered view
 */
public function renderView($view, array $parameters = array())
{
    return $this->container->get('templating')->render($view, $parameters);
}

Но я не знаю, что мне нужно для инъекций в моем сервисе. Я знаю даже это с помощью команды php app/console container:debug. Я могу видеть все мои службы, но я не знаю, как можно взять/выбрать правильный

Обновление

Я попытался добавить

arguments: [@mailer,@templating]

но я получил ServiceCircularReferenceException

UPDATE

Я изменил свой service.yml с помощью

    arguments: [@service_container]

и даже мое обслуживание

$email = $this->service_container->get('mailer');
$twig = $this->service_container->get('templating');

для использования служебной почты (swift) и рендеринга.

Я не думаю, что это лучшее решение. Я бы хотел ввести только mailer и templating

ОБНОВЛЕНИЕ После ответа Джейсона Я использую Symfony 2.3

my services.yml

services:
    EmailService:
        class: %EmailService.class%
        arguments:  [@mailer,@templating,%EmailService.adminEmail%]

Я получил этот ServiceCircularReferenceException

4b9b3361

Ответ 1

Вы правы в отношении renderView(), это только ярлык для контроллеров. При использовании класса сервиса и при вставке службы шаблонов все, что вам нужно сделать, это изменить вашу функцию на render(). Поэтому вместо

return $this->renderView('Hello/index.html.twig', array('name' => $name));

вы бы использовали

return $this->render('Hello/index.html.twig', array('name' => $name));

Обновление от ответа Оливии:

Если вы получаете циклические опорные ошибки, единственный способ их - ввести весь контейнер. Это не считается лучшей практикой, но иногда этого нельзя избежать. Когда мне приходится прибегать к этому, я по-прежнему устанавливаю переменные класса в конструкторе, чтобы я мог действовать так, как если бы они были введены напрямую. Поэтому я сделаю:

use Symfony\Component\DependencyInjection\ContainerInterface;

class MyClass()
{
    private $mailer;
    private $templating;

    public function __construct(ContainerInterface $container)
    {
        $this->mailer = $container->get('mailer');
        $this->templating = $container->get('templating');
    }
    // rest of class will use these services as if injected directly
}

Обратите внимание, что я только что протестировал собственный автономный сервис в Symfony 2.5 и не получил циркулярной ссылки, непосредственно введя почтовые программы и службы шаблонов.