Developersland

Teknoloji ve Yazılım Blogu

  • Yazıtipi boyutunu arttır
  • Varsayılan yazıtipi boyutu
  • Yazıtipi boyutunu azaltır

Zend Framework 2 Tutorial

zend framework 2Bu tutorial Php 5.3.10 versiyonu kullanılarak hazırlanmıştır. Zend Framework 2 kullanımını anlamak amacıyla örnek bir albüm uygulaması geliştireceğiz. Öncelikle projemizi ayağa kaldırmamız gerekiyor. Bunun için daha önce yazdığım Zend Framework 2 projenin ayağa kaldırılması isimli yazımı okuyabilirsiniz. zend Framework 2 MVC tasarım şablonunu kullanmaktadır bu nedenle size önerim MVC tasarım şablonuyla ilgili biraz ön bilgi edinmenizdir.
Örnek Projeyi buradan indirebilirsiniz.

Projemizi ayağa kaldırdıktan sonra artık örnek uygulamamızı geliştirmeye başlayabiliriz. Projemizde 4 işlem gerçekleştirmeye çalışacağız. Bunlar:

  • Albümlerin Listelenmesi

  • Yeni Albüm Ekleme

  • Albüm Düzenleme

  • Albüm Silme




Projemizi Zend Framework 2 standartlarına uygun olarak onların sunduğu iskelet yapıya uygun olarak geliştireceğiz.Yapımız en başta aşağıdaki gibidir.

zendframework2 proje yapısı

Yapacağımız Albüm uygulamasını bir modül olarak geliştireceğiz. Bu nedenle gerekli altyapıyı oluşturmamız gerekiyor öncelikle. Zend Framework 2 standartlarına sadık kalarak şu şekilde bir iskelet yapı oluşturalım.

zendframework2 modül ekleme

Projemizin son hali aşağıda gördüğünüz gibi olacaktır.

zendframework2

Şimdi bu dosyaların teke tek ne anlama geldiklerini açıklama çalışarak devam edelim.

Module.php

Zend Framework 2 de ModuleManager bulunmaktadır.ModuleManager modülü yüklemek ve yapılandırmak amacıyla Module.php dosyasına bakmaktadır. Bu dosyanın esas amacı bazı konfigürasyon ayarlarının bulunduğu dosyaların yolunu göstermektir. Bu dosyalar arasında module.config.php, autoload_classmap.php gibi dosyalar bulunmaktadır. Dosyamızın içi şu şekildedir.

<?php

namespace Album;

// module/Album/Module.php

use Album\Model\AlbumTable;

class Module {

    public function getAutoloaderConfig() {

        return array(

            'Zend\Loader\ClassMapAutoloader' => array(

                __DIR__ . '/autoload_classmap.php',

            ),

            'Zend\Loader\StandardAutoloader' => array(

                'namespaces' => array(

                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,

                ),

            ),

        );

    }


    public function getConfig() {

        return include __DIR__ . '/config/module.config.php';

    }

    public function getServiceConfig() {

        return array(

            'factories' => array(

                'Album\Model\AlbumTable' => function($sm) {

                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');

                    $table = new AlbumTable($dbAdapter);

                    return $table;

                },

            ),

        );

    }

}

?>


autoload_classmap.php

Geliştirme aşamasında olduğumuzdan dolayı dosyalarımızı classmap aracılığıyla yüklememize gerek yoktur. Bu nedenle bu dosyada şu an için sadece boş bir dizi döndürüyoruz.


<?php

// module/Album/autoload_classmap.php:

return array();

?>


module.config.php

Projemizin konfigürasyon ayarlarının bir kısmı bu dosyada bulunmaktadır. Geriye bütün ayarların bulunduğu diziyi döndürür.
Burada sayfalara erişilmeye çalışılırken url'lerin hangi formatta olduğu da belirtilmektedir. www.projemiz.com/album şeklinde projemize erişeceğiz. 
www.projemiz.com/album/add şeklinde yeni makale ekleyeceğiz burada add kelimesi hangi actionun çalıştırılacağını belirtmektedir diğer actionlarımız ise edit ve delete olacaktır.

URLPageAction
/albumHome (list of albums)index
/album/addAdd new albumadd
/album/edit/2Edit album with an id of 2edit
/album/delete/4Delete album with an id of 4delete

Contoller, View gibi önemli sınıfların konumları bu dosyada belirtilmektedir.İçeriği aşağıdaki gibidir:


<?php

// module/Album/config/module.config.php:

