CakePHP lets you convert a controller into a RESTful API resource. We will use a prefixed (in other words, namespaced) controller to prevent cluttering your main controller for that given resource.
Using $routes->setExtensions(['json']); tells the framework to parse the .json extension in the URL. Otherwise it will think it's a part of the method name.
CakePHP 4
-
Create a prefix in
config/routes.php:$routes->prefix('Api', function (RouteBuilder $routes) { $routes->setExtensions(['json']); $routes->fallbacks(DashedRoute::class); }); -
Create
src/Controller/Api/AppController.php:viewBuilder()->setOption('serialize', true); } } -
Create your resource controller, say
src/Controller/Api/PostsController.php:set([ 'foo' => 'bar', ]); } } -
Optional: Configure your API scope in
config/routes.php:$routes->scope('/api', function (RouteBuilder $builder) { $builder->setRouteClass(DashedRoute::class); $builder->setExtensions(['json']); $builder->resources('Events', [ 'prefix' => 'Api', ]); });
CakePHP 5
-
Create a prefix in
config/routes.php:$routes->prefix('Api', function (RouteBuilder $routes) { $routes->setExtensions(['json']); $routes->fallbacks(DashedRoute::class); }); -
Create
src/Controller/Api/AppController.php:addViewClasses([\Cake\View\JsonView::class]); $this->viewBuilder()->setOption('serialize', true); } } -
Create your resource controller, say
src/Controller/Api/PostsController.php:set([ 'foo' => 'bar', ]); } }
Try accessing your resource at example.com/api/posts/hello.json.
If something doesn't work right away, always run bin/cake cache clear_all before you spend hours investigating.