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