Zend Framework Doctrine 2 Entegrasyonu

1 Comment

PHP yazanlar için en iyi framework ve en iyi ORM yi entegre edelim.

Kaynak : http://www.oelerich.org/?p=315

Zend Framework ün kurulu olduğunu varsayarak anlatacağım.

Efendim ilk olarak http://www.doctrine-project.org/projects/orm/download adresinden stabil olan Doctrine 2.0 sürümünü indiriyoruz.Daha sonrasında Doctrine dizinini Zend de bulunana library dizini altına koyuyoruz. bin dizinini ise zf nin root dizinine koyuyoruz.

application.ini dosyamızda Doctrine entegrasyonunuda kullanacağımız konfigürasyonları belirtiyoruz.

doctrine.conn.host = '127.0.0.1'
doctrine.conn.user = 'root'
doctrine.conn.pass = root''
doctrine.conn.driv = 'pdo_mysql'
doctrine.conn.dbname = 'zf-test'
doctrine.path.models = APPLICATION_PATH "/models"

Bu ayarlamayı yaptıktan sonra Bootstrap dosyasında belli değişiklikler yapıyoruz. Doctrine kütüphanelerini Bootstrap.php dosyasında yüklüyoruz.Örnek kod aşağıdaki gibidir.

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    /**
     * generate registry
     * @return Zend_Registry
     */
    protected function _initRegistry(){
        $registry = Zend_Registry::getInstance();
        return $registry;
    }

    /**
     * Register namespace Default_
     * @return Zend_Application_Module_Autoloader
     */
    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Default_',
            'basePath'  => dirname(__FILE__),
        ));
        return $autoloader;
    }

    /**
     * Initialize Doctrine
     * @return Doctrine_Manager
     */
    public function _initDoctrine() {
        // include and register Doctrine's class loader
        require_once('Doctrine/Common/ClassLoader.php');
        $classLoader = new \Doctrine\Common\ClassLoader(
            'Doctrine',
            APPLICATION_PATH . '/../library/'
        );
        $classLoader->register();

        // create the Doctrine configuration
        $config = new \Doctrine\ORM\Configuration();

        // setting the cache ( to ArrayCache. Take a look at
        // the Doctrine manual for different options ! )
        $cache = new \Doctrine\Common\Cache\ArrayCache;
        $config->setMetadataCacheImpl($cache);
        $config->setQueryCacheImpl($cache);

        // choosing the driver for our database schema
        // we'll use annotations
        $driver = $config->newDefaultAnnotationDriver(
            APPLICATION_PATH . '/models'
        );
        $config->setMetadataDriverImpl($driver);

        // set the proxy dir and set some options
        $config->setProxyDir(APPLICATION_PATH . '/models/Proxies');
        $config->setAutoGenerateProxyClasses(true);
        $config->setProxyNamespace('App\Proxies');

        // now create the entity manager and use the connection
        // settings we defined in our application.ini
        $connectionSettings = $this->getOption('doctrine');
        $conn = array(
            'driver'    => $connectionSettings['conn']['driv'],
            'user'      => $connectionSettings['conn']['user'],
            'password'  => $connectionSettings['conn']['pass'],
            'dbname'    => $connectionSettings['conn']['dbname'],
            'host'      => $connectionSettings['conn']['host']
        );
        $entityManager = \Doctrine\ORM\EntityManager::create($conn, $config);

        // push the entity manager into our registry for later use
        $registry = Zend_Registry::getInstance();
        $registry->entitymanager = $entityManager;

        return $entityManager;
    }

}


İlk iki metod Doctrine ile ilgili bir işlem yapmıyor. Sadece Zend in Autoloader ve Registry modüllerini oluşturuyor. _initDoctrine metodunda ise gerekli belirtilen konfigürasyonlara göre Doctrine nesnesini oluşturuyoruz.Doctrine e bağlı olarak ArrayCache Proxy ve EntitiyManager oluşturuluyor.Bunları tam olarak incelemediğim için pek yorum yapamıyorum.Kaynakta belirtilen ise ArrayCache performansı daha üst seviyede tutabilmek için Doctrine in cache mekanizması, Proxy sanırım o da incelememiş :) , EntityManager veritabanı ve bizim modellerimiz arasındaki bir interface.Daha detaylı incelediğimde umarım bu konu hakkında da bir yazı yazabilirim :)

