الإطار زند:باستخدام نماذج وجهات النظر وأفضل الممارسات [مغلقة]

StackOverflow https://stackoverflow.com/questions/603935

  •  03-07-2019
  •  | 
  •  

سؤال

أنا جديدة نسبيا إلى البرمجة الشيئية.أنا إلى حد كبير في فهم المفاهيم ، ولكن من الناحية العملية ، أنا أواجه صعوبة في العثور على المعلومات حول كيفية استخدام أفضل النماذج في الإطار زند التطبيقات.

على وجه التحديد, لدي نموذج (هذا لا يشمل أي شيء) التي لا تستخدم جدول قاعدة بيانات.ويستخدم حاصل على واضعي الوصول إلى المحمية أعضاء.أجد نفسي تكافح مع كيفية عرض هذا النموذج في طريقة العرض.أنا لا أريد المنطق في رأيي قوالب, ولكن أجد نفسي في الحالة التالية:

في وحدة تحكم:

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

في رأيي القالب:

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

أنا حقا لا مثل استدعاء وظائف في رأيي قوالب ولكن لا أعرف طريقة أفضل للقيام بذلك.أنا لا أريد نموذج أعضاء الجمهور, ولكن أنا في الأساس يريدون تحقيق نفس النتائج:

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

أنا لا أريد بلدي تحكم للقيام بكل عمل من الحاجة إلى معرفة كل شيء عن هذا النموذج:

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

ما هو أفضل ممارسة استخدام النماذج في زند الإطار ؟ يمكن لأي شخص أن يوصي أي التعليمي التي من شأنها أن تساعدني على فهم هذا النموذج/عرض المعضلة في زند الإطار ؟

هل كانت مفيدة؟

المحلول

أحد الاحتمالات هو أن استخدام السحر __مجموعة __على الطرق في PHP.أنا استخدامها مثل ذلك داخل نموذج مجردة الدرجة:

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.
    }
}

هذا يجعل من ذلك أنه يمكنك تحديد حاصل على واضعي على خصائص ضرورية ولكن يجعل من ذلك أن لم يكن لديك لتحديد النمطي وظائف كل الممتلكات فقط تلك التي تريد القيام ببعض النوع من المعالجة على ذلك قبل أن تعود قيمة.على سبيل المثال يمكنني استخدام وظيفة في عدد من الأماكن إلى تغيير ISO متوافقة مع التواريخ (كما المخزنة في الخلية) في أكثر إحكاما و تنسيق قابل للقراءة للمستخدمين.

بقدر ما وضع في جهاز تحكم, أنصح تبحث في هذا المنصب للحصول على بعض ردود الفعل على ما مناولة إلى مكان داخل وحدة التحكم الخاصة بك.

يشعر البعض أنهم يفضلون المساعد تلقائيا بتحميل النماذج في عرض التنانير تحكم تماما.شخصيا أود أن أقول أنه في سياق الإطار زند PHP يجعل الكثير من معانيها لتمرير نماذج في نظر من تحكم الدولة النماذج في نظر كثير من الأحيان يعتمد على ما جاء من طلب (التي يجب أن يكون بالتأكيد التعامل معها في وحدة تحكم).

تحديث: كما في الانتقادات في التعليقات ، الشيء الوحيد الذي أود أن أشير إلى أن قاعدة البيانات الخاصة بك الوصول إلى طبقة المجال (أو النموذج) طبقة هي في الحقيقة شيئان مختلفان ، ولو مع السجل النشط يتم مزجها معا.سألت هذا السؤال في حين يعود وتلقى بعض تعليقات مفيدة في هذا الشأن.أيا كان عليك أن تقرر أن تفعل مع هذا النموذج ، سوف تحتاج إلى توفير API ثابت لجميع كائنات المجال بغض النظر من أين بيانات النموذج يأتي من.

أعتقد أن فائدة واحدة التي تقدمها Saem الجواب هو أنه يوفر القدرة على مباشرة الخريطة خصائص / الدالة لإرجاع القيم من واحد أو أكثر من كائنات المجال إلى عرض الكائن.نظريا استخدام في الرأي ثم يبدو مثل هذا:

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

نصائح أخرى

إذا مطورين آخرين الوحيد هي على وشك أن العمل مع القوالب، أود أن أوصي مجرد مرور في النماذج. هنا هو ارتباط إلى آخر جيف اتوود على MVC فهم الموديل عرض المراقب المالي

لا يهدف هذا بشكل خاص نحو إطار زند، ولكن المشكلة هي العام بدلا من ذلك، في رأيي.

ويبدو أنك على الطريق الصحيح، بدلا من الصعب الأسلاك نموذج لطريقة العرض، داخل وحدة تحكم. كنت تفضل يكون هذا الملخص، أهمية خاصة إذا كنت تصمم خريطة للطن من النماذج، أو رسم الطراز نفسه مرارا وتكرارا.

سوف

وشيء بسيط يتمثل في كتابة مجموعة من وظائف رسم الخرائط، والذي من شأنه أن يكون على ما يرام إذا كان كل ما تم تجنب هو رسم الشيء نفسه مرارا وتكرارا.

إذا كنت تريد حلا أكثر عمومية، التي تناولت أيضا تجنب كتابة هذا الرمز لوحة المراجل، وإبقاء الأمور أكثر DRY، أقترح خلق طبقة معين.

هل يمكن إنشاء ViewModelMapper، التي من شأنها أن تأخذ نموذجا، أو عدد قليل من النماذج ورسم خريطة لها إلى طريقة العرض.

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
    }
}

هل يمكن بعد ذلك المثال هذا على جهاز تحكم، والإعداد للتعيينات، بحيث يتحكم وحدة تحكم التعيين لا يزال، ولكن كل لوحة المراجل والترميز المنطق هو مركزية، لجميع الخرائط تحكم، فيما عدا استثناءات نادرة.

لقراءة جيدة على بنية النموذج، قراءة هذا المقال . أنه لا يتحدث تحديدا عن الرأي، لكنها بالتأكيد تستحق القراءة.

وانتهى بي الأمر إضافة وظيفة getViewClass() إلى نماذج بلدي. وحدة تحكم يدعو هذه الوظيفة للحصول على المتغيرات محمية أنه لن يكون على خلاف ذلك الحصول عليها وليس لديها وجهة نظر ما يدعو للقلق حول استدعاء أي حاصل.

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

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

وأنا لا أعرف إذا كان هناك طريقة أفضل لانجاز هذه المهمة في إطار زند، ولكن هذا هو حل واحد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top