Actions

Framework

Difference between revisions of "Getting Started"

From Joomla! Documentation

(This page has some Q&A's for some of the issues I encountered when getting started with the Framework)
 
m (added Category:Framework using HotCat)
 
Line 80: Line 80:
 
$app = $this->getApplication();
 
$app = $this->getApplication();
 
$db = $app->db;</source>
 
$db = $app->db;</source>
 +
 +
[[Category:Framework]]

Latest revision as of 07:53, 30 January 2014

These are some questions and answers that may help make getting started with the Framework easier.

Contents

Why does the router keep throwing "Unable to handle request for route"

This error is generated when the \Joomla\Router\Router class is unable to find a valid route to match the URL the user has entered.

This could be due to:

  • There is no route defined for the resource and the router does not have a defaultController (defined using $router->setDefaultController(fully namespaces controller name)). Check to see if a route exists, or the defaultController has been set.
  • You have not created a .htaccess file to rewrite the URL To remove the index.php component of the URL. Use the example .htaccess in the framework-app. (https://github.com/dbhurley/framework-app/blob/master/www/.htaccess)

How do I create a default route when no existing route matches?

A default controller can be created for the Joomla\Router\Router class. This is used when no existing route matches the request URI.

To define a default controller call the \Joomla\Router\Router class setDefaultController function and pass the fully namespaced controller name you wish to use:

        $router->setDefultControllerPrefix('App');
        $router->setDefaultController('\Controller\DefaultController');

This will attempt to load the DefaultController.php file from the App/Controller directory. The class name would be DefaultController.

How can I easily create a lot of routes?

The \Joomla\Router\Router class has a function addMaps that takes an array of routes.

        $router->addMaps(my array of routes)

These can be loaded from an array defined elsewhere or from an external file. The framework-app (https://github.com/dbhurley/framework-app/) shows how to load these from an external JSON file.

        $router = new Router();
        $maps = json_decode(file_get_contents(JPATH_CONFIGURATION.'/routes.json'));
        $router->addMaps($maps);

I find creating routes in a routes.json file easier to manage.

How do I connect to the database from a Controller?

Connecting to the database is managed through the \Joomla\Database\DatabaseFactory class. While you could create this each time in each controller this would be extra code to manage for any changes. I found the easiest way was to create this when bootstrapping the application and maintaining a reference in the AbstractWebApplication class.

Much of this code has been lifted from the Framework-app at (https://github.com/dbhurley/framework-app).

First, create a json file called config.json in the App/Config directory:

        {
        "database":{"driver":"mysql","host":"localhost","user":"root","password":"root","name":"mydatabase","prefix":"app_"},
        "system":{"list_limit":"20","gzip":"0","offset":"UTC"},"languages":["en-GB"]
}

Then when bootstrapping your app (maybe in the index.php) do the following:

        $config = json_decode(file_get_contents(JPATH_CONFIGURATION.'/config.json'),true);
        $application = new \App\App(null,new \Joomla\Registry\Registry($config));
        $application->execute();

Then in the doExecute() method of your app create a reference to the database:

        $dbFactory = new Database\DatabaseFactory;
        $this->db = $dbFactory->getDriver(
                $this->get('database.driver'),
                array(
                        'host'=>$this->get('database.host'),
                        'user'=>$this->get('database.user'),
                        'password'=>$this->get('database.password'),
                        'port'=>$this->get('database.port'),
                        'socket'=>$this->get('database.socket'),
                        'database'=>$this->get('database.name'),
                        )
                );

In your controller the database can then be accessed using:

        $app = $this->getApplication();
        $db = $app->db;