Controllers are the ‘C’ in MVC. After routing has been applied and the correct controller has been found, your controller’s action is called. Your controller should handle interpreting the request data, making sure the correct models are called, and the right response or view is rendered. Controllers can be thought of as middle layer between the Model and View. You want to keep your controllers thin, and your models fat. This will help you reuse your code and makes your code easier to test.
Commonly, a controller is used to manage the logic around a single model. For example, if you were building a site for an online bakery, you might have a RecipesController managing your recipes and an IngredientsController managing your ingredients. However, it’s also possible to have controllers work with more than one model. In CakePHP, a controller is named after the primary model it handles.
Your application’s controllers extend the AppController class, which in turn extends the core Controller class. The AppController class can be defined in src/Controller/AppController.php and it should contain methods that are shared between all of your application’s controllers.
Controllers provide a number of methods that handle requests. These are called actions. By default, each public method in a controller is an action, and is accessible from a URL. An action is responsible for interpreting the request and creating the response. Usually responses are in the form of a rendered view, but there are other ways to create responses as well.
AppController
The AppConttroller class is the parent class of all applications’ controllers. This class extends the Controller class of CakePHP. AppController is defined at src/Controller/AppController.php. The file contains the following code.
namespace App\Controller;
use Cake\Controller\Controller;
class AppController extends Controller
{
}
AppController can be used to load components that will be used in every controller of your application. The attributes and methods created in AppController will be available in all controllers that extend it. The initialize() method will be invoked at the end of controller’s constructor to load components.
Controller Actions
The methods in the controller class are called Actions. Actions are responsible for sending appropriate response for browser/user making the request. View is rendered by the name of action, i.e., the name of method in controller.
Example
class RecipesController extends AppController{ public function view($id){ // Action logic goes here. } public function share($customerId, $recipeId){ // Action logic goes here. } public function search($query){ // Action logic goes here. } }
As you can see in the above example, the RecipesController has 3 actions − View, Share, and Search.
Redirecting
For redirecting a user to another action of the same controller, we can use the setAction() method. The following is the syntax for the setAction() method −
Syntax
CakeControllerController::setAction($action, $args…)
The following code will redirect the user to index action of the same controller.
$this->setAction(‘index’);
The following example shows the usage of the above method.
Example
Make changes in the config/routes.php file as shown in the following program.
config/routes.php
<?php use CakeCorePlugin; use CakeRoutingRouteBuilder; use CakeRoutingRouter; Router::defaultRouteClass(‘DashedRoute’); Router::scope(‘/’, function (RouteBuilder $routes) { $routes->connect(‘/redirectcontroller’,[‘ controller’=>’Redirects’,’action’=>’action1′]); $routes->connect(‘/redirectcontroller2’,[‘ controller’=>’Redirects’,’action’=>’action2′]); $routes->fallbacks(‘DashedRoute’); }); Plugin::routes();
Create a RedirectsController.php file at src/Controller/RedirectsController.php. Copy the following code in the controller file.
src/Controller/RedirectsController.php
<?php namespace AppController; use AppControllerAppController; use CakeORMTableRegistry; use CakeDatasourceConnectionManager; class RedirectsController extends AppController{ public function action1(){ } public function action2(){ echo “redirecting from action2”; $this->setAction(‘action1’); } } ?>
Create a directory Redirects at src/Template and under that directory create a Viewfile called action1.ctp. Copy the following code in that file.
src/Template/Redirects/action1.ctp
This is an example of how to redirect within controller.
Execute the above example by visiting the following URL.
http://localhost:85/CakePHP/redirect-controller
Output
Upon execution, you will receive the following output.
Now, visit the following URL − http://localhost:85/CakePHP/redirect-controller2
The above URL will give you the following output.
Loading Models
In CakePHP, a model can be loaded using the loadModel() method. The following is the syntax for the loadModel() method.
Syntax
CakeControllerController::loadModel(string $modelClass, string $type)
There are two arguments to the above function −
- The first argument is the name of model class.
- The second argument is the type of repository to load.
Example
If you want to load Articles model in a controller, then it can be loaded by writing the following line in controller’s action.
$this->loadModel(‘Articles’);
Read more from CakePHP Official Documentation – Controllers 3.7