slo_nik
@slo_nik

Как правильно получить запись по slug?

Добрый вечер.

Помогите, пожалуйста, решить задачу.

Есть сущность Region, также есть embeddable класс Name.

/*
 * @ORM\Entity
 * @ORM\Table(name="location_regions")
 */
class Region
{
    /**
     * @var Id
     * @ORM\Column(type="location_region_id")
     * @ORM\Id
     */
    private Id $id;
    /**
     * @var Name
     * @ORM\Embedded(class="Name", columnPrefix=false)
     */
    private Name $name;

    /....../
   public functon getName(): Name
  {
       return $this->name;
  }

#############################################
/**
 * @ORM\Embeddable()
 */
class Name
{
    /**
     * @var string
     * @ORM\Column(type="string", unique=true)
     */
    private string $name;
    /**
     * @var string
     * @ORM\Column(type="string", unique=true, nullable=true)
     * @Gedmo\Slug(fields={"name"})
     */
    private string $slug;

    public function __construct(string $name)
    {
        Assert::notEmpty($name);
        $this->name = $name;
    }

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

    public function getSlug(): string
    {
        return $this->slug;
    }
}


При создании нового региона slug автоматически записывается в базу.

При попытке перейти к просмотру отдельного региона получаю ошибку.
Unable to guess how to get a Doctrine instance from the request information for parameter "region".


Я понимаю, что doctrine не может понять, какую именно запись ей доставать из базы.

Действие в контроллере

/**
     * @param Region $region
     * @param RegionFetcher $fetcher
     * @return Response
     *
     * @Route("/region/{slug}", name=".show")
     * @ParamConverter("region", options={"mapping": {"slug": "slug"}})
     */
    public function show(Region $region, RegionFetcher $fetcher): Response
    {
        $region = $fetcher->find($region->getId()->getValue());
        return $this->render('app/admin/location/regions/show.html.twig', ['region' => $region]);
    }


Ссылка для перехода с главной страницы

<a href="{{ path('location.regions.show', {'slug': region.slug}) }}">{{ region.name }}</a>


Как правильно в данном случае объяснить doctrine через аннотацию какую именно запись достать из базы?
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
myks92
@myks92
Нашёл решение — пометь вопрос ответом!
public function show(string $slug, RegionFetcher $fetcher): Response
    {
        $region = $fetcher->findOneBy(["name.slug" => $slug]);
        return $this->render('app/admin/location/regions/show.html.twig', ['region' => $region]);
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы