2009-08-05 3 views
2

Мне нужно изменить сообщения об ошибках доктрины по умолчанию. Как я могу это сделать ?Пользовательские сообщения об ошибках при проверке доктрины

спасибо

+0

Ху, я только что видел, что вы опубликовали этот вопрос на вчерашней странице Doctrine: -D Ну, по крайней мере, jwage соглашается с CrazyJoe ^^ –

ответ

5

CrazyJoe прав, таким образом: это не возможно без какой-либо тяжелой работы :-(

Но, если вы будете искать достаточно трудно, вы могли бы найти способ ;-)


С Doctrine 1.1 вы расширяете классы моделей Doctrine_Record.
Этот класс определяет этот метод:

/** 
* Get the record error stack as a human readable string. 
* Useful for outputting errors to user via web browser 
* 
* @return string $message 
*/ 
public function getErrorStackAsString() 
{ 
    $errorStack = $this->getErrorStack(); 

    if (count($errorStack)) { 
     $message = sprintf("Validation failed in class %s\n\n", get_class($this)); 

     $message .= " " . count($errorStack) . " field" . (count($errorStack) > 1 ? 's' : null) . " had validation error" . (count($errorStack) > 1 ? 's' : null) . ":\n\n"; 
     foreach ($errorStack as $field => $errors) { 
      $message .= " * " . count($errors) . " validator" . (count($errors) > 1 ? 's' : null) . " failed on $field (" . implode(", ", $errors) . ")\n"; 
     } 
     return $message; 
    } else { 
     return false; 
    } 
} 

Это метод, который генерирует сообщения; как вы можете видеть, это полностью автоматический и не настраивается на все :-(


Тем не менее, благодаря ООП, мы можем перегрузить этот метод в наших классах Типовых ...

Но, быть немного чище, я бы:

  • Создать новый класс - говорят My_Doctrine_Record, что расширяет Doctrine_Record
  • этот класс будет переопределять этот метод, чтобы разрешить настройку сообщений об ошибках
  • И наши классы моделей расширят этот класс My_Doctrine_Record.

Это позволит избежать дублирования этого метода внутри каждого из наших классов моделей; и может оказаться полезным еще один день ...


Нашего метод My_Doctrine_Record::getErrorStackAsString может, конечно, полагаться на метод наших модельных классов, чтобы помочь генерировать сообщения, со специальной настройкой для каждого класса модели.

Вот рабочий пример; далеко от совершенства, но он может направить вас к тому, что вы хотите получить ;-)


Прежде всего, инициализацый:

require_once '/usr/share/php/Doctrine/lib/Doctrine.php'; 
spl_autoload_register(array('Doctrine', 'autoload')); 

$manager = Doctrine_Manager::getInstance(); 
$manager->setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL); 

$conn = Doctrine_Manager::connection('mysql://test:[email protected]/test1'); 

Я предполагаю, что у вас уже есть что-то подобное в вашем приложении ...


Далее наш новый My_Doctrine_Record класс:

class My_Doctrine_Record extends Doctrine_Record 
{ 
    public function getErrorStackAsString() 
    { 
     $errorStack = $this->getErrorStack(); 
     if (count($errorStack)) { 
      $message = sprintf("BAD DATA in class %s :\n", get_class($this)); 
      foreach ($errorStack as $field => $errors) { 
       $messageForField = $this->_getValidationFailed($field, $errors); 
       if ($messageForField === null) { 
        // No custom message for this case => we use the default one. 
        $message .= " * " . count($errors) . " validator" . (count($errors) > 1 ? 's' : null) . " failed on $field (" . implode(", ", $errors) . ")\n"; 
       } else { 
        $message .= " * " . $messageForField; 
       } 
      } 
      return $message; 
     } else { 
      return false; 
     } 
    } 

    protected function _getValidationFailed($field, $errors) { 
     return null; 
    } 

} 

Вы заметите, что метод getErrorStackAsString вдохновлен тем, что делается в одной представленной доктриной - это кажется нормальным, я бы сказал, ^^

Еще одна вещь, чтобы быть замеченными:

  • Он определяет и называет _ getValidationFailed метод
  • , что следует создавать сообщения об ошибках; или вернуть null, если мы хотим использовать по умолчанию behabiour
  • и мы можем перегрузить, что _getValidationFailed метод в наших классах модели, чтобы настроить StuFF ;-)


А теперь, мой класс модели:

class Test extends My_Doctrine_Record 
{ 
    protected function _getValidationFailed($field, $errors) { 
     switch ($field) { 
      case 'name': 
        return "You entered wrong data from 'name' field.\n  Errors are for '" 
         . implode("', '", $errors) . "'\n"; 
       break; 
      // other fields ? 
      default: 
       return null; 
     } 
    } 

    public function setTableDefinition() 
    { 
     $this->setTableName('test'); 
     $this->hasColumn('id', 'integer', 4, array(
      'type' => 'integer', 
      'length' => 4, 
      'unsigned' => 0, 
      'primary' => true, 
      'autoincrement' => true, 
      )); 
     $this->hasColumn('name', 'string', 32, array(
      'type' => 'string', 
      'length' => 32, 
      'fixed' => false, 
      'notnull' => true, 
      'email' => true, 
      )); 
     $this->hasColumn('value', 'string', 128, array(
      'type' => 'string', 
      'length' => 128, 
      'fixed' => false, 
      'notnull' => true, 
      'htmlcolor' => true, 
      )); 
     $this->hasColumn('date_field', 'integer', 4, array(
      'type' => 'timestamp', 
      'notnull' => true, 
      )); 
    } 
} 

Он расширяет My_Doctrine_Record и определяет _getValidationFailed метод, который имеет дело с Validations ошибок на name поле моей модели.


Теперь, давайте предположим, что я могу это сделать, чтобы загрузить запись:

$test = Doctrine::getTable('Test')->find(1); 
var_dump($test->toArray()); 

Давайте попробуем изменить его, настраивая "плохие" значения:

$test->name = (string)time(); 
$test->value = 'glop'; 
try { 
    $test->save(); 
} catch (Doctrine_Validator_Exception $e) { 
    echo '<pre>'; 
    echo $e->getMessage(); 
    echo '</pre>'; 
    die; 
} 

Оба name и value поля не все в порядке ... Итак, мы рассмотрим методы проверки и сформируем это сообщение об ошибке:

BAD DATA in class Test : 
    * You entered wrong data from 'name' field. 
     Errors are for 'email' 
    * 1 validator failed on value (htmlcolor) 

Вы можете увидеть сообщение для "name" было настроено, а одно для "value" происходит от доктрины по умолчанию.


Итак, вывод: не так легко, но выполнимо ;-)

И теперь, это до вас, чтобы использовать это в качестве руководства к точному решению вашей проблемы : -)
Мне понадобится еще немного кодирования, я думаю ... Но вы не далеко от реальной сделки!

Удачи!

0

Его невозможно в текущей версии !!!

+0

Полезно знать, спасибо – inakiabt

+0

ОК, спасибо за ваш ответ – rizidoro

Смежные вопросы