Symfony 4, find () объект

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

Но когда я вызываю метод setProduit () (из сущности Paniers), Phpstorm говорит: «Ожидаемое приложение \ 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;
  }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
4 213
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

Ответ принят как подходящий

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

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

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

Ну да, я использую это, когда мне нужен собственный метод из моего репозитория, возможно, мне стоит использовать его каждый раз. То же самое с $ lignePanier, так?

Ruskof 09.12.2018 13:45

Есть разные способы решения этой конкретной проблемы :) Денис В. упомянул один из них, я просто хотел добавить еще один. Конечно, для каждой сущности, которую вы хотите использовать, вы можете ввести соответствующий репозиторий в метод контроллера. Таким образом, phpstorm всегда будет знать, какой тип имеет возвращаемый объект. Не забудьте указать собственные методы репозитория - если вы их создадите.

Basti 09.12.2018 14:08

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

Не вводите $ id, вам нужно только ввести свой объект: https://symfony.com/doc/current/best_practices/controllers.html#using-the-paramconverter

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

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

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

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

1) Спасибо за это 2-3) Мой учитель прислал мне образцы с $ doctrine / $ twig, поэтому я начал с плохих привычек, но на самом деле это уже на моем пути 4) У меня есть старые формы (полный php), но я изменю это в следующем часов, так что приятно знать

Ruskof 09.12.2018 16:20

Другие вопросы по теме