Symfony2 CRUD Application

Posted in Symfony, 02.06.2013 17:06

Aus dem "Simple Example" aus dem Symfony-Book (v.2.2) kann man auch einfach eine CRUD-Anwendung erstellen. Im Lauf der Installation (s.Buch) muß man folgende Befehle ausführen:


# Bundle erstellen
php app/console generate:bundle --namespace=Acme/StoreBundle

# nachdem die Datenbankeinstellungen unter paramters.yml eingetragen sind, kann die DB erstellt werden:
php app/console doctrine:database:create

# nachdem die Entity erstellt wurde (Tabellen und Spalten-Infos in den Annotations), 
# kann man sich getter- und setter-Methoden automatisiert ergänzen lassen:
php app/console doctrine:generate:entities Acme/StoreBundle/Entity/Product

# Dann läßt man die Tabelle erstellen:
php app/console doctrine:schema:update --force

# einfache Entities (hier z.b. nur 1 Spalte) kann man auch so erstellen lassen :
php app/console doctrine:generate:entity --entity="AcmeStoreBundle:Category" --fields="name:string(255)"

# auch die Tabelle category wird von Symfony erstellt:
php app/console doctrine:schema:update --force

# dieser Befehl erstellt eine komplette CRUD-App für die Tabelle product
php app/console doctrine:generate:crud --entity=AcmeStoreBundle:Product --format=annotation --with-write --no-interaction

# dieser Befehl erstellt eine komplette CRUD-App für die Tabelle Category
php app/console doctrine:generate:crud --entity=AcmeStoreBundle:Category --format=annotation --with-write --no-interaction

Dann muß noch das Routing erstellt werden unter Acme/StoreBundle/Resources/config/routing.yml:

AcmeStoreBundle: resource: "@AcmeStoreBundle/Controller/" type: annotation prefix: /store

Was nicht im Buch steht: das PHP5-Intl-Modul muß installiert sein (sudo apt-get install php5-intl) und die Entity-Klassen müssen eine __toString-Methode implementieren, sonst gibts beim Aufruf Fehler! Die kann in beiden Fällen so aussehen:

public function __toString()
    {
        return $this->name;
    }

Danach will man die generierten Formulare noch verschönern. Um Twig dazu zu bekommen, das Stylesheet in Resources/public/css zu laden muß dieses erst nach web kopiert werden, das geht auch automatisiert mit:


php app/console assets:install

Im new.html.twig (oder auch im base.html.twig) dann folgenden Code einbauen:

  
{% block stylesheets %}
   <link href="{{ asset('bundles/acmestore/css/form.css') }}" type="text/css" rel="stylesheet" />
{% endblock %}

Achtung

Entity-Annotations müssen manchmal extra Escaped werden:



/**
 * @var string
 *
 * @ORM\Column(name="`fulltext`", type="text", nullable=true)
 */
 private $fulltext;

"Fulltext" ist ein reserved Word! So hieß die Tablespalte aber wirklich (Erbe von jos_content!). Der Crud-Generator hat die Annotation OHNE die Backticks erzeugt. Wenn diese aber weggelassen werden, kommt es zu einem undurchsichtigen SQL-Syntaxerror!