Задать вопрос
@pv-klochkov

Как работать с slug в Symfony?

Здравствуйте!

Никак не получается настроить роутер через {slug}

Всё делал по книге

Пока вместо слагов стоял Id всё работало как надо.

Поставил {slug} Symfony предъявил мне в show:

Cannot autowire argument $page of "App\Controller\PageController::show()": it needs an instance of "App\Entity\Page" but this type has been excluded in "config/services.yaml".

В services.yaml вставил

App\Entity\Page:
autowire: true

Теперь show стал показывать пустоту или точнее светлоголубую пустоту.

Вставил дамп и
App\Entity\Page {#762 ▼
  -id: null
  -title: null
  -slug: null
  -description: null
  -cover: null
  -body: null
  -createdAt: null
}


Как я понимаю не находит он страницу по слагам этим по id находит, а по слагам нет.
Как заставить ума не приложу.

Контроллер:
namespace App\Controller;

use App\Entity\Page;
use App\Repository\PageRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class PageController extends AbstractController
{
    #[Route('/', name: 'homepage')]
    public function index(PageRepository $pageRepository): Response
    {
        return $this->render('page/index.html.twig', [
            'pages' => $pageRepository->findAll(),
        ]);
    }

    #[Route('/{slug}', name: 'show-page')]
    public function show(Request $request, Page $page): Response
    {
        return $this->render('/page/show.html.twig', [
            'slug' => $page->getSlug(),
            'page' => $page,
        ]);
    }
}


Index.twig:
{% extends 'base.html.twig' %}

{% block title %}Hello PageController!{% endblock %}

{% block body %}
<style>
    .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
    .example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
</style>

<div class="example-wrapper">

    This friendly message is coming from:
    <ul>
        <li>Your controller at <code>/home/pv/www/lantico.site/src/Controller/PageController.php</code></li>
        <li>Your template at <code>/home/pv/www/lantico.site/templates/page/index.html.twig</code></li>
    </ul>

    {% for page in pages %}
        <h4>{{ page.title }}</h4>
        <p>
            <a href="{{ path('show-page', {slug: page.slug}) }}">{{ page }}</a>
        </p>
    {% endfor %}
</div>
{% endblock %}


show.twig.html

{% extends 'base.html.twig' %}

{% block title %}
  {{ page.title }}
{% endblock %}

{% block body %}
  <h2>{{ page.body }} </h2>
  {{ dump(page) }}
{% endblock %}
  • Вопрос задан
  • 406 просмотров
Подписаться 2 Простой 10 комментариев
Решения вопроса 1
В services.yaml вставил

App\Entity\Page:
autowire: true

1. Уберите это.

2. Используйте атрибут MapEntity, чтобы явно указать, на какое поле мапить параметр 'slug'

<?php

namespace App\Controller;

use App\Entity\Page;
use App\Repository\PageRepository;
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class PageController extends AbstractController
{
    // ...

    #[Route('/{slug}', name: 'show-page')]
    public function show(
        #[MapEntity(mapping: ['slug' => 'slug'])] Page $page
    ): Response
    {
        return $this->render('/page/show.html.twig', [
            'slug' => $page->getSlug(),
            'page' => $page,
        ]);
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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