schema icon indicating copy to clipboard operation
schema copied to clipboard

Validator from class

Open jtojnar opened this issue 3 years ago • 1 comments

The Expect::from is nice, but it does not really work for immutable objects like the following:

<?php

use Money\Money;

final class InvoiceItem {
	public function __construct(
		public readonly string $name,
		public readonly Money $price,
		public readonly int $amount,
	) {
	}
}
Version without readonly
<?php

use Money\Money;

final class InvoiceItem {
	public function __construct(
		private string $name,
		private Money $price,
		private int $amount,
	) {
	}

	public function getName(): string {
		return $this->name;
	}

	public function getPrice(): Money {
		return $this->price;
	}

	public function getAmount(): int {
		return $this->amount;
	}
}

It would be nice to have Expect::fromClass(InvoiceItem::class), that would check the constructor arguments instead of the public properties like Expect::from does.

I can try to implement this, if you think this is a good idea.

jtojnar avatar Apr 10 '22 07:04 jtojnar

Actually, I am not sure if argument names are considered a part of the public API. But with PHP 8’s support for named parameters, they probably should be anyway.

Edit: Looks like it is indeed the case and some projects are using @no-named-arguments as an annotation to disable that. So I would suggest supporting all classes whose constructor is not annotated with that.

jtojnar avatar Apr 10 '22 08:04 jtojnar