Skip to content

Commit 34f4932

Browse files
authored
[12.x] Add AsHtmlString cast (#55071)
* Add AsHtmlString cast * Style
1 parent c3670c2 commit 34f4932

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace Illuminate\Database\Eloquent\Casts;
4+
5+
use Illuminate\Contracts\Database\Eloquent\Castable;
6+
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
7+
use Illuminate\Support\HtmlString;
8+
9+
class AsHtmlString implements Castable
10+
{
11+
/**
12+
* Get the caster class to use when casting from / to this cast target.
13+
*
14+
* @param array $arguments
15+
* @return \Illuminate\Contracts\Database\Eloquent\CastsAttributes<\Illuminate\Support\HtmlString, string|HtmlString>
16+
*/
17+
public static function castUsing(array $arguments)
18+
{
19+
return new class implements CastsAttributes
20+
{
21+
public function get($model, $key, $value, $attributes)
22+
{
23+
return isset($value) ? new HtmlString($value) : null;
24+
}
25+
26+
public function set($model, $key, $value, $attributes)
27+
{
28+
return isset($value) ? (string) $value : null;
29+
}
30+
};
31+
}
32+
}

tests/Database/DatabaseEloquentModelTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Illuminate\Database\Eloquent\Casts\AsEncryptedCollection;
2727
use Illuminate\Database\Eloquent\Casts\AsEnumArrayObject;
2828
use Illuminate\Database\Eloquent\Casts\AsEnumCollection;
29+
use Illuminate\Database\Eloquent\Casts\AsHtmlString;
2930
use Illuminate\Database\Eloquent\Casts\AsStringable;
3031
use Illuminate\Database\Eloquent\Casts\Attribute;
3132
use Illuminate\Database\Eloquent\Collection;
@@ -45,6 +46,7 @@
4546
use Illuminate\Support\Carbon;
4647
use Illuminate\Support\Collection as BaseCollection;
4748
use Illuminate\Support\Facades\Crypt;
49+
use Illuminate\Support\HtmlString;
4850
use Illuminate\Support\InteractsWithTime;
4951
use Illuminate\Support\Stringable;
5052
use InvalidArgumentException;
@@ -264,6 +266,24 @@ public function testDirtyOnCastedStringable()
264266
$this->assertTrue($model->isDirty('asStringableAttribute'));
265267
}
266268

269+
public function testDirtyOnCastedHtmlString()
270+
{
271+
$model = new EloquentModelCastingStub;
272+
$model->setRawAttributes([
273+
'asHtmlStringAttribute' => '<div>foo bar</div>',
274+
]);
275+
$model->syncOriginal();
276+
277+
$this->assertInstanceOf(HtmlString::class, $model->asHtmlStringAttribute);
278+
$this->assertFalse($model->isDirty('asHtmlStringAttribute'));
279+
280+
$model->asHtmlStringAttribute = new HtmlString('<div>foo bar</div>');
281+
$this->assertFalse($model->isDirty('asHtmlStringAttribute'));
282+
283+
$model->asHtmlStringAttribute = new Stringable('<div>foo baz</div>');
284+
$this->assertTrue($model->isDirty('asHtmlStringAttribute'));
285+
}
286+
267287
// public function testDirtyOnCastedEncryptedCollection()
268288
// {
269289
// $this->encrypter = m::mock(Encrypter::class);
@@ -3670,6 +3690,7 @@ protected function casts(): array
36703690
'datetimeAttribute' => 'datetime',
36713691
'asarrayobjectAttribute' => AsArrayObject::class,
36723692
'asStringableAttribute' => AsStringable::class,
3693+
'asHtmlStringAttribute' => AsHtmlString::class,
36733694
'asCustomCollectionAttribute' => AsCollection::using(CustomCollection::class),
36743695
'asEncryptedArrayObjectAttribute' => AsEncryptedArrayObject::class,
36753696
'asEncryptedCustomCollectionAttribute' => AsEncryptedCollection::using(CustomCollection::class),

0 commit comments

Comments
 (0)