从任何文件夹运行Symfony App控制台

时间:2014-04-01 17:09:44

标签: php magento symfony console

当我通过composer安装新的Symfony应用程序或直接下载它时,它附带一个命令行console应用程序。我可以使用以下命令运行此应用程序

$ php app/console help

在具有开发人员命令行应用程序的其他系统中,(Drupal的drush,Magento的n98-magerun等),应用程序能够确定根目录的位置文件夹是指您深入文件层次结构,并且可以从任何地方运行应用程序

$ cd some/drupal/path
$ drush                   //still works!

要与Symfony app/console做类似的事情,您需要自己构建此路径

$ cd some/symfony/path
$ php ../../../app/console

如果命令依赖于PHP工作目录作为根目录,那么即使这样也行不通。

是否有标准/良好支持的方式让#34;从任何文件夹运行"使用Symfony app/console的其他CLI应用程序的行为?

4 个答案:

答案 0 :(得分:2)

我为此目的使用以下控制台脚本:

#!/usr/bin/env php
<?php
function fileLocator($file =null, $maxDepth = 10, $currentDir = ".")
{
    if(empty($file)){
        return false;
    }elseif(file_exists($currentDir . "/$file")){
        return $currentDir;
    }elseif(--$maxDepth){
        return fileLocator($file, $maxDepth, $currentDir . "/..");
    }else{
        return false;
    }
}

$projectDir = fileLocator('app', 10, getcwd());

if($projectDir){
    $projectDir = realpath($projectDir);
    if(substr($projectDir, -1) != DIRECTORY_SEPARATOR){
        $projectDir .= DIRECTORY_SEPARATOR ;
    }

    $appDir = $projectDir . 'app';  
}else {
 die('You are not in symfony project');
}

// if you don't want to setup permissions the proper way, just uncomment the following PHP line
// read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information
//umask(0000);

set_time_limit(0);

require_once $appDir.'/bootstrap.php.cache';
require_once $appDir.'/AppKernel.php';

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Debug\Debug;

$input = new ArgvInput();
$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');
$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--no-debug', '')) && $env !== 'prod';

if ($debug) {
    Debug::enable();
}

$kernel = new AppKernel($env, $debug);
$application = new Application($kernel);
$application->run($input);

适用于* nix用户

使用此代码创建控制台文件。把它放在您选择的全局路径中(如/usr/local/bin/) 给它可执行权限

  

sudo chmod + x / usr / local / bin / console

你准备好了。您可以从symfony2项目的任何目录中运行控制台。

对于Windows用户:

假设你在路径变量中有你的php路径,所以你可以执行像php app/console这样的控制台。

使用相同的代码创建console.php文件。使用以下脚本创建console.bat文件:

@ECHO OFF
php "%~dp0sf.php" %*

复制php目录中的console.phpconsole.bat文件。现在你准备好了。

享受!!

答案 1 :(得分:1)

你需要创建一个符号链接

sudo ln -s /full/path/to/app/console /usr/local/bin/console
sudo chmod +x /usr/local/bin/console

然后您可以运行sudo console help

答案 2 :(得分:0)

这是一个以Bash脚本实现的解决方案,适用于Windows下的Linux / Mac或Cygwin的bash提示。即使你在项目之间定期交换它也应该工作正常,因为它不依赖于环境变量。

创建一个包含以下内容的脚本,使其可执行(使用chmod a + x),然后将其放在路径中:

#!/bin/sh

 while [[ "`pwd`" != "/" ]]; do
    app_dir=`find \`pwd\`/ -maxdepth 1 -name 'app'`
    if [ -f "$app_dir/console" ]; then
      php $app_dir/console $@
      break
    fi

    cd ..
  done

然后只需在Symfony项目中的任何地方使用它,并像使用“php app / console”一样使用它。它不依赖于任何环境变量 - 它所做的只是递归查看您所在位置的父文件夹,查找app / console,然后使用传递给它的任何和所有参数运行它(这就是$ @符号用于)。

答案 3 :(得分:0)

我创建了一个Bundle来解决。目前,它只是一个bash / fish脚本,它会创建类似于虚拟环境的内容:

$ composer require sk/symfony-venv
// [...] wait for install
$ . vendor/bin/activate
(project) $ console

https://github.com/skroczek/symfony-venv上,您可以阅读更多内容。欢迎反馈。 :)