Zend Framework: Modeller ve Görüntüleme kullanarak, en iyi uygulamaları

4 Cevap php

Ben Nesne Tabanlı Programlama nispeten yeni. Ben hemen hemen kavramları anlamak, ancak pratik konuşma, ben gerçekten zor bir zaman hakkında bilgi bulma yaşıyorum nasıl benim Zend Framework uygulamalarında en iyi kullanım Modelleri için.

Özellikle, bir modeli var (ki bir şey uzatmak değil) bir Veritabanı Tablo kullanmak gelmez. Onun korumalı üyeleri erişmek için alıcı ve ayarlayıcıları kullanır. Kendimi iyi görünümde bu modeli nasıl görüntüleneceği ile mücadele bulabilirsiniz. Ben benim görüşüme şablonları mantığı istemiyorum, ama şu durumda kendimi buluyorum:

Benim denetleyicisi:

$object = new Object();
$object->setName('Foo Bar');
$this->view->object = $object;

Benim bakış şablonda:

<h2><?= $this->object->getName() ?></h2>

Gerçekten benim görünümü şablonları işlevlerini çağırarak sevmiyorum ama ben bunu yapmak için daha iyi bir yol bilmiyorum. Ben Model'in üyeleri, kamu olmak istemiyorum, ama temelde aynı sonuçları elde etmek istiyorum:

<h2><?= $this->object->name ?></h2>

Benim denetleyicisi modeli hakkında her şeyi bilmek zorunda tüm işi yapmak istemiyorum:

$object = new Object();
$object->setName('Foo Bar');
$this->view->object = $object;
$this->view->object->name = $object->getName();

Zend Framework modelleri kullanarak en iyi yöntem nedir? Herkes bana Zend Framework Bu Model / View ikilemi anlamanıza yardımcı olacak herhangi bir öğretici tavsiye edebilir misiniz?

4 Cevap

Bir olasılık sihirli __ set ve __ kullanmak için PHP yöntemleri olsun. Ben bu yüzden benim soyut Model sınıf içinde gibi kullanabilirsiniz:

abstract class Model_Abstract
{
    protected $_data;

    // Private Data Members assigned to protected $_data
    public function __construct($data = null)
    {
    	// Makes it so that I can pass in an associative array as well as 
    	// an StdObject.
    	if(!is_object($data)) {
    		$data = (object) $data;
    	}

    	$this->_data = $data;

    }

    public function __get($key)
    {
    	if (method_exists($this, '_get' . ucfirst($key))) {
    		$method = '_get' . ucfirst($key);
    		return $this->$method();			
    	}
    	else {
    		return $this->_data->$key;
    	}	
    }

    public function __set($key, $val)
    {
    	if ( method_exists( $this, '_set' . ucfirst($key) ) ) {
    		$method = '_set' . ucfirst($key);
    		return $this->$method($val);			
    	}
    	else {
    		$this->_data->$key = $val;
    		return $this->_data->$key;
    	}
    }
}


class Model_User extends Model_Abstract
{
    //Example overriding method for the property firstName in the $_data collection.
    protected function _getFirstName()
    {
    	// Do some special processing and then output the first name.
    }
}

Bu gerekli özellikleri için alıcı ve ayarlayıcıları belirtebilirsiniz böylece yapar ama dönmeden önce, her özellik için bunu işleme çeşit yapmak istiyorum sadece olanları Demirbaş işlevleri tanımlamak zorunda kalmamak yapar değer. Örneğin ben kullanıcılar için daha kompakt ve okunabilir biçime (MySQL saklanan gibi) ISO uyumlu tarihleri ​​değiştirmek için yerlerde bir dizi işlevini kullanın.

Bildiğim kadarıyla sizin denetleyicisi yerleştirmek ne kadar, ben senin denetleyicisi içinde yerleştirmek için ne taşıma bazı özel geribildirim için this post bakarak tavsiye ederim.

Bazı onlar yerine otomatik görünüme modelleri yükler ve tamamen denetleyicisi etekleri bir yardımcınız var olacağını hissediyorum. Şahsen ben görünümünde modellerin durumu sık sık (kesinlikle ele alınmalıdır isteği geldi ne bağlıdır çünkü Zend Framework ve PHP çerçevesinde ise kumandadan görünümüne models geçmek için bol duygusu yapar söyleyebilirim kontrol olarak).

Update: yorumlarında eleştirilere başı olarak, ben işaret olur bir şey Active Record ile birlikte harmanlanmış olsa veritabanı erişim katmanı ve etki alanı (veya model) tabakası, gerçekten iki farklı şeyler olmasıdır. Ben süre geri this question bir sordu ve bu konuda bazı yararlı geri bildirim aldık. Eğer modeli ile yapmaya karar ne olursa olsun, ne olursa olsun modeli için veri nereden geldiğini, tüm etki alanı nesneleri için tutarlı bir API sağlamak isteyeceksiniz.

Ben SAEM cevabı tarafından sunulan bir yararı doğrudan görünüm nesnesi için bir veya daha fazla etki alanı nesnelerin özellikleri / fonksiyonu dönüş değerlerini harita yeteneği sunduğu olduğunu varsayalım. Teorik görünümü içinde kullanım sonra bu gibi görünüyor:

// Mapped from Model_User::_data->last_name and Model_User::_data->first_name
$this->name

Sadece diğer geliştiricilerin şablonları ile çalışma olacak ise, ben sadece modellerinde geçen öneriyoruz. İşte MVC bir Jeff Atwood yazılan bir link Understanding Model-View-Controller

Bu özellikle Zend Framework yönelik değil, ama sorun aklımda, oldukça geneldir.

Bu kontrolörün içinde, görünümüne modeli kablolama yerine sert, doğru yolda konum görünüyor. Eğer model bir ton haritalama, veya tekrar tekrar aynı model haritalama konum eğer yerine özellikle önemlidir ki soyut, olurdu.

Basit Bir şey kaçınarak her tekrar aynı şeyi haritalama eğer iyi olurdu haritalama fonksiyonları bir demet, yazmak olacaktır.

Ayrıca kazan plaka kodu yazma, ve daha KURU şeyler tutarak önle, ele daha genel bir çözüm, istedim, ben bir mapper sınıf oluşturma öneririz.

Sen bir model, ya da birkaç model almak ve görünümüne onları haritada hangi bir ViewModelMapper oluşturabilirsiniz.

class ViewModelMapper
{
    public function __construct($view)
    {
        //set the properties
    }

    public function addModel($model, $overrideViewProperty = null)
    {
        //add the model to the list of models to map, use the view's property 
        // name to figure out what to map it to? Allow for an override just in case.
    }

    public function getMappedView()
    {
        //take the view, map all the models
    }
}

Yapabildin sonra örneği bu denetleyici ve kurulum dönüşümler, yani denetleyicisi hala eşleme kontrol, ancak tüm kazan plaka ve kodlama mantığı nadir istisnalar dışında, tüm kontrolör haritalar için, merkezi olduğunu gör.

Modeli mimarisi üzerinde iyi bir okuma için, read this post. Özellikle görünümü hakkında konuşmak değil, ama kesinlikle okumaya değer.

Benim modellerine bir getViewClass() fonksiyonunu ekleyerek sona erdi. Kontrolör aksi erişim olmazdı korumalı değişkenleri almak için bu işlevini çağırır ve görünümü herhangi alıcılar arama hakkında endişelenmenize gerek yok.

//controller
$object = new Object();
$object->setName('Foo Bar');
$this->view->object = $object->getViewClass();

//view template
<h2><?= $this->object->name ?></h2>

Zend Framework işi için daha iyi bir yolu olup olmadığını bilmiyorum, ama bu bir çözümdür.