return array(

    'controllers' => array(

        'invokables' => array(

            'Album\Controller\Album' => 'Album\Controller\AlbumController',

        ),

    ),

    'router' => array(

        'routes' => array(

            'album' => array(

                'type' => 'segment',

                'options' => array(

                    'route' => '/album[/:action][/:id]',

                    'constraints' => array(

                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',

                        'id' => '[0-9]+',

                    ),

                    'defaults' => array(

                        'controller' => 'Album\Controller\Album',

                        'action' => 'index',

                    ),

                ),

            ),

        ),

    ),

    'view_manager' => array(

        'template_path_stack' => array(

            'album' => __DIR__ . '/../view',

        ),

    ),

);

?>

application.config.php

Buradaki application.config.php dosyasında yeni modülümüzü tanıtmamız gerekmektedir.


<?php

return array(

    'modules' => array(

        'Application',

        'Album',         <-- Bu satırı ekleyelim

    ),

    'module_listener_options' => array(

        'config_glob_paths'    => array(

            'config/autoload/{,*.}{global,local}.php',

        ),

        'module_paths' => array(

            './module',

            './vendor',

        ),

    ),

);

?>

AlbumController.php

Uygulamamızın iş mantığını burada gerçekleştireceğiz.Temel olarak listeleme, ekleme, düzenleme ve silme olmak üzere 4 işlem gerçekleştirmemiz gerektğinden bu işlerin her birini ayrı ayrı yapacak 4 metodumuz bulunmaktadır. Bunlar addActiın, editAction, IndexAction ve deleteAction metodlarıdır. getAlbumTable metodu listeleme amacıyla bize yardımcı olacak metoddur yani IndexAction içerisinde kullanacağız bu metodu. İçerisi şu şekildedir: 


<?php

// module/Album/src/Album/Controller/AlbumController.php:

namespace Album\Controller;

use Zend\Mvc\Controller\AbstractActionController;

use Zend\View\Model\ViewModel;

use Album\Model\Album;

use Album\Form\AlbumForm;

class AlbumController extends AbstractActionController {

    protected $albumTable;

    public function indexAction() {

        return new ViewModel(array(

                    'albums' => $this->getAlbumTable()->fetchAll(),

                ));

    }


    public function editAction() {

        $id = (int) $this->params()->fromRoute('id', 0);

        if (!$id) {

            return $this->redirect()->toRoute('album', array(

                        'action' => 'add'

                    ));

        }

        $album = $this->getAlbumTable()->getAlbum($id);


        $form = new AlbumForm();

        $form->bind($album);

        $form->get('submit')->setAttribute('value', 'Edit');


        $request = $this->getRequest();

        if ($request->isPost()) {

            $form->setInputFilter($album->getInputFilter());

            $form->setData($request->getPost());


            if ($form->isValid()) {

                $this->getAlbumTable()->saveAlbum($album);


                // Redirect to list of albums

                return $this->redirect()->toRoute('album');

            }

        }


        return array(

            'id' => $id,

            'form' => $form,

        );

    }


    public function deleteAction() {

        $id = (int) $this->params()->fromRoute('id', 0);

        if (!$id) {

            return $this->redirect()->toRoute('album');

        }


        $request = $this->getRequest();

        if ($request->isPost()) {

            $del = $request->getPost('del', 'No');


            if ($del == 'Yes') {

                $id = (int) $request->getPost('id');

                $this->getAlbumTable()->deleteAlbum($id);

            }


            // Redirect to list of albums

            return $this->redirect()->toRoute('album');

        }


        return array(

            'id' => $id,

            'album' => $this->getAlbumTable()->getAlbum($id)

        );

    }


    public function getAlbumTable() {

        if (!$this->albumTable) {

            $sm = $this->getServiceLocator();

            $this->albumTable = $sm->get('Album\Model\AlbumTable');

        }

        return $this->albumTable;

    }


    public function addAction() {

        $form = new AlbumForm();

        $form->get('submit')->setValue('Add');


        $request = $this->getRequest();

        if ($request->isPost()) {

            $album = new Album();

            $form->setInputFilter($album->getInputFilter());

            $form->setData($request->getPost());


            if ($form->isValid()) {

                $album->exchangeArray($form->getData());

                $this->getAlbumTable()->saveAlbum($album);


                // Redirect to list of albums

                return $this->redirect()->toRoute('album');

            }

        }

        return array('form' => $form);

    }

}

?>

Kullanıcı Arayüzünün oluşturulması

Kullanıcıyla etkileşim kurmak amacıyla uygulamamızın her bir fonksiyonu için arayüzler oluşturmamız gerekmektedir. Bu amaçla hem .phtm uzantılı 4 dosya oluşturacağız. Projemizin son halinin verildiği resimden bu dosyaları nereye koyacağımıza bakabilirsiniz. Bu dosyaların içerikleri aşağıdaki gibidir:

