Symfony 4 ist nun bereits ein halbes Jahr verfügbar.
Da es in dieser Version eine ganze Reihe von Breaking Changes und Änderungen an der Projektstruktur gab, war es abzusehen, dass es eine Weile dauern wird bis viele Bundles vollständig kompatibel sein würden.
So erging es auch dem sehr beliebten UserBundle von FriendsOfSymfony – bis jetzt 🙂
Mit ein bisschen hin und her tricksen und die nötigen Informationen im Netz zusammenzusuchen habe ich es nun geschafft das Bundle mit Symfony 4 zum laufen zu bekommen. In diesem Beitrag erkläre ich dir wie du das Bundle installierst und konfigurierst.
Ausgangssituation
Ich habe mir eine frische SF4 Installation mit dem folgenden Befehl installiert:
$ composer create-project symfony/website-skeleton sf4 |
Grundsätzlich sollte es auch mit bestehenden Projekten funktionieren, ggf. können bestimmte Schritte übersprungen werden oder abweichen.
Installation der Abhängigkeiten
Installiere mittels Composer folgende Pakete in deinem Projekt:
$ composer require annotations doctrine migrations twig translations |
Und wenn du schon dabei bist, noch die Web Debug Toolbar als Dev Dependency:
$ composer require --dev profiler |
Installieren des UserBundle
Installiere nun das FOS UserBundle mittels folgendem Befehl (wichtig: auch wenn in der Dokumentation steht ~2.0, verwende ~2.1 !):
$ composer require friendsofsymfony/user-bundle "~2.1" |
Nach der Installation erscheinen ein paar Fehlermeldungen – welche wir aber nun beheben werden:
./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 3 installs, 0 updates, 0 removals - Installing paragonie/random_compat (v2.0.12): Loading from cache - Installing symfony/templating (v4.0.8): Loading from cache - Installing friendsofsymfony/user-bundle (v2.1.2): Loading from cache Writing lock file Generating autoload files ocramius/package-versions: Generating version class... ocramius/package-versions: ...done generating version class Symfony operations: 1 recipe (9d90a068cdcb22dccea816f32f31d58a) - Configuring friendsofsymfony/user-bundle (>=v2.1.2): From auto-generated recipe Executing script cache:clear [KO] [KO] Script cache:clear returned with error code 1 !! !! In ArrayNode.php line 230: !! !! The child node "db_driver" at path "fos_user" must be configured. !! !! !! |
Bundle konfigurieren
Um das Bundle zu konfigurieren, legst du dir die Datei config/packages/fos_user.yaml an und füllst sie wie folgt:
Wie du siehst, habe ich hier zwei neue ENV-Parameter hinzugefügt, MAILER_SENDER und MAILER_USER, füge diese entsprechend in deiner .env-Datei hinzu. (Sender = Absender-Adresse, User = Absender-Name)
Gehe nun in die Datei config/packages/framework.yaml und füge diese Parameter im Abschnitt framework hinzu:
Das war’s auch schon, der Rest läuft nun identisch zur Dokumentation ab.
User Entity erzeugen
Erzeuge nun mit folgendem Befehl eine User Entity
$ php bin/console make:entity User |
Und passe Zeile 5, 11 und 18 an:
<?php namespace App\Entity; use FOS\UserBundle\Model\User as BaseUser;use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="App\Repository\UserRepository") */ class User extends BaseUser{ /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ protected $id; public function getId() { return $this->id; } } |
Als nächstes erstellst du eine DB Migration und migrierst diese:
php bin/console doctrine:migrations:diff php bin/console doctrine:migrations:migrate |
Firewall konfigurieren
Jetzt fügst du die Einstellungen (natürlich entsprechend angepasst) deiner config/packages/security.yaml hinzu:
# config/packages/security.yaml security: encoders: FOS\UserBundle\Model\UserInterface: bcrypt role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: ROLE_ADMIN providers: fos_userbundle: id: fos_user.user_provider.username firewalls: main: pattern: ^/ form_login: provider: fos_userbundle csrf_token_generator: security.csrf.token_manager logout: true anonymous: true access_control: - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin/, role: ROLE_ADMIN } |
Routen laden
Als letztes musst du nun noch die UserBundle Routen laden. Öffne hierzu die config/routes.yaml und füge folgenden Eintrag hinzu:
fos_user: resource: "@FOSUserBundle/Resources/config/routing/all.xml" |
Ergebnis
Hast du alles korrekt gemacht, kannst du das Bundle nun nutzen und z.B. über /register die Registrationsseite aufrufen:
Vermutlich wird es in der Zukunft noch ein entsprechendes Recipe geben damit man sich diesen Mehraufwand spart.
Kommentare wie immer erwünscht.
0x gelesen