joomla / application
Joomla 应用程序包
Requires
- php: ^8.1.0
- joomla/event: ^3.0
- joomla/registry: ^3.0
- laminas/laminas-diactoros: ^2.24.0
- psr/http-message: ^1.0
- psr/log: ^1.0|^2.0|^3.0
- symfony/deprecation-contracts: ^2|^3
Requires (Dev)
- ext-json: *
- joomla/controller: ^3.0
- joomla/di: ^3.0
- joomla/input: ^3.0
- joomla/router: ^3.0
- joomla/session: ^3.0
- joomla/test: ^3.0
- joomla/uri: ^3.0
- phan/phan: ^5.4
- phpstan/phpstan: ^1.10.7
- phpunit/phpunit: ^10.0
- rector/rector: ^1.0
- squizlabs/php_codesniffer: ~3.10.2
- symfony/phpunit-bridge: ^7.0
Suggests
- ext-json: To use JSON format, ext-json is required
- joomla/controller: ^3.0 To support resolving ControllerInterface objects in ControllerResolverInterface, install joomla/controller
- joomla/input: ^3.0 To use WebApplicationInterface, install joomla/input
- joomla/router: ^3.0 To use WebApplication or ControllerResolverInterface implementations, install joomla/router
- joomla/session: ^3.0 To use SessionAwareWebApplicationInterface, install joomla/session
- joomla/uri: ^3.0 To use AbstractWebApplication, install joomla/uri
- psr/container: ^1.0 To use the ContainerControllerResolver, install any PSR-11 compatible container
- dev-main
- dev-3.x-dev / 3.0.x-dev
- 3.0.2
- 3.0.1
- 3.0.0
- dev-2.0-dev / 2.0.x-dev
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 2.0.0-rc
- 2.0.0-beta
- 1.9.3
- 1.9.2
- 1.9.1
- 1.9.0
- 1.8.1
- 1.8.0
- 1.7.0
- 1.6.0
- 1.5.1
- 1.5.0
- 1.4.1
- 1.4.0
- 1.3.0
- 1.2.1
- 1.2.0
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0
- 1.0-beta3
- 1.0-beta2
- 1.0-beta
- 1.0-alpha
- dev-improve-bailouts
- dev-1.x-dev
This package is auto-updated.
Last update: 2024-09-17 09:44:36 UTC
README
初始化应用程序
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
,因此可以与支持该标准的服务器端日志记录包集成。
以下示例展示了如何使用来自 AbstractApplication
的 initialise
方法在你的应用程序中设置日志记录。
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
类来创建健壮的模拟对象。
有三个可用的模拟方法
createMockBase
将为AbstractApplication
创建模拟。createMockCli
将为AbstractCliApplication
创建模拟。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
- 请求 URIuri.base.full
- 完整 URIuri.base.host
- URI 主机uri.base.path
- URI 路径uri.route
- 扩展(非基础)请求 URI 的部分uri.media.full
- 完整媒体 URIuri.media.path
- 相对媒体 URI
并且在对象构造期间使用以下选项
gzip
用于压缩输出site_uri
用于查看是否设置了显式的基 URI(在使用 mod_rewrite 连接请求 URI 时很有帮助)media_uri
用于获取显式设置的媒体 URI(相对值附加到uri.base
)。如果没有显式设置,它默认为uri.base
的media/
路径。
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"