Задать вопрос
IgorPI
@IgorPI

Symfony, кто знает как замэппить значение из Request?

Добрый вечер!

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        bind:
            $images_directory: '%app.images_directory%'
            $lang: '%blabalabla%' # Господа, обратите внимание!


Обратите внимание, $lang появится в качестве аргумента, в контроллере или сервисе.
Мой вопрос заключается в том, как замэппить значение из Request в эту переменную?

Метод в контроллере.
... 
  public function add(Request $request, EntityManagerInterface $manager, $lang)
  ...
  • Вопрос задан
  • 151 просмотр
Подписаться 1 Простой 2 комментария
Решения вопроса 2
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
В общем случае - никак.
Workaround: через value object:
class Locale
{
    /**
     * @var string
     */
    private $value;

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

    public function __toString()
    {
        return $this->value;
    }
}

class LocaleFactory
{
    /**
     * @var RequestStack
     */
    private $requestStack;

    /**
     * @var string
     */
    private $default;

    public function __construct(RequestStack $requestStack, string $default)
    {
        $this->requestStack = $requestStack;
        $this->default = $default;
    }

    public function create(): Locale
    {
        if ($request = $this->requestStack->getMasterRequest()) {
            return new Locale($request->get('locale', $this->default));
        }

        return new Locale($this->default);
    }
}

services:
    App\Locale\Locale:
        factory: ['@App\Locale\LocaleFactory', 'create']


Соответственно использовать не как скалярное значение
public function add(Request $request, EntityManagerInterface $manager, Locale $lang)


Action Argument Resolver / ParamConverter - тоже вариант, но будет работать только для контроллеров.
Ответ написан
Комментировать
IgorPI
@IgorPI Автор вопроса
Symfony 5

parameters:
    lang: ru
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        bind:
            $default_lang: '%lang%'

services:
    app.service.lang:
        class: App\Service\Lang
        arguments: ['@request_stack', '@?']


<?php


namespace App\Service;

use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Class Lang
 * @package App\Service
 */
class Lang
{
    /** @var string  */
    private $lang;

    /**
     * Lang constructor.
     * @param RequestStack $requestStack
     * @param $default_lang
     */
    public function __construct(RequestStack $requestStack, $default_lang)
    {
        $this->lang = $requestStack->getCurrentRequest()->get("lang", $default_lang);
    }

    /**
     * @return mixed|string
     */
    public function get()
    {
        return $this->lang;
    }
}


Контроллер
public function myMethod(Lang $lang) 
{
   $value = $lang->get()
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы