【问题标题】:How to cast a property in the DTO class of Spatie\DataTransferObject如何在 Spatie\DataTransferObject 的 DTO 类中强制转换属性
【发布时间】:2021-06-25 17:10:39
【问题描述】:

在 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 的特定领域使用脚轮的正确方法

【问题讨论】:

    标签: php laravel casting data-transfer-objects


    【解决方案1】:

    以自爆的例子为起点 “?”对于 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'),
    
            
        ]);
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      相关资源
      最近更新 更多