Ankündigung

Einklappen
Keine Ankündigung bisher.

Symfony2 + SonataAdminBundle: One-To-Zero-Or-One Relationship

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Symfony2 + SonataAdminBundle: One-To-Zero-Or-One Relationship

    Hallo Symfony-Freunde,

    ich hätte da mal eine Frage.

    Ich probiere mich gerade mit Symfony aus und hänge bei einem Problem bei der Verwaltung von Entity-Beziehungen. Folgende Situation:

    Ich habe Symfony aufgesetzt und nutze zur User-Verwaltung das FOS/UserBundle. Das funktioniert alles ohne Probleme. Nun möchte ich, dass ein registrierter User, die Möglichkeit hat, zu seinem User-Account ein Benutzer-Profil (Spieler) anzulegen. Dies soll aber optional sein. Hat er kein Profil angelegt bleibt er normaler User. Ist ein Profil vorhanden ist er ein erweiterter User.

    Um das zu realisieren habe ich eine One-To-One Relationship wie folgt angelegt.

    User.php
    PHP-Code:
    namespace kinger\MyBundle\Entity;

    use 
    Doctrine\ORM\Mapping as ORM;
    use 
    FOS\UserBundle\Model\User as BaseUser;

    /**
     * User
     *
     * @ORM\Table(name="user")
     */
    class User extends BaseUser
    {
        ...
       
        
    /**
         * @var integer
         *
         * @ORM\OneToOne(targetEntity="Player", mappedBy="user_id");
         * @ORM\JoinColumn(nullable=true)
         */
        
    private $player;

        ... 
    player.php
    PHP-Code:
    namespace kinger\MyBundle\Entity;

    use 
    Doctrine\ORM\Mapping as ORM;

    /**
     * Player
     *
     * @ORM\Table(name="profiles_player")
     */
    class Player
    {
        ...
        
        
    /**
         * @var integer
         *
         * @ORM\OneToOne(targetEntity="User", inversedBy="player_id", cascade={"persist", "remove"}, orphanRemoval=true)
         * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
         */
        
    private $user;

        ... 
    Die Beziehung funktioniert, soweit ich das sehen konnte auch ohne Probleme.
    1. Frage: Ist ein solcher Aufbau sinnvoll oder würdet ihr eine andere Lösung (wie zB extra User-Account für Spieler) vorschlagen?

    Um das ganze nun zu Verwalten nutze ich das SonataAdminBundle. Ich habe eine Admin-Form für User und Spieler angelegt und diese funktionieren auch wie sie sollen. Nun habe ich die Form das Spieler-Entity wie folgt in die Verwaltung der User eingebunden.

    PHP-Code:
    $formMapper
        
    ->with('Spielerprofil')
            ->
    add('player''sonata_type_admin', array('label' => false))
        ->
    end()

    Die Form wird angezeigt und man könnte die Spieler-Felder ausfüllen. Problem dabei ist, dass auch wenn der User gar kein Spieler-Profil anlegen möchte, durch diesen aufbau immer ein leeres Spieler-Profil angelegt wird.
    Frage 2: Gibt es eine Möglichkeit, in der Form der User einen Button oder Ähnliches anzulegen, wo der Benutzer aktiv das Profil anlegen oder löschen kann? So, dass das Formular für den Spieler nur angezeigt wird, wenn ein Spieler-Profil angelegt worden ist?

    (Es ist nicht ganz einfach sowas zu erklären, aber ich hoffe das passt so.)

    Und dann habe ich noch ein allgemeine Frage.
    Frage 3: Ist es sinnvoll die Logik von Benutzer und Spieler in zwei verschiedenen Bundles zu trennen oder spielt das eher weniger eine Rolle? Besser gefragt, gibt es einen Best-Practice für die Strukturierung von Bundles?

    Grüße


  • #2
    Ok, vielleicht ist die Frage etwas zu speziel für php.de.

    Kann jamand eine deutschsprachige Symfony2-Community empfehlen?

    Gruß

    Kommentar


    • #3
      Kann nur die erste Frage beantworten, und zwar, dass ich es ebenso mache. Zuerst registriert man sich auf der Seite (mit einem User-Provider) und danach erstellt man sich seine Applikations-spezifische Persona (die dann 1:1 an den Account gebunden ist).

      Die anderen Fragen sind glaube ich nicht zu beantworten. Mach, wie es sinnvoll für dich erscheint und versuche stets, es aus der Sicht von Leuten von außen zu sehen.

      Zum Thema "deutschsprachige Community", kann ich nur sagen, was ich immer sage: Lern Englisch. Sonst kannste deine Programmier-Karriere gleich an den Nagel hängen.
      Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

      Kommentar


      • #4
        Wie lässt du deine User die Applikations-spezifische Persona anlegen? In verschiedene Forms oder in einer? Ich würde das ja gerne alles in einer Form administrieren. (Ist dann auch schön einfach für den User) Es ist auch kein Problem, die erweiterte User-Form erst einzublenden wenn die 1:1-Beziehung besteht. Aber wie schaff ich das, dass der User komfortable die Beziehung anlegen oder löschen kann? Im Idealfall möchte ich nur zwei Buttons in der User-Form. Hast du da eine Idee?

        Du hast natürlich Recht mit dem Englischen. Ich kann auch Englisch, so ist das nicht. Aber einen wirklich konstruktiven Dialog auf Englisch zu führen, gerade bei Problembeschreibungen, ist immer schwieriger als auf Deutsch. Daher fragte ich erst einmal nach einer deutschen Community. Kannst du denn eine englischsprachige Community empfehlen oder reicht Stackoverflow?

        Kommentar


        • #5
          Ich kenne mich bei Symfony nicht so gut aus, da ich eigentlich ausschließlich mit Silex arbeite. Ich habe es über zwei Formulare gemacht, aber das ist auch Domänen-spezifisch. Bei SO wirste mit Symfony vielleicht Glück haben, aber ich würde eher auf Symfony-Spezifische Foren hoffen. Gerade bei Formularen gibts einfach so viel Zeug was man machen kann, dass das vermutlich selbst bei SO kaum Antworten produzieren wird.
          Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

          Kommentar


          • #6
            Ok, ich werde mich mal auf der Symfony2- beziehungsweise Sonata-Seite nach einem Forum umschauen.

            Silex hab ich schon mal kurz überflogen. Sah schön schlank aus. Was sind die Vorteile von Silex? Basiert doch auf Symfony-Komponenten, oder?

            Kommentar


            • #7
              Für mich war der Vorteil, dass ich mir Stück für Stück mein Framework quasi selbst zusammenbauen konnte, und ohne die Vorgabe von Symfony "erkunden" konnte, was für mich der beste Arbeitsweg ist.

              Mittlerweile habe ich mein Silex-Projekt soweit, dass ich im Grunde gleichauf mit Symfony bin. Aber: Ich verstehe was wo passiert und habe nicht so viele Blackboxen wie bei Symfony.
              Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

              Kommentar


              • #8
                Ah, danke für die Info. Könnte ich später nutzen um meine Projekte performanter zu gestalten. Aber fürs prototyping bleib ich erst einmal bei Symfony.

                Kommentar


                • #9
                  OT:
                  falls du noch etwas über die Unterschiede zwischen Symfony und Silex wissen willst: https://igor.io/2012/11/09/scaling-silex.html
                  https://github.com/Ma27
                  Javascript Logic is funny:
                  [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                  Kommentar

                  Lädt...
                  X