Php 从任何文件夹运行Symfony应用程序控制台

Php 从任何文件夹运行Symfony应用程序控制台,php,magento,symfony,console,Php,Magento,Symfony,Console,当我通过composer或直接下载安装一个新的Symfony应用程序时,它附带一个命令行控制台应用程序。我可以使用以下命令运行此应用程序 $ php app/console help 在具有开发人员命令行应用程序的其他系统中(Drupal的drush、Magento的n98 magerun,等等),当您深入文件层次结构时,应用程序能够确定根文件夹的位置,并且可以从任何位置运行应用程序 $ cd some/drupal/path $ drush //still

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

$ 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工作目录作为根目录,那么即使这样也可能不起作用


使用Symfony的
app/console

您需要创建一个符号链接,是否有一种标准的/受良好支持的方式来获取其他CLI应用程序的“从任何文件夹运行”行为

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

然后您可以运行
sudo控制台帮助

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

#!/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);
复制php目录中的
console.php
console.bat
文件。现在你准备好出发了


享受

这里有一个作为Bash脚本实现的解决方案,非常适合在Linux/Mac或Cygwin在Windows下的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 #!/垃圾箱/垃圾箱 而[[“`pwd`”!=“/”];做 app_dir=`find\`pwd\`/-maxdepth 1-name'app'` 如果[-f“$app_dir/console”];然后 php$app_dir/控制台$@ 打破 fi 光盘 完成
然后在Symfony项目中的任何地方使用它,就像使用“php应用程序/控制台”一样使用它。它不依赖于任何环境变量—它所做的只是递归地查看您所在的父文件夹,查找应用程序/控制台,然后使用传递给它的任何和所有参数运行它(这就是$@符号的作用)。

我创建了一个包来解决这个问题。它目前只是一个bash/fish脚本,它创建了类似于虚拟环境的东西:

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

在网上你可以阅读更多。欢迎反馈。:)

谢谢!如果是~/bin,那可能更好——还有,为什么是sudo?当你有多个symfony项目时,这可能是一种危险的方法。假设您已经为项目A准备好了这个符号链接。稍后,您在项目B中,出于习惯类型:console-doctor:schema:drop。你刚刚在项目A中删除了数据库!sudo是因为他链接到
/usr/local
。但是,您希望以拥有该树的用户身份运行此操作,以避免产生权限问题。
/tmp/magento
问题是您应该熟悉的问题,其根本原因就是这个。
$ composer require sk/symfony-venv
// [...] wait for install
$ . vendor/bin/activate
(project) $ console