Extra simple gestion de page par slug

This post is available in english

Dans cet article, nous allons créer une entité Page, qui nous permettra de créer des pages publiques qui seront accessibles grâce au slug correspondant.

Image Title

Premièrement nous créons l'entité src/Entity/Page.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\PageRepository")
 */
class Page implements PageInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $slug;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $content;

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

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

    public function setSlug(string $slug): self
    {
        $this->slug = $slug;

        return $this;
    }

    public function getContent(): ?string
    {
        return $this->content;
    }

    public function setContent(?string $content): self
    {
        $this->content = $content;

        return $this;
    }
}

ainsi que son interface

src/Entity/PageInterface.php

<?php

namespace App\Entity;

use Sylius\Component\Resource\Model\ResourceInterface;

interface PageInterface extends ResourceInterface
{
    public function getSlug();
    public function setSlug(string $slug);
    public function getContent();
    public function setContent(?string $content);
}

On met à jour la base de donnée : php bin/console doctrine:migration:diff puis php bin/console doctrine:migration:migrate

On ajoute la resource config/packages/resources.yaml

sylius_resource:
    resources:
        app.page:
            classes:
                model: App\Entity\Page

On crée la route config/routes.yaml

app_page:
    resource: |
        alias: app.page
        section: admin
        templates: SyliusAdminBundle:Crud
        grid: app_admin_page
        redirect: index
    type: sylius.resource
    prefix: admin

On crée la grille config/packages/grids.yaml

sylius_grid:
    grids:
        app_admin_page:
            driver:
                name: doctrine/orm
                options:
                    class: App\Entity\Page
            fields:
                slug:
                    type: string
                content:
                    type: string
            actions:
                main:
                    create:
                        type: create
                item:
                    update:
                        type: update
                    delete:
                        type: delete

Si on se rend à la page /admin/pages on devrait avoir ce résultat

Image Title

Maintenant il nous reste à créer le controller qui va faire le lien entre le slug et le contenu

src/Controller/PageController.php

<?php

namespace App\Controller;

use App\Repository\PageRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class PageController extends AbstractController
{
    public function index($slug, PageRepository $pages)
    {
        $page = $pages->findOneBy(array('slug' => $slug));
        if (is_null($page)) {
            throw new NotFoundHttpException('Page not found.');
        }

        return $this->render('page.html.twig',
            array('page' => $page)
        );
    }
}

templates/page.html.twig

{% extends '@SyliusShop/layout.html.twig' %}

{% block content %}
    <div class="">
        <div class="ui hidden divider"></div>

        {{ page.content|raw }}
    </div>
{% endblock %}

et enfin on ajoute la route du controller config/routes.yaml

app_page_public:
    path: /page/{slug}
    controller: App\Controller\PageController::index

Vous pouvez maintenant créer une page et y accéder en vous rendant sur /page/son-slug