- Basic Concepts
- Files and Directory Layout
- Request Processing Overview
- The Application Object
- Modules
- Generating a Response
- URL Handlers
- Requests
- Responses
- Filters and Layout
- Dependency Injection
- Static Resources
- Common Patterns
- Settings
- Sessions
- Handling Logins
- Sendables
- Encryption
- Deploying Resources
- Asset Storage
- Logging
- Handling Exceptions
- Dates and Times
- Events
- Record Streams
- Modules and Scaffolds
- Http Clients
- Toolkit Classes
- StringTools
- Mime
- Xml
- Custard
- Introduction & Setup
- Creating a custard command
The Application object
The Application object is the top level object in the Rhubarb processing stack. It collects the registered modules for an application, maintains a number of high level objects like the Request and Container objects along with provision for shared data arrays. Application objects are the first object asked to generate a response for a given request.
Normally an application will have just one Application object. It is possible to create secondary application instances which can be used when unit testing. For example a SaaS application might need to instantiate it's landlord application in order to test particular API calls. This can be achieved with acceptance or functional testing using many tools (codeception, selenium, phantomjs) however acceptance tests are usually harder to maintain and support - unit testing can be a much less expensive way to provide the test coverage.
Using the Application object
Retrieving the current application
Rhubarb can host more than one application in a single execution. The currently running application can be
returned from Application::current()
$app = Application::current();
Once you have the current application you can access the following objects in the following ways:
$app = Application::current();
// Get the PhpContext
$phpContext = $app->context();
// Get the Request
$request = $app->request();
// Get the dependency injection Container
$container = $app->container();
There are also a number of other useful states the application keeps track of:
Live mode
Live mode should only be enabled on production servers. The setting can be used to enable or disable features that only make sense on production environments.
// True if the application is running on a production server
$live = $app->live;
Developer Mode
Similar to live mode, developer mode is normally used to switch on or off behaviours that only make sense during development. Most of these behaviours have some sort of performance penalty but improve debugging or deployment experiences. It's common to find developer mode on but live mode off on a staging server for example.
// True if the application is running in developer mode
$developerMode = $app->developerMode;
Application root path
If you need to create paths to folders in your application directory you should use this setting rather than try to resolve the root path yourself.
// The path to the root of the application source code
$rootPath = $app->applicationRootPath;
Unit testing mode
During unit testing some behaviours that require a real browser to be making the request need to be turned off.
// True if the application is currently being unit tested.
$unitTesting = $app->unitTesting;
Creating and registering an Application object
To serve a response Rhubarb needs to boot an application. You can either define your own Application class or you can create an instance of the base Application class and configure it.
The most important thing to do when creating or configuring an application is to register the modules. The following two examples show how to do this with an extended Application class or a directly configured class.
class MyApplication extends Application
{
protected function getModules()
{
return [
new MyModule()
];
}
}
$app = new MyApplication();
$app = new Application();
$app->registerModule(new MyModule());
The recommended approach is to create a bespoke Application class for your application.
Registering the application
To serve requests you need to register the application. There are two main ways to do this.
- Create a
settings/app.config.php
file and create your application object. - Set the
rhubarb_app
environment variable to equal the full class name of your application
Creating the application in app.config.php
An example app.config.php file might look like this.
namespace My\WebsiteApp;
$application = new MyApplication();
Setting the rhubarb_app environment variable
This can be done from the terminal using the export unix command if running a custard or command line script. If serving http requests this will usually need configured through your web server configuration files. For apache you need to add the following directive:
SetEnv rhubarb_app "\My\WebApp\MyApplication"
Application as a Module
The Application class extends the Module class and can be considered the "root" or top level module of the application. As such your application class can define url handlers, initialise components and require other modules.