এই এই প্রশ্নটি পড়ে মনে হয় যে ব্যবহারকারী ইনপুটকে বৈধতা দেওয়ার ক্ষেত্রে ব্যতিক্রম ছুঁড়ে ফেলা উচিত।
তবে এই তথ্যটি কার বৈধ করা উচিত? আমার অ্যাপ্লিকেশনগুলিতে, সমস্ত বৈধতা ব্যবসায়ের স্তরে সম্পন্ন হয় কারণ কেবল শ্রেণি নিজেই জানে যে এর প্রতিটি বৈশিষ্ট্যের জন্য কোন মানগুলি বৈধ। আমি যদি কোনও সম্পত্তি নিয়ন্ত্রকের কাছে বৈধ করার জন্য বিধিগুলি অনুলিপি করতে পারি, তবে এটি সম্ভব হয় যে বৈধতার বিধিগুলি পরিবর্তন হয় এবং এখন দুটি জায়গা রয়েছে যেখানে পরিবর্তনটি করা উচিত।
আমার ভিত্তিটি কি ব্যবসায়ের স্তরে বৈধতা হওয়া উচিত?
আমি কি করবো
সুতরাং আমার কোডটি সাধারণত এইভাবে শেষ হয়:
<?php
class Person
{
private $name;
private $age;
public function setName($n) {
$n = trim($n);
if (mb_strlen($n) == 0) {
throw new ValidationException("Name cannot be empty");
}
$this->name = $n;
}
public function setAge($a) {
if (!is_int($a)) {
if (!ctype_digit(trim($a))) {
throw new ValidationException("Age $a is not valid");
}
$a = (int)$a;
}
if ($a < 0 || $a > 150) {
throw new ValidationException("Age $a is out of bounds");
}
$this->age = $a;
}
// other getters, setters and methods
}
কন্ট্রোলারে, আমি কেবলমাত্র মডেলটির কাছে ইনপুট ডেটাটি পাস করি এবং ব্যবহারকারীর ত্রুটি (গুলি) দেখানোর জন্য নিক্ষিপ্ত ব্যতিক্রমগুলি ধরি:
<?php
$person = new Person();
$errors = array();
// global try for all exceptions other than ValidationException
try {
// validation and process (if everything ok)
try {
$person->setAge($_POST['age']);
} catch (ValidationException $e) {
$errors['age'] = $e->getMessage();
}
try {
$person->setName($_POST['name']);
} catch (ValidationException $e) {
$errors['name'] = $e->getMessage();
}
...
} catch (Exception $e) {
// log the error, send 500 internal server error to the client
// and finish the request
}
if (count($errors) == 0) {
// process
} else {
showErrorsToUser($errors);
}
এটি কি একটি খারাপ পদ্ধতি?
বিকল্প পদ্ধতি
আমি কি isValidAge($a)
সত্য / মিথ্যা প্রত্যাবর্তনের জন্য পদ্ধতি তৈরি করতে এবং তারপরে নিয়ামক থেকে কল করতে পারি?
<?php
class Person
{
private $name;
private $age;
public function setName($n) {
$n = trim($n);
if ($this->isValidName($n)) {
$this->name = $n;
} else {
throw new Exception("Invalid name");
}
}
public function setAge($a) {
if ($this->isValidAge($a)) {
$this->age = $a;
} else {
throw new Exception("Invalid age");
}
}
public function isValidName($n) {
$n = trim($n);
if (mb_strlen($n) == 0) {
return false;
}
return true;
}
public function isValidAge($a) {
if (!is_int($a)) {
if (!ctype_digit(trim($a))) {
return false;
}
$a = (int)$a;
}
if ($a < 0 || $a > 150) {
return false;
}
return true;
}
// other getters, setters and methods
}
এবং নিয়ন্ত্রকটি মূলত একই রকম হবে, চেষ্টা / ধরার পরিবর্তে এখন / অন্যথায় থাকলে এখন রয়েছে:
<?php
$person = new Person();
$errors = array();
if ($person->isValidAge($age)) {
$person->setAge($age);
} catch (Exception $e) {
$errors['age'] = "Invalid age";
}
if ($person->isValidName($name)) {
$person->setName($name);
} catch (Exception $e) {
$errors['name'] = "Invalid name";
}
...
if (count($errors) == 0) {
// process
} else {
showErrorsToUser($errors);
}
তো এখন আমার কি করা উচিৎ?
আমি আমার আসল পদ্ধতিতে বেশ খুশি এবং আমার সহকর্মীরা যাদের কাছে আমি এটি সাধারণভাবে দেখিয়েছি তা এটি পছন্দ করেছে। তবুও, আমি কি বিকল্প পদ্ধতিতে পরিবর্তন করব? বা আমি কি এই মারাত্মক ভুল করছি এবং আমার অন্য কোনও উপায় সন্ধান করা উচিত?
IValidateResults
।
ValidationException
এবং অন্যান্য ব্যতিক্রমগুলি কিছুটা সংশোধন করেছি