كيفية التعامل مع الاستثناءات على التحقق من صحة العقيدة 2

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

سؤال

أنا جديد على العقيدة 2 (والاستثناءات في PHP ، حقًا) ، لكنني أحاول التوصل إلى محرك التحقق القوي في العقيدة 2 (أعلى Codeigniter) ، بعد ذلك هذه الصفحة.

في الوقت الحالي ، أتساءل من أين يمكنني تحديد فئة ValidateException ، وكيفية "محاولة" القيام بحفظ (مستمر؟) على كياني (من وحدة تحكم ، مكتبة ، إلخ).

أرغب في الحصول على شيء حيث ، بعد القيام بذلك (في مكتبة "المصادقة" ، على سبيل المثال):

$user->username = $username;
$user->email_address = $email_address;
$user->password = $password;

$em->persist($user);
$em->flush();

return $foo; //where $foo refers to whether $em->flush() worked...

يمكنني ببساطة أن أعود ما إذا كان هذا الثبات ناجحًا (أي تم تمرير التحقق من الصحة وحفظه) ، أو غير ناجح (أي التحقق من الصحة).

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

المحلول

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

class UserFactory
{
  /** @var Doctrine Entity Manager */
  private $_em;

  function __construct(EntityManager $em) {
    $this->_em = $em;
  }

  function createUserFromArray($data) {
    $user = new User();
    $user->setUsername($data['username']);
    $user->setEmail($data['email']);

    $this->_em->persist($user);
    $this->_em->flush(); // Or this could be called from some other place

    return $user;
  }
}

ثم في وحدة التحكم الخاصة بك ، كل ما تفعله هو شيء من هذا القبيل:

// Get the EntityManger from wherever (registry, session, etc)
$userFactory = new UserFactory($em);
$user = $userFactory->createFromArray($dataFromForm);

شيئان إضافيان.

أولاً ، إذا كنت تستخدم Getters و Pretters الصريحة لخصائرك (اسم المستخدم والبريد الإلكتروني) ، يمكنك رمي استثناءات في هذه الوظائف إذا لم يستوفوا المعايير.

في فئة المستخدم الخاصة بك:

function setEmail($email) {
  // Do some validations on the email address
  if (!is_valid_email($email)) {
    throw new Exception('Invalid Email');
  }
  $this->email = $email;
}

ثانياً ، أعتقد أن هذا هو السؤال الذي تطرحه حقًا هو حول عمليات الاسترجاعات لدورة الحياة. يمكنك تحديد أولئك على/في فصول النموذج/الكيان بأنفسهم.

class User
{
  /** @PrePersist @PreUpdate */
  function ensureUniqueEmail()
  {
    // Do your check, else throw exception
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top