Instead of defining all of your route-level logic in a single routes.php
file, you may wish to organize this behavior using Controller classes.
Controllers can group related route logic into a class. Controllers are stored in the resources/controllers
directory of your themosis-theme
theme or custom plugin.
Here is an example of a basic controller class:
<?php
namespace Theme\Controllers;
use Themosis\Route\BaseController;
class Home extends BaseController
{
public function index()
{
return view('pages.home');
}
}
All your controller classes must extend the
BaseController
class in order to work. Be careful about the namespaceThemosis\Route\BaseController
.
Now based on our code example above, we can use this controller and its method/action from within our routes.php
file like so:
Route::get('home', 'Home@index');
To link a controller to a route, use the following syntax 'ClassName@method'
. In the example above, the route is linked to the Theme\Controller\Home
class and calls its index
method.
Sometimes routes need more parameters. For example when you define a route for a specific page. To use a controller, add the uses
key to the route callback array and set its value to the controller like so:
Route::get('page', ['about-us', 'uses' => 'About@index']);
We now force developers to use PHP namespaces for the controllers and classes in general. In both the theme and plugin.
A themosis-theme
theme has its namespace set to Theme\\
by default. So every controller added into your theme resources/controllers
directory must have their namespace set to Theme\Controllers
.
Check the plugin guide regarding plugin namespace.
So the following theme route example:
Route::match(['get', 'post'], 'home', 'Home@show');
is instantiating the Theme\Controllers\Home
class saved into the theme resources/controllers/Home.php
file and is calling its show()
public method.
Here is a sample of the above Theme\Controllers\Home
class:
<?php
namespace Theme\Controllers;
use Themosis\Route\BaseController;
class Home extends BaseController
{
public function show()
{
return view('pages.home');
}
}
By default, theme controller classes are loaded using the PSR-4 standard and have a namespace of Theme\Controllers
.
In order to modify your theme controller namespace and autoloading, use the loading.config.php
file stored inside the resources/config
directory of your themosis-theme
:
<?php
return [
/*
* Edit this file in order to configure your theme's
* classes autoloading. Classes are loaded using PSR-4.
*
* The key is the namespace and key's value contains one or more paths to your classes.
*/
'Theme\\Controllers\\' => themosis_path('theme.resources').'controllers',
'Theme\\Models\\' => themosis_path('theme.resources').'models',
'Theme\\Providers\\' => themosis_path('theme.resources').'providers'
];
The function themosis_path('theme.resources')
returns the theme resources
folder path. More information about the themosis_path
function in the Helpers guide.
The Themosis framework now implements the Illuminate\Container in order to resolve controllers. As a result, you can now type-hint any dependencies your controller may need in its constructor or public methods.
Here is an example of a dependency injected in a controller constructor:
<?php
namespace Theme\Controllers;
use Theme\Models;
use Themosis\Route\BaseController;
class Home extends BaseController
{
/**
* A books model instance.
*/
protected $books;
/*
* Auto-instantiate a Theme\Models\Books class.
*/
public function __construct(Books $books)
{
$this->books = $books;
}
}
The same principle can be used to controller methods. You can type-hint your dependency just like in the constructor. Here is an example:
<?php
namespace Theme\Controllers;
use Theme\Models;
use Themosis\Route\BaseController;
class Home extends BaseController
{
/*
* Auto-instantiate a Theme\Models\Books class.
*/
public function show(Books $books)
{
$books = $books->query()->get();
}
}
If your controller method is also expecting values from route parameters, simply append those parameters after your dependencies. Two possible scenarios for this case:
Route parameters are not available to WordPress routes. But each time you use a WordPress route, we give you the globals $post
and $query
as parameters. In order to access them, simply define them after your method dependencies like so:
public function show(Books $books, $post, $query)
{
return view('books');
}
If you have for example a route defined like so:
Route::get('projects/{id}', 'Projects@show');
You can access your route parameter value this way:
public function show(Projects $projects, $id)
{
// Write some logic...
}
Read the models guide
Made in Belgium