Zend Expressive API does not return contents of objects

18
March 16, 2019, at 04:50 AM

I'm creating a small API, mostly for learning purposes, but, I might implement it into a project I'm working on. So far, I have installed the zend expressive skeleton application and set up my models and entities. I'm able to query the database and get results, but, when I return the results as a JSON Response, I can only see a list of empty arrays for each result. I would like to be able to return the actual objects that are being returned from the database instead of converting them to arrays.

HomePageHandler.php

<?php
declare(strict_types=1);
namespace App\Handler;
use App\Entity\Product;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Zend\Diactoros\Response\HtmlResponse;
use Zend\Diactoros\Response\JsonResponse;
use Zend\Expressive\Router;
use Zend\Expressive\Template\TemplateRendererInterface;
use App\Model\ProductModel;
class HomePageHandler implements RequestHandlerInterface
{
    /** @var string */
    private $containerName;
    /** @var Router\RouterInterface */
    private $router;
    /** @var null|TemplateRendererInterface */
    private $template;
    private $productModel;
    public function __construct(
        string $containerName,
        Router\RouterInterface $router,
        ?TemplateRendererInterface $template = null,
        ProductModel $productModel
    ) {
        $this->containerName = $containerName;
        $this->router        = $router;
        $this->template      = $template;
        $this->productModel  = $productModel;
    }
    public function handle(ServerRequestInterface $request) : ResponseInterface
    {
        $data = $this->productModel->fetchAllProducts();
        return new JsonResponse([$data]);
        //return new HtmlResponse($this->template->render('app::home-page', $data));
    }
}

I'm expecting a JSON Response returned with a list of 18 "Product" entities. My results look like.

[[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]]

Let me know if there is any other code you would like to see. Thanks in advance!

Edited with Product.php code

<?php
/**
 * Created by PhpStorm.
 * User: Brock H. Caldwell
 * Date: 3/14/2019
 * Time: 4:04 PM
 */
namespace App\Entity;
class Product
{
    protected $id;
    protected $picture;
    protected $shortDescription;
    protected $longDescription;
    protected $dimensions;
    protected $price;
    protected $sold;
    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * @param mixed $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }
    /**
     * @return mixed
     */
    public function getPicture()
    {
        return $this->picture;
    }
    /**
     * @param mixed $picture
     */
    public function setPicture($picture)
    {
        $this->picture = $picture;
    }
    /**
     * @return mixed
     */
    public function getShortDescription()
    {
        return $this->shortDescription;
    }
    /**
     * @param mixed $shortDescription
     */
    public function setShortDescription($shortDescription)
    {
        $this->shortDescription = $shortDescription;
    }
    /**
     * @return mixed
     */
    public function getLongDescription()
    {
        return $this->longDescription;
    }
    /**
     * @param mixed $longDescription
     */
    public function setLongDescription($longDescription)
    {
        $this->longDescription = $longDescription;
    }
    /**
     * @return mixed
     */
    public function getDimensions()
    {
        return $this->dimensions;
    }
    /**
     * @param mixed $dimensions
     */
    public function setDimensions($dimensions)
    {
        $this->dimensions = $dimensions;
    }
    /**
     * @return mixed
     */
    public function getPrice()
    {
        return $this->price;
    }
    /**
     * @param mixed $price
     */
    public function setPrice($price)
    {
        $this->price = $price;
    }
    /**
     * @return mixed
     */
    public function getSold()
    {
        return $this->sold;
    }
    /**
     * @param mixed $sold
     */
    public function setSold($sold)
    {
        $this->sold = $sold;
    }
    public function exchangeArray($data)
    {
        $this->id = (!empty($data['id'])) ? $data['id'] : null;
        $this->picture = (!empty($data['picture'])) ? $data['picture'] : null;
        $this->shortDescription = (!empty($data['shortDescription'])) ? $data['shortDescription'] : null;
        $this->longDescription = (!empty($data['longDescription'])) ? $data['longDescription'] : null;
        $this->dimensions = (!empty($data['dimensions'])) ? $data['dimensions'] : null;
        $this->price = (!empty($data['price'])) ? $data['price'] : null;
        $this->sold = (!empty($data['sold'])) ? $data['sold'] : null;
    }
}
Answer 1

You need to either make the properties public, or implement the JsonSerializable interface in your Product entity. All of its properties are protected, which is fine, but that means they aren't exposed when the object is JSON encoded.

Here are some brief examples:

class Example1 {  protected $a = 1;  }
class Example2 {  public $b = 2; }
class Example3 implements JsonSerializable {
    protected $c = 3;
    public function jsonSerialize() {
        return ['c' => $this->c];
    }
}
echo json_encode([new Example1, new Example2, new Example3]);

The result:

[{},{"b":2},{"c":3}]

If you choose to implement JsonSerializable, exactly how you do it is up to you, but you just need a jsonSerialize() method that returns the properties you want in the JSON result in a format accessible to json_encode (an object with public properties or an array).

READ ALSO
What change Language codeigniter

What change Language codeigniter

I want to rend my codeigniter multilanguage and I would create a button that it can change in config/configphp $config[language]== "? "

29
Chaining webdriver methods

Chaining webdriver methods

I'd like to implement a class to carry out some common webdriver functions, but I keep getting: the driver server has died

34
Access Denied error while using PHP to connect to database in CentOS 7

Access Denied error while using PHP to connect to database in CentOS 7

I am trying to connect to remote MySQL database at address 192168

62