鉴于我已经通过外部服务检索了几行作为数组。在基于 Symfony2 和 Doctrine 构建的 PHP 应用程序中。
我如何继续将数据映射到模型,以便我可以使用所有现有的业务逻辑?
*注意:*我不想自己对私有领域进行反思,也不想改变模型。
我尝试研究学说的内部结构,但很多内容似乎与查询逻辑紧密结合。我知道我可以实现一个工厂方法来在我的数据集上实例化模型,但感觉我的供应商文件夹中已经有所有类等待使用。
在 Symfony 中,您有 Serializer 组件。
您可以使用composer将其安装为独立组件:
composer require symfony/serializer
$person = new \App\Entity\Person();
$person->setName('foo');
$person->setAge(99);
$person->setSportsman(false);
$jsonContent = $serializer->serialize($person, 'json');
// $jsonContent contains {"name":"foo","age":99,"sportsman":false}
echo $jsonContent; // or return it in a Response
$person = $serializer->deserialize($jsonContent, \App\Entity\Person::class, 'json');
看看多功能对象映射器。只需向模型添加属性即可完全满足您的需要。它使用私有属性,与 symfony 序列化器不同,源数据的结构不需要与您的模型匹配。模型可以是 Doctrine 实体或任何其他类。
composer require zolex/vom
这是具有属性的模型示例。
use Zolex\VOM\Mapping as VOM;
#[VOM\Model]
class MyClass
{
#[VOM\Property]
public string $onTheRoot;
#[VOM\Property(accessor: 'deeper.inThe.structure')]
public string $fromTheDeep;
}
在模型中输入数据:
$data = [
'onTheRoot' => 'I live on the root',
'deeper' [
'inThe' => [
'structure' => 'I live somewhere deeper in the data structure'
]
]
];
$vom->denormalize($data, MyClass::class);