1
resposta

Erro ao passar entidade como parâmatro

Estou com o seguinte erro

App\Controller\SeasonsController::index(): Argument #1 ($series) must be of type App\Entity\Series, string given, called in C:\projetos\alura\controle_series_symfony\vendor\symfony\http-kernel\HttpKernel.php on line 163

sempre que eu passo a serie como parâmetro para alguma função


     #[Route('/series/{series}/seasons', name: 'app_seasons')]
    
    public function index(Series $series): Response
    {
     
     segue o meu mapeamento
     
     <?php

namespace App\Entity;

use App\Repository\SeriesRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

#[ORM\Entity(repositoryClass: SeriesRepository::class)]
class Series
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\OneToMany(targetEntity: Season::class,
                     mappedBy: 'series', 
                     orphanRemoval: true,
                     cascade: ['persist']
                     )]
    private Collection $seasons;

   

    public function __construct(#[ORM\Column(type:"string", length:255)]
    #[Assert\NotBlank]
    #[Assert\Length(min: 5)]
    private string $name = '')
    {
        $this->seasons = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;
        return $this;
    }

    /**
     * @return Collection<int, Season>
     */
    public function getSeasons(): Collection
    {
        return $this->seasons;
    }

    public function addSeason(Season $season): static
    {
        if (!$this->seasons->contains($season)) {
            $this->seasons->add($season);
            $season->setSeries($this);
        }

        return $this;
    }

    public function removeSeason(Season $season): static
    {
        if ($this->seasons->removeElement($season)) {
            // set the owning side to null (unless already changed)
            if ($season->getSeries() === $this) {
                $season->setSeries(null);
            }
        }

        return $this;
    }
}

segue uma classe de exemplo

<?php

namespace App\Controller;

use App\Entity\Series;
use App\Repository\SeasonRepository;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Cache\CacheItemInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Cache\CacheInterface;

class SeasonsController extends AbstractController
{
    private $seasonRepository;
    public function __construct(private CacheInterface $cache, private SeasonRepository $repository)
    {
    }

    #[Route('/series/{series}/seasons', name: 'app_seasons')]
    
    public function index(Series $series): Response
    {
        
       /* $seasons = $this->cache->get("series_{$seriesId}_seasons", 
                 function(CacheItemInterface $item){
                    $item->expiresAfter(new \DateInterval('PT10S'));
                    
                 });

                 dd($seasons);

        $seasons = $this->repository->findBy([
            'series' => $seriesId
        ]);
        

        return $this->render('seasons/index.html.twig', [
            'seasons' => $seasons,
        ]);*/

        return new Response('');
    }

    /*public function index(int $seriesId): Response
    {
        
        $seasons = $this->cache->get("series_{$seriesId}_seasons", 
                 function(CacheItemInterface $item){
                    $item->expiresAfter(new \DateInterval('PT10S'));
                    
                 });

                 dd($seasons);

        $seasons = $this->repository->findBy([
            'series' => $seriesId
        ]);
        

        return $this->render('seasons/index.html.twig', [
            'seasons' => $seasons,
        ]);
    }*/

}

aparentemente não encontra essa entidade

1 resposta

Olá Adriano! Tudo bem?

Pelo erro que você mencionou, parece que o Symfony está esperando receber um objeto da classe App\Entity\Series, mas está recebendo uma string.

Isso geralmente acontece quando o Symfony não consegue converter o parâmetro da URL para o objeto da entidade correspondente. Isso pode ser causado por não configurar corretamente o parâmetro para converter usando o ParamConverter ou problemas relacionados ao roteamento que não passa o objeto esperado.

Uma possível solução é garantir que o Symfony possa fazer essa conversão automaticamente. Isso é geralmente gerenciado pelo Doctrine param converter que faz parte do SensioFrameworkExtraBundle. Você precisa ter certeza de que este bundle está ativo e configurado corretamente.

Aqui está um exemplo de como você pode verificar e configurar:

  1. Ativar o SensioFrameworkExtraBundle (se ainda não estiver ativado): No arquivo config/bundles.php, certifique-se de que o Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle está listado e ativo.

  2. Usar o ParamConverter: O Symfony usa o ParamConverter para mapear parâmetros de rotas para entidades. Seu código parece estar correto, mas certifique-se de que não há configurações conflitantes ou faltando. Por padrão, o Symfony deveria lidar com isso automaticamente se o SensioFrameworkExtraBundle estiver corretamente configurado.

  3. Verificar a rota e o parâmetro: Certifique-se de que a rota está corretamente definida para passar o objeto Series. O erro pode ocorrer se, por algum motivo, o valor passado na URL não puder ser mapeado para um objeto Series.

  4. Debugging: Use o comando php bin/console debug:router para verificar as rotas atuais e como elas estão configuradas. Isso pode ajudar a identificar se há algum problema com os parâmetros esperados pela rota.

Se após essas verificações o problema persistir, pode ser útil verificar se o valor passado na URL realmente corresponde a um ID válido de uma série no banco de dados, pois se não houver correspondência, o Symfony não será capaz de converter o parâmetro para um objeto Series.

Espero que essas dicas te ajudem a resolver o problema!

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.