Symfony 4, найти () объект - PullRequest
       18

Symfony 4, найти () объект

0 голосов
/ 09 декабря 2018

Благодаря документу Symfony https://symfony.com/doc/current/doctrine.html#updating-an-object, я могу использовать методы get / set из моей сущности под названием 'Produit'.

Но когда я вызываю метод setProduit () (из сущности Paniers) Phpstorm говорит «ожидаемый App \ Entity \ Paniers, получил объект» для $ produitSelected.

Я не знаю, почему phpstorm говорит это, потому что я могу использовать методы, в чем проблема?find () возвращает объект-сущность, верно?

class PaniersController extends AbstractController
{

    /**
    * @Route("/paniers/add/{id}", name="paniers.add")
    */
    public function addPanier(Request $request, Environment $twig, RegistryInterface $doctrine, $id)
    {
        $produitSelected = $doctrine->getRepository(Produit::class)->find($id);
        if (!$produitSelected) {
            throw $this->createNotFoundException(
                'Pas de produit trouvé pour l\' id : '.$id
            );
        }
        $lignePanier=$doctrine->getRepository(Paniers::class)->findOneBy(['produit' => $produitSelected, 'user' =>$this->getUser()]);
        if($produitSelected->getStock()>0){
            if ($lignePanier){
                $quantite =$lignePanier->getQuantite();
                $lignePanier->setQuantite($quantite+1);
            } else {
                $lignePanier = new Paniers();
                $lignePanier->setUser($this->getUser())
                ->setDateAjoutPanier(new \DateTime(date('Y-m-d')))
                ->setQuantite(1)
                ->setProduit($produitSelected);
            }
            $doctrine->getManager()->persist($lignePanier);
            $produitSelected->setStock($produitSelected->getStock()-1);
            $doctrine->getManager()->persist($produitSelected);
            $doctrine->getManager()->flush();
        }
    }
}

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\PaniersRepository")
 * @ORM\Table(name="paniers")
 */
class Paniers
{

//...

   /**
   * @ORM\ManyToOne(targetEntity="Produit")
   * @ORM\JoinColumn(name="produit_id", referencedColumnName="id")
   */
  private $produit;

     public function getProduit(): ?Produit
  {
      return $this->produit;
  }

  public function setProduit(?Produit $produit): self
  {
      $this->produit = $produit;
      return $this;
  }
}

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

В дополнение к правильному ответу Дениса V я хочу добавить, что вы также можете изменить свой контроллер следующим образом:

public function addPanier(Request $request, Environment $twig, RegistryInterface $doctrine,ProduitRepository $produitRepository, $id)
        {
            $produitSelected = $produitRepostiory->find($id);
            //rest of the code
       }

Таким образом, phpstorm также знает тип возвращаемого объекта, так как каждый возвращаемый объектТип подсказал в соответствующем репозитории.

0 голосов
/ 09 декабря 2018

Сначала вам нужно исправить код:

Не вводите $ id, вам нужно всего лишь напечатать вашу сущность: https://symfony.com/doc/current/best_practices/controllers.html#using-the-paramconverter

Не вводите доктрину $, используйте $em = $this->getDoctrine()->getManager();

Не вводите $ twig, используйте return $this->render('...template', []);

Используйте английский, это всегда правило.Вам могут помочь не только другие люди, но и потому, что Symfony понимает это, и вам понадобится это, когда вы начнете использовать коллекции форм: https://symfony.com/doc/current/form/form_collections.html

Внедрите репозиторий, и вам будет проще выполнять автозаполнение и обнаруживать ошибки.Используйте команду `` `make: entity``, и вы увидите, что я думаю, трудно объяснить.

0 голосов
/ 09 декабря 2018

PhpStorm, очевидно, не настолько умен, чтобы понимать, что фактический тип возвращаемого значения find($id) в этом случае будет Produit.Но вы можете помочь:

/** @var Produit $produitSelected */
$produitSelected = $doctrine->getRepository(Produit::class)->find($id);

Чтобы заставить его работать, вы должны либо использовать Produit с полным пространством имен, либо добавить пространство имен непосредственно в подсказку типа.

Конечно, это нене гарантирует, что фактический тип будет Produit.Поэтому, если вы допустите ошибку, PhpStorm сообщит неверный тип.

...