首先,我建议不要在这里使用控制器。请记住,控制器的目的是在模型和视图之间进行调解。使用自动化流程,您并没有真正的视图——没有人查看或阅读您的输出(您可能想要实现一些日志记录,但那是另一回事)。
也就是说,我想说你最好的选择是使用 Symfony 的内置控制台命令功能创建一个命令。您可能已经使用app/console
命令工具来执行诸如生成包和创建实体映射之类的操作。通过ContainerAwareCommand
课程,您实际上可以编写自己的课程。最好的部分是命令知道容器......换句话说,您可以使用get()
方法直接访问 Doctrine、Monolog、Twig 或任何其他服务。
因此,假设您的应用程序从站点中提取图像,然后将这些图像的 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")
.
希望这可以帮助!
(More documentation on the ContainerAwareCommand class here)