Integrating Doctrine: Symfony vs Yii


Symfony | Frameworks | Technical | Doctrine | Yii | January 14, 2011

Continuing with Symfony vs Yii series, in this post will be show how to integrate the best PHP ORM into our project. The versions that will be used are: Yii 1.1.5, Symfony 1.4.8 and Doctrine 1.2.3 .

First it will be show the steps to properly integrate Doctrine with Yii, which has no native connection, but there is a very useful plugin (doctrine-yii) to do so. Then the same but with Symfony, which will be a very straight forward process because Symfony has native integration with Doctrine.

 

Yii way

1.- Download Doctrine 1.2.3 (The latest stable release)

Browse the Doctrine Download Page and download the latest release in the branch 1.

In the project/protected folder create one named vendors and inside this new folder create another one named doctrine. In that folder extract the doctrine package.

 

2.- Install the Doctrine-Yii Plugin

Download the Doctrine-Yii plugin from the download page.

There is two classes you have to copy to your project:

DoctrineCommand class

In the plugin site it is describe the DoctrineCommand installation process. It will be describe the most important parts here.

Copy the DoctrineCommand class to project/protected/commands/shell folder. Now, if you enter to the yiic shell utility uou will see a new doctrine command to use.

Yii Shell

 

DoctrineComponent class

As with DoctrineCommand, DoctrineComponent has a installation page. Here it will be describe the most important parts.

Copy the DoctrineComponent class to project/protected/vendors/doctrine folder.

Now you must change the project/protected/config/main.html"php">  'preload' => array('log', 'doctrine'),  

and

 
  'components' => array(
    'doctrine' => array(
      'class'            => 'application.vendors.doctrine.DoctrineComponent',
      'connectionString' => 'mysql://username:[email protected]/dbname',
    ),
    ...
  );
 

In the second chunk you indicate to your app the component class to use and the connection string for the database connection.

If you are a Symfony guy then ... Yes my friend, there is no Yaml in Yii. just plain php files.

 

Register Doctrine Autoload method

Open the DoctrineComponent class and update the init method:

 
  public function init()
  {
    parent::init();
 
    spl_autoload_unregister(array('YiiBase','autoload'));
    spl_autoload_register(array('Doctrine','autoload'));
    spl_autoload_register(array('YiiBase','autoload'));
 
    Doctrine_Manager::connection($this->connectionString);
    $modelsPath = Yii::getPathOfAlias("application.models");
    Doctrine::loadModels($modelsPath);
 
    ...
  }
 

You need to unregister the Yii autoload method first, then register the Doctrine autoload method and finally register the Yii method.

To test your doctrine installation you can enter in the yii shell the command: doctrine build-all (you must have at least one table in the schema.yml to build from)

 

Those are all the steps you need to follow to have Doctrine working with your Yii project.

Remember that the schema.yml and the fixtures.yml files should be located in the project/protected/models folder.

Now you can start updating your db schema and creating initial data for it with Doctrine.

 

Symfony way

The integration process with Symfony will be much easier because symfony 1.4 is coming by default with Doctrine 1.2.

1.- Activate Doctrine Plugin

Open project/config/ProjectConfiguration class and update the getActivePlugins method:

 
  protected function getActivePlugins()
  {
    return array
           (
             'sfDoctrinePlugin',
             //'symfextPlugin',
           );
  }
 

Once the plugin activated you can use Doctrine ORM Framework. As simple as that.

To test your doctrine activation you can enter the command: symfony doctrine:build --all --and-load --no-confirmation (you must have at least one table in the schema.yml to build from)

Remember that to update your connection properties you must change the project/config/databases.yml file:

 
all:
  doctrine:
    class:         sfDoctrineDatabase
    param:
      dsn:         mysql:host=localhost;dbname=my_database
      username:    root
      password:    ''
      attributes:
        use_dql_callbacks: true
 

 And to add new initial data for the db you can use project/data/fixtures/fixtures.yml file:

 

