va5ja / rdn-console
Zend Framework 2 Symfony Console模块
Requires
Conflicts
README
RdnConsole模块将Symfony Console组件与Zend Framework 2连接起来。
如何安装
使用composer需要va5ja/rdn-console包
$ composer require va5ja/rdn-console:1.*
通过在application.config.php文件中包含它来激活模块
<?php return array( 'modules' => array( 'RdnConsole', // ... ), );
如何使用
您可以使用vendor/bin/console工具运行您的命令。这个工具可能位于您composer的bin-dir配置不同的目录中。
模块还将接管所有zf2控制台路由。因此,您也可以简单地通过运行php public/index.php来运行您的命令。
确保在您的public/index.php文件中返回您的应用程序变量$app
// ... return Zend\Mvc\Application::init($config);
如何创建命令
在您的模块内部创建命令,通过控制台命令服务定位器注册它们,最后将命令注入到控制台应用程序中。
让我们在App模块中创建一个hello world命令
1. 创建命令类
通过扩展RdnConsole\Command\AbstractCommand创建类App\Console\Command\HelloWorld
<?php namespace App\Console\Command; use RdnConsole\Command\AbstractCommand; use RdnConsole\Command\ConfigurableInterface; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class HelloWorld extends AbstractCommand implements ConfigurableInterface { public function configure() { $this->adapter ->setName('app:hello-world') ->setDescription('Test hello world command') ; } public function execute(InputInterface $input, OutputInterface $output) { $output->writeln('Hello world!'); } }
2. 使用服务定位器注册命令
在您的module.config.php文件中放置以下内容(或在您的模块的getConfig()方法中)
<?php return array( 'rdn_console_commands' => array( 'invokables' => array( 'App:HelloWorld' => 'App\Console\Command\HelloWorld', ), ), );
3. 将命令注入到控制台应用程序中
现在,在您的module.config.php文件中放置以下内容
<?php return array( 'rdn_console' => array( 'commands' => array( 'App:HelloWorld', ), ), );
4. 运行命令!
现在,您只需运行vendor/bin/console app:hello-world即可运行此命令。
示例命令
模块提供了一个示例RdnConsole:CacheClear命令。您可以通过在您的module.config.php文件中包含以下内容来启用它
<?php return array( 'rdn_console' => array( 'commands' => array( 'RdnConsole:CacheClear', ), ), );
命令适配器
您会注意到命令使用适配器来自定义配置
public function configure() { $this->adapter ->setName('app:hello-world') ->setDescription('Test hello world command') ; }
这略微不同于默认的Symfony工作流程。您必须始终使用此适配器与symfony通信:获取命令名称,获取辅助工具等。
我们使用适配器来将配置与执行代码分开。这种方法的优点将在下一节中解释。
工厂
这个模块最好的部分是它允许我们将命令的配置与其实际的执行代码分开。
这意味着什么?假设您有很多命令,每个命令都有多个依赖项。如果我们像默认方式那样创建我们的命令,Symfony将每次都加载每个命令及其所有依赖项。
但这是低效的,会减慢应用程序的运行速度。相反,此模块将仅加载显示可用命令列表所需的初始配置。
然后当您准备好实际执行命令时,模块将使用工厂模式创建命令,加载所有依赖项,并最终运行执行代码。
如何使用工厂创建命令
1. 创建命令类
像平常一样创建命令类,但不要实现ConfigurableInterface。我们还包含了任何外部依赖项
<?php namespace App\Console\Command; use RdnConsole\Command\AbstractCommand; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class HelloWorld extends AbstractCommand { protected $dependency; public function __construct($dependency) { $this->dependency = $dependency; } public function execute(InputInterface $input, OutputInterface $output) { $output->writeln('Hello world!'); } }
2. 创建命令工厂
接下来,我们通过扩展RdnConsole\Factory\Command\AbstractCommandFactory类来创建此类的工厂。此工厂类将包含命令的配置。您还必须实现create()方法以创建实际的命令对象
<?php namespace App\Factory\Console\Command; use App\Console\Command; use RdnConsole\Factory\Command\AbstractCommandFactory; class HelloWorld extends AbstractCommandFactory { public function configure() { $this->adapter ->setName('app:hello-world') ->setDescription('Test hello world command') ; } protected function create() { $dependency = $this->service('External dependency'); return new Command\HelloWorld($dependency); } }
AbstractCommandFactory类从rdn-factory模块扩展了AbstractFactory类。
3. 使用服务定位器注册命令工厂
最后,我们将此工厂注册到服务定位器,以替换我们之前的可调用类
<?php return array( 'rdn_console_commands' => array( 'factories' => array( 'App:HelloWorld' => 'App\Factory\Console\Command\HelloWorld', ), ), );