Skip to content

Commit 341c0ab

Browse files
pataarbarryvdhlaravel-ide-helper
authored
feat: add support for AsCollection and AsArrayObject casts (#1393)
* feat: add support for AsCollection and AsArrayObject casts * update changelog * improve tests * remove change * composer fix-style * snapshot --------- Co-authored-by: Barry vd. Heuvel <[email protected]> Co-authored-by: laravel-ide-helper <[email protected]>
1 parent cee441c commit 341c0ab

File tree

6 files changed

+162
-0
lines changed

6 files changed

+162
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file.
1616
- Add support for real-time facades in the helper file. [#1455 / filipac](https://github.com/barryvdh/laravel-ide-helper/pull/1455)
1717
- Add support for relations with composite keys. [#1479 / calebdw](https://github.com/barryvdh/laravel-ide-helper/pull/1479)
1818
- Add support for attribute accessors with no backing field or type hinting [#1411 / pindab0ter](https://github.com/barryvdh/laravel-ide-helper/pull/1411).
19+
- Add support for AsCollection and AsArrayObject casts [#1393 / pataar](https://github.com/barryvdh/laravel-ide-helper/pull/1393)
1920

2021
2024-02-05, 2.14.0
2122
------------------

src/Console/ModelsCommand.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
use Illuminate\Contracts\Database\Eloquent\Castable;
2424
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
2525
use Illuminate\Contracts\Database\Eloquent\CastsInboundAttributes;
26+
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
27+
use Illuminate\Database\Eloquent\Casts\AsCollection;
2628
use Illuminate\Database\Eloquent\Casts\Attribute;
2729
use Illuminate\Database\Eloquent\Factories\Factory;
2830
use Illuminate\Database\Eloquent\Model;
@@ -419,9 +421,13 @@ public function castPropertiesType($model)
419421
case 'immutable_datetime':
420422
$realType = '\Carbon\CarbonImmutable';
421423
break;
424+
case AsCollection::class:
422425
case 'collection':
423426
$realType = '\Illuminate\Support\Collection';
424427
break;
428+
case AsArrayObject::class:
429+
$realType = '\ArrayObject';
430+
break;
425431
default:
426432
// In case of an optional custom cast parameter , only evaluate
427433
// the `$type` until the `:`
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
6+
7+
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
8+
use Illuminate\Database\Eloquent\Casts\AsCollection;
9+
use Illuminate\Database\Eloquent\Model;
10+
11+
class AdvancedCast extends Model
12+
{
13+
protected $casts = [
14+
'cast_to_date_serialization' => 'date:Y-m-d',
15+
'cast_to_datetime_serialization' => 'datetime:Y-m-d H:i:s',
16+
'cast_to_custom_datetime' => 'custom_datetime:Y-m-d H:i:s',
17+
'cast_to_immutable_date' => 'immutable_date',
18+
'cast_to_immutable_custom_datetime' => 'immutable_custom_datetime:Y-m-d H:i:s',
19+
'cast_to_immutable_datetime' => 'immutable_datetime',
20+
'cast_to_timestamp' => 'timestamp',
21+
'cast_to_encrypted' => 'encrypted',
22+
'cast_to_encrypted_array' => 'encrypted:array',
23+
'cast_to_encrypted_collection' => 'encrypted:collection',
24+
'cast_to_encrypted_json' => 'encrypted:json',
25+
'cast_to_encrypted_object' => 'encrypted:object',
26+
'cast_to_as_collection' => AsCollection::class,
27+
'cast_to_as_array_object' => AsArrayObject::class,
28+
];
29+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts;
6+
7+
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
8+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
9+
use Illuminate\Foundation\Application;
10+
11+
class Test extends AbstractModelsCommand
12+
{
13+
public function test(): void
14+
{
15+
if (!version_compare(Application::VERSION, '8.28', '>=')) {
16+
$this->markTestSkipped(
17+
'This test only works in Laravel >= 8.28'
18+
);
19+
}
20+
21+
$command = $this->app->make(ModelsCommand::class);
22+
23+
$tester = $this->runCommand($command, [
24+
'--write' => true,
25+
]);
26+
27+
$this->assertSame(0, $tester->getStatusCode());
28+
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
29+
$this->assertMatchesMockedSnapshot();
30+
}
31+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
6+
7+
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
8+
use Illuminate\Database\Eloquent\Casts\AsCollection;
9+
use Illuminate\Database\Eloquent\Model;
10+
11+
/**
12+
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models\AdvancedCast
13+
*
14+
* @property \Illuminate\Support\Carbon $cast_to_date_serialization
15+
* @property \Illuminate\Support\Carbon $cast_to_datetime_serialization
16+
* @property \Illuminate\Support\Carbon $cast_to_custom_datetime
17+
* @property \Carbon\CarbonImmutable $cast_to_immutable_date
18+
* @property \Carbon\CarbonImmutable $cast_to_immutable_custom_datetime
19+
* @property \Carbon\CarbonImmutable $cast_to_immutable_datetime
20+
* @property integer $cast_to_timestamp
21+
* @property mixed $cast_to_encrypted
22+
* @property array $cast_to_encrypted_array
23+
* @property \Illuminate\Support\Collection $cast_to_encrypted_collection
24+
* @property array $cast_to_encrypted_json
25+
* @property object $cast_to_encrypted_object
26+
* @property \Illuminate\Support\Collection $cast_to_as_collection
27+
* @property \ArrayObject $cast_to_as_array_object
28+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast newModelQuery()
29+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast newQuery()
30+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast query()
31+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToAsArrayObject($value)
32+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToAsCollection($value)
33+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToCustomDatetime($value)
34+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToDateSerialization($value)
35+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToDatetimeSerialization($value)
36+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToEncrypted($value)
37+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToEncryptedArray($value)
38+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToEncryptedCollection($value)
39+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToEncryptedJson($value)
40+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToEncryptedObject($value)
41+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToImmutableCustomDatetime($value)
42+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToImmutableDate($value)
43+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToImmutableDatetime($value)
44+
* @method static \Illuminate\Database\Eloquent\Builder|AdvancedCast whereCastToTimestamp($value)
45+
* @mixin \Eloquent
46+
*/
47+
class AdvancedCast extends Model
48+
{
49+
protected $casts = [
50+
'cast_to_date_serialization' => 'date:Y-m-d',
51+
'cast_to_datetime_serialization' => 'datetime:Y-m-d H:i:s',
52+
'cast_to_custom_datetime' => 'custom_datetime:Y-m-d H:i:s',
53+
'cast_to_immutable_date' => 'immutable_date',
54+
'cast_to_immutable_custom_datetime' => 'immutable_custom_datetime:Y-m-d H:i:s',
55+
'cast_to_immutable_datetime' => 'immutable_datetime',
56+
'cast_to_timestamp' => 'timestamp',
57+
'cast_to_encrypted' => 'encrypted',
58+
'cast_to_encrypted_array' => 'encrypted:array',
59+
'cast_to_encrypted_collection' => 'encrypted:collection',
60+
'cast_to_encrypted_json' => 'encrypted:json',
61+
'cast_to_encrypted_object' => 'encrypted:object',
62+
'cast_to_as_collection' => AsCollection::class,
63+
'cast_to_as_array_object' => AsArrayObject::class,
64+
];
65+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Illuminate\Database\Migrations\Migration;
6+
use Illuminate\Database\Schema\Blueprint;
7+
use Illuminate\Support\Facades\Schema;
8+
9+
class AdvancedCastsTable extends Migration
10+
{
11+
public function up(): void
12+
{
13+
Schema::create('advanced_casts', static function (Blueprint $table) {
14+
$table->string('cast_to_date_serialization');
15+
$table->string('cast_to_datetime_serialization');
16+
$table->string('cast_to_custom_datetime');
17+
$table->string('cast_to_immutable_date');
18+
$table->string('cast_to_immutable_custom_datetime');
19+
$table->string('cast_to_immutable_datetime');
20+
$table->string('cast_to_timestamp');
21+
$table->string('cast_to_encrypted');
22+
$table->string('cast_to_encrypted_array');
23+
$table->string('cast_to_encrypted_collection');
24+
$table->string('cast_to_encrypted_json');
25+
$table->string('cast_to_encrypted_object');
26+
$table->string('cast_to_as_collection');
27+
$table->string('cast_to_as_array_object');
28+
});
29+
}
30+
}

0 commit comments

Comments
 (0)