In this post it was show how to integrate the best PHP ORM with Symfony and Yii. As you can see it is much easier to integrate with symfony because of its native connection, although it wasn't that hard to do it with Yii. But remember if you want to work extensively with Doctrine you must consider its level of integration. With Symfony, Doctrine is deeply integrated with the forms framework and it is very easy to set up a new db schema and to generate the form classes. However this deep integration does not exist with Yii, because Yii has its own ORM.

 

 


Comments


Pablo said about 3 days later

Thanks!



Hey Stranger, leave a comment:


My Tweets

10 days ago
I'm sooo not looking forward to getting up for work tomorrowwww - cant wait for this thing to work! https://tinyurl.com/67rg4lo
12 days ago
finally this class #semester is finished, new #projects in mind
20 days ago
Mark Zuckerberg Explains His Law Of Social Sharing [Video]https://t.co/sqq10Ehh via@TechCrunchh
about 1 month ago
retomando mi #twitter #notime
about 1 month ago
Inspiring for ANYONE who hates their job and their STUPIDD GD BOSS https://tinyurl.com/3cz3pan
about 1 month ago
How Facebook Can Put Google Out of Businesshttps://t.co/HqDfQGoo via@TechCrunchh
2 months ago
So why not just cut out the middle man? Microsoft.https://techcrunch.com/2011/05/15/samsung-series-5-chromebook/
2 months ago
really like to #design class hierarchies with #compositepattern
3 months ago
Similarly, Microsoft.com started to use jQuery instead of their own ASP.NET Ajax framework. They are still using Windows, for whatever XD
3 months ago
Estudiantes de la PUCP le “voltean” campaña a esposo de Keiko | yoperiodhttps://t.co/ruI9UnmI9Unm@lamulaamula
3 months ago
Reading: Apress.-.Pro.html"https://www.twitter.com/search?q=#php">#php #performance #read
3 months ago
debug_backtrace() is very important on certain situations. #php #debug
3 months ago
@alvarezrodrich felicitaciones!
4 months ago
time to do some #uml diagrams, #classdiagram
4 months ago
hoy es el día,#votaa conciente#peruu
4 months ago
@skoop @funkatron I think someone had a bad day!, #Frameworks are there but you don't have to use them.
4 months ago
making #wireframes for a new #functionality
4 months ago
so much #spam on my #blog =(
4 months ago
learning new topics and tools that I did not use before #rcp
4 months ago
aprendiendo muchos temas y herramientas que no utilizaba antes #rcp
4 months ago
#tweaking httpd.conf #virtualhost
4 months ago
thanks #symfony 1.4, even when i'm not using the entire #framework, yours classes save my life!
4 months ago
integrating with #SOA using #soap
4 months ago
It seems my most #productive working hours are on #sunday #afternoon #evening! XD
4 months ago
#ASOT 500 =)
4 months ago
installing SCA_SDO on #Centos #php
4 months ago
My web service using #soap worked!!!!! #php #SCA #SDO
4 months ago
Working in a new place since last week!, #RCP: Red Científica Peruana, the one which sells the .pe domains in#Perúú ->#happypy
5 months ago
Finally with a new #laptop: #Toshiba =)
5 months ago
@pasku1 Thanks, I will try Pivotaltracker.
5 months ago
@doolphy thanks for your answer doolphy! I'll try you!
5 months ago
@jmasson thanks for your answer! Jira + Confluence is a good combination.
5 months ago
Which is the best project management and collaboration tool right now? #projectmanagement #tool #collaboration
5 months ago
What a #voice! Sied Van Riel feat Nicole McKenna - Stealing Time (Aly & Fila Remix) + #ASOT 497 #trancefamily
5 months ago
working on a situation where #php #traits would be very useful
5 months ago
It is #awesome when you finish doing a lot of changes and nothing is broken =) #TDD #testing
5 months ago
oh, happy birthday! @mtabini o mejor dicho feliz cumpleaños!
5 months ago
why do #IE8 not accept #javascript "const" keyword?
5 months ago
Discovering there is much #more to do with #javascript ... a lot.
5 months ago
Awesome #song!: Cerf, Mitiska & Jaren - Another World (Original Vocal Mix) #ASOT 495 #trancefamily
6 months ago
My legal woman is #PHP, but I have an affair with #Javascript, overall when she wears #jQuery.
6 months ago
This presentation is one of the best I've seen about #unit #testing https://www.slideshare.net/avalanche123/clean-code-5609451
6 months ago
where to do a master on #IT: US or Spain? #survey #php #master plz RT
6 months ago
Bobina feat. Betsie Larkin - You Belong To Me: What a #beautiful voice -> #ASOT 494 #arminvanbuuren
6 months ago
OH NO, IT'S MONDAY -- 2011-02-07 https://t.co/pgaIxe5 via @gojkoadzic
6 months ago
it was not a + b, it was parserInt(a) + parseInt(b) =(, #javascript #fail
6 months ago
The models are complete representations of the system, whereas an #architectural #view focuses only on what is architecturally #significant.
6 months ago
@jmasson that would be great and finally #wikimedia, #drupal, #wordpress and maybe #joomla would push towards the same side, the #php side.
6 months ago
@jmasson Thanks!, #PHP has a bright #future ahead.
6 months ago
A new #blog post about not reinventing the #wheel: /article/symfony2_phpbb4_and_drupal8 #symfony #phpbb #drupal
6 months ago
@giorgiosironi #indeed, that's a very good #question. I think an average of 4 but also depends on how much that #developer work.
6 months ago
It seems the new platform for deploying, managing and scaling PHP apps is https://orchestra.io/ #cool
6 months ago
#Phase project planning vs #iteration project #planning - #project #management
6 months ago
#jeditable with #jquery save my life =)
6 months ago
Amazing #song -> Sied van Riel feat. Nicole McKenna - Stealing Time #ASOT 493 #trancefamily
6 months ago
I simply love "offset" #jquery function =)
6 months ago
I really don't understand why projects like #drupal does not base their components in projects like #doctrine and #symfony
6 months ago
OH NO, IT'S MONDAY -- 2011-01-17 https://t.co/37pr4Bd via @gojkoadzic
6 months ago
@alvarezrodrich me alegra ver q ya borró su cuenta Sr. Rodrich,#twitterr es malo jajja, XD
6 months ago
Acabo de hacerle a mi #brother @diegonl89 un blog para que hable de #actualidad en general: https://www.elgatotechero.com #peru
6 months ago
I just made to my #brother a #blog to talk about current #events in #peru: https://www.elgatotechero.com
6 months ago
Amazing things can be done with #javascript and #css, and of course with the help of #jQuery =)
6 months ago
An architecturally significant element is an element that is important for #understanding the #system.
6 months ago
An architecturally element has a wide impact on the #structure, #performance, #robustness, #evolvability, and #scalability of a #system.
6 months ago
@giorgiosironi Definitely!
6 months ago
Playing with #table #inheritance in #Doctrine
6 months ago
Reading about #RUP, and how addresses the #major difficulties in a new #project.
6 months ago
A new blog #post about #refactoring your queries with #Doctrine: /article/refactoring_queries_with_doctrine #symfony
6 months ago
Yandex in 2010: 43 percent revenue growth https://t.co/cpjT5Jw via @cnet
6 months ago
Going forward!!!!! =) poco a poco llegan los resultados de tanto esfuerzo #fb
6 months ago
Perfect #system with respect to the #requirements but the #wrong system with respect to the #real #problem at the time of #delivery.
6 months ago
Going #forward! =) #fb
6 months ago
A new #blog #post about integrating #Doctrine with #Yii and #Symfony: /article/integrating_doctrine_symfony_vs_yii
6 months ago
@sam_dark Ok thanks!, but I don't understand why in #Yii documentantion use $_GET and $_POST instead of CHttpRequest https://bit.ly/i5emoL