سؤال

أنا خلق ORM في PHP و لدي فئة 'ORM' الأساس الذي يقوم بإنشاء كائن المقابلة بيانات الجدول (أسعى على غرار/الوظيفة نفسها باعتبارها ActiveRecord نمط.) اسندت نفسها يمتد 'قاعدة البيانات' ، الذي يضع اتصال قاعدة البيانات.

لذا يمكن الاتصال على:

$c = new Customer();
$c->name = 'John Smith';
$c->save();

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

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

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

المحلول

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

// Customer.class.php
function getByName($name) {
    // SELECT * FROM `customer` WHERE `name` = $name
}

// ** this could instead be written as: **
// ORM.class.php
function getByField($field, $value) {
    // SELECT * FROM `$this->table` WHERE `$field` = $value
}

نصائح أخرى

أنت بالتأكيد التفكير بشكل صحيح لوضع منطق الأعمال في فئة جديدة خارج 'ORM'.بالنسبة لي, بدلا من ذلك ببساطة توسيع ORM-الطبقة, افضل تغليف جديدة, قيمة فئة كائن إلى توفير درجة إضافية من الحرية من قاعدة البيانات الخاصة بك تصميم مجانا حتى التفكير في الطبقة كما محض الكائن الأعمال.

لا.يجب عليك استخدام تكوين بدلا من الميراث.انظر المثال التالي:

class Customer {
    public $name;
    public function save() {
        $orm = new ORM('customers', 'id'); // table name and primary key
        $orm->name = $this->name;
        $orm->save();
    }
}

و ORM الدرجة لا ينبغي أن تمتد Database.تكوين مرة أخرى هو الانسب في هذه الحالة استخدام.

نعم, مكان عملك المنطق في سليل الطبقة.هذا هو النمط الشائع يرى في أن معظم البيانات الوصول إلى طبقات الجيل الأطر.

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

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

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

أنت بالتأكيد التفكير في الاتجاه الصحيح مع الميراث هنا.

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

لقد حلها مثل هذا في بلدي لحم الخنزير.dbObject.تأكد من التحقق من ذلك و بعقبة بعض braincrunching لقد فعلت :P

class Poll extends dbObject // dbObject is my ORM. Poll can extend it so it gets all properties.
{
        function __construct($ID=false)
        {
            $this->__setupDatabase('polls', // db table
                array('ID_Poll' => 'ID',    // db field => object property
                        'strPollQuestion' => 'strpollquestion', 
                        'datPublished' => 'datpublished', 
                        'datCloseDate' => 'datclosedate', 
                        'enmClosed' => 'enmclosed', 
                        'enmGoedgekeurd' => 'enmgoedgekeurd'),
                        'ID_Poll',  // primary db key 
                        $ID);   // primary key value
        $this->addRelation('Pollitem'); //Connect PollItem to Poll 1;1
        $this->addRelation('Pollvote', 'PollUser'); // connect pollVote via PollUser (many:many)


        }

function Display()
{

 // do your displayíng for poll here:
    $pollItems = $this->Find("PollItem"); // find all poll items
    $alreadyvoted = $this->Find("PollVote", array("IP"=>$_SERVER['REMOTE_ADDR'])); // find all votes for current ip
}

لاحظ أن هذه الطريقة ، أي قاعدة بيانات أو ORM وظائف مجردة بعيدا عن الاستطلاع الكائن.لا تحتاج أن تعرف.فقط setupdatabase ربط الحقول / تعيينات.و addRelation إلى ربط علاقات أخرى dbObjects.

أيضا, حتى dbObject فئة لا تعرف الكثير عن SQL.حدد / الانضمام إلى الاستفسارات التي بناها خاص QueryBuilder الكائن.

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