今回、LaravelにてCSVの1行分を表すクラス(DTO的な)を定義する必要があって、CSVの1行を出力するために、列の出力順をプロパティごとに設定したなぁとおもったので、そのやり方をメモ。
Reference URL:
https://www.doctrine-project.org/projects/doctrine-annotations/en/1.13/index.html
Define Annotation class.
namespace App\Annotations;
/**
* @Annotation
*/
class Order
{
public int $value;
public function __construct(array $values)
{
$this->value = $values['value'];
}
}
Put annotation on the properties.
namespace App\Services\CsvRows;
use App\Annotations\Order;
class MemberPersonalInfoRow
{
/** @Order(1) */
public string $id;
/** @Order(2) */
public string $name;
/** @Order(3) */
public string $phone_number;
/** @Order(4) */
public string $address;
}
Retrieve the annotation by property.
$reflectionClass = new \ReflectionClass(MemberPersonalInfoRow::class);
$annotationReader = app(AnnotationReader::class);
foreach ($reflectionClass->getProperties() as $property) {
$order = $annotationReader->getPropertyAnnotation($property, Order::class);
if (is_null($order)) {
continue;
}
/** @var $order Order */
var_dump(
$property->getName(),
$order->value
);
}