Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何为反序列化添加字段别名映射_Php_Symfony_Deserialization - Fatal编程技术网

Php 如何为反序列化添加字段别名映射

Php 如何为反序列化添加字段别名映射,php,symfony,deserialization,Php,Symfony,Deserialization,我不熟悉对象的序列化,在尝试找出如何/在何处插入对象字段和CSV标题之间的映射时遇到了困难 我目前正在创建一个CSV上传表单,并尝试使用CSVEncoder将CSV行反序列化为一个对象数组 现在,当头是完美的时候,这就可以工作了,但是我希望在CSVEncoder中添加某种头映射,以将头映射到字段 范例 class Person { public $name; public $age; public $email; } 下面这样的CSV标题将完美地映射行 'name,ag

我不熟悉对象的序列化,在尝试找出如何/在何处插入对象字段和CSV标题之间的映射时遇到了困难

我目前正在创建一个CSV上传表单,并尝试使用CSVEncoder将CSV行反序列化为一个对象数组

现在,当头是完美的时候,这就可以工作了,但是我希望在CSVEncoder中添加某种头映射,以将头映射到字段

范例

class Person
{
    public $name;
    public $age;
    public $email;
}
下面这样的CSV标题将完美地映射行

'name,age,email'
但是我想添加一些映射,以允许像这样的头也映射到适当的字段

'full name,aged,email address'
参考资料:

也许我的谷歌搜索技能不太好,因为我认为这在尝试反序列化CSV时会很常见

我确实有一个非序列化版本,可以读取文件并将行转换为对象,但速度非常慢,我希望通过“正确”操作来改进代码(以及我的技能)

在另一个版本中,我读取了标题行,将其与映射正确标题的关联数组和可接受别名数组进行比较,然后用正确的标题重写标题

在将文件传递给CSVEncoder之前,我可以再次执行此操作,但我想知道是否有更好的方式来执行此操作


干杯

您应该使用名称转换器,请选中此项

因此,您的名称转换器可能如下所示:

use Symfony\Component\Serializer\NameConverter\NameConverterInterface;

class MappingNameConverter implements NameConverterInterface {
    public function __construct(array $mapping) {
        $this->mapping = $mapping;
    }

    public function denormalize($propertyName)
    {
        return $this->mapping[$propertyName];
    }
}
use Symfony\Component\Serializer\Encoder\CsvEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;

$mapping = ['full name' => 'name', 'aged' => 'age', ...];
$nameConverter = new MappingNameConverter($mapping);
$normalizer = new ObjectNormalizer(null, $nameConverter);

$serializer = new Serializer([$normalizer], [new CsvEncoder()]);
你应该这样使用它:

use Symfony\Component\Serializer\NameConverter\NameConverterInterface;

class MappingNameConverter implements NameConverterInterface {
    public function __construct(array $mapping) {
        $this->mapping = $mapping;
    }

    public function denormalize($propertyName)
    {
        return $this->mapping[$propertyName];
    }
}
use Symfony\Component\Serializer\Encoder\CsvEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;

$mapping = ['full name' => 'name', 'aged' => 'age', ...];
$nameConverter = new MappingNameConverter($mapping);
$normalizer = new ObjectNormalizer(null, $nameConverter);

$serializer = new Serializer([$normalizer], [new CsvEncoder()]);

我没有测试代码,但是类似的东西应该可以工作:)

谢谢!我确实读过,但我完全误解了。我以为这只是在值中添加“org_”,而不是在键中添加。只是一些解释这个概念的代码行。干得好,文森特。非常感谢。我不知道为什么Symfony文档有时会如此氪色。