Slug występuje w adresie Url po nazwie domeny w formie pojedynczej frazy (np: /kontakt) lub kilku, oddzielonych znakiem myślnika „-” (np: /to-jest-przyklad-sluga). Separator można zmienić na inny, aczkolwiek Google preferuje taką postać. Ta forma linków nosi nazwę przyjaznych adresów Url (Friendly URL). Są one jednym z kluczowych czynników wpływających na pozycjonowanie stron internetowych w wyszukiwarkach.
Symfony korzysta z biblioteki ORM (Mapowanie Obiektowo-Relacyjne), która ma do zaoferowania sporo możliwości. Na przykład umożliwia wykonywanie automatycznych operacji na bazie danych tzw. zachowań (ang. behaviours). W tym rozdziale zajmiemy się jednym z nich, czyli zachowaniem sluggable – generowaniem sluga do podstrony.
Aby można było korzystać z zachowań musimy wpierw zainstalować pakiet StofDoctrineExtensionsBundle :
1 |
$ php composer.phar require stof/doctrine-extensions-bundle |
a następnie dopisać go do pliku bundles.php (/config/bundles.php):
1 2 3 |
//... Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true], //... |
Utwórz plik konfiguracyjny stof_doctrine_extensions.yaml (/config/packages/stof_doctrine_extensions.yaml) i wklej do niego zawartość:
1 2 3 4 5 |
stof_doctrine_extensions: default_locale: en_US orm: default: sluggable: true |
Jak widać, w pliku tym można m.in. włączyć (true) lub wyłączyć (false) zachowanie sluggable.
Na koniec, musimy jeszcze w klasie entity wskazać pole, dla którego slug będzie generowany i zapisywany w bazie. Zazwyczaj slug jest tworzony z tytułu podstrony, posta, artykułu itd. W naszym przykładzie będzie podobnie 😉
Stwórz klasę np: Page.php (/src/Entity/Page.php).
[Uwaga! Poniższy kod jest okrojony do minimum, tak aby ująć samo sedno.]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php // src/Entity/Page.php namespace App\Entity; // ... use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as Gedmo; // ... /** * @ORM\Entity */ class Page { // ... /** * @var string * @ORM\Column(type="string") */ private $title; /** * @Gedmo\Slug(fields={"title"}) * @ORM\Column(type="string", length=128, unique=true) */ private $slug; public function getSlug(): ?string { return $this->slug; } public function setSlug(?string $slug): void { $this->slug = $slug; } // ... |
Jak widać slug jest pobierany z pola o nazwie title : @Gedmo\Slug(fields={„title”}). Oprócz tego, dla kolumny ze slugiem można ustawić dodatkowy parametr: unique=true, tak, że nie może się on powtórzyć, czyli musi być unikatowy dla całej tabeli. Gdyby zdarzył się jednak wyjątek, to do nowego sluga zostanie dopisana cyfra 1, np: slug-1.
I to wszystko 🙂 Do następnego! –>