首页 > 解决方案 > 如何在 Spatie\DataTransferObject 的 DTO 类中强制转换属性

问题描述

在 laravel 中,我使用 spatie/data-transfer-object 将我的列之一转换为

protected $casts = [
    'details' => ProductDetails::class,    
];

在我的 ProductDetails DTO 中,我还想转换我的两个日期字段

class ProductDetails extends CastableDataTransferObject
{
    use HasDates;

    public int $number

    #[CastWith(ProductDateCaster::class)]
    public int $start_date; //est DD/MM/YY

    #[CastWith(ProductDateCaster::class)]
    public int $end_date;

}

这是我的施法者

class ProductDateCaster implements Caster{
    
  public function cast(mixed $value): string
        {
            $productDetails = new ProductDetails();
            return $productDetails->parseDate($value)->format('d/m/Y');
        }
    }

我的做法不对,施法者正在创建一个 DTO 对象,并向被施法者以外的字段提供 null。谁能建议在 DTO 的特定领域使用脚轮的正确方法

标签: phplaravelcastingdata-transfer-objects

解决方案


以自爆的例子为起点'?' 对于 PHP8 来说是 null 安全的,总是使用它。

class UserDto extends DataTransferObject
{
    public string $email;
    public ?string $password = null;

    public ?int $city_id                      = null;
    public ?array $about                      = ['en'=>'','ar'=>''];


public ?bool $fromAdmin = null;


public function __construct($args)
{
    parent::__construct($args);
}


/**
 * @throws UnknownProperties
 */
public static function userModel(Request $params): Self
{
    return new self([
        'email'     => $params->input('email'),
        'password'  => $params->filled('password') ? bcrypt($params->input('password')) : false,
        'city_id' => $params?->input('city_id'),

        'about'   => [
            'en' => $params?->input('about')['en'] ?? NULL,
            'ar' => $params?->input('about')['ar'] ?? NULL,
        ],

        'fromAdmin' => $params?->input('fromAdmin'),

        
    ]);
}

}


推荐阅读