Allgemein PHP Tipps und Tricks Tutorials

FOS UserBundle mit Symfony 4 verheiraten

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:
FOS UserBundle in aktion

Vermutlich wird es in der Zukunft noch ein entsprechendes Recipe geben damit man sich diesen Mehraufwand spart.

Kommentare wie immer erwünscht.


0x gelesen

Print Friendly, PDF & Email

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.