joomla/application

3.0.2 2024-08-07 16:49 UTC

README

Latest Stable Version Total Downloads Latest Unstable Version License

初始化应用程序

AbstractApplication 实现了一个在构造函数末尾被调用的 initialise 方法。该方法旨在根据开发者的需要由派生类覆盖。

如果你在应用程序类中覆盖了 __construct 方法,请记住最后调用父构造函数。

use Joomla\Application\AbstractApplication;
use Joomla\Input\Input;
use Joomla\Registry\Registry;

class MyApplication extends AbstractApplication
{
	/**
	 * Customer constructor for my application class.
	 *
	 * @param   Input     $input
	 * @param   Registry  $config
	 *
	 * @since   1.0
	 */
	public function __construct(Input $input = null, Registry $config = null, Foo $foo)
	{
		// Do some extra assignment.
		$this->foo = $foo;

		// Call the parent constructor last of all.
		parent::__construct($input, $config);
	}

	/**
	 * Method to run the application routines.
	 *
	 * @return  void
	 *
	 * @since   1.0
	 */
	protected function doExecute()
	{
		try
		{
			// Do stuff.
		}
		catch(\Exception $e)
		{
			// Set status header of exception code and response body of exception message
			$this->setHeader('status', $e->getCode() ?: 500);
			$this->setBody($e->getMessage());
		}
	}

	/**
	 * Custom initialisation for my application.
	 *
	 * @return  void
	 *
	 * @since   1.0
	 */
	protected function initialise()
	{
		// Do stuff.
		// Note that configuration has been loaded.
	}
}

应用程序中的日志记录

AbstractApplication 实现了 Psr\Log\LoggerAwareInterface,因此可以与支持该标准的服务器端日志记录包集成。

以下示例展示了如何使用来自 AbstractApplicationinitialise 方法在你的应用程序中设置日志记录。

use Joomla\Application\AbstractApplication;
use Monolog\Logger;
use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;

class MyApplication extends AbstractApplication
{
	/**
	 * Custom initialisation for my application.
	 *
	 * Note that configuration has been loaded.
	 *
	 * @return  void
	 *
	 * @since   1.0
	 */
	protected function initialise()
	{
		// Get the file logging path from configuration.
		$logPath = $this->get('logger.path');
		$log = new Logger('MyApp');

		if ($logPath)
		{
			// If the log path is set, configure a file logger.
			$log->pushHandler(new StreamHandler($logPath, Logger::WARNING);
		}
		else
		{
			// If the log path is not set, just use a null logger.
			$log->pushHandler(new NullHandler, Logger::WARNING);
		}

		$this->setLogger($logger);
	}
}

日志变量是私有的,因此你必须使用 getLogger 方法来访问它。如果没有初始化日志记录器,则 getLogger 方法将抛出异常。

要检查是否已设置日志记录器,请使用 hasLogger 方法。如果已设置日志记录器,则将返回 true

考虑以下示例

use Joomla\Application\AbstractApplication;

class MyApplication extends AbstractApplication
{
	protected function doExecute()
	{
		// In this case, we always want the logger set.
		$this->getLogger()->logInfo('Performed this {task}', array('task' => $task));

		// Or, in this case logging is optional, so we check if the logger is set first.
		if ($this->get('debug') && $this->hasLogger())
		{
			$this->getLogger()->logDebug('Performed {task}', array('task' => $task));
		}
	}
}

模拟应用程序包

对于更复杂的模拟,你需要模拟真实行为,可以使用 Application\Tests\Mocker 类来创建健壮的模拟对象。

有三个可用的模拟方法

  1. createMockBase 将为 AbstractApplication 创建模拟。
  2. createMockCli 将为 AbstractCliApplication 创建模拟。
  3. createMockWeb 将为 AbstractWebApplication 创建模拟。
use Joomla\Application\Tests\Mocker as AppMocker;

class MyTest extends \PHPUnit_Framework_TestCase
{
	private $instance;

	protected function setUp()
	{
		parent::setUp();

		// Create the mock input object.
		$appMocker = new AppMocker($this);
		$mockApp = $appMocker->createMockWeb();

		// Create the test instance injecting the mock dependency.
		$this->instance = new MyClass($mockApp);
	}
}

createMockWeb 方法将返回一个模拟对象,其中以下方法被模拟以大致模拟真实行为,尽管功能有所减少

