1

私は何度か symfony 2 を使い始めようとしましたが、途中で行き詰まってしまいました。今回はこれで我慢しようと思います!

これまでのところ、私の最大の疑問は、ユーザーの操作なしでタスクを実行するオブジェクトをどこに置くかということです。

元。

毎日、いくつかの Web サイトからのデータの解析を処理するいくつかの php クラスを作成したいと考えています。このタスクを手動または cron ジョブで起動したい。そのため、私が推測するモデルとコントローラーだけが本当に必要です。(サイトを解析してモデルを作成するコントローラー、解析されたデータを保存して db に永続化するモデル)。これらのバックグラウンド ジョブのみを処理するバンドルを作成するには、これを実行するのが最善の方法です。

以下のクラスを考えています。

  • サイトパーサー

    • Site1Parser は SiteParser を拡張します
    • Site2Parser は SiteParser を拡張します
  • モデル1

  • モデル2

  • さまざまなサイトの解析を調整し、作成されたモデルを保持するように指示するクラス。

それは論理的に思えますか?もしそうなら、どうすればその構造をsymfonyに入れることができるでしょうか?

いろいろと助けていただきありがとうございます。私が明確でない場合や質問がある場合は、お尋ねください。必要な詳細を提供します。

4

1 に答える 1

7

まず、ここでコントローラーを使用しないことをお勧めします。コントローラーの目的は、モデルとビューの間を仲介することです。自動化されたプロセスでは、実際にはビューがありません。出力を見たり読んだりする人はいません (ログを実装したい場合もありますが、それは別の問題です)。

そうは言っても、Symfony の組み込みのコンソール コマンド機能を使用してコマンドを作成するのが最善の策だと思います。app/consoleコマンド ツールを使用して、バンドルの生成やエンティティ マッピングの作成などを行ったことがあるでしょう。クラスを使用するContainerAwareCommandと、実際に自分で書くことができます。そして最良の部分は、コマンドがコンテナーを認識していることです...つまり、メソッドを使用して、Doctrine、Monolog、Twig、またはその他のサービスに直接アクセスできますget()

アプリケーションがサイトから画像を抽出し、それらの画像の URL をデータベースに保存するとします。これを行うには、まずサービス クラスを作成し (MyBundle\Service 名前空間に配置しましょう)、必要なメソッドを指定する必要があります。

namespace MyBundle\Service;

class Parser
{    
    public function extractImageUrls($siteUrl)
    {
        // Do whatever here, and return an array of URLs
    }
}

次に、app/config/config.yml を介して「parser」という名前のサービスとして登録できます。

services:
    parser:
        class: MyBundle\Service\Parser

get("parser")これで、コンテナから呼び出すことができます。コントローラーはコンテナーを拡張するため、コントローラーでは と言うことができます$this->get("parser")が、コンソール コマンドでは特にコンテナーを取得する必要があります: $this->getContainer()->get("parser").

したがって、SiteParseCommand を次のように記述できます。

namespace MyBundle\Command;

class SiteParseCommand extends ContainerAwareCommand {
    protected function configure()
    {
        $this->setName("site:parse");
        $this->addArgument("site", InputArgument::REQUIRED);
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $parser = $this->getContainer()->get("parser");
        $doctrine = $this->getContainer()->get("doctrine");
        $em = $doctrine->getEntityManager();
        $imageRepository = $em->getRepository("MyBundle:Image");

        $site = $input->getArgument("site");

        $images = $parser->getImageUrls($site);

        // Add each image to the database as you normally would, using your entity manager
    }
}

これで、コマンド ラインから次のように呼び出すことができます。

app/console site:parse "http://url.com"

それを crontab に追加してください。

繰り返しますが、ビューがないため、すべてが適切に機能しているかどうかを簡単に判断することはできません。そのため、何が起こっているかを知らせるために、ある種のログを実装します。Monolog もサービスであるため、コンソール コマンドも 経由でアクセスできます$this->getContainer()->get("logger")

お役に立てれば!

(ContainerAwareCommand クラスに関するその他のドキュメントはこちら)

于 2012-10-10T23:40:36.910 に答える