radnan/rdn-console

Zend Framework 2 Symfony Console 模块

v1.2.2 2014-09-30 06:11 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:46:12 UTC


README

RdnConsole 模块将 Symfony Console 组件与 Zend Framework 2 连接起来。

如何安装

使用 composer 需求 radnan/rdn-console

$ composer require radnan/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 通信:获取命令名称,获取助手等。

我们使用适配器将配置与执行代码分开。这种方法的优点将在下一节中解释。

工厂

此模块最出色的部分是它允许我们将命令的配置与其实际的执行代码分开。

这意味着什么?比如说,您有很多命令,每个命令都有多个依赖项。如果我们按照默认方式创建命令,每次都会加载每个命令及其所有依赖项。

但这效率低下,并会减慢应用程序的运行速度。相反,此模块只会加载用于显示可用命令列表的初始配置所需的配置。

然后,当您准备好实际执行命令时,模块将使用工厂模式创建命令,加载所有依赖项,并最终运行执行代码。

如何使用工厂创建命令

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',
		),
	),
);