  • appendBody($content)
  • get($name [, $default])
  • getBody([$asArray])
  • getHeaders()
  • prependBody($content)
  • set($name, $value)
  • setBody($content)
  • setHeader($name, $value [, $replace])

你可以通过在测试类中创建以下方法来提供这些方法的自定义实现

  • mockWebAppendBody
  • mockWebGet
  • mockWebGetBody
  • mockWebGetHeaders
  • mockWebSet
  • mockWebSetBody
  • mockWebSetHeader

Web 应用程序

配置选项

AbstractWebApplication 设置以下应用程序配置

  • 执行日期和时间戳

    • execution.datetime - 执行日期和时间
    • execution.timestamp - 执行时间戳
  • URI

    • uri.request - 请求 URI
    • uri.base.full - 完整 URI
    • uri.base.host - URI 主机
    • uri.base.path - URI 路径
    • uri.route - 扩展(非基础)请求 URI 的部分
    • uri.media.full - 完整媒体 URI
    • uri.media.path - 相对媒体 URI

并且在对象构造期间使用以下选项

  • gzip 用于压缩输出
  • site_uri 用于查看是否设置了显式的基 URI(在使用 mod_rewrite 连接请求 URI 时很有帮助)
  • media_uri 用于获取显式设置的媒体 URI(相对值附加到 uri.base)。如果没有显式设置,它默认为 uri.basemedia/ 路径。

setHeader 方法

接受参数

  • $name - 要设置的头部名称。
  • $value - 要设置的头部值。
  • $replace - 如果为真,则替换具有相同名称的所有头部。

示例:使用 WebApplication::setHeader 设置状态头部。

$app->setHeader('status', '401 Auhtorization required', true);

结果将在响应中包含头部

Status Code: 401 Authorization required

命令行应用程序

Joomla 框架提供了一个用于制作命令行应用程序的应用程序类。

一个示例命令行应用程序骨架

use Joomla\Application\AbstractCliApplication;

// Bootstrap the autoloader (adjust path as appropriate to your situation).
require_once __DIR__ . '/../vendor/autoload.php';

class MyCli extends AbstractCliApplication
{
	protected function doExecute()
	{
		// Output string
		$this->out('It works');

		// Get user input
		$this->out('What is your name? ', false);

		$userInput = $this->in();
		$this->out('Hello ' . $userInput);
	}
}

$app = new MyCli;
$app->execute();

命令行应用程序的颜色

在支持 ANSI 的终端上可以使用颜色。

use Joomla\Application\AbstractCliApplication;

class MyCli extends AbstractCliApplication
{
	protected function doExecute()
	{
		// Green text
		$this->out('<info>foo</info>');

		// Yellow text
		$this->out('<comment>foo</comment>');

		// Black text on a cyan background
		$this->out('<question>foo</question>');

		// White text on a red background
		$this->out('<error>foo</error>');
	}
}

您也可以创建自己的样式。

use Joomla\Application\AbstractCliApplication;
use Joomla\Application\Cli\Colorstyle;

class MyCli extends AbstractCliApplication
{
	/**
	 * Override to initialise the colour styles.
	 *
	 * @return  void
	 *
	 * @since   1.0
	 */
	protected function initialise()
	{
		$style = new Colorstyle('yellow', 'red', array('bold', 'blink'));
		$this->getOutput()->addStyle('fire', $style);
	}

	protected function doExecute()
	{
		$this->out('<fire>foo</fire>');
	}
}

可用的前景色和背景色有:黑色、红色、绿色、黄色、蓝色、品红色、青色和白色。

以及可用的选项有:粗体、下划线、闪烁和反转。

您也可以在标签名称中设置这些颜色和选项

use Joomla\Application\AbstractCliApplication;

class MyCli extends AbstractCliApplication
{
	protected function doExecute()
	{
		// Green text
		$this->out('<fg=green>foo</fg=green>');

		// Black text on a cyan background
		$this->out('<fg=black;bg=cyan>foo</fg=black;bg=cyan>');

		// Bold text on a yellow background
		$this->out('<bg=yellow;options=bold>foo</bg=yellow;options=bold>');
	}
}

通过 Composer 安装

"joomla/application": "~3.0" 添加到 composer.json 中的 require 块,然后运行 composer install

{
	"require": {
		"joomla/application": "~3.0"
	}
}

或者,您可以直接在命令行运行以下命令

composer require joomla/application "~3.0"

如果您想包含测试源,请使用

composer require --prefer-source joomla/application "~3.0"