(Symfony3)
我想要设置一些简单的cron任务来为我们的项目经理生成安全报告,以便他们可以为开发人员安排升级时间(而不是我忘记手动运行)。
作为一个非常基本的检查,我只是运行......
php bin/console security:check
...看看作曲家对漏洞的看法。最后,我希望将此输出转换为电子邮件,或者在运行cron时将其发布到松散频道或大写字母作业。
问题
当我从via终端运行命令时,它运行良好。在控制器内运行命令始终返回响应锁定文件不存在。我假设这是参考项目根目录下的composer.lock文件。我可以确认这个文件确实存在。
以下是我目前使用的控制器,改编自:
http://symfony.com/doc/current/console/command_in_controller.html
<?php
namespace Treetop1500\SecurityReportBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
class DefaultController extends Controller
{
public function indexAction($key)
{
if ($key != $this->getParameter('easy_cron_key')) {
throw new UnauthorizedHttpException("You are not authorized to access this page.");
}
$kernel = $this->get('kernel');
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput(array(
'command' => 'security:check'
));
// You can use NullOutput() if you don't need the output
$output = new BufferedOutput();
$application->run($input, $output);
// return the output, don't use if you used NullOutput()
$content = $output->fetch();
// return new Response(""), if you used NullOutput()
return new Response($content);
}
}
$content
始终具有值&#34;锁定文件不存在。&#34;
我意识到可能有更好的工具和方法来做到这一点,但是我真的想了解为什么这是来自此控制器操作的生成响应。谢谢你看看!
答案 0 :(得分:1)
将绝对路径传递给composer.lock
文件就像那样:
php bin/console security:check /path/to/another/composer.lock
所以在你的例子中,那将是:
$input = new ArrayInput([
'command' => 'security:check',
'lockfile' => '/path/to/another/composer.lock'
]);
阅读更多信息:来自SensioLabs的SecurityCheckerCommand。可选参数为lockfile
,由SecurityChecker检查。在第46行,他们正在查找composer.lock
文件(默认参数)并在找不到它们时抛出异常。
P.S。之前,我为数组输入了错误的参数。我查看了Symfony文档(How to Call Other Commands)并修复了答案。
答案 1 :(得分:0)
解决方法是将lockfile参数传递给ArrayInput对象,如下所示:
$lockfile = $this->get('kernel')->getRootDir()."/../composer.lock";
$input = new ArrayInput(array('command'=>'security:check','lockfile'=>$lockfile));