CakePHP 4 - How do I create a simple proof of concept REST API?

Viewed 135

How do I get a simple proof-of-concept REST API working in CakePHP 4?

I have followed the guides in CakePHP's cookbook here and here

Currently my routes.php file contains the following (with comments removed):

<?php

use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;

return static function (RouteBuilder $routes) {        
    $routes->setRouteClass(DashedRoute::class);    
    $routes->scope('/', function (RouteBuilder $builder) {            
        $builder->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);            
        $builder->connect('/pages/*', 'Pages::display');            
        $builder->fallbacks();
    });
    $routes->scope('/', function (RouteBuilder $builder) {
        $builder->setExtensions(['json']);
        $builder->resources('LocateITAPI');
    });
};

My Controller contains the following code:

<?php
// src/Controller/LocateITAPIController.php
namespace App\Controller;

use App\Controller\AppController;

class LocateITAPIController extends AppController
{
    public function initialize(): void
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
    }

    public function index()
    {        
        echo json_encode(utf8_encode("LocateITAPIController::index()"));
    }

    public function view($id)
    {        
        echo json_encode(utf8_encode("LocateITAPIController::view()"));
    }

    public function add()
    {        
        echo json_encode(utf8_encode("LocateITAPIController::add()"));
    }

    public function edit($id)
    {        
        echo json_encode(utf8_encode("LocateITAPIController::edit()"));
    }

    public function delete($id)
    {        
        echo json_encode(utf8_encode("LocateITAPIController::delete()"));
    }

}

I am trying to access it using the browser at:

http://localhost/app/locateitapi.json

I am expecting to see a JSON response, instead what i am seeing is this error:

Missing Controller Error

1 Answers

Due to the cakephp naming convention, you have that error message.

Solution I:

use url like: http://localhost/app/locate-i-t-a-p-i.json

Solution II: Add in router:

//http://localhost/app/locateitapi.json
$builder->connect('/locateitapi', ['controller' => 'LocateITAPIController', 'action' => 'index']);
$builder->connect('/locateitapi/add', ['controller' => 'LocateITAPIController', 'action' => 'add']);

Solution III:

rename your controller class like:

class LocateItApiController ...
// http://localhost/app/locate-it-api.json

class LocateitapiController ...
// http://localhost/app/locateitapi.json
Related