هل يمكن أن تسمي كائنات المجال تعدادات البيانات الأخرى؟ (Zend Framework)

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

سؤال

علي سبيل المثال:

لدي مستخدم يحتوي على 10 أجهزة توجيهي. جنبا إلى جنب مع ذلك لدي مدير يدير 5 من تلك الحاجيات.

أرغب في استرداد مصادر المستخدم التي يديرها مدير محدد. لذلك قمت بإنشاء وظيفة في جهاز widgetmapper الخاص بي تسمى FetchUsersmanagedWidgets ($ userId ، $ ManagerId) التي تستفسر عن DB لتلك الخمسة الأدوات وتخطيط مجموعة من كائنات القطعة.

أعلم أنه ليس من المفترض أن تكون كائنات المجال على دراية بمصمميها ، ولكن هل يمكنني إنشاء وظيفة في نموذج المستخدم الذي يدعو إلى وظيفة widgetMapper؟

على سبيل المثال

class Application_Model_User {

    public function getWidgetsManagedBy($manager) {
        $widgetMapper = new Application_Model_WidgetMapper;
        return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId());
    }

}

أم أن هذا شارع في اتجاه واحد ، ويجب ألا تستدعي كائنات المجال وظائف Mapper؟

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

المحلول

النمط بشكل عام هي فكرة عن كيفية حل مشكلة شائعة. ليس لهم "يجب أن تفعل ذلك بهذه الطريقة" أو "كل شيء آخر سيء". في الواقع هناك حتى اسم لاتخاذ قرار لا يتبع الأنماط المتعمدة.
من ما رأيته يميل الناس إلى التفكير "طاولة DB واحدة هي مجال واحد ، لذا يحتاج كل طاولة DB إلى نموذج واحد وخريطة واحدة". في حالتك ، أفترض أن لديك ثلاثة جداول: المستخدمين ، والضرب والجدول الذي يحمل علاقة N: M بين هذين (سأسميها WetherWidgets).
يعد Werstwidgets جزءًا من نموذج المستخدم وليس لديه طراز/خريطة خاصة و ليس جزء من نموذج القطعة. لحل معرفات القطعة هذه في UserModel ، تحتاج إلى Mapper عنصر واجهة المستخدم بالطبع والتي تؤدي إلى المشكلة التي تصفها.
من المحتمل أن يكون هناك الكثير من الطرق لحل هذا ، أنا ببساطة أفترض أن الافتراضية قابلة للإلغاء:

Class UserModel
{
    $_widgetMapper = null;

    public function getWidgetMapper()
    {
        if(null === $this->_widgetMapper)
        {
             $this->setWidgetMapper(new DefaultWidgetMapper());
        }
        return $this->_widgetMapper();
    }

    public function setWidgetMapper($mapper)
    {
        // todo: make sure it's a mapper of the correct type
        $this->_widgetMapper = $mapper;
    }
}

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

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