The Application Package

Initialising Applications

AbstractApplication implements an initialise method that is called at the end of the constructor. This method is intended to be overridden in derived classes as needed by the developer.

If you are overriding the __construct method in your application class, remember to call the parent constructor last.

use JoomlaApplicationAbstractApplication; use JoomlaInputInput; use JoomlaRegistryRegistry; 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. } }

Logging within Applications

AbstractApplication implements the PsrLogLoggerAwareInterface so is ready for intergrating with an logging package that supports that standard.

The following example shows how you could set up logging in your application using initialise method from AbstractApplication.

use JoomlaApplicationAbstractApplication; use MonologLogger; use MonologHandlerNullHandler; use MonologHandlerStreamHandler; 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); } }

The logger variable is private so you must use the getLogger method to access it. If a logger has not been initialised, the getLogger method will throw an exception.

To check if the logger has been set, use the hasLogger method. This will return true if the logger has been set.

Consider the following example:

use JoomlaApplicationAbstractApplication; 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)); } } }

Mocking the Application Package

For more complicated mocking where you need to similate real behaviour, you can use the ApplicationTestsMocker class to create robust mock objects.

There are three mocking methods available:

createMockBase will create a mock for AbstractApplication. createMockCli will create a mock for AbstractCliApplication. createMockWeb will create a mock for AbstractWebApplication.

use JoomlaApplicationTestsMocker 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); } }

The createMockWeb method will return a mock with the following methods mocked to roughly simulate real behaviour albeit with reduced functionality:

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

You can provide customised implementations these methods by creating the following methods in your test class respectively:

mockWebAppendBody mockWebGet mockWebGetBody mockWebGetHeaders mockWebSet mockWebSetBody mockWebSetHeader

Web Application

Configuration options

The AbstractWebApplication sets following application configuration:

Execution datetime and timestamp

execution.datetime - Execution datetime execution.timestamp - Execution timestamp

URIs

uri.request - The request URI uri.base.full - full URI uri.base.host - URI host uri.base.path - URI path uri.route - Extended (non-base) part of the request URI uri.media.full - full media URI uri.media.path - relative media URI

and uses following ones during object construction:

gzip to compress the output site_uri to see if an explicit base URI has been set (helpful when chaining request uri using mod_rewrite) media_uri to get an explicitly set media URI (relative values are appended to uri.base ). If it's not set explicitly, it defaults to a media/ path of uri.base.

The setHeader method

Accepted parameters

$name - The name of the header to set. $value - The value of the header to set. $replace - True to replace any headers with the same name.

Example: Using WebApplication::setHeader to set a status header.

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

Will result in response containing header

Status Code: 401 Authorization required

Command Line Applications

The Joomla Framework provides an application class for making command line applications.

An example command line application skeleton:

use JoomlaApplicationAbstractCliApplication; // 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();

Colors for CLI Applications

It is possible to use colors on an ANSI enabled terminal.

use JoomlaApplicationAbstractCliApplication; 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>'); } }

You can also create your own styles.

use JoomlaApplicationAbstractCliApplication; use JoomlaApplicationCliColorstyle; 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>'); } }

Available foreground and background colors are: black, red, green, yellow, blue, magenta, cyan and white.

And available options are: bold, underscore, blink and reverse.

You can also set these colors and options inside the tagname:

use JoomlaApplicationAbstractCliApplication; 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>'); } }

Installation via Composer

Add "joomla/application": "~2.0" to the require block in your composer.json and then run composer install.

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

Alternatively, you can simply run the following from the command line:

composer require joomla/application "~2.0"

If you want to include the test sources, use

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

版权声明:

1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。
2、网站不提供资料下载,如需下载请到原作者页面进行下载。
3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考学习用!
4、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。