Zendframework 3 - лучшие практики перевода в модели - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть модель, которую я использую для проверки данных.Одним из валидаторов является функция callbak.Мне нужно перевести сообщение об ошибке в соответствии с языком пользователя.Я думал, чтобы получить доступ к представлению помощника перевода, но как получить доступ к нему в пользовательском классе?Это также лучшая практика?

class AvialabilityModel implements InputFilterAwareInterface
{

    public $srcFrom;
    public $srcTo;
    public $srcIdRoomType;
    public $srcIdRoom;

    private $inputFilter;
    private $new;

    public function __construct($new)
    {
        $this->new = $new;
    }

    public function exchangeArray(array $data)
    {
        $this->srcFrom          = !empty($data['srcFrom']) ? $data['srcFrom'] : null;
        $this->srcTo            = !empty($data['srcTo']) ? $data['srcTo'] : null;
        $this->srcIdRoomType    = !empty($data['srcIdRoomType']) ? $data['srcIdRoomType'] : null;
        $this->srcIdRoom        = !empty($data['srcIdRoom']) ? $data['srcIdRoom'] : null;
    }

    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        throw new DomainException(sprintf(
            '%s does not allow injection of an alternate input filter',
            __CLASS__
        ));
    }

    public function getInputFilter()
    {
       ....

        $inputFilter->add([
            'name' => 'srcTo',
            'required' => true,
            'validators' => [
                [
                    'name' => Date::class,
                    C::CFG_OPTIONS=>['format'=>'d-m-Y']
                ],
                [
                    'name'=> Callback::class,
                    C::CFG_OPTIONS=>[
                        'messages'=>[
                            Callback::INVALID_VALUE => 'La data deve essere successiva a quella iniziale!'
                        ],
                        'callback'=>function($value,$context=array()){
                            $d1 = Utils::stringToDate($context['start'],null);
                            $d2 = Utils::stringToDate($value,null);
                            return $d2>$d1;
                        }
                    ]
                ]
            ],
            'filters'=>[
                CommonModel::stringTrim()
            ]
        ]);

       ......
        return $this->inputFilter;
    }
}

1 Ответ

0 голосов
/ 25 февраля 2019

Почему бы просто не реализовать MvcTranslator, как для документов ?

class AvailabilityModelFactory implements FactoryInterface
{
    public function __invoke( ... )
    {
        $translator = $container->get('MvcTranslator');

        return new AvailabilityModel($translator, ...);
    }
}

Использование:

class AvialabilityModel implements InputFilterAwareInterface
{
    /**
     * @var TranslatorInterface
     */
    protected $translator;

    public function __construct(
        \Zend\I18n\Translator\TranslatorInterface $translator
        $new
    ) {
        $this->new = $new;
    }

    public function getInputFilter()
    {
       ....

        $inputFilter->add([
            'name' => 'srcTo',
            'required' => true,
            'validators' => [
                [
                    'name' => Date::class,
                    C::CFG_OPTIONS=>['format'=>'d-m-Y']
                ],
                [
                    'name'=> Callback::class,
                    C::CFG_OPTIONS=>[
                        'messages'=>[
                            Callback::INVALID_VALUE => 
                                $this->translator->translate( // USAGE HERE
                                    'La data deve essere successiva a quella iniziale!'
                                ),
                        ],
                        'callback'=>function($value,$context=array()){
                            $d1 = Utils::stringToDate($context['start'],null);
                            $d2 = Utils::stringToDate($value,null);
                            return $d2>$d1;
                        }
                    ]
                ]
            ],
            'filters'=>[
                CommonModel::stringTrim()
            ]
        ]);

       ......
        return $this->inputFilter;
    }
    ...
}

(незабудьте инструкции intro для инструкций по настройке)

...