I was reviewing some blade view code recently and decided it was too verbose. There were some long output statements that were duplicated throughout the view and that always signals a need to refactor or come up with a better method. So I wanted to share (or at least document) what I came up with here.
First, the issue: fields stored as boolean "0/1" in the database must be output in "Yes/No" format. Plus, if the field is blank (or null), that must be reflected as well. Add to that the uncertainty of whether the production Microsoft Azure database will return a string or integer value for 1 or 0.
This problem necessitates a blade statement like:
Like I said...verbose!
One solution might be to create a Laravel accessor for the boolean field in the model. But that would mean that if I want the actual boolean value, I'd have to add a getOriginal() method to the value to bypass the accessor. While this is okay, it can wreak havoc when other developers are trying to access a property and they don't realize there is an accessor in the model. Also, I'd have to write a separate accessor for every boolean property on every model in my project.
Instead, I created a Parse class in my app/Helpers folder that can perform a number of useful functions for my view. You can view this class here.
Then I added the Parse class to my config/app.php file under 'aliases':
'Parse' => App\Helpers\Parse::class,
First, the issue: fields stored as boolean "0/1" in the database must be output in "Yes/No" format. Plus, if the field is blank (or null), that must be reflected as well. Add to that the uncertainty of whether the production Microsoft Azure database will return a string or integer value for 1 or 0.
This problem necessitates a blade statement like:
{{ $object->property === null || $object->property === "" ? "" : $object->property == 1 ? 'Yes' : 'No' }}
Like I said...verbose!
One solution might be to create a Laravel accessor for the boolean field in the model. But that would mean that if I want the actual boolean value, I'd have to add a getOriginal() method to the value to bypass the accessor. While this is okay, it can wreak havoc when other developers are trying to access a property and they don't realize there is an accessor in the model. Also, I'd have to write a separate accessor for every boolean property on every model in my project.
Instead, I created a Parse class in my app/Helpers folder that can perform a number of useful functions for my view. You can view this class here.
Then I added the Parse class to my config/app.php file under 'aliases':
'Parse' => App\Helpers\Parse::class,
Here's the above statement simplified using the parser helper:
{{ Parse::yesNo($object->property }}
But because sometimes specifications change and form questions are asked in an opposite way from what was originally specified, I made a reverse parser, where a boolean 1 actually means 'No':
{{ Parse::noYes($object->property }}
Additionally, sometimes Yes and No don't cover every usage for a boolean field, so I made it possible to pass in other strings to replace 'Yes' and 'No':
{{ Parse::yesNo($object->property, 'Awesome!', 'Awful') }}
I hope this helps someone else out there looking for cleaner views! 😃
Comments
Post a Comment