The truth is rarely pure and never simple

symfony: Meldungen der Validator-Klassen

Die Meldungen der Validator-Klassen lassen sich recht gut aus der Online-Dokumentation heraussuchen. Weil dort aber keine “vererbten” Meldungen sichtbar sind, muss man jedes Mal die Basisklasse(n) durchsuchen, um sicher zu gehen, alle Meldungen gefunden zu haben. Spätestens mit eigenen Validator-Klassen macht das keinen Spaß mehr. Um das ein wenig zu vereinfachen, habe ich einen Phing-Task dafür geschrieben. Wenn man die nachstehende Datei, die auf eigene Gefahr und als public domain genutzt werden kann, in einem Symfony-Projekt in den Ordner lib/task kopiert, bekommt man mit

php symfony list-validator-messages
eine übersichtliche Liste. Sollten jemandem Fehler auffallen, bitte ich um kurze Nachricht. Hier ein Beispiel des Ergebnisses:
Und hier der Code:
[php]<?php

// disable error messages from wrong arguments
function error_handler($error, $error_str, $errfile, $errline) {}

class listvalidatormessagesTask extends sfBaseTask
{
protected function configure()
{
$this->addOptions(array(
new sfCommandOption(‘application’, null, sfCommandOption::PARAMETER_REQUIRED, ‘The application name’),
new sfCommandOption(‘env’, null, sfCommandOption::PARAMETER_REQUIRED, ‘The environment’, ‘dev’),
new sfCommandOption(‘connection’, null, sfCommandOption::PARAMETER_REQUIRED, ‘The connection name’, ‘propel’),
));

$this->namespace = ”;
$this->name = ‘list-validator-messages’;
$this->briefDescription = ”;
$this->detailedDescription = <<<EOF
The [list-validator-messages|INFO] task lists all messages from regular and custom validators.
Call it with:

[php symfony list-validator-messages|INFO]
EOF;
}

protected function execute($arguments = array(), $options = array())
{
$formatter = new sfAnsiColorFormatter();

set_error_handler(error_handler);

$was_declared = array();

$dir = sfConfig::get(‘sf_symfony_lib_dir’) . ‘/validator/’;
$rootdir = sfConfig::get(‘sf_root_dir’) . ‘/’;

$files = array_merge(glob($dir . ‘sfValidator*.class.php’), glob($rootdir . ‘apps/*/lib/sf*Validator.class.php’));
if (!$pos = array_search($dir . ‘sfValidatorBase.class.php’, $files))
{
echo ‘Wrong directory – no sfValidatorBase.class.php found.’;
die();
} else {
include_once($files[$pos]);
unset($files[$pos]);
$was_declared = get_declared_classes();
}

foreach ($files as $file)
{
include_once($file);
}

$now_declared = get_declared_classes();
$new_classes = array_diff($now_declared, $was_declared);

$first = array_keys($new_classes);
$first = $first[0];

foreach ($new_classes as $nr => $class)
{
echo $formatter->format($nr-$first+1 . ‘/’ . count($new_classes) .’: ‘ . $class . "\n", ‘INFO’);
$ref = new ReflectionClass($class);
if ($ref->isAbstract())
{
echo $formatter->format(‘ abstract class’ . "\n", ‘COMMENT’);
continue;
}
if (!$ref->isSubclassOf(‘sfValidatorBase’))
{
echo $formatter->format(‘ not derived from sfValidatorBase’ . "\n", ‘COMMENT’);
continue;
}

$options = array();
$temp_class = NULL;
$success = false;
while(!$temp_class)
{
try
{
$temp_class = new $class($options);
$success = true;
} catch (Exception $e)
{
if ($e instanceof RuntimeException)
{
$matches = array();
preg_match(‘/^.*\'(.*)\’.*$/’, $e->getMessage(), $matches);
if (count($matches) == 2)
{
$options[$matches[1]] = NULL;
$success = true;
} else {
break;
}
} else {
break;
}
}
}
if ($success)
{
if ($success = method_exists($temp_class, ‘getMessages’))
{
foreach ($temp_class->getMessages() as $key => $message)
{
echo ‘ * ‘ . $key . ‘: ‘ . $message . "\n";
}
}
} else {
echo $formatter->format(‘ unable to load class’ . "\n", ‘COMMENT’);
}
}
}
}[/php]