إرث المدقق السمفوني

5

لدي فئتين من الكيانات:

class A {

/**
 * @Assert\LessThanOrEqual(3)
 *
 * @var int
 */
protected $attempts;

}

class B extends A {

/**
 * @Assert\LessThanOrEqual(5)
 *
 * @var int
 */
protected $attempts;

}

واختبار واحد للتحقق من أن التحقق يعمل بشكل صحيح:

public function testSetAttemptsCount()
{
    $block = new B();
    $block->setAttempts(6);

    $errors = $this->getService('validator')->validate($block);
    $this->assertHasViolation($errors, 'attempts', LessThanOrEqual::TOO_HIGH_ERROR);

    $block->setAttempts(4);
    $errors = $this->getService('validator')->validate($block);
    $this->assertNotHasViolation($errors, 'attempts', LessThanOrEqual::TOO_HIGH_ERROR);
}

لن ينجح هذا الاختبار لأنه يتحقق من صحة القيمة من الفئة A. هل يعرف أي شخص كيف يمكنني "إعادة كتابة" قاعدة التحقق للحقل؟

1 إجابة

1
افضل جواب

سأختتم بحثي عن الحل الآن. من الواضح أنه كانت هناك محاولة لحل هذه المشكلة ولكنها تسببت في نوع من كسر BC ، ولكن لم أجد أي إشارات إليها (حتى نتمكن من فهمها بشكل أفضل). بعد كل شيء ، الإصدارات الرئيسية تسمح بفواصل BC ، وفي رأيي أيضًا 3.0 أو 4.0 كانوا مرشحين جيدين لهذا ، ولكن بطريقة ما تراجع الفكر.

أفضل عرض حصلت عليه (ولكن ليس كافيًا ولا مثاليًا بأي شكل من الأشكال) هو الاقتباس من المستندات :

This means you are able to add new constraints to a property, but you cannot override them ... To create your own validation, add the constraints to a new validation group

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

يمكن اشتقاق ما ورد أعلاه ، إلى حد ما حل غير تقليدي إلى حد ما ، إذا قمنا بتثبيت قواعد التحقق الخاصة بنا YAML أو XML . لذا ، لا توجد تعليقات توضيحية. في YAML ، قد يبدو شيء مثل هذا:

App\Data\Foo:
    properties:
        attempts:
            - LessThanOrEqual: 2
        another:
            - LessThanOrEqual: 5

App\Data\Bar:
    properties:
        attempts:
            - LessThanOrEqual: {value: 5, groups: [Overriden]}
        another:
            - LessThanOrEqual: {value: 5, groups: [Overriden]}

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

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

آمل أن يساعد هذا قليلا...

:مؤلف
فوق
قائمة طعام