Use a Value Object in your Entity Accessors

by | May 24, 2022 | IT Tips | 0 comments

Just looking at Laracasts https://laracasts.com/series/whip-monstrous-code-into-shape/episodes/6 and God Object cleanup and found you can return a Value Object which can have multiple methods in the object with allows you to return different formatting or return a default value if you access it as a property (e.g. $item->code_desc).

Example of using a Value Object in Cakephp 4 Entity

https://book.cakephp.org/4/en/orm/entities.html#accessors-mutators

// Entity class. Note the _getCodeDesc method now returns a value object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
 
declare(strict_types=1);
 
namespace App\Model\Entity;
 
use Cake\ORM\Entity;
use Cake\I18n\Number;
 
class Item extends Entity
{
     
    protected $_virtual = ['code_desc', 'price_as_dollars'];
    protected $_accessible = [
        'active' => true,
        //...
    ];
 
    // cake creates a code_desc property on this entity
    // which is now an object with methods available to do cool stuff :)
    protected function _getCodeDesc()
    {
        return new CodeDescription($this->code, $this->description);
    }
 
    protected function _getPriceAsDollars()
    {
        return Number::format($this->price / 100000, ['places' => 4, 'locale' => 'en_AU']);
    }
}

Class created to allow multiple types of formatting to be available for an entity property

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
// App/Model/Entity//CodeDescription.php
 
declare(strict_types=1);
 
namespace App\Model\Entity;
 
class CodeDescription
{
    // auto promotion!!!
    public function __construct(private ?string $code, private ?string $description)
    {
    }
 
    public function asEntered()
    {
        return $this->code . ' - ' . $this->description;
    }
 
    public function toUpper()
    {
        return strtoupper($this->asEntered());
    }
 
    public function __toString()
    {
        return $this->toUpper();
    }
}

Examples showing calling the Value Object methods in a view class.

In a view. Get the default value which calls the __toString() method which returns code description in upper case.

1
2
3
4
5
6
<div class="row">
    <div class="col">
        <h3><?= h($item->code_desc) ?></h3>
        <!-- or this way is the same --> <!-- <h3><?= h($item->codeDesc->toUpper()) ?></h3> -->
    </div>
</div>

Or to get it without upper case just as entered

1
2
3
4
5
<div class="row">
    <div class="col">
        <h3><?= h($item->code_desc->asEntered()) ?></h3>
    </div>
</div>

0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.