1

2 つの応答を返すコントローラー アクションを作成しようとしています。SwiftMailer は、kernel.terminateイベントを使用してこれを実現します。イベントのイベントリスナーを作成できますが、何をしたいのかを伝える方法がわかりません。私は PDF ファイルを作成してダウンロードするのに何が必要かを知っていますが、リスナーはいつそれを行うべきかをどのように知るのでしょうか?

編集:

「教えて」は、これを行うことでSOでここにあります

    if ($nextAction) {
        $request->attributes->set('household_id', $id);
    }

しかし、イベントリスナーにこれらすべてを実行させる方法はまったく明確ではありません (コントローラーからコピーされますが、最初の行の場合):

$em = $this->container->get('doctrine.orm.default_entity_manager');
$household = $em->getRepository('ManaClientBundle:Household')->find($id);
$fname = $household->getHead()->getFname();
$sname = $household->getHead()->getSname();
$filename = $sname . $fname . 'card.pdf';
$stylesheetXml = $this->renderView('ManaClientBundle:Test:pdfstyle.xml.twig', array());

$facade = $this->get('ps_pdf.facade');
$response = new Response();

$this->render('ManaClientBundle:Test:card.pdf.twig', array(
    'household' => $household,
    'date' => date_create(),
        ), $response);
$xml = $response->getContent();
$content = $facade->render($xml, $stylesheetXml);
header('content-type:application/pdf;' .
        'Content-Disposition:attachment; filename=' . $filename);
echo $content;

フォームに含まれるもの:

->add('save', 'submit')
->add('saveCreate', 'submit')

コントローラには以下が含まれます:

$nextAction = $form->get('saveCreate')->isClicked();
if ($nextAction) {
// tell event to create and download a pdf file using $id
}
return $this->redirect($this->generateUrl('household_show', array('id' => $id)));

サービス:

  listener.pdfresponse:
    class: Mana\ClientBundle\EventListener\PdfListenerSubscriber
    arguments: [ @service_container ]
    tags:
      - { name: kernel.event_listener, event: kernel.terminate, method: onKernelTerminate }

リスナー

namespace Mana\ClientBundle\EventListener;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class PdfListenerSubscriber implements EventSubscriberInterface {

     private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function onKernelTerminate(PostResponseEvent $event) {
        //create and download pdf file
    }

    static public function getSubscribedEvents()
    {
        return array(
            KernelEvents::TERMINATE => 'onKernelTerminate');
    }
}
4

1 に答える 1

2

HTTP 要求に対する 2 つの応答はあり得ません。最初の要求が応答されると、Web サーバーによって接続がドロップされるため、2 番目の応答が送信される場所がなくなります。

于 2013-10-17T17:15:09.223 に答える