web-dev-qa-db-ja.com

Symfonyコマンドの使用法でのRenderView

(コントローラー内ではなく)symfonyコマンド内で$ this-> renderViewを使用するにはどうすればよいですか?関数「renderView」については初めてですが、コマンドで使用するには何を設定する必要がありますか?

よろしくお願いします

11
TheTom

コマンドクラスはContainerAwareCommandabstract class を拡張する必要があり、次のことができます。

_$this->getContainer()->get('templating')->render($view, $parameters);
_

ContainerAwareCommandを拡張するコマンドに関しては、コンテナーを取得する適切な方法は、コントローラーのショートカットとは異なり、getContainer()によるものです。

28
mykiwi

さらにもう1つ:依存性注入に依存します。つまり、ContainerInterfaceを注入します。

namespace AppBundle\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Psr\Container\ContainerInterface;

class SampleCommand extends Command
{
    public function __construct(ContainerInterface $container)
    {
        $this->templating = $container->get('templating');
        parent::__construct();
    }

    protected function configure()
    {
        $this->setName('app:my-command')
             ->setDescription('Do my command using render');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $data = retrieveSomeData();
        $csv = $this->templating->render('path/to/sample.csv.twig',
                                         array('data' => $data));
        $output->write($csv);
    }

    private $templating;
}

これはSymfonyに依存してコンテナーを挿入し、コンテナーはtemplatingまたはtwig、あるいはカスタムコマンドに必要なものを取得するために使用されます。

2
Olaf Dietsche

Symfony 4では、$this->getContainer()->get('templating')->render($view, $parameters);を動作させることができませんでした。

Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommandと拡張ContainerAwareCommandclass EmailCommand extends ContainerAwareCommandの名前空間の使用を設定しました

例外がスローされます

[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException]
      You have requested a non-existent service "templating".

Symfony 4の場合、これが私が思いついたソリューションです。

まず、Twigをインストールしました。

composer require twig

次に、独自のtwigサービスを作成しました。

<?php

# src/Service/Twig.php

namespace App\Service;

use Symfony\Component\HttpKernel\KernelInterface;

class Twig extends \Twig_Environment {

    public function __construct(KernelInterface $kernel) {
        $loader = new \Twig_Loader_Filesystem($kernel->getProjectDir());

        parent::__construct($loader);
    }
}

これで、私の電子メールコマンドは次のようになります。

<?php

# src/Command/EmailCommand.php

namespace App\Command;

use Symfony\Component\Console\Command\Command,
    Symfony\Component\Console\Input\InputInterface,
    Symfony\Component\Console\Output\OutputInterface,
    App\Service\Twig;

class EmailCommand extends Command {

    protected static $defaultName = 'mybot:email';

    private $mailer,
            $twig;

    public function __construct(\Swift_Mailer $mailer, Twig $twig) {
        $this->mailer = $mailer;
        $this->twig = $twig;

        parent::__construct();
    }

    protected function configure() {
        $this->setDescription('Email bot.');
    }

    protected function execute(InputInterface $input, OutputInterface $output) {

        $template = $this->twig->load('templates/email.html.twig');

        $message = (new \Swift_Message('Hello Email'))
            ->setFrom('[email protected]')
            ->setTo('[email protected]')
            ->setBody(
                $template->render(['name' => 'Fabien']),
                'text/html'
            );

        $this->mailer->send($message);
    }
}
1
Francisco Luz