Extra simple gestion de page par slug
This post is available in englishDans 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.
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
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