<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dubluve.net &#187; doctrine</title>
	<atom:link href="http://dubluve.net/category/software/php/doctrine/feed/" rel="self" type="application/rss+xml" />
	<link>http://dubluve.net</link>
	<description>Biz de yazılımcıyız</description>
	<lastBuildDate>Sat, 19 May 2012 18:29:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Symfony 2 &#8211; Veritabanı İçin Başlangıç Verileri Oluşturmak &#8211; Doctrine Fixtures</title>
		<link>http://dubluve.net/2012/01/22/symfony-2-veritabani-icin-baslangic-verileri-olusturmak-doctrine-fixtures-2/</link>
		<comments>http://dubluve.net/2012/01/22/symfony-2-veritabani-icin-baslangic-verileri-olusturmak-doctrine-fixtures-2/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 10:23:02 +0000</pubDate>
		<dc:creator>Boğaç Aslanyürek</dc:creator>
				<category><![CDATA[doctrine]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[symfony 2]]></category>
		<category><![CDATA[fixture]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony framework]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://dubluve.net/?p=808</guid>
		<description><![CDATA[Daha önceki yazımda Symfony2&#8242;de veritabanı değişikliklerini yönetmek için database migrations kullanımını anlatmıştım. Bu yazıda yine veritabanında bize çok yardımcı olacak bir özellikten bahsedeceğim. Geliştirme sırasında veritabanı sıklıkla değişir, özellikle database migration yapısı kullanmıyorsanız tabloları tekrar yaratmak zorunda kalırsınız. Benzer şekilde veritabanı yapınıza yeni tablolar eklenebilir, sistemin düzgün işlemesi için gerekli veriler (örneğin parametre tabloları) olabilir [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Symfony 2 Database Migrations" href="http://dubluve.net/2012/01/11/symfony2-database-migrations/" target="_blank">Daha önceki yazımda</a> Symfony2&#8242;de veritabanı değişikliklerini yönetmek için database migrations kullanımını anlatmıştım. Bu yazıda yine veritabanında bize çok yardımcı olacak bir özellikten bahsedeceğim.</p>
<p>Geliştirme sırasında veritabanı sıklıkla değişir, özellikle database migration yapısı kullanmıyorsanız tabloları tekrar yaratmak zorunda kalırsınız. Benzer şekilde veritabanı yapınıza yeni tablolar eklenebilir, sistemin düzgün işlemesi için gerekli veriler (örneğin parametre tabloları) olabilir ya da ekibinize yeni yazılımcılar katılabilir. Bu gibi durumlarda tabloları kullanan ekranlar için tekrar test verileri girmek gerekir. İşte bu test verisi girme işlemini otomatik olarak gerçekleştirmek istediğimiz zaman, Doctrine ORM&#8217;de yer alan <strong>database fixtures</strong> özelliğini kullanabiliriz.</p>
<h2>Kurulum</h2>
<p>Symfony 2&#8242;de database fixtures özelliğini kullanmak için DoctrineFixturesBundle paketini yüklemek gerekiyor. Bunun için proje klasörümüzde yer alan deps dosyasına aşağıdaki bilgileri ekliyoruz:</p>
<pre class="php">[doctrine-fixtures]
git=http://github.com/doctrine/data-fixtures.git

[DoctrineFixturesBundle]
git=http://github.com/symfony/DoctrineFixturesBundle.git
target=/bundles/Symfony/Bundle/DoctrineFixturesBundle</pre>
<p>Bu eklemeleri yaptıktan sonra komut satırından ilgili proje klasörüne gelip ek kütüphanelerin kurulumunu sağlayan ilgili komutu çalıştırıyoruz:</p>
<pre>php bin\vendors install</pre>
<p>Eğer kurulum sorunsuz tamamlandıysa {proje_klasoru}/vendor/doctrine-fixtures klasörünü olmalı.</p>
<p>Şu aşamada paketin kaynak kodunu projeye ekledik ama uygulamamız bu paketi henüz kullanmıyor. Bu nedenle paketi yüklemek için gerekli kodları ilgili sayfalara eklemek gerekiyor. Önce ilgili isim alanının (namespace) uygulama tarafından tanınması için {proje_klasoru}\app\autoload.php dosyasına aşağıdaki kodları ekliyoruz:</p>
<pre class="php">$loader-&gt;registerNamespaces(
       array( // ...
             'Doctrine\\Common\\DataFixtures' =&gt; __DIR__.'/../vendor/doctrine-fixtures/lib',
             'Doctrine\\Common' =&gt; __DIR__.'/../vendor/doctrine-common/lib',
             // ... ));</pre>
<p><strong>Burada dikkat edilmesi gereken nokta</strong>, <em>Doctrine\\Common\\DataFixtures</em> satırının <em>Doctrine\\Common</em> satırından önce gelmesi gerektiğidir. Symfony&#8217;de kullanılan isim alanları, yukarıdaki <em>registerNamespaces()</em> metodundaki sırasıyla kontrol edilir, bu nedenle ilk olarak <em>Doctrine\\Common</em> satırı gelirse, bir alt isim alanını gösteren satır dikkate alınmayacak ve Doctrine\\Common\\DataFixtures isim alanı kayıt edilemeyecektir. Yani her zaman daha özel, yani daha alt seviye isim alanlarını gösteren satırlar <span style="text-decoration: underline;">daha önce</span> gelmelidir.</p>
<h2>Fixture Yaratalım!</h2>
<p>Test verilerini otomatik olarak oluşturacak dosyalar, Symfony&#8217;de PHP sınıflarından oluşmaktadır. Bu dosyalar, yani fixture dosyaları, ilgili paketin {paket_klasoru}/DataFixtures/ORM klasörü altında yer almalıdır (örneğin Dubluve/TestBundle/DataFixtures/ORM). Eğer MongoDB kullanmayı düşünüyorsanız  {paket_klasoru}/DataFixtures/MongoDB altında dosyaları tutmalısınız. Yükleyeceğiniz dosyanın adı önemli değil, fakat anlamlı olması açısından, örneğin User nesnesi için <em>LoadUserData.php </em> olarak isimlendirebilirsiniz.</p>
<p>Peki dosyayı yarattık, içeriği nasıl oluşturacağız? Birçok uygulamada temel ihtiyaç olan kullanıcı nesnesine, geçerli bir kullanıcı için test verisi oluşturalım. Nesnemiz User, sahip olduğu özellikler <em>username</em> ve <em>password</em> ve daha önceden {paket_klasoru}/Entity altında ilgili sınıfı yaratmış olalım. Örnek kod aşağıdaki gibi olmalı:</p>
<pre class="php">// src/Dubluve/TestBundle/DataFixtures/ORM/LoadUserData.php</pre>
<pre class="php"> namespace Dubluve\TestBundle\DataFixtures\ORM;
 use Doctrine\Common\DataFixtures\FixtureInterface;
 use Dubluve\TestBundle\Entity\User;
 use Doctrine\Common\Persistence\ObjectManager;</pre>
<pre class="php"> class LoadUserData implements FixtureInterface {
   public function load(ObjectManager $manager) {
     $userAdmin = new User();
     $userAdmin-&gt;setUsername('admin');
     $userAdmin-&gt;setPassword('test');
     $manager-&gt;persist($userAdmin);
     $manager-&gt;flush();
   }
 }</pre>
<p>User nesnesi ve benzer nesneler için fixture sınıfları oluşturduktan sonra tüm bu değişiklikleri veritabanına uygulamak için aşağıdaki komutlardan, mongodb kullanıyorsanız 2. komutu, yoksa sadece ilkini çalıştırıyoruz:</p>
<pre>php app/console doctrine:fixtures:load
php app/console doctrine:mongodb:fixtures:load</pre>
<h2>Meraklısına Detaylar</h2>
<p>Yukarıdaki örnek basit anlamda fixture kullanımını anlatıyor. Fakat veritabanınızda muhtemelen birbiriyle ilişkili birçok nesne olacak ve bunları birbiriyle ilişkilendirerek veritabana girmek isteyeceksiniz. Bunun için DoctrineFixtures paketine ilişki kurma ve ard arda fixture çalıştırma özellikler bulunuyor. Aşağıdaki örnekte ilk olarak kullanıcı tablosuna ve kullanıcı grubu tablosuna birer kayıt ekleyip, ara tabloda ilişkilendireğiz.</p>
<pre class="php">// src/Dubluve/TestBundle/DataFixtures/ORM/LoadUserData.php
namespace Dubluve\TestBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Dubluve\TestBundle\Entity\User;
use Doctrine\Common\Persistence\ObjectManager;</pre>
<pre class="php">class LoadUserData extends AbstractFixture implements OrderedFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $userAdmin = new User();
        $userAdmin-&gt;setUsername('admin');
        $userAdmin-&gt;setPassword('test');

        $manager-&gt;persist($userAdmin);
        $manager-&gt;flush();

        $this-&gt;addReference('admin-user', $userAdmin);
    }

    public function getOrder()
    {
        return 1; // the order in which fixtures will be loaded
    }
}</pre>
<p>Yukarıdaki sınıfta, daha önceki fixture sınıfından farklı olarak getOrder() fonksiyonunu görüyoruz. Bu fonksiyon, yeni kullanıdığımız  <em>AbstractFixture</em> sınıfından miras geliyor ve fixture sınıfının hangi sıralamada çalıştırılacağını ifade ediyor. Fonksiyondan 1 değerinin dönmesi, ilk olarak bu fixture sınıfının çalıştırılacağını belirtiyor.</p>
<p>Yine farklı bir satır olan<em> $this-&gt;addReference(&#8216;admin-user&#8217;, $userAdmin) </em>satırı bu fixture sınıfında $userAdmin nesnesini kullanarak veritabanına kaydettiğimiz kayıt için bir referans oluşturuyor. Bu referansı daha sonra başka bir fixture sınıfında kullanacağız.</p>
<p>Kullanıcı grubu için yaratacağımız fixture sınıfı da şu şekilde:</p>
<pre class="php">// src/Dubluve/TestBundle/ORM/LoadGroupData.php
namespace Dubluve\TestBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Dubluve\TestBundle\Entity\Group;
use Doctrine\Common\Persistence\ObjectManager;</pre>
<pre>class LoadGroupData extends AbstractFixture implements OrderedFixtureInterface</pre>
<pre class="php">{
    public function load(ObjectManager $manager)
{</pre>
<pre class="php">        $groupAdmin = new Group();
        $groupAdmin-&gt;setGroupName('admin');

        $manager-&gt;persist($groupAdmin);
        $manager-&gt;flush();

        $this-&gt;addReference('admin-group', $groupAdmin);
    }

    public function getOrder()
    {
        return 2;
    }
}</pre>
<p>Son olarak da referans oluşturduğumuz bu iki kayıt için ara tabloya kayıt yaratacak fixture sınıfını oluşturuyoruz:</p>
<pre class="php">// src/Dubluve/TestBundle/DataFixtures/ORM/LoadUserGroupData.php
namespace Dubluve\TestBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Dubluve\TestBundle\Entity\UserGroup;
use Doctrine\Common\Persistence\ObjectManager;

class LoadUserGroupData extends AbstractFixture implements OrderedFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $userGroupAdmin = new UserGroup();
        $userGroupAdmin-&gt;setUser($manager-&gt;merge($this-&gt;getReference('admin-user')));
        $userGroupAdmin-&gt;setGroup($manager-&gt;merge($this-&gt;getReference('admin-group')));

        $manager-&gt;persist($userGroupAdmin);
        $manager-&gt;flush();
    }

    public function getOrder()
    {
        return 3;
    }
}</pre>
<p>Bu sınıfları yarattıktan sonra yukarıda yaptığımız gibi ilgili konsol komutunu çalıştırıp, bu kayıtları veritabanına kaydedebiliriz.</p>
<p>Zevkle yazılım geliştireceğiniz günler dilerim!</p>
]]></content:encoded>
			<wfw:commentRss>http://dubluve.net/2012/01/22/symfony-2-veritabani-icin-baslangic-verileri-olusturmak-doctrine-fixtures-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  dubluve.net/category/software/php/doctrine/feed/ ) in 0.60398 seconds, on May 20th, 2012 at 2:41 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 20th, 2012 at 3:41 am UTC -->