index.phtml


<?php

// module/Album/view/album/album/index.phtml:


$title = 'My albums';

$this->headTitle($title);

?>

<h1><?php echo $this->escapeHtml($title); ?></h1>


<p><a href="/<?php echo $this->url('album', array(

        'action'=>'add'));?>">Add new album</a></p>


<table class="table">

<tr>

    <th>Title</th>

    <th>Artist</th>

    <th>&nbsp;</th>

</tr>

<?php foreach($albums as $album) : ?>

<tr>

    <td><?php echo $this->escapeHtml($album->title);?></td>

    <td><?php echo $this->escapeHtml($album->artist);?></td><td>

        <a href="/<?php echo $this->url('album',

            array('action'=>'edit', 'id' => $album->id));?>">Edit</a>

        <a href="/<?php echo $this->url('album',

            array('action'=>'delete', 'id' => $album->id));?>">Delete</a>

    </td>

</tr>

<?php endforeach; ?>

</table>


add.phtml


<?php


$title = 'Add new album';

$this->headTitle($title);

?>

<h1><?php echo $this->escapeHtml($title); ?></h1>

<?php

$form = $this->form;

$form->setAttribute('action', $this->url('album', array('action' => 'add')));

$form->prepare();


echo $this->form()->openTag($form);

echo $this->formHidden($form->get('id'));

echo $this->formRow($form->get('title'));

echo $this->formRow($form->get('artist'));

echo $this->formSubmit($form->get('submit'));

echo $this->form()->closeTag();



delete.phtml


<?php

// module/Album/view/album/album/delete.phtml:


$title = 'Delete album';

$this->headTitle($title);

?>

<h1><?php echo $this->escapeHtml($title); ?></h1>


<p>Are you sure that you want to delete

    '<?php echo $this->escapeHtml($album->title); ?>' by

    '<?php echo $this->escapeHtml($album->artist); ?>'?

</p>

<?php

$url = $this->url('album', array(

    'action' => 'delete',

    'id'     => $this->id,

));

?>

<form action="<?php echo $url; ?>" method="post">

<div>

    <input type="hidden" name="id" value="<?php echo (int) $album->id; ?>" />

    <input type="submit" name="del" value="Yes" />

    <input type="submit" name="del" value="No" />

</div>

</form>



edit.phtml


<?php

// module/Album/view/album/album/edit.phtml:


$title = 'Edit album';

$this->headTitle($title);

?>

<h1><?php echo $this->escapeHtml($title); ?></h1>


<?php

$form = $this->form;

$form->setAttribute('action', $this->url(

    'album',

    array(

        'action' => 'edit',

        'id'     => $this->id,

    )

));

$form->prepare();


echo $this->form()->openTag($form);

echo $this->formHidden($form->get('id'));

echo $this->formRow($form->get('title'));

echo $this->formRow($form->get('artist'));

echo $this->formSubmit($form->get('submit'));

echo $this->form()->closeTag();


Veritabanı 

Veritabanımızı oluşturalım örnek uygulamamız için.


CREATE TABLE album (
  id int(11) NOT NULL auto_increment,
  artist varchar(100) NOT NULL,
  title varchar(100) NOT NULL,
  PRIMARY KEY (id)
);
INSERT INTO album (artist, title)
    VALUES  ('The  Military  Wives',  'In  My  Dreams');
INSERT INTO album (artist, title)
    VALUES  ('Adele',  '21');
INSERT INTO album (artist, title)
    VALUES  ('Bruce  Springsteen',  'Wrecking Ball (Deluxe)');
INSERT INTO album (artist, title)
    VALUES  ('Lana  Del  Rey',  'Born  To  Die');
INSERT INTO album (artist, title)
    VALUES  ('Gotye',  'Making  Mirrors');


Album.php

Album için bir sınıf oluşturduk. Buradaki getInputFilter metodu daha sonra form yapısında kullanılacaktır.

<?php

namespace Album\Model;

use Zend\InputFilter\Factory as InputFactory;

use Zend\InputFilter\InputFilter;

use Zend\InputFilter\InputFilterAwareInterface;

use Zend\InputFilter\InputFilterInterface;

class Album implements InputFilterAwareInterface {

    public $id;

    public $artist;

    public $title;

    protected $inputFilter;

    public function exchangeArray($data) {

        $this->id = (isset($data['id'])) ? $data['id'] : null;

        $this->artist = (isset($data['artist'])) ? $data['artist'] : null;

        $this->title = (isset($data['title'])) ? $data['title'] : null;

    }


