<?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; symfony 2</title>
	<atom:link href="http://dubluve.net/category/software/php/symfony-2/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>Symfony2 &#8211; Ek Kutuphaneleri Yonetmek</title>
		<link>http://dubluve.net/2012/05/03/symfony2-ek-kutuphaneleri-yonetmek/</link>
		<comments>http://dubluve.net/2012/05/03/symfony2-ek-kutuphaneleri-yonetmek/#comments</comments>
		<pubDate>Thu, 03 May 2012 18:20:59 +0000</pubDate>
		<dc:creator>Boğaç Aslanyürek</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[symfony 2]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[symfony bundles]]></category>
		<category><![CDATA[symfony vendors]]></category>
		<category><![CDATA[symfony yeni vendor eklemek]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://dubluve.net/?p=1308</guid>
		<description><![CDATA[Symfony2 için kullanılan ek kütüphaneleriyle tek bir bilgisayarda çalışırsanız sorun yaşamayabilirsiniz. Fakat canlı bir ortama ve ya başka bir yazılımcının bilgisayarına kurmak istediğinizde, hangi kütüphanenin hangi versiyonunu kurduğunuzu unutabilirsiniz ya da zamanla herkes farklı bir versiyona sahip olabilir. Ayrıca ek kütüphane klasörünüz fazlasıyla şişeceği için kullandığınız git deposunda gereksiz yer kaplar. Hataları önlemek ve işleri [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony2 için kullanılan ek kütüphaneleriyle tek bir bilgisayarda çalışırsanız sorun yaşamayabilirsiniz. Fakat canlı bir ortama ve ya başka bir yazılımcının bilgisayarına kurmak istediğinizde, hangi kütüphanenin hangi versiyonunu kurduğunuzu unutabilirsiniz ya da zamanla herkes farklı bir versiyona sahip olabilir. Ayrıca ek kütüphane klasörünüz fazlasıyla şişeceği için kullandığınız git deposunda gereksiz yer kaplar.</p>
<p>Hataları önlemek ve işleri kolaylaştırmak için Symfony2 ile birlikte ek kütüphanelerinizin versiyonlarının yönetildiği bir dosya ve bunun için tek basit bir komutla çalıştırabileğiniz bir program geliştirilmiş. Bu program git versiyon kontrol sistemini kullanıyor, dolayısıyla git sisteminin bilgisayarınızda yüklü olması gerekiyor. Eğer git yüklü değilse Windows&#8217;ta yüklemek için <a title="Setup Git On Windows" href="http://help.github.com/win-set-up-git/" target="_blank">şuradaki</a> talimatları izleyebilirsiniz.</p>
<h4>deps Dosyası ve bin/vendors komutu</h4>
<p>Öncelikle Symfony2 framework <a title="Symfony2" href="http://symfony.com/download" target="_blank">şu adresten</a> ek kütüphaneler olmadan (without vendors) indiriyoruz, arşiv dosyasını açıyoruz. Arşivin açıldığı  klasörde deps ve deps.lock isminde 2 adet dosya göreceksiniz. Deps dosyasındaki her bir blok ek kütüphaneleri göstermekte ve ek kütüphaneler kurmak için kullanacağımız program bu dosyayı okuyor. Deps.lock dosyası ise yüklediğiniz kütüphanenin git tarafından oluşturulan ve o commit&#8217;e ait commit-hash bilgisini (<a title="Git Versiyon Kontrol Sistemine Giriş" href="http://dubluve.net/2012/03/31/git-versiyon-kontrol-sistemine-giris/" target="_blank">burada bahsetmiştim</a>) tutuyor.</p>
<p>Peki yeni bir kütüphane yüklemek için ne yapacağız? Oldukça basit, deps dosyasına yeni bir kayıt gireceğiz. Deps dosyasına göz atarsanız kayıtlar genel olarak şöyledir:</p>
<pre>[FOSUserBundle]
 git=git://github.com/FriendsOfSymfony/FOSUserBundle.git
 target=bundles/FOS/UserBundle
 version=1.2.0</pre>
<p>Bu blokta [] içindeki bilgi ek kütüphanemizin ismini gösterir. Eğer <em>target</em> parametresiyle herhangi bir klasör belirmediyseniz varsayılan olarak burada verilen isimde bir klasör yaratılır ve dosyalar bu klasöre indirilir.</p>
<p><em>git=&lt;git_repo_url&gt; </em>kısmına yazılan adres kısım ek kütüphanenini alınacağı adresi gösterir. Bu adrese git ve http/https ile başlayan kütüphane adreslerini girebilirsiniz. Gerekli olan parametreler aslında bu kadar, fakat diğer parametrelere de göz atalım.</p>
<p><em>target=&lt;vendor_target&gt; </em>kısmında kütüphane dosyalarının indirileceği klasörü giriyoruz. Buraya girilen klasör <em>&lt;proje_klasörü&gt;/vendor</em> altında yaratılıyor.</p>
<p>Son olarak <em>version= &lt;versiyon&gt;</em> kısmında ise bir kütüphane için belli bir versiyon ve ya branch belirtebiliyoruz.</p>
<p>Deps dosyasında kayıtlı olan ek kütüphaneleri indirmek için proje klasörüne geçtikten yapmamız gereken sadece aşağıdaki komutu çalıştırmak:</p>
<pre>php bin/vendors install</pre>
<p>Bu komuttan sonra eğer vendor klasörünüzde hiçbir klasör görmezseniz ve ya klasörleriniz hepsi boşsa, git sistemini işletim sisteminize düzgün kuramamış olabilirsiniz. Eğer bazı kütüphaneler yüklenemiyorsa tekrar denediğinizde bunlar da yüklenecektir. İlk kez çalıştırdığınızda bu işlem zaman alabilir, sabırlı olun <img src='http://dubluve.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Sistem Nasıl İşliyor?</h4>
<p>Peki sistem nasıl işliyor, yukarıdaki komutu çalıştırdığımda neler oluyor diyenler için aşağıdaki şemayı hazırladım. Ek kütüphanelerimiz hayırlı olsun <img src='http://dubluve.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://dubluve.net/wp-content/uploads/2012/05/flow.jpg"><img class="alignnone  wp-image-1311" title="Akış Diyagramı" src="http://dubluve.net/wp-content/uploads/2012/05/flow.jpg" alt="vendors script flowchart" width="493" height="405" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://dubluve.net/2012/05/03/symfony2-ek-kutuphaneleri-yonetmek/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Symfony2- FOSFacebook &#8211; Facebook needs the CURL PHP Extension Hatasi</title>
		<link>http://dubluve.net/2012/04/29/symfony2-fosfacebook-facebook-needs-the-curl-php-extension-hatasi/</link>
		<comments>http://dubluve.net/2012/04/29/symfony2-fosfacebook-facebook-needs-the-curl-php-extension-hatasi/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 10:40:50 +0000</pubDate>
		<dc:creator>Boğaç Aslanyürek</dc:creator>
				<category><![CDATA[symfony 2]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[konsol]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[wamp]]></category>

		<guid isPermaLink="false">http://dubluve.net/?p=1291</guid>
		<description><![CDATA[Symfony2&#8242;de FOSFaceBookBundle yüklemesi yaptıktan sonra, herhangi bir konsol komutu çağırmaya çalıştığımda aşağıdaki hatayı alıyordum. [Exception] Facebook needs the CURL PHP extension. Biraz araştırdığımda, WAMP gibi 3'ü bir yerde kurulumlarda Apache tarafından kullanılan php.ini dosyası ile konsoldan aşağıdaki şekilde çağırdığımız php komutunun farklı php.ini dosyası kullandığını öğrendim. php app/console container:debug Yani wamp&#8217;ın menüsünü kullanarak curl uzantısını [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony2&#8242;de FOSFaceBookBundle yüklemesi yaptıktan sonra, herhangi bir konsol komutu çağırmaya çalıştığımda aşağıdaki hatayı alıyordum.</p>
<pre><code>[Exception] Facebook needs the CURL PHP extension.</code></pre>
<p><code>Biraz araştırdığımda, WAMP gibi 3'ü bir yerde kurulumlarda Apache tarafından kullanılan php.ini dosyası ile konsoldan aşağıdaki şekilde çağırdığımız php komutunun farklı php.ini dosyası kullandığını öğrendim.</code></p>
<pre>php app/console container:debug</pre>
<p>Yani wamp&#8217;ın menüsünü kullanarak curl uzantısını aktifleştirseniz bile aslında konsoldan çağrılan php programının kullandığı php.ini değişmiyor. WAMP için örnek vermek gerekirse, C:\wamp\bin\php\php5.3.8 klasöründeki php.ini dosyasını şu şekilde düzenlemek gerekiyor:</p>
<pre>;extension=php_curl.dll</pre>
<pre><strong>extension=php_curl.dll</strong></pre>
]]></content:encoded>
			<wfw:commentRss>http://dubluve.net/2012/04/29/symfony2-fosfacebook-facebook-needs-the-curl-php-extension-hatasi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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>
		<item>
		<title>Symfony2  Database Migrations &#8211; Veritabanı Değişikliklerini Yönetmek</title>
		<link>http://dubluve.net/2012/01/11/symfony2-database-migrations/</link>
		<comments>http://dubluve.net/2012/01/11/symfony2-database-migrations/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 16:20:10 +0000</pubDate>
		<dc:creator>Boğaç Aslanyürek</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[symfony 2]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[database migrations]]></category>
		<category><![CDATA[symfony framework]]></category>
		<category><![CDATA[symfony öğren]]></category>
		<category><![CDATA[symfony veritabanı]]></category>
		<category><![CDATA[symfony veritabanı değişiklikleri]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://dubluve.net/?p=707</guid>
		<description><![CDATA[Bir süredir PHP framework&#8217;u Symfony2 ile ilgileniyorum. Daha önceki versiyonlarında biz yazılım geliştiricilerin hayatını kurtaran özellikleri olan Symfony2, yeni versiyonuyla daha performanslı, daha basit ve daha esnek bir yapıyla karşımıza çıkıyor. Her ne kadar eski versiyonda olan admin-generator gibi muhteşem araçları henüz &#8220;resmi&#8221; olarak içermese de (bazı geliştiricilerin yüklenebilir ek paketleri var), yeni projelerimizi Dubluve [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Bir süredir PHP framework&#8217;u Symfony2 ile ilgileniyorum. Daha önceki versiyonlarında biz yazılım geliştiricilerin hayatını kurtaran özellikleri olan Symfony2, yeni versiyonuyla daha performanslı, daha basit ve daha esnek bir yapıyla karşımıza çıkıyor. Her ne kadar eski versiyonda olan admin-generator gibi muhteşem araçları henüz &#8220;resmi&#8221; olarak içermese de (bazı geliştiricilerin yüklenebilir ek paketleri var), yeni projelerimizi Dubluve olarak Symfony2&#8242;de geliştirme kararı aldık <img src='http://dubluve.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Daha önceden Ruby On Rails&#8217;ta kullandığım ve çok faydalı bulduğum &#8220;database migrations&#8221; özelliğinin Symfony2&#8242;nin resmi paketlerinden biri olduğunu öğrendiğimde gerçekten çok sevindim. Database migrations, veritabanında sık sık değişiklik olan projelerde, bu değişikliklerin takibini kolaylaştıran ve değişiklikleri tek tek uygulamayı ve geri almayı sağlayan bir özelliktir. Her yapılan değişiklik için bir migration kaydı (Symfony2&#8242;de bu kayıt bir PHP sınıfı, Ruby On Rails&#8217;te Ruby sınıfıdır) oluşturulur. Bu sınıfta genel olarak iki farklı fonksiyon yardımıyla yapılan değişiklik ve geri alma işlemleri tanımlanır.</p>
<h2 style="text-align: justify;">Kurulum</h2>
<p style="text-align: justify;">Symfony2&#8242;de database migrations özelliğini kullanmak için DoctrineMigrationsBundle isimli paketi kurmak gerekiyor. Hali hazırda çalışan bir Symfony2 projemiz olduğunu varsayarak, bu paketi kurabilmek için deps dosyasına aşağıdaki satırları ekliyoruz:</p>
<p><code>[doctrine-migrations]<br />
git=http://github.com/doctrine/migrations.git<br />
[DoctrineMigrationsBundle]<br />
git=http://github.com/symfony/DoctrineMigrationsBundle.git<br />
target=/bundles/Symfony/Bundle/DoctrineMigrationsBundle</code></p>
<p style="text-align: justify;">Daha sonra paket kurulumunun başlaması için, komut satırında proje klasörüne geçiyor ve tüm paketlerin güncellenmesi için ilgili komutu çalıştırıyoruz. Projenin D:\ diskinde olduğunu ve WampServer kullandığımızı varsayıyorum:</p>
<p><code>cd d:\wamp\www\{proje_klasoru}<br />
php bin/vendors install</code></p>
<p style="text-align: justify;">Paket kurulumu tamamlandı, fakat şu an bu paketi projemizde kullanamıyoruz. Paketi projede kullanabilmek için önce bu paketin ait olduğu isim alanını (namespace) projemizin tanımasını sağlamalıyız. Bunun için projemizin app klasöründe yer alan autoload.php dosyasına aşağıdaki şekilde ekleme yapıyoruz:</p>
<pre class="&quot;php">public function registerBundles()
{
$bundles = array(
//...
new Symfony\Bundle\DoctrineMigrationsBundle\DoctrineMigrationsBundle(),
);
}</pre>
<p>Sonrasında paketin yazılım tarafından yüklenmesi için aşağıdaki kodu {proje_klasoru}/app/AppKernel.php dosyasına ekliyoruz:</p>
<pre class="php">
public function registerBundles()
{
    $bundles = array(
        // Burada daha önceden yüklemiş olduğunuz başka paketler olabilir...
        new Symfony\Bundle\DoctrineMigrationsBundle\DoctrineMigrationsBundle(),
    );
}
</pre>
<h2>Paket Kullanımı</h2>
<p style="text-align: justify;">Paketle ilgili tüm ayarlar bitti, şimdi biraz kullanımdan bahsedelim. Öncelikle belirtelim ki, DoctrineMigrationsBundle paketi, Symfony2&#8242;yi komut satırından kullanırken bize ek komutlar sağlıyor. Bu da tabii ki migration kullanmak için büyük kolaylık sağlıyor. Windows komut satırında, projemizin klasöründeyken, aşağıdaki komutu çalıştırarak yeni migration komutlarını görebiliriz:</p>
<pre>php app\console | find "migrations"</pre>
<p style="text-align: justify;">Bu komutlardan örneğin &#8220;status&#8221;, bize şu anki durum hakkında bilgi verir:</p>
<pre>$ php app\console doctrine:migrations:status</pre>
<pre>== Configuration</pre>
<pre>&gt;&gt; Name: Application Migrations
 &gt;&gt; Database Driver: pdo_mysql
 &gt;&gt; Database Name: {veritabani_adi}
 &gt;&gt; Configuration Source: manually configured
 &gt;&gt; Version Table Name: migration_versions
 &gt;&gt; Migrations Namespace: Application\Migrations
 &gt;&gt; Migrations Directory: D:\wamp\www\{proje_klasoru}\app/DoctrineMigrations
 &gt;&gt; Current Version: 2012-01-10 09:00:34 (20120110090034)
 &gt;&gt; Latest Version: 2012-01-10 09:00:34 (20120110090034)
 &gt;&gt; Executed Migrations: 2
 &gt;&gt; Available Migrations: 2
 &gt;&gt; New Migrations: 0</pre>
<p style="text-align: justify;">DoctrineMigrationsBundle paketi, hangi değişikliklerin yapıldığını, şu an projenin hangi değişiklik versiyonunda olduğunu, veritabanında kendi tablolarında tutuyor. Yani tablo değişiklikleri için bir nevi versiyon kontrolü sistemi oluşturuyor. İlk yüklemeden sonra, paketin kendi tabloları henüz veritabanında olmadığı için, bu tabloları oluşturmak gerekiyor. Bu tabloları oluşturmak için komut satırında aşağıdaki komutları çalıştırıyoruz:</p>
<pre>php app\console doctrine:migrations:diff</pre>
<pre>php app\console doctrine:migrations:migrate</pre>
<h2>Yeni Migration Yaratmak</h2>
<p style="text-align: justify;">Paket tabloları yaratıldı. Artık migrations kullanarak tablolarımızda değişiklikler yapabileceğiz. O zaman hemen bir migration sınıfı yaratalım ve içeriğini inceleyelim <img src='http://dubluve.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Yine komut satırında aşağıdaki komutu çalıştırıyoruz:</p>
<pre>php app\console doctrine:migrations:generate</pre>
<p style="text-align: justify;">Yeni bir migration dosyası ve sınıfı projemizin app\DoctrineMigrations klasöründe yaratılmış oldu. Bu dosyada up() ve down() isminde iki fonksiyon bulunuyor. Bu fonksiyonlardan up() ilgili migration uygulandığında yapılacak değişikliği, down() ise bu değişiklik geri alındğında yapılması gerekenleri içeriyor. Bir migration dosyasının içeriği örneğin şu şekilde olabilir:</p>
<pre class="php">&lt; ?php  namespace DoctrineMigrations;  use Doctrine\DBAL\Migrations\AbstractMigration, Doctrine\DBAL\Schema\Schema;  class Version20100416130422 extends AbstractMigration {  	public function up(Schema $schema) {  		$this-&gt;addSql('CREATE TABLE addresses (id INT NOT NULL, street VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB');
	} 

	public function down(Schema $schema) {
		$this-&gt;addSql('DROP TABLE addresses');
	}
}</pre>
<p style="text-align: justify;">Her bir veritabanı değişikliği için yeni bir sınıf üretmek ve ilgili komutları burada tutmak biraz zor gelebilir. Fakat asıl güzel nokta burada ortaya çıkıyor: Symfony2&#8242;de veritabanı değişiklikleri otomatik tespit edilerek ilgili migration dosyası otomatik yaratılıyor. Mesela yeni bir alan ekledik, bunu ilgili entity sınıfına ekliyoruz, fakat migration oluşturmuyoruz. Komut satırından</p>
<p><code>php app\console doctrine:migrations:diff </code></p>
<p>komutunu çalıştırdığımızda, veritabanının mevcut hali ile entity sınıfları karşılaştırılıyor ve değişiklikler migration sınıfı olarak otomatik generate ediliyor. Bize sadece</p>
<p><code>php app\console doctrine:migrations:migrate</code></p>
<p>komutunu çalıştırmak ve yeni değişiklikleri uygulamak kalıyor.</p>
<h2>Eski Bir Migration Anına Dönmek</h2>
<p style="text-align: justify;">Projemizin ilerleyen safhalarında, yaptığımız bazı değişiklikleri geri almamız gerekirse, istediğimiz herhangi bir ana dönmek de oldukça kolay. Yaratılan migration sınıflarının özel bir isimlendirme metodu olduğun fark etmişsinizdir. Bu sınıflar Version{migration_id}.php olarak oluşturulurlar. Buradaki migration_id ilgili değişikliği tekil olarak temsil eder. Eski bir migration anına (örneğin 20120110085916) dönmek için aşağıdaki komutu komut satırında çalıştırmak yeterli:</p>
<pre>php app/console doctrine:migrations:migrate 20120110085916</pre>
<p>İşte bu kadar kolay!</p>
<p style="text-align: justify;">Hem database migration tanımıyla yeni tanışanlar, hem de daha önceden Ruby on Rails gibi framework&#8217;lerde bu özelliği kullanmış olanlar için umarım faydalı olmuştur.<br />
Zevkle yazılım geliştireceğiniz günler dilerim!</p>
]]></content:encoded>
			<wfw:commentRss>http://dubluve.net/2012/01/11/symfony2-database-migrations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  dubluve.net/category/software/php/symfony-2/feed/ ) in 0.72757 seconds, on May 20th, 2012 at 2:42 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 20th, 2012 at 3:42 am UTC -->
