Мне нужно изменить сообщения об ошибках доктрины по умолчанию. Как я могу это сделать ?Пользовательские сообщения об ошибках при проверке доктрины
спасибо
Мне нужно изменить сообщения об ошибках доктрины по умолчанию. Как я могу это сделать ?Пользовательские сообщения об ошибках при проверке доктрины
спасибо
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
" происходит от доктрины по умолчанию.
Итак, вывод: не так легко, но выполнимо ;-)
И теперь, это до вас, чтобы использовать это в качестве руководства к точному решению вашей проблемы : -)
Мне понадобится еще немного кодирования, я думаю ... Но вы не далеко от реальной сделки!
Удачи!
Ху, я только что видел, что вы опубликовали этот вопрос на вчерашней странице Doctrine: -D Ну, по крайней мере, jwage соглашается с CrazyJoe ^^ –