    public function getArrayCopy() {

        return get_object_vars($this);

    }


    public function setInputFilter(InputFilterInterface $inputFilter) {

        throw new \Exception("Not used");

    }


    public function getInputFilter() {

        if (!$this->inputFilter) {

            $inputFilter = new InputFilter();

            $factory = new InputFactory();


            $inputFilter->add($factory->createInput(array(

                        'name' => 'id',

                        'required' => true,

                        'filters' => array(

                            array('name' => 'Int'),

                        ),

                    )));


            $inputFilter->add($factory->createInput(array(

                        'name' => 'artist',

                        'required' => true,

                        'filters' => array(

                            array('name' => 'StripTags'),

                            array('name' => 'StringTrim'),

                        ),

                        'validators' => array(

                            array(

                                'name' => 'StringLength',

                                'options' => array(

                                    'encoding' => 'UTF-8',

                                    'min' => 1,

                                    'max' => 100,

                                ),

                            ),

                        ),

                    )));


            $inputFilter->add($factory->createInput(array(

                        'name' => 'title',

                        'required' => true,

                        'filters' => array(

                            array('name' => 'StripTags'),

                            array('name' => 'StringTrim'),

                        ),

                        'validators' => array(

                            array(

                                'name' => 'StringLength',

                                'options' => array(

                                    'encoding' => 'UTF-8',

                                    'min' => 1,

                                    'max' => 100,

                                ),

                            ),

                        ),

                    )));


            $this->inputFilter = $inputFilter;

        }


        return $this->inputFilter;

    }


}

?>


AlbumTable.php

Veritabanında bulunan Album tablosuna karşılık gelen işlemleri bu sınıf vasıtasıyla gerçekleştireceğiz.


<?php

namespace Album\Model;


use Zend\Db\Adapter\Adapter;

use Zend\Db\ResultSet\ResultSet;

use Zend\Db\TableGateway\AbstractTableGateway;


class AlbumTable extends AbstractTableGateway

{

    protected $table ='album';


    public function __construct(Adapter $adapter)

    {

        $this->adapter = $adapter;

        $this->resultSetPrototype = new ResultSet();

        $this->resultSetPrototype->setArrayObjectPrototype(new Album());

        $this->initialize();

    }


    public function fetchAll()

    {

        $resultSet = $this->select();

        return $resultSet;

    }


    public function getAlbum($id)

    {

        $id  = (int) $id;

        $rowset = $this->select(array('id' => $id));

        $row = $rowset->current();

        if (!$row) {

            throw new \Exception("Could not find row $id");

        }

        return $row;

    }


    public function saveAlbum(Album $album)

    {

        $data = array(

            'artist' => $album->artist,

            'title'  => $album->title,

        );

        $id = (int)$album->id;

        if ($id == 0) {

            $this->insert($data);

        } else {

            if ($this->getAlbum($id)) {

                $this->update($data, array('id' => $id));

            } else {

                throw new \Exception('Form id does not exist');

            }

        }

    }


    public function deleteAlbum($id)

    {

        $this->delete(array('id' => $id));

    }

}

?>

Projemizi çalıştırabiliriz. Projeyi çalıştırdığınızda karşınıza aşağıdaki gibi ekran gelecektir.
zendframeworkarayuz.png





KAYNAK: http://framework.zend.com/manual/2.0/en/user-guide/skeleton-application.html

 

Yorumlar  

 
0 #1 ahmet 20-11-2012 21:52
örnek uygulama için teşekkürler ek olarak
aşağıdaki dosyada veritabanı ayarlarını yapabilir
//config/autoload/global.php:
return array(
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=test;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR _INIT_COMMAND => 'SET NAMES \'UTF8\''
),
'username' => 'root',
'password' => '',
),

'service_manager ' => array(
'factories' => array(
'Zend\Db\Adapter \Adapter'
=> 'Zend\Db\Adapter \AdapterService Factory',
),
),
);

yada dönecek array değerini dosyalara bölebilirsiniz

ancak bunun için
//config/autoload/ burada oluşturacağınız herhangi bir dosya ismini
//application.config.php
'config_glob_pat hs' => array(
'config/autoload/{,*.}{global,local} .php',
),
{global,local} gibi buraya ek olarak tanımlanması gerekmektedir örneğin
//config/autoload/local.php olarak bölmek istersek

şöyle bir tablo ortaya çıkar ve tanımlandığı için işleme koyulur
Alıntı
 

Yorum ekle


Güvenlik kodu
Yenile