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

时间:2014-06-20 10:37:03

标签: symfony symfony-2.3 symfony-2.4

首先,我要感谢大家查看我的问题。这是我的问题。

我想从控制器在Symfony 2中运行三个现有的控制台命令。所以我为此编写了三个独立的函数(见下文)。我设法在控制器内运行' doctrine:mapping:import '(找到下面的代码)而没有任何问题。我想要做的下一件事是根据导入的映射文件生成实体。我无法在不关闭和启动内核的情况下运行' doctrine:generate:entities '命令(我认为这是个坏主意,请看下面的代码)。在不关闭和启动内核的情况下,它不会为我生成实体。但是在关闭并启动内核后,它会为我创建实体(我现在有点开心)。我遇到的下一个问题是当我运行' doctrine:generate:form '命令时(找到下面的代码)。当我在生成实体后运行此代码时,它会说“Class”,“我的类别的名称”不存在。这不可能发生。因为我在生成实体后运行表单构建命令。即使我尝试通过物理访问文件来搜索类是否实际存在。它就在那里。我会说,所以我完全被困在这里。

嗯,我知道这是一个冗长的问题。如果有人能够分辨出什么导致生成实体不创建实体而不关闭并启动内核和表单构建器命令不起作用,即使实体文件在那里,也真的很感激。但有一件事我注意到,当我一次运行一个命令时,这个命令(3个函数)工作正常。但我想一个接一个地称这三个功能。因此,当我顺序调用这3个函数时,主要出现问题。

代码为'doctrine:mapping:import'

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());
}

代码为'doctrine:generate:entities'

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());
}

代码为'doctrine:generate:form'

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());
}

提前多多感谢。 干杯!

2 个答案:

答案 0 :(得分:1)

你知道有一个过程组件吗? http://symfony.com/doc/current/components/process.html

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

答案 1 :(得分:0)

首先,我要感谢@vincecore给我关于Symfony Process Component的提醒。我设法使用Process组件来实现我想要实现的目标。我认为内核启动关闭不是一个正确的方法,即使它运行良好。但是,即使在处理内核之后,生成表单也不起作用。这是我在运行所有' doctrine:mapping:import ',' doctrine:generate:entities '和' doctrine:generate时发现的代码片段:在控制器内部形成'控制台命令。为了清楚起见,我想说明与生成表单相关的代码。

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();
    } 
}

这种方法(Process组件)的好处是您可以在使用命令控制台执行时直接执行命令。但是,如果不将工作目录设置为项目文件夹,则这在第一个位置不起作用。事实上,显而易见的原因是命令无法在项目文件夹外的任何地方访问“app / console”。因此,我必须将项目文件夹($ process-&gt; setWorkingDirectory($ move_to_project))中的控制台命令移动到项目文件夹中执行命令。其余两个函数(导入和生成实体)也相同,只有命令和参数发生变化。

希望这可以帮助那些在Symfony 2 Controller中运行多个命令控制台时尝试并找不到运气的人。

干杯!