Как правильно передать не службы в конструктор кастом нормализовать в Symfony - PullRequest
1 голос
/ 28 июня 2019

Я создаю свой собственный Normalizer на основе учебника на странице документации Symfony https://symfony.com/doc/current/serializer/custom_normalizer.html,, который я нахожу неполным, потому что он говорит вам, как его создать, но не применять, это первое точка.

Затем, основываясь на моем небольшом опыте в Symfony, я пытаюсь угадать, как передать данные в normalizer, чтобы быть правильными вычислениями, данные, которые я пытаюсь передать, не services, что может быть String or a Request object, но ни одна из этих данных не позволяет мне, на самом деле мне нужно понять или мне нужно провести рефакторинг, чтобы получить то, что я хочу?

Я поместил свой код normalizer, чтобы хорошо понять, что я ищу.

ЭН:

<?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;
  }

}

Применение нормализатора: Передача динамической переменной $ rangeDate из объекта Request.

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

и это ошибка, которую я получаю:

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

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Зачем вам передавать дату диапазона в качестве аргумента конструктора?

Нормализатор - это зависимость службы, rangeDate - это динамическое значение.

Вместо этого вы можете передать ее в качестве аргумента для метода normalizeлибо в качестве нового аргумента, либо в массиве контекста:

$rangeDate  = $request->request->get('range','all');
$serializer = new Serializer([new TaskNormalizer($normalizer)]);
$data       = $serializer->normalize($attendances, null, ['attributes' => $attributes, 'rangeDate' => $rangeDate]);
0 голосов
/ 28 июня 2019

Вы будете явно декларировать свой сервис ... что-то вроде этого должно сработать:

## 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;
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...