Sonrasında bir model yeni adıyla bir entity oluşturuyoruz.

<?php

/**
 * @Entity
 * @Table(name="test123")
 */
class Default_Model_Test
{
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    private $id;

    /** @Column(type="string") */
    private $name;

    public function setName($string) {
        $this->name = $string;
        return true;
    }
}

Doctrine 2 ile gelen yeni bir olay ise model oluşturma veya modelden DB oluşturma işlerini bin adlı dizinden yapabiliyor olmanız.Kaynakta söylendiği gibi bin/doctrine.php dosyasını aşağıdaki şekilde değiştirdim.

<?php

define('APPLICATION_ENV', 'development');

define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

// Doctrine and Symfony Classes
require_once 'Doctrine/Common/ClassLoader.php';
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', APPLICATION_PATH . '/../library');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Symfony', APPLICATION_PATH . '/../library/Doctrine');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH . '/models');
$classLoader->setNamespaceSeparator('_');
$classLoader->register();

// Zend Components
require_once 'Zend/Application.php';

// Create application
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

// bootstrap doctrine
$application->getBootstrap()->bootstrap('doctrine');
$em = $application->getBootstrap()->getResource('doctrine');

// generate the Doctrine HelperSet
$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
    'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
    'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));

\Doctrine\ORM\Tools\Console\ConsoleRunner::run($helperSet);

Sonrasında oluşturduğum bin dizinine giderek doctrine i executable yapıyorum.

chmod +x ./doctrine

Şu şekilde de modelden veritabanını oluşturuyorum.Pardon entitiy den :)

./doctrine orm:schema-tool:create

Kullanımı da şu şekilde oluyor :

<?php

class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        $registry = Zend_Registry::getInstance();
        $this->_em = $registry->entitymanager;
    }

    public function indexAction()
    {
        $testEntity = new Default_Model_Test;
        $testEntity->setName('Zaphod Beeblebrox');
        $this->_em->persist($testEntity);
        $this->_em->flush();
    }

}

Fakat siz de benim gibi ters bir adamsanız şöyle birşeye ihtiyaç duyacaksınız.”İşte efendim ben DB yi oluşturayım entitiyler buna göre oluşsun” der iseniz eğer şunu yapıyoruz.

./doctrine orm:convert-mapping --from-database php /tmp/
Böylece /tmp dizinine tablolarınızın php çıktısını alabilirsiniz.Aynı şekilde ph p yerine yaml ve xml de alabiliyorsunuz.Bunun için php yerine xml veya yaml yazmanız yeterli.
İyi gönler efendim… :)

Zend Framework ile subdomainlerinizi ilgili modüllere yönlendirin

No Comments

Gecenin saat 2 sinde beni bu yazıyı yazmay iten şey inat etmemdir :) Efendim geleim konuya.Diyelim li domainim.com adında bir domaininz olsun.Zend Framework ile kodlamışsınız bir güzel. İşte bunun mobil versiyonunu yaptınız, servisler modülü falan var admin i var falan filan işte tüm bu modüllerin ayrı domainlerde hizmet vermesini istiyorsunuz.İşte tam bu konuda Zend_Router devreye giriyor.Bilmeyene bela öğrenene sefa hesabı.1 saatlik araştırmalarım sonucunda yine çözümü stackoverflow da bulldum.** Bu siteyi yapanlardan Allah razı olsun :)

Gelelim koda application.ini dostama şu satırları ekledim (Bu arada benim domainim cevremdenevar.com ve bunun mobile modülünü farklı bir domain ile hizmete sunacağım.)

