在主应用程序中包含Symfony2独立控制台组件包以访问命令

时间:2015-09-15 17:33:22

标签: php symfony composer-php

当我致电:php console.php say:hello MyName

时,

下面的独立命令应用可以自行运行

问题出在底部。

/var/www/html/local/test-app/composer.json

{
  "name": "my/test-package",
  "description": "......",
  "type": "library",
  "version": "1.0.0",
  "autoload": {
    "psr-0": {"": ""}
  },
  "require": {
    "symfony/console": "2.*"
  },
  "minimum-stability": "stable"
}

/var/www/html/local/test-app/Command/HelloCommand.php

<?php

namespace Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class HelloCommand extends Command
{
    protected function configure()
    {
        $this
            ->setName('say:hello')
            ->setDescription('Say hello to someone')
            ->addArgument(
                'name',
                InputArgument::OPTIONAL,
                'Who do you want to say hello?'
            );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $name = $input->getArgument('name');
        $hello = $name ? 'Hello '.$name : 'Hello';

        $output->writeln($hello);
    }
}

/var/www/html/local/test-app/console.php

#!/usr/bin/env php
<?php

require __DIR__.'/vendor/autoload.php';

use Command\HelloCommand;
use Symfony\Component\Console\Application;

$application = new Application();
$application->add(new HelloCommand());
$application->run();

问题

当我在我的主项目的composer.json中包含独立包时,composer会安装所有内容,但是当我调用php console.php say:hello MyName时出现Could not open input file: console.php错误。显然我必须在bin目录中创建一个符号链接,如behat,phing,phpspec,doctrine等,但是如何?

我的主要项目作曲家json

"require": {
    "my/test-package": "dev-master"
},

我查了一下:

所以.......

3 个答案:

答案 0 :(得分:1)

Composer将在 vendor 目录中安装依赖项。您可以使用 console.php 文件的完整路径:

php vendor/my/test-package/console.php say:hello MyName

看到完整路径而不是 vendor / bin / 可能看起来很奇怪,但这是一种有效的方法,如Wouter J with for PHPUnit所示。它有一个优点:它将调用正确的命令而不是另一个时间(例如,另一个包已经创建了 vendor / bin / console.php 文件)。

答案 1 :(得分:1)

如果要使用composer use

来定位二进制文​​件的特定目录
{
    ....
    "config": {
        "bin-dir": "bin"
    },
    ....
}

这样,您可以在项目的根目录中找到bin目录中的所有二进制文件(因为它会自动为您创建动态链接)。

不要忘记将此目录(bin)添加到.gitignore文件中。

更多信息:https://getcomposer.org/doc/articles/vendor-binaries.md#can-vendor-binaries-be-installed-somewhere-other-than-vendor-bin-

答案 2 :(得分:1)

解决。我完整地举例说明其他任何人都可以从中受益。

STANDALONE SYMFONY2 CONSOLE COMMAND APP

<强> /var/www/html/local/test-app/composer.json

在下面创建composer.json文件后运行composer install

{
  "name": "my/test-package",
  "description": "Write something here",
  "type": "library",
  "version": "1.0.0",
  "autoload": {
    "psr-0": {
      "Command": "src/"
    }
  },
  "require": {
    "symfony/console": "2.*"
  },
  "minimum-stability": "stable",
  "bin": [
    "bin/console"
  ]
}

<强> /无功/网络/ HTML /本地/测试应用程式内/ bin中/控制台

确保使其可执行,因此请先运行chmod +x bin/console

#!/usr/bin/env php
<?php

set_time_limit(0);

(@include_once __DIR__ . '/../vendor/autoload.php') || @include_once __DIR__ . '/../../../autoload.php';

use Command\HelloCommand;
use Symfony\Component\Console\Application;

$app = new Application('My CLI Application', '1.0.0');
$app->add(new HelloCommand());
$app->run();

<强> /var/www/html/local/test-app/src/Command/HelloCommand.php

<?php

namespace Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class HelloCommand extends Command
{
    protected function configure()
    {
        $this
            ->setName('say:hello')
            ->setDescription('Say hello to someone')
            ->addArgument(
                'name',
                InputArgument::OPTIONAL,
                'Who do you want to say hello?'
            );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $name = $input->getArgument('name');
        $hello = $name ? 'Hello '.$name : 'Hello';

        $output->writeln($hello);
    }
}

<强>测试

test-app$ bin/console say:hello MyName
Hello MyName

独立控制台命令应用程序现已准备就绪,但您也想在主项目中使用它,为此,请执行以下操作。

您的主要项目

在composer.json文件中包含新包后,运行composer update my/test-package

<强> /var/www/html/local/my-main-app/composer.json

{
    "name": "my/main-app",
    "type": "project",
    "description": "Main",
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "repositories": [
        {
          "type": "git",
          "url": "git@github.com:my/test-package.git"
        }
    ],
    "require": {
        .......
        .......
        "my/test-package": "dev-master"
    },
    "minimum-stability": "stable"
}

如果查看bin目录,您应该看到名为console的文件,这意味着您可以在主应用程序中使用该命令。

<强>测试

my-main-app$ bin/console say:hello MyName
Hello MyName