在symfony中将not服务传递给自定义normalize的构造函数的正确方法是什么

在symfony中将not服务传递给自定义normalize的构造函数的正确方法是什么,symfony,symfony4,Symfony,Symfony4,我正在根据Symfony文档页面上的教程创建自己的Normalizer,我发现它不完整,因为它告诉您如何创建它,但不应用它,这是第一点 然后根据我在Symfony方面的一点经验,我试图猜测如何将数据传递到规范化器以进行正确的计算,我试图传递的数据不是服务,它可以是字符串或请求对象,但这些数据都不允许我,我真的需要理解,还是需要重构才能得到我想要的 我把我的规范化器代码放在一起,以便很好地理解我在寻找什么 规范化器: <?php namespace App\Serializer; use

我正在根据
Symfony
文档页面上的教程创建自己的
Normalizer
,我发现它不完整,因为它告诉您如何创建它,但不应用它,这是第一点

然后根据我在
Symfony
方面的一点经验,我试图猜测如何将数据传递到
规范化器
以进行正确的计算,我试图传递的数据不是
服务
,它可以是
字符串或请求对象
,但这些数据都不允许我,我真的需要理解,还是需要重构才能得到我想要的

我把我的
规范化器
代码放在一起,以便很好地理解我在寻找什么

规范化器:

<?php
namespace App\Serializer;

use App\Entity\Task;
use App\Traits\TaskControl;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

class TaskNormalizer implements NormalizerInterface
{

  use TaskControl;

  private $normalizer;
  private $rangeDate;

  public function __construct(ObjectNormalizer $normalizer, $rangeDate )
  {
    $this->normalizer = $normalizer;
    $this->rangeDate  = $rangeDate;
  }


  public function normalize($task, $format = null, array $context = [])
  {
    $data = $this->normalizer->normalize($task, $format, $context);

    dd($this->rangeDate);

    $data['totalWork'] = $this->timeTask($task,$this->rangeDate);

    return $data;
  }

  public function supportsNormalization($task, $format = null, array $context = []): bool
  {
    return $task instanceof Task;
  }

}
这就是我得到的错误:

Cannot autowire service "App\Serializer\TaskNormalizer": argument "$rangeDate" of method "__construct()" has no type-hint, you should configure its value explicitly.

你必须明确地宣布你的服务。。。像这样的事情应该可以做到:

## services.yml
 App\Serializer\TaskNormalizer :
            arguments:
                $normalizer: '@serializer.normalizer.object' ## check the alias ... 
                $rangeDate: '%range_date%'
请记住,为了依赖倒置原则,依赖接口比依赖类更好。因此,您应该考虑将构造函数更改为:

 ## your class
public function __construct(NormalizerInterface $normalizer, $rangeDate )
      {
        $this->normalizer = $normalizer;
        $this->rangeDate  = $rangeDate;
      }

为什么要将范围日期作为构造函数参数传递

Normalizer是一个服务依赖项,rangeDate是一个动态值

您可以将其作为方法normalize的参数传递,而不是作为新参数传递,或在上下文数组中传递:

$rangeDate  = $request->request->get('range','all');
$serializer = new Serializer([new TaskNormalizer($normalizer)]);
$data       = $serializer->normalize($attendances, null, ['attributes' => $attributes, 'rangeDate' => $rangeDate]);

谢谢,但问题是$rangeDate是来自对象请求的动态数据,与使用“%range\u date%”不一样,我没有找到传递$rangeDate=$Request->Request->get('range','all')的方法;为了规范化,我需要计算工作时间并将其序列化。是吗?然后你应该看看他的:当然,但是怎么做呢?我在文档中找不到任何内容。那么,只需从构造函数中删除rangeDate,将其从类属性中删除,删除并将其作为参数添加到normalize方法中(例如,在第三个方法中)。`````````$rangeDate=$request->request->get('range','all')$serializer=新的序列化程序([new TaskNormalizer($normalizer)])$数据=$serializer->normalize($attentations,null,$rangeDate,['attributes'=>$attributes])```谢谢,我终于通过上下文获得了它:
$data=$serializer->normalize($attributes,null,['attributes'=>$attributes,'rangeDate'=>$rangeDate])你通过添加这个来编辑你的答案,我给出了正确的答案?仅供参考,错误来自autowire试图将你的类“编译”到服务中,并且不知道$rangeDate是什么。更新config/services.yaml的exclude部分,跳过该类以消除错误。当然,下面的答案向您展示了设置规范化器的正确方法,它不仅可以消除错误,而且还可以正常工作。而且,由于您似乎正在使用该框架,因此您应该意识到,您真正需要做的就是。不需要真正的“新”一个。@Cerad我最终通过在上下文中传递数据来修复它,我不知道我能做什么,我已经给出了正确的答案。谢谢你提供的信息,我知道你有答案。只是想确保您知道,由于您使用的是框架,所以答案可以稍微细化。只需注入序列化程序,就会自动附加规范化程序。使您不必自己创建对象。
$rangeDate  = $request->request->get('range','all');
$serializer = new Serializer([new TaskNormalizer($normalizer)]);
$data       = $serializer->normalize($attendances, null, ['attributes' => $attributes, 'rangeDate' => $rangeDate]);