resources.router.routes.mobile.type = “Zend_Controller_Router_Route_Hostname”
resources.router.routes.mobile.route = “mobile.cevremdenevar.com”
resources.router.routes.mobile.chains.list.route = “:controller/:action/*”
resources.router.routes.mobile.defaults.module = “mobile”
resources.router.routes.mobile.defaults.controller = “index”
resources.router.routes.mobile.defaults.action = “index”

resources.router.routes.mobile.type = “Zend_Controller_Router_Route_Hostname”
resources.router.routes.mobile.route = “mobile.cevremdenevar.com”
resources.router.routes.mobile.chains.list.route = “:controller/:action/*”
resources.router.routes.mobile.defaults.module = “mobile”
resources.router.routes.mobile.defaults.controller = “index”
resources.router.routes.mobile.defaults.action = “index”

Efendim olay budur.Ne .htaccess iniz ile ne de bootstrap iniz in ayarları ile oynamayınız.Bu arkadaş bunu hallediyor.Yani boşa işte domain i . lardan explode edip işte onu buraya route edip falan filan bilmem ne gibi şeylerle uğraşmayınız.Değerli vaktinize yazık…

Stallman

No Comments

Bu haftasonu değerli dostlarım ile Stallman ı dinlemeye gittik.Türkiye ye 2. kez gelen Richard Stallman GNU nun yaratıcısı.Açıkçası konu çok teknik değildi.Fakat farkettimki gerçek bir anlam karmaşası yaşadığımız konularda  ve aslında doğru bildiğimiz yanlış konusunda bizleri aydınlattı kendisi.

Konu yazılım lisanları ve lisanların tehlikeleriydi.Başkan yine ufkumuzu gelnişletti. Mikrozoft la savaşın IBM le zavaşın dedi.Aslında pekte güzel şeyler söyledi :)

Özeti şöyle : http://www.gnu.org/music/free-software-song.html

Sanırım Bilmök ün sayfasından sunumu izleyebilirsiniz.

İlk Arabam C4

2 Comments

Bilmiyorum belki Getz den C4 e geçiş yaptığımdan dolayı düyanın en iyi arabasına binmiş gibi hissediyorum kendimi bugünlerde.Getz bana ait değildi ve ilk arabam C4 yani bana ait olan ilk arabam.

Bir kere Citroen alacaklara yada düşünenlere ilk tavsiyem kimseye kulak asmamaları.Zira etrafta o kadar çok boş konuşan adam var ki ağzı olan konuşuyor  un tam anlamını hakkıyla teslim ediyor.Mesela amcam hiç Citroen kullanmamış ama direk “Citroen çok kötü abi” diyebiliyor.”NEDEN ?” sorusuna cevabı ilginç “Bizim arkadaşta vardı bozuldu.Oradan biliyorum.” :) Yahu arabanın bozulması kadar doğal bir durum yok.Bir de şöyleleri vardır.Amcam hayatı boyunca otomatik vites dışında araba kullanmamıştır.Manuel kullanmayı bilmiyordur.Ama büyük araba otoritesidir.”Citroen kötü yaa..!” :) LA havle ….

Gelelim aracın bende bıraktığı ilk izlenime.Arabalardan ciddi anlamda çok anlamam.Araç dizel olmasına rağmen dizellerdeki motor gürültüsü yok.Bu en  sevindiğim nokta.Aracın tasarımı ve görünüşü oldukça iyi.Ama biraz Audi taklidi olmuş gibi geldi bana.Fakat bu durum beni rahatsız etmedi.

İç dizayn ve konforu sınıfından beklenmeyecek kadar iyi.Gece sürüş modu kullanışlı ve analog dijital göstergeler çok şık.Kullanılabilirlik harika.

Motor olayın gelirsek; dediğim gibi gürültüsüz ve performanslı bir motora sahip.92 HP 1.6 18000 devirde turbosu devreye giriyor gazı köklediğiniz zaman ve cidden altınızdaki gücü hissedebiliyorsunuz.Araç kalıbına göre oldukça atik.Klima açık konumda yokuşta kalkarken boğulma olayı olmuyor.

Beklediğimden çok daha üst düzey bir performans aldım diyebilirim.Servis ve diğer olayları kullandıkça göreceğim.Son sözüm eğer yeni bir C4 alma konusunda tereddütler yaşıyorsanız  haklısın aynılarını bende yaşadım.Ama kessinlikle hakkını veriyor.Şiddetle tavsiye ederim.

Ubuntu 10.04 te apttitude sorunu

No Comments

Laptop um bozulunca uzun zamandır yüzüne bakmadığım :) desktop umu kullanmak zorunda kaldım.Tabi üzerinde çalıştığım projeler için yeni bişeyler kurmam gerek malum uzun zamandır kullanmamışım.Önce bir upgrade edelim

apt-get distpugrade

Fakat o da ne :!! :S

mustafa@mustafa-desktop:~$ apt-get dist-upgrade
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
mustafa@mustafa-desktop:~$ sudo apt-get dist-upgrade
Reading package lists... Error!
E: Dynamic MMap ran out of room. Please increase the size of APT::Cache-Limit. Current value: 25165824. (man 5 apt.conf)
E: Error occurred while processing x11-xserver-utils (NewFileVer1)
E: Problem with MergeList /var/lib/dpkg/status
W: Unable to munmap
E: The package lists or status file could not be parsed or opened.

Biraz araştırdım ettim falan şöylede güzel bişey buldum.

sudo touch /etc/apt/apt.conf.d/30cache
#add
APT::Cache-Limit "125829120";

Derdimi çözdü mü ?

Evet çözdü…

Python Notlarım (Part I)

1 Comment

Bir hevestir Python a öyle bakayım  istedim.İlk edindiğim izlenim farklı ama güzel.Öncelikle ilk edindiğim bilgileri  hatırlanabilir olması için bloguma yazmak istedim.

Şu anda Python bir geçiş dönemi yaşıyor gibi PHP 4 5 gibi python da da 2 ve 3 versiyonu var her iki versiyonu da apt-get ile kurmak çok kolay.Bunlara ek olarak Python için interactive prompt diye bir olay var ki işte öğrenirken ve denemeler yaparken bu olayı çok seviyorsunuz.Anında görüntü şov.Bunu yapabilmek için console a python komutu ile geçmek mümkün.

İlk olarak script1.py isminde bir dosyaya şunları yazdım :

#A first Python Script
import sys
print (sys.platform)
print (2 ** 5)
x = 'Spam!'
print (x * 8

Bu dosyayı  “python script1.py” şeklinde çalıştırabiliyorum.Import olayına gelince.

threenames.py adlı bir dosya oluşturup şunları yazdım.

a = 'dead'
b = 'parrot'
c = 'sketch'
print(a, b, c)
# Define three attributes
# Exported to other files
# Also used in this file

Oluşturduğunuz her py dosyası bir module oluyor. modul.attr şeklinde erişimi mümkün.

% python
>>> import threenames
dead parrot sketch
>>>
>>> threenames.b, threenames.c
('parrot', 'sketch')
>>>
>>> from threenames import a, b, c
>>> b, c
('parrot', 'sketch')

PHP Web Güvenliği

No Comments

Şöyle bir yazı buldum paylaşmak istedim.Gayet güzel ve açıklayıcı bir şekilde temel PHP güvenliğini anlatmış.

Git Üzerine

No Comments

Git versiyonlama sisteminde krınik olarak karşılaştığım ve her seferinde çözümünü aramak zorunda kaldığım şeyleri sonunda buraya yazmaya karar verdim.
Öncelikle bir depoyu clone lamak…
git clone git@github.com:depoadı.git
Bu şekilde bir depoyu oulşturabiliriz.Remote taki bir branch ta çalışmak için ise:
git checkout -b  branch-adi origin/branch-adi
kullanılıyor.Şimdilik bu kadar .Yeni sorunlarla karşılaştıkça bu yazıyı geliştirmeyi düşünüyorum

Git versiyonlama sisteminde krınik olarak karşılaştığım ve her seferinde çözümünü aramak zorunda kaldığım şeyleri sonunda buraya yazmaya karar verdim.
Öncelikle bir depoyu clone lamak…

git clone git@github.com:depoadı.git

Bu şekilde bir depoyu oulşturabiliriz.Remote taki bir branch ta çalışmak için ise:
git checkout -b  branch-adi origin/branch-adikullanılıyor.Şimdilik bu kadar .Yeni sorunlarla karşılaştıkça bu yazıyı geliştirmeyi düşünüyorum

Kızıyorum Ama…

2 Comments

Bu h****r denilen firmadan kendinme bir sunucu almıştım.Amcamlar bozuk diski çakınca bna sorun üzerine sorun.Zaten hiç iyi olmadığım bir konu sunucu yönetimi birde böyle sorunlar yaşayınca iyice tiksindim.Bu yüzden blogum bir süreliğine kapalıydı.Şimdi linode a gçetim bakalım.İnşallah burada dikiş tutturabilirim.

Yılın müzik videosu

No Comments

Bu adamlar harbi çok iyi.Geldikleri kültürün dışında bu işin eğitimini de almışlar sanki.Dinledikçe dinleyesim geliyor.

İşte bu da linki: http://www.facebook.com/video/video.php?v=446528778800

İyi seyirler…

Older Entries