MVC: Sorgu sonuçları üzerinden bir görünüm döngü Can?

4 Cevap php

Ben MVC yeniyim. Sen uyardı ...

Ben bir kontrolöre bir MySQL sonuç dönebilirsiniz Kullanıcı modeli var. Kontrolör MySQL görüntülemek için görünüme üzerinde kaynak geçer. Bir veritabanı sonuç getirilirken fonksiyonunu kullanarak, görünümünde sorgu sonuçlarını yazdırmak için kabul edilebilir mi?

<?php while($row = some_fetching_function($database_result_resource): ?>
<tr>
   <td><?=$row['Username']?></td>
   ...etc
</tr>
<?php endwhile; ?>

Bu bana doğru görünmüyor. Bu sıkı, doğru birleştiğinde oluyor? Model veritabanı kaynak bir tür dönmeli ve görünümü bu döngü veritabanı getiriliyor yöntemin bazı türünü kullanarak zorundadır. Bu iki sonuç döngü olmadan ayrılacaklar miyim? Ben görünümünde daha sonra tekrar sonuçların bir dizi oluşturmak için model sonuçları döngü var ve olacaktır düşünüyorum.

Özetle:

  1. MVC tasarım deseni kalarak görünümü, bir veritabanı sonucu kaynak gösterebilir miyim?
  2. Bir veritabanına sıkı bağlantı kaçınarak, iki veri döngü önlemek mümkün mü?

4 Cevap

Soyut uzakta kod veritabanı kısmı bence eğer kabul edilebilir. Örneğin, ilerleyen bir "satır kümesi" (iterable arabirimini veya bir şey uygulamak) sağlayabilir. Perde arkasında, bu nesne bir veritabanı sonuç içeren ve getiriliyor işlevini kullanabilirsiniz.

Temelde fikir, bir veritabanı veya başka bir kaynaktan geliyor anlamına gelmez bir genel görünümlü satır, ve bu yol ile görünümü fırsatlar odaklanırken azaltmak olmasıdır.

Tabii ki olabilir. Ama aslında görünümünde satırlarını gerekir. Sizin denetleyicisi modeli veri ataması yapmak, ancak doğrudan görünümünde. Yaşasın Im Helping işaret ettiği gibi, veri getiriliyor kullandığınız Modeli bağlıdır. Ama sizin görünümünde herhangi Veritabanı özel yöntemler veya model mantığı olmamalıdır. Model genel Iterator arabirimini uygulayan Eğer görünümüne doğrudan geçebileceği.

<?php
public function someControllerAction($params)
{
    $myModel = Model::getModel('Model Name');
    // But you don't do Model::getModel('Model Name')->getResults($params['date']) in your viewa
    $this->view->rows = $myModel->getResults($params['date']);
}
?>

Jani dediği gibi, muhtemelen Standard PHP Kitaplığı'ndan iterable arabirimini uygulayan bir sınıf MySQL sonuç sarılmalıdır. Sadece bir diziye koymak için sonuçlar üzerinde iki kez yinelemek zorunda değil ise bu şekilde sizin bakış, tanıdık ve genel foreach yapı kullanabilirsiniz.

SPL

class rswrap implements Iterator
{
    var $rs;
    var $current;

    function __construct($rs)
    {
        $this->rs = $rs;
    }

    function rewind()
    {
        // do nothing
    }

    function next()
    {
        $this->current = some_fetching_function($this->rs);
    }

    function current()
    {
        return $this->current;
    }

    function valid()
    {
        return $this->current !== false;
    }

    function key()
    {
        return 0; // usually sufficient but you may want to write a real key function.
    }
}

$resultset = new rswrap($database_result_resource);

foreach($resultset as $row)
{
    // your code here
}

Ben en iyi yolu, soyut nesnelerin bir liste halinde SQL sorgusu sonuçları olduğunu düşünüyorum ve listesini döndürür.

Bir Satır Set de-çiftlerin yineleme kullandığınız belirli veritabanı bağlantısı görünümü sanmıyorum. Görünümü kullanılan veritabanı bağlantısı thats bağımsız olmalıdır. Eğer JDBC kullanmak veya hazırda ya da ne karar verirseniz geçiş görünümüne değişiklik gerektirmez.