The symfony Cookbook

Beginnen met Doctrine

About

You are currently reading "The symfony Cookbook" which is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License license.

Symfony Live 2010 Paris Conference
symfony training
Be trained by symfony experts
Jul 22: Paris (1.2 + Doctrine - Français)
Aug 19: San Francisco (1.2 + Doctrine - English)
Sep 23: Paris (1.2 + Doctrine - Français)
Oct 21: Nantes (1.2 + Doctrine - Français)
Nov 18: Paris (1.2 + Doctrine - Français)
and more...

Search


powered by google
You are currently browsing "The symfony Cookbook" in Dutch for the 1.1 version - Switch to version: - Switch to language:
Creative Commons License This work is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Translation of this work into another language is explicitly allowed.

Dus je wilt Doctrine een keer proberen met symfony 1.1? Eerst moeten we een nieuw symfony 1.1 project opzetten en de sfDoctrinePlugin voor 1.1 installeren. Voer de volgende commando's uit en lees verder:

$ mkdir symfony1.1Doctrine
$ cd symfony1.1Doctrine
$ /path/to/symfony generate:project symfony1.1Doctrine
$ svn co http://svn.symfony-project.com/plugins/sfDoctrinePlugin/trunk plugins/sfDoctrinePlugin
$ php symfony cc

Typ nu het volgende commando in om een lijst te krijgen met alle commando's die sfDoctrinePlugin bied. Het zal je opvallen dat het alle commando's zijn die sfPropelPlugin ook bied, en meer!

$ php symfony list doctrine
  Available tasks for the "doctrine" namespace:
  :build-all                   Generates Doctrine model, SQL and initializes the database (doctrine-build-all)
  :build-all-load              Generates Doctrine model, SQL, initializes database, and load data (doctrine-build-all-load)
  :build-all-reload            Generates Doctrine model, SQL, initializes database, and load data (doctrine-build-all-reload)
  :build-all-reload-test-all   Generates Doctrine model, SQL, initializes database, load data and run all test suites (doctrine-build-all-reload-test-all)
  :build-db                    Creates database for current model (doctrine-build-db)
  :build-forms                 Creates form classes for the current model (doctrine-build-forms)
  :build-model                 Creates classes for the current model (doctrine-build-model)
  :build-schema                Creates a schema.xml from an existing database (doctrine-build-schema)
  :build-sql                   Creates SQL for the current model (doctrine-build-sql)
  :data-dump                   Dumps data to the fixtures directory (doctrine-dump-data)
  :data-load                   Loads data from fixtures directory (doctrine-load-data)
  :dql                         Execute a DQL query and view the results (doctrine-dql)
  :drop-db                     Drops database for current model (doctrine-drop-db)
  :generate-crud               Generates a Doctrine CRUD module (doctrine-generate-crud)
  :generate-migration          Generate migration class (doctrine-generate-migration)
  :generate-migrations-db      Generate migration classes from existing database connections (doctrine-generate-migrations-db, doctrine-gen-migrations-from-db)
  :generate-migrations-models  Generate migration classes from an existing set of models (doctrine-generate-migrations-models, doctrine-gen-migrations-from-models)
  :init-admin                  Initializes a Doctrine admin module (doctrine-init-admin)
  :insert-sql                  Inserts SQL for current model (doctrine-insert-sql)
  :migrate                     Migrates database to current/specified version (doctrine-migrate)
  :rebuild-db                  Creates database for current model (doctrine-rebuild-db)

Allereerst moet er voor de sfDoctrinePlugin minimaal 1 applicatie opgezet zijn, dus laten we een frontend applicatie initialiseren.

$ php symfony generate:app frontend

Laten we nu onze database configuratie opzetten in config/databases.yml. Open het bestand in je favoriete editor en plaats de YAML hieronder in het bestand. Voor deze test gebruiken we simpelwel een SQLite database. Doctrine kan een SQLite database voor je aanmaken op config/doctrine.db, en dat zullen we ook doen zodra we ons schema en wat fixtures hebben opgezet.

all:
  doctrine:
    class:    sfDoctrineDatabase
    param:
      dsn:    sqlite:///<?php echo dirname(__FILE__); ?>/doctrine.db

Nu we de database hebben geconfigureerd, kunnen we onze YAML schema bestanden definieren in config/doctrine/schema.yml. In dit voorbeeld zetten we een simpel BlogPost model op die HasMany Tags.

---
  BlogPost:
    actAs:
      Sluggable:
        fields: [title]
      Timestampable:
    columns:
      title: string(255)
      body: clob
      author: string(255)
    relations:
      Tags:
        class: Tag
        refClass: BlogPostTag
        foreignAlias: BlogPosts
 
  BlogPostTag:
    columns:
      blog_post_id:
        type: integer
        primary: true
      tag_id:
        type: integer
        primary: true
 
  Tag:
    actAs: [Timestampable]
    columns:
      name: string(255)

Nu we ons Doctrine schema hebben gedefinieerd, kunnen we wat test data fixtures maken in data/fixtures/data.yml. Open het bestand in je favoriete editor en plak onderstaande YAML in het bestand.

---
BlogPost:
  BlogPost_1:
    title:  symfony + Doctrine
    body:   symfony and Doctrine are great!
    author: Jonathan H. Wage
    Tags:   [symfony, doctrine, php]
 
Tag:
  symfony:
    name: symfony
  doctrine:
    name: doctrine
  php:
    name: php

OK, nu voor het leuke gedeelte. We hebben ons schema, en we hebben test gegevens, dus nu kunnen we een enkel Doctrine commando uitvoeren om de database aan te maken, de modellen te genereren, de tabellen aan te maken en de gegevens in te laden.

$ php symfony doctrine-build-all-reload frontend
>> doctrine  Are you sure you wish to drop your databases? (y/n)
y
>> doctrine  Successfully dropped database f...1.1Doctrine/config/doctrine.db"
>> doctrine  Successfully created database f...1.1Doctrine/config/doctrine.db"
>> doctrine  Generated models successfully
>> doctrine  Created tables successfully
>> doctrine  Data was successfully loaded

Nu is je doctrine.db SQLite database aangemaakt, alle tabellen uit je schema zijn gemaakt, en de data fixtures zijn in de tabellen geplaatst. Laten we nu wat spelen met de data om te zien hoe we de Doctrine Query Language kunnen gebruiken om data te verkrijgen.

$ php symfony doctrine:dql frontend "FROM BlogPost p, p.Tags t"
>> doctrine  executing: "FROM BlogPost p, p.Tags t" ()
>> doctrine  - 
>> doctrine    id: 1
>> doctrine    title: symfony + Doctrine
>> doctrine    body: symfony and Doctrine are great!
>> doctrine    author: Jonathan H. Wage
>> doctrine    slug: symfony-doctrine
>> doctrine    created_at: 2008-06-16 12:28:57
>> doctrine    updated_at: 2008-06-16 12:28:57
>> doctrine    Tags: 
>> doctrine      - 
>> doctrine        id: 1
>> doctrine        name: symfony
>> doctrine        created_at: 2008-06-16 12:28:57
>> doctrine        updated_at: 2008-06-16 12:28:57
>> doctrine      - 
>> doctrine        id: 2
>> doctrine        name: doctrine
>> doctrine        created_at: 2008-06-16 12:28:57
>> doctrine        updated_at: 2008-06-16 12:28:57
>> doctrine      - 
>> doctrine        id: 3
>> doctrine        name: php
>> doctrine        created_at: 2008-06-16 12:28:57
>> doctrine        updated_at: 2008-06-16 12:28:57

Laten we nu wat uitleggen over de data die werd teruggegeven. Zoals je kunt zien hebben de models een created_at, updated_at en slug kolom die niet in het schema bestand werden gedefinieerd. Deze kolommen zijn toegevoegd door de "behaviors" die in het schema aan de tabellen werden gekoppeld door de actAs instelling. De created_at en updated_at kolommen krijgen automatisch een waarde onSet en onUpdate, en de slug kolom is een url-vriendelijke string die is gemaakt van de waarde van de name kolom. Doctrine heeft een aantal "behaviors" die standaard worden meegeleverd, zoals Sluggable en Timestampable, maar het behavior-systeem is beouwd om iedereen toe te staan makkelijk behaviors voor hun modellen te schrijven en hergebruiken.

Nu dat we ons data model volledig hebben opgezet en test gegevens hebben ingeladen kunnen we een admin generator maken om de blog posts en tags te beheren.

$ php symfony doctrine:init-admin frontend blog_posts BlogPost
$ php symfony doctrine:init-admin frontend tags Tag

Let op

De admin generator templates voor sfDoctrinePlugin zijn nog niet volledig geupdate voor symfony 1.1 omdat ze nog steeds moeten werken met de compat_10 optie die aangezet kan worden in apps/frontend/config/settings.yml. Ze zullen 100% worden geupdate voordat de officiele release van symfony 1.1 stabiel is.

Open nu je web browser en check je frontend applicatie in de blog_posts en tags modules. Het zou op de onderstaande URL beschikbaar moeten zijn:

$ http://localhost/symfony1.1Doctrine/web/frontend_dev.php/blog_posts
$ http://localhost/symfony1.1Doctrine/web/frontend_dev.php/tags

blog posts

Met een beetje configuratie van de blog post admin generator kan je nu beheren welke tags geassocieerd worden met welke blog posts door checkboxes aan te vinden bij het wijzigen van een blogpost. Open apps/frontend/modules/blog_post/config/generator.yml en vervang de inhoud met de volgende YAML.

generator:
  class:              sfDoctrineAdminGenerator
  param:
    model_class:      BlogPost
    theme:            default
    list:
      display:        [=title, author]
      object_actions:
        _edit:        -
        _delete:      -
    edit:
      display:        [author, title, body, Tags]
      fields:
        author:
          type:       input_tag
        title:
          type:       input_tag
        body:
          type:       textarea_tag
          params:     size=50x10
        Tags:
          type:       doctrine_admin_check_list
          params:     through_class=BlogPostTag

Ververs nu de blog post list in je browser en je zal zien dat deze goed is opgeschoond. Wijzig een blog post door te klikken op het wijzig icoon of the titel en je zal zien dat je de geassocieerde tags bij de blog post kan wijzigen zoals hieronder.

edit blog posts

Alle features die je in Propel hebt werken voor 99% hetzelfde in Doctrine, dus het zou redelijk makkelijk moeten zijn om dit aan te leren als je eerder met Propel gewerkt hebt. sfDoctrinePlugin implementeert alle functionaliteit hetzelfde als sfPropelPlugin, en daarnaast bied het nog een aantal features die in sfPropelPlugin niet aanwezig zijn. Hieronder vind je wat informatie over de belangrijkste features die Doctrine ondersteunt:

Als deze korte tutorial je interesse in Doctrine heeft opgewekt, dan kan je op de onderstaande pagina's nog meer informatie vinden over Doctrine:

Questions & Feedback

If you find a typo or an error, please register and open a ticket.

If you need support or have a technical question, please post to the official user mailing-list.

The Sensio Labs Network

Since 1998, Sensio Labs has been promoting the Open-Source software movement by providing quality web application development, training, consulting, and supporting several large Open-Source projects.