Skip to content

Commit

Permalink
custom constraints message extractor (schmittjoh#423)
Browse files Browse the repository at this point in the history
  • Loading branch information
whyte624 committed Dec 18, 2016
1 parent 06da85e commit 281d500
Show file tree
Hide file tree
Showing 2 changed files with 156 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Resources/config/services.xml
Expand Up @@ -15,6 +15,7 @@
<parameter key="jms_translation.extractor.file.form_extractor.class">JMS\TranslationBundle\Translation\Extractor\File\FormExtractor</parameter>
<parameter key="jms_translation.extractor.file.validation_extractor.class">JMS\TranslationBundle\Translation\Extractor\File\ValidationExtractor</parameter>
<parameter key="jms_translation.extractor.file.authentication_message_extractor.class">JMS\TranslationBundle\Translation\Extractor\File\AuthenticationMessagesExtractor</parameter>
<parameter key="jms_translation.extractor.file.constraint_message_extractor.class">JMS\TranslationBundle\Translation\Extractor\File\ConstraintMessageExtractor</parameter>

<parameter key="jms_translation.loader.symfony.xliff_loader.class">JMS\TranslationBundle\Translation\Loader\Symfony\XliffLoader</parameter>
<parameter key="jms_translation.loader.xliff_loader.class">JMS\TranslationBundle\Translation\Loader\XliffLoader</parameter>
Expand Down Expand Up @@ -115,6 +116,9 @@
<argument type="service" id="jms_translation.file_source_factory" />
<tag name="jms_translation.file_visitor" />
</service>
<service id="jms_translation.extractor.file.constraint_message_extractor" class="%jms_translation.extractor.file.constraint_message_extractor.class%" public="false">
<tag name="jms_translation.file_visitor" />
</service>

<!-- Util -->
<service id="jms_translation.doc_parser" class="Doctrine\Common\Annotations\DocParser" public="false">
Expand Down
152 changes: 152 additions & 0 deletions Translation/Extractor/File/ConstraintMessageExtractor.php
@@ -0,0 +1,152 @@
<?php

namespace JMS\TranslationBundle\Translation\Extractor\File;
use PhpParser\Node;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor;
use Symfony\Component\Validator\Constraint;
use JMS\TranslationBundle\Model\Message;
use JMS\TranslationBundle\Model\MessageCatalogue;
use JMS\TranslationBundle\Translation\Extractor\FileVisitorInterface;

class ConstraintMessageExtractor implements FileVisitorInterface, NodeVisitor
{

/**
* @var NodeTraverser
*/
private $traverser;

/**
* @var \SplFileInfo
*/
private $file;

/**
* @var MessageCatalogue
*/
private $catalogue;

/**
* @var string
*/
private $namespace = '';

/**
* ValidationExtractor constructor.
*/
public function __construct()
{
$this->traverser = new NodeTraverser();
$this->traverser->addVisitor($this);
}

/**
* @param Node $node
* @return void
*/
public function enterNode(Node $node)
{
if ($node instanceof Node\Stmt\Namespace_) {
if (isset($node->name)) {
$this->namespace = implode('\\', $node->name->parts);
}

return;
}

if (!$node instanceof Node\Stmt\Class_) {
return;
}

$name = '' === $this->namespace ? $node->name : $this->namespace.'\\'.$node->name;

if ($node instanceof Node\Stmt\Class_) {
if (!class_exists($name)) {
return;
}
$ref = new \ReflectionClass($name);
if (!$ref->isSubclassOf('Symfony\Component\Validator\Constraint')) {
return;
} else {
$constraint = $ref->newInstance();
/** @var Constraint $constraint */
$this->extractFromConstraint($constraint);
}
}
}

/**
* @param \SplFileInfo $file
* @param MessageCatalogue $catalogue
* @param array $ast
*/
public function visitPhpFile(\SplFileInfo $file, MessageCatalogue $catalogue, array $ast)
{
$this->file = $file;
$this->namespace = '';
$this->catalogue = $catalogue;
$this->traverser->traverse($ast);
}

/**
* @param array $nodes
* @return void
*/
public function beforeTraverse(array $nodes)
{
}

/**
* @param Node $node
* @return void
*/
public function leaveNode(Node $node)
{
}

/**
* @param array $nodes
* @return void
*/
public function afterTraverse(array $nodes)
{
}

/**
* @param \SplFileInfo $file
* @param MessageCatalogue $catalogue
*/
public function visitFile(\SplFileInfo $file, MessageCatalogue $catalogue)
{
}

/**
* @param \SplFileInfo $file
* @param MessageCatalogue $catalogue
* @param \Twig_Node $ast
*/
public function visitTwigFile(\SplFileInfo $file, MessageCatalogue $catalogue, \Twig_Node $ast)
{
}

/**
* @param Constraint $constraint
*/
private function extractFromConstraint(Constraint $constraint)
{
$ref = new \ReflectionClass($constraint);

$properties = $ref->getProperties();

foreach ($properties as $property) {
$propName = $property->getName();

// If the property ends with 'Message'
if (strtolower(substr($propName, -1 * strlen('Message'))) === 'message') {
$message = new Message($constraint->{$propName}, 'validators');
$this->catalogue->add($message);
}
}
}
}

0 comments on commit 281d500

Please sign in to comment.