API ПЛАТФОРМА CUSTUM OPERATION Предоставляет значение для аргумента данных - PullRequest
0 голосов
/ 15 октября 2018

Добрый день.Я использую Symfony 4.1.1 и APIPlatorm для создания API.Я пытаюсь создать custum Post Operation для создания пользователя в базе данных с зашифрованным паролем.

Я следовал процедуре, описанной в https://api -platform.com / docs / core / operations Но я должен выполнить следующую ошибку:

Контроллер \ "App \ Controller \ UtilisateurSpecial \" требует, чтобы вы указали значение для аргумента \ "$ data \".Либо аргумент имеет значение NULL, и значение NULL не было предоставлено, значение по умолчанию не было предоставлено, либо после этого есть необязательный аргумент.

Это моя конфигурация.Не могли бы вы помочь мне решить эту проблему?

src \ Entity \ Utilisateur.php

 <?php

   namespace App\Entity;

   use ApiPlatform\Core\Annotation\ApiResource;
   use Doctrine\ORM\Mapping as ORM;
   use Symfony\Component\Security\Core\User\UserInterface;
   use Symfony\Component\Validator\Constraints as Assert;
   use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

   /**
    * @ApiResource(
    *     collectionOperations={
    *     "post",
    *     "special"={
    *         "method"="POST",
    *         "path"="/utilisateurs/special.{_format}",
    *          "requirements"={
    *              "_format": "\s+"
    *           },
    *         "controller"=App\Controller\UtilisateurSpecial::class,
    *         "defaults"={"_api_receive"=false}
    *     }
    * })
    * @ORM\Entity(repositoryClass="App\Repository\UtilisateurRepository")
    * @UniqueEntity(fields="email", message="Cet email est déjà enregistré en base.")
    * @UniqueEntity(fields="username", message="Cet identifiant est déjà enregistré en base")
    * 
    */
   class Utilisateur implements UserInterface, \Serializable
   {
       /**
        * @ORM\Column(type="integer")
        * @ORM\Id
        * @ORM\GeneratedValue(strategy="AUTO")
        */
       private $id;

       /**
        * @ORM\Column(type="string", length=25, unique=true)
        * @Assert\NotBlank()
        * @Assert\Length(max=25)
        */
       private $username;

       /**
        * @ORM\Column(type="string")
        */
       private $password;

       /**
        * @ORM\Column(type="string", length=60, unique=true)
        * @Assert\NotBlank()
        * @Assert\Length(max=60)
        * @Assert\Email()
        */
       private $email;

       /**
        * @ORM\Column(name="is_active", type="boolean")
        */
       private $isActive;

        /**
        * @var array
        * @ORM\Column(type="array")
        */
       private $roles;

       public function __construct()
       {
           $this->isActive = true;
           $this->roles = ['ROLE_USER'];
       }

       /*
        * Get id
        */
       public function getId()
       {
           return $this->id;
       }

       public function getUsername()
       {
           return $this->username;
       }

       public function setUsername($username)
       {
           $this->username = $username;
           return $this;
       }


       public function getPassword()
       {
           return $this->password;
       }

       public function setPassword($password)
       {
           $this->password = $password;
           return $this;
       }

       /*
        * Get email
        */
       public function getEmail()
       {
           return $this->email;
       }

       /*
        * Set email
        */
       public function setEmail($email)
       {
           $this->email = $email;
           return $this;
       }

       /*
        * Get isActive
        */
       public function getIsActive()
       {
           return $this->isActive;
       }

       /*
        * Set isActive
        */
       public function setIsActive($isActive)
       {
           $this->isActive = $isActive;
           return $this;
       }

        // modifier la méthode getRoles
        public function getRoles()
        {
            return $this->roles; 
        }

        public function setRoles(array $roles)
        {
            if (!in_array('ROLE_USER', $roles))
            {
                $roles[] = 'ROLE_USER';
            }
            foreach ($roles as $role)
            {
                if(substr($role, 0, 5) !== 'ROLE_') {
                    throw new InvalidArgumentException("Chaque rôle doit commencer par 'ROLE_'");
                }
            }
            $this->roles = $roles;
            return $this;
        }

       public function getSalt()
       {
           // pas besoin de salt puisque nous allons utiliser bcrypt
           // attention si vous utilisez une méthode d'encodage différente !
           // il faudra décommenter les lignes concernant le salt, créer la propriété correspondante, et renvoyer sa valeur dans cette méthode
           return null;
       }

       public function eraseCredentials()
       {
       }

       /** @see \Serializable::serialize() */
       public function serialize()
       {
           return serialize(array(
               $this->id,
               $this->username,
               $this->password,
               $this->isActive,
               // voir remarques sur salt plus haut
               // $this->salt,
           ));
       }

       /** @see \Serializable::unserialize() */
       public function unserialize($serialized)
       {
           list (
               $this->id,
               $this->username,
               $this->password,
               $this->isActive,
               // voir remarques sur salt plus haut
               // $this->salt
           ) = unserialize($serialized);
       }


   }

src / controller / UtilisateurSpecial

<?php
namespace App\Controller;

use App\Entity\Utilisateur;
use App\Service\UtilisateurService;

class UtilisateurSpecial
{
   private $utilisateurService;

   public function __construct(UtilisateurService $utilisateurService)
   {
       $this->utilisateurService = $utilisateurService;
   }

   public function __invoke( $data): Utilisateur
   {
       $this->utilisateurService->addUtilisateur($data->getUsername, $data->getPassword);

       return $data;
   }
}

Можете ли вы помочьмне решить мою проблему?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Давайте посмотрим на ваш конфиг:

  /**
    * @ApiResource(
    *     collectionOperations={
    *     "post",
    *     "special"={
    *         "method"="POST",
    *         "path"="/utilisateurs/special.{_format}",
    *          "requirements"={
    *              "_format": "\s+"
    *           },
    *         "controller"=App\Controller\UtilisateurSpecial::class,
    *         "defaults"={"_api_receive"=false}
    *     }
    * })
    * @ORM\Entity(repositoryClass="App\Repository\UtilisateurRepository")
    * @UniqueEntity(fields="email", message="Cet email est déjà enregistré en base.")
    * @UniqueEntity(fields="username", message="Cet identifiant est déjà enregistré en base")
    * 
    */

По умолчанию API Platform передает ресурс вашей пользовательской операции, в вашем случае объекту класса Utilisateur.Поскольку это операция POST, это будет экземпляр Utilisateur, созданный на основе вашего ввода в теле запроса.

Посмотрите, что в документации API Platform сказано по этому поводу:

Если вы хотитечтобы обойти автоматический поиск объекта, вы можете установить для параметра _api_receive значение false.Таким образом, он пропустит прослушиватели Read, Deserialize и Validate (дополнительную информацию см. В системе событий).

Если вы установите _api_receive = true, API-платформа не сможет передать ничегок вашей пользовательской операции.Вы отключили автоматическую десериализацию.Таким образом, в этом случае вам вообще не нужно иметь аргумент $ data для __invoke ().

Вместо этого вы должны определить свой __invoke () следующим образом:

public function __invoke(Request $request) { 
}

Таким образом, вы получитедоступ к текущему объекту Request для всего, что вам может понадобиться.

0 голосов
/ 15 октября 2018

Если $ data является объектом пользователя ... Вы должны сделать три вещи.

Во-первых, импортировать контроллер класса (использовать) в сущности.

Во-вторых, удалить

"defaults"={"_api_receive"=false}

из аннотации ресурса API в пользовательском объекте.

В-третьих, $ data должно быть:

public function __invoke(User $data): Utilisateur { 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...