Let's leave the form processing behind and continue with something completely different.
Introducing the bluemvc-api package, we will now build a simple JSON API for our previously created product list.
To implement this, we will use the ApiController class.
Create a new file ApiProductsController.php in the directory Application/Controllers/ with the following content:
<?php
declare(strict_types=1);
namespace Application\Controllers;
use BlueMvc\Api\ApiController;
class ApiProductsController extends ApiController
{
public function getAction(): array
{
return ['Foo' => 'Bar'];
}
}
Open Application/Setup/ApplicationSetup.php and add a new route for the controller:
<?php
declare(strict_types=1);
namespace Application\Setup;
use Application\Controllers\ApiProductsController;
use Application\Controllers\ErrorController;
use Application\Controllers\IndexController;
use Application\Controllers\ProductsController;
use BlueMvc\Core\Interfaces\ApplicationInterface;
use BlueMvc\Core\Route;
use BlueMvc\Twig\TwigViewRenderer;
use DataTypes\System\FilePath;
/**
* The application setup.
*/
class ApplicationSetup
{
/**
* Sets up the application.
*
* @param ApplicationInterface $application The application.
*/
public static function setup(ApplicationInterface $application): void
{
// Set up view handling.
$application->addViewRenderer(new TwigViewRenderer());
$application->setViewPath(FilePath::parseAsDirectory('../Application/Views'));
// Set up routes.
$application->addRoute(new Route('', IndexController::class));
$application->addRoute(new Route('products', ProductsController::class));
$application->addRoute(new Route('api/products', ApiProductsController::class));
$application->setErrorControllerClass(ErrorController::class);
}
}
Note that it is possible to set a multi-level path for a route, e.g. api/products. This is also true for ordinary controllers.
Open the url http://localhost/api/products/ and check the result:
{
"Foo": "Bar"
}
So, what just happened?
For an ApiController, the action method name corresponds to the http method used.
In this case, the browser sent a GET request, which invoked the getAction method (action method names are case-insensitive for ApiControllers).
Also, the return value from the action method is automatically JSON-encoded for everything that is not an ActionResult or null.
Let's try it with our product list instead.
Open Application/Controllers/ApiProductsController.php and modify the content to look like this:
<?php
declare(strict_types=1);
namespace Application\Controllers;
use Application\Models\Product;
use BlueMvc\Api\ApiController;
class ApiProductsController extends ApiController
{
public function getAction(): array
{
return Product::getAll();
}
}
Reload the http://localhost/api/products/ page to see the new result:
[
{
"Id": "foo",
"Name": "24 inch LCD Monitor",
"Price": 140
},
{
"Id": "bar",
"Name": "USS Enterprise Scale Replica",
"Price": 20
}
]
As expected, this is the product list in JSON-format.
That concludes this short introduction to the bluemvc-api package.
In the next part of this tutorial, the website will be tested using PHPUnit.
✎ Published in category get started