在控制器Symfony 2中运行多个控制台命令

在控制器Symfony 2中运行多个控制台命令,symfony,symfony-2.3,symfony-2.4,Symfony,Symfony 2.3,Symfony 2.4,首先,我要感谢大家关注我的问题。这是我的问题 我想从控制器运行Symfony 2中现有的三个控制台命令。因此,我为此编写了三个单独的函数(见下文)。我成功地运行了“条令:映射:导入”(查找下面的代码),在控制器内部没有任何问题。我想做的下一件事是基于导入的映射文件生成实体。如果不关闭并启动内核(我认为这是个坏主意,请看下面的代码),我就无法运行“条令:生成:实体”命令。如果不关闭并引导内核,它将不会为我生成实体。但是在关闭并引导内核之后,它为我创建了实体(我现在有点高兴)。我遇到的下一个问题是当

首先,我要感谢大家关注我的问题。这是我的问题

我想从控制器运行Symfony 2中现有的三个控制台命令。因此,我为此编写了三个单独的函数(见下文)。我成功地运行了“条令:映射:导入”(查找下面的代码),在控制器内部没有任何问题。我想做的下一件事是基于导入的映射文件生成实体。如果不关闭并启动内核(我认为这是个坏主意,请看下面的代码),我就无法运行“条令:生成:实体”命令。如果不关闭并引导内核,它将不会为我生成实体。但是在关闭并引导内核之后,它为我创建了实体(我现在有点高兴)。我遇到的下一个问题是当我运行“条令:生成:表单”命令时(查找下面的代码)。当我在生成实体之后运行这段代码时,它会说“Class”,我的类的名称“不存在”。这不可能发生。因为我在生成实体后运行formbuild命令。甚至我也尝试通过物理访问该文件来搜索该类是否确实存在。它就在那里。所以我想说,我完全被困在这里了

我知道这是一个很长的问题。如果有人能够知道是什么原因导致generate entities无法创建实体,而不关闭并引导内核和form builder命令,即使实体文件也在那里,那将非常感谢。不过我注意到一件事,当我一次运行一个命令时,这个命令(3个函数)工作得很好。但是我想一个接一个地调用这3个函数。所以问题主要发生在我顺序调用这3个函数时

“条令:映射:导入”代码

public function executeImportCommandAction($filter)
{
    $kernel = $this->container->get('kernel');        
    $app = new Application($kernel);
    $app->setAutoExit(false);
    $input = new \Symfony\Component\Console\Input\ArrayInput(
            array('command' => 'doctrine:mapping:import', 'bundle' => 'TESTClientBundle', '--filter'
        => $filter, 'mapping-type' => 'yml'));
    $app->doRun($input, new \Symfony\Component\Console\Output\ConsoleOutput());
}
“条令:生成:实体”代码

public function executeBuildFormCommandActions($entity)
{
    $kernel = $this->container->get('kernel');        
    $kernel->shutdown();
    $kernel->boot();
    $app = new Application($kernel);       
    $app->setAutoExit(false);

    $input = new \Symfony\Component\Console\Input\ArrayInput(
            array('command' => 'doctrine:generate:entities', 'name' => 'TESTClientBundle',
        '--no-backup' => 'true'));
    $app->doRun($input, new \Symfony\Component\Console\Output\ConsoleOutput());
}
“条令:生成:表格”代码

public function executeBuildFormCommandActions($entity)
{
    #$kernel = $this->container->get('kernel');        

    $app = new Application($kernel);
    $app->setAutoExit(false);

    $input = new \Symfony\Component\Console\Input\ArrayInput(
            array('command' => 'doctrine:generate:form', 'entity' => 'TESTVClientBundle:'.$entity.''));
    $app->doRun($input, new \Symfony\Component\Console\Output\ConsoleOutput());
}
先谢谢你。
干杯

您知道有一个流程组件吗


您可以轻松地使用它运行symfony命令。

首先,我需要感谢@vincecore为我提供了有关这方面的指导。我设法解决了流程组件的问题,以实现我想要实现的目标。我假设内核引导关闭不是一个合适的方法,即使它工作得很好。然而,即使在处理内核之后,生成表单也不起作用。这是我在控制器中运行所有“条令:映射:导入”、“条令:生成:实体”和“条令:生成:表单”控制台命令时发现的代码。为了清楚起见,我想举例说明与生成表单相关的代码

public function executeBuildFormCommandActions($form_file)
{
    $move_to_project = 'C:/xampp5.5.11/htdocs/proj_test/';
    $commandline = "php app/console doctrine:generate:form TESTClientBundle:$form_file";
    $form_type_file = $this->get('kernel')->getRootDir() . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'TEST'
            . DIRECTORY_SEPARATOR . 'ClientBundle' . DIRECTORY_SEPARATOR .
            'Form' . DIRECTORY_SEPARATOR . $form_file.'Type.php';
    if(is_file($form_type_file)){
        unlink($form_type_file);
    }        

    $process = new \Symfony\Component\Process\Process($commandline);
    $process->setWorkingDirectory($move_to_project);
    $process->run();        
    try {
        if (!$process->isSuccessful()) {                
            throw new \RuntimeException($process->getErrorOutput());
        }            
        echo $process->getOutput().'<hr/>';
    } catch (\RuntimeException $r) {
        echo $r->getMessage();
    } 
}
公共函数executeBuildFormCommandActions($form_文件)
{
$move_to_project='C:/xampp5.5.11/htdocs/proj_test/';
$commandline=“php应用程序/控制台原则:生成:formtestclientbundle:$form_文件”;
$form\u type\u file=$this->get('kernel')->getRootDir().DIRECTORY\u SEPARATOR'....DIRECTORY\u SEPARATOR'.'src'.DIRECTORY\u SEPARATOR.'TEST'
.DIRECTORY\u SEPARATOR.'ClientBundle'。DIRECTORY\u SEPARATOR。
'Form'.DIRECTORY_SEPARATOR.$Form_file.Type.php';
if(is_文件($form_type_文件)){
取消链接($form\u type\u file);
}        
$process=new\Symfony\Component\process\process($commandline);
$process->setWorkingDirectory($move_to_project);
$process->run();
试一试{
如果(!$process->isSuccessful()){
抛出new\RuntimeException($process->getErrorOutput());
}            
echo$process->getOutput();
}捕获(\RuntimeException$r){
echo$r->getMessage();
} 
}
这种方法(流程组件)的优点是,您可以在使用命令控制台执行命令时直接执行命令。但是,如果没有将工作目录设置为project folder,这在一开始就不起作用。这是显而易见的,事实背后的原因是命令无法访问项目文件夹之外的任何位置的“应用程序/控制台”。因此,我必须在项目文件夹中移动控制台命令($process->setWorkingDirectory($move_to_project))作为在项目文件夹中执行命令。其余两个函数(导入和生成实体)也是相同的,只有命令和参数会更改

希望这能帮助那些试图在Symfony 2控制器内运行多个命令控制台但没有运气的人


干杯

谢谢你的提醒。看起来很有趣。我要试一试。干杯使用进程更好,但如何在控制器中运行多个命令?这就是问题所在。@VincentGuyard上述函数已在控制器中。仔细看看。欢呼:)当我用new Process()执行命令时,我的php冻结,不允许我执行另一个命令。我所做的是在每个命令之间使用“&&”将所有命令执行到一个命令中。(是的,我知道,你的代码在控制器内)