respect-validation/library/Message/Formatter.php
Henrique Moody fb322df1da
Use "ParameterStringifier" to stringify input
The idea of the "ParameterStringifier" is to convert any value to a
string. However, we use the "stringify" function directly when
converting the input into a string. That defies the purpose of the
ParameterStringifier, as it gives the "Formatter" two ways of converting
a value into a string.

Signed-off-by: Henrique Moody <henriquemoody@gmail.com>
2024-03-11 20:01:47 +01:00

54 lines
1.3 KiB
PHP

<?php
/*
* Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
* SPDX-License-Identifier: MIT
*/
declare(strict_types=1);
namespace Respect\Validation\Message;
use function call_user_func;
use function preg_replace_callback;
final class Formatter
{
/**
* @var callable
*/
private $translator;
/**
* @var ParameterStringifier
*/
private $parameterStringifier;
public function __construct(callable $translator, ParameterStringifier $parameterStringifier)
{
$this->translator = $translator;
$this->parameterStringifier = $parameterStringifier;
}
/**
* @param mixed $input
* @param mixed[] $parameters
*/
public function format(string $template, $input, array $parameters): string
{
$parameters['name'] = $parameters['name'] ?? $this->parameterStringifier->stringify('input', $input);
return preg_replace_callback(
'/{{(\w+)}}/',
function ($match) use ($parameters) {
if (!isset($parameters[$match[1]])) {
return $match[0];
}
return $this->parameterStringifier->stringify($match[1], $parameters[$match[1]]);
},
call_user_func($this->translator, $template)
);
}
}