まず、ここでコントローラーを使用しないことをお勧めします。コントローラーの目的は、モデルとビューの間を仲介することです。自動化されたプロセスでは、実際にはビューがありません。出力を見たり読んだりする人はいません (ログを実装したい場合もありますが、それは別の問題です)。
そうは言っても、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 クラスに関するその他のドキュメントはこちら)