I would like to create a standard JsonModel format. Furthermore, I think I will implement a trait and use it in a controller. However, I couldn’t find a way to using trait in Laminas. How do you solve the issues? Should I use trait or have another way better?
Well, there is a huge discussion about traits in PHP anyway. It seems that most developers tend to avoid traits for a good reason. If you 're interested in this discussion, have a look at this discussion on twitter: https://twitter.com/medunes/status/1351563554340696070.
Anyway, you can use Traits in Laminas at any time. Here 's a short example using the JsonSerializable
interface and the method jsonSerialize
as a trait.
<?php
declare(strict_types=1);
namespace Application\Entity\Trait;
trait JsonTrait
{
public function jsonSerialize()
{
$data = get_object_vars($this);
return json_encode($data);
}
}
As you can see this is a simple trait for JSON encoding object properties. You must use the normal namespacing rules for the PSR-4 autoloading in laminas. Once created a trait, you can use it like all other stuff in laminas.
<?php
declare(strict_types=1);
namespace Application\Entity;
use Application\Entity\Trait\JsonTrait;
use JsonSerializable;
class MyNameEntity implements JsonSerializable
{
use JsonTrait;
protected string $name = '';
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
}
As you can see this is a simple value object containing the a name property and implementing the JsonSerializable
interface. Beside that we 're using our JsonTrait
. Just implement it by using the standard use
statement before listing the class properties.
Let 's use this …
$entity = new Application\Entity\MyNameEntity();
$entity->setName('Marcel');
$json = json_encode($entity);
The above shown example ends up with …
{"name":"Marcel"}
This example demonstrate the basic usage of traits. If you use traits you should decide on your own.
You can use Laminas\View\Model\JsonModel
in your controller. Internally, the model uses laminas-json which supports the JsonSerializable
interface and the methods toJson
and toArray
of your objects.
In the quick start of laminas-view you will find an example: