1

Sonata管理バンドルを使用してsymfony2プロジェクトに取り組んでいます。

フォーム入力とデータベースへの書き込み後に生成する画像を含む大きな pdf があります。永続化データの最後に pdf 生成を開始します。その後、ユーザーはリダイレクトされます。

私の計画: データをデータベースに永続化した後、pdf 生成をトリガーしたいと考えています。しかし、リダイレクトは PDF ドキュメントの準備ができるのを待っています。それには時間がかかります。そのため、リダイレクトを実行すると同時に、PDF 生成をバックグラウンドで実行する必要があります。

PDF が正常に作成されると、ヘッダーに通知メッセージが表示されます。

PDF生成はDOMPDFで行われます。そのため、個別のコマンド ライン ツールではなく、php で直接実行されます。

誰かがこれを実装する方法を考えていますか?

リダイレクトが完了した後の ajax リクエストについて考えています。それは良いアプローチですか?

4

2 に答える 2

0

イベントの使用を考えたことはありますか?

次のようにイベントを記述できます。

 class PdfGeneratorListener
{
    public function onPdfReady(EventInterface $event)
    {
        // create pdf or whatever
    }
}

そして、あなたが決定したときにそれを呼び出します:

$eventDispatcher->notify(new Event($pdfcontent, 'pdf.ready'));
于 2013-10-01T23:23:23.397 に答える
0

最終的に次の方法で問題を修正しました。

  1. EventListener の登録:サブジェクト (オファー、注文など) が挿入される特別なイベントを通知する EventDispatcher を使用します。件名に基づいて、pdf ドキュメントがレンダリングされます。

    public function onOfferUpdate(OfferEvent $event)
    {
      $offer = $event->getOffer();
      $em = $this->container->get('doctrine')->getEntityManager();
    
      $job = new Job('acme:pdfgenerator:write', array('--entity="'.get_class($offer).'"', '--id='.$offer->getId()));
      $job->addRelatedEntity($offer);
      $em->persist($job);
      $em->flush();
    }
    
  2. acme:pdfgenerator:write コマンドを作成します: 最終的な PDF 作成を処理するターミナルで実行されるコマンドを作成します。このコマンドは、指定されたサブジェクト ID で呼び出されます。有効なサブジェクトをデータベースで検索した後、pdf を生成してファイルシステムに配置します。

  3. JobQueue の使用:シンプルな JobQueue をインストールして開始します (私はJMSJobQueueBundleを使用します)。

    app/console jms-job-queue:run  # To start listing to the job queue
    
  4. オプション: 特定のジョブのステータスを取得する ajax リクエストを実装しました。したがって、ドキュメントの作成が完了すると、ユーザーはフラッシュ メッセージを受け取ります。

今では魅力のように機能します。PDF の作成は別のプロセスで実行され、ユーザーは数秒待たずに次のページを見ることができます。

于 2013-11-06T17:35:42.470 に答える