Чтение из параметров в Symfony 3.4 getParameter null - PullRequest
0 голосов
/ 02 января 2019

Я не могу прочитать параметр из parameters.yml в моем контроллере.

Я хочу сделать это:

//My Controller
class ExampleController extends Controller
{
    function someMethod($argument)
    {
        dump($this->getParameter('free_proxy'));die();

и в parameters.yml я получил:

parameters:
    free_proxy: "http://xxx:8080"

Я получаю сообщение об ошибке: Call to a member function getParameter() on null

Я протестировал некоторые решения, такие как добавление некоторых служб и использование get и прочее, но ничего не работает.

РЕДАКТИРОВАТЬ: также, япопробовал это:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind:
          $freeProxy: '%free_proxy%'

Затем с помощью:

$this->container->getParameter('free_proxy');

Но я получил ошибку: Unused binding "$freeProxy" in service...

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Итак, здесь есть две загадки. Во-первых, почему контейнер не внедряется, что в свою очередь приводит к сбою getParameter. И второе, почему bind генерирует эту неиспользуемую ошибку привязки.

Вы не показали свою маршрутизацию, но я подозреваю, что где-то вдоль линии у вас действительно есть:

$exampleController = new ExampleController();

Если это так, то это объясняет, почему getParameter не работает. Вам действительно нужно позволить Symfony создать контроллер на основе маршрута. В противном случае контейнер не вводится и пропускается другая магия контроллера.

Я установил свежее приложение 3.4 со старой структурой каталогов и добавил параметр

composer create-project symfony/framework-standard-edition s34

# app/config/parameters.yml
parameters:
    free_proxy: "http://xxx:8080"

Затем я настроил контроллер по умолчанию, используя аннотацию маршрута по умолчанию:

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        $freeProxy = $this->getParameter('free_proxy');

        // replace this example code with whatever you need
        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR.$freeProxy,
        ]);
    }
}

И все заработало как положено. Обработчик запросов Symfony заботится о внедрении контейнера и, таким образом, предоставляет вам доступ к параметрам. Если вы не можете заставить это работать, тогда , пожалуйста, обновите ваш вопрос информацией о маршрутизации.

Затем я взглянул на проблему связывания. Вы действительно хотите ввести эти параметры вместо того, чтобы тянуть их. Я обновил services.yml

# app/config/services.yml
services:
    bind:
        $freeProxy: '%free_proxy%'

И начал получать эти неиспользованные ошибки привязки. Оказывается, связывание не работает для инъекций действий. Не совсем уверен, почему. Я не использую это много, но я действительно ожидал бы, что простое добавление $ freeProxy к вашему методу действия сработает. В любом случае, вот рабочий пример правильного способа делать вещи.

class ExampleController extends Controller
{
    private $freeProxy;

    public function __construct($freeProxy)
    {
        $this->freeProxy = $freeProxy;
    }
    /**
     * @Route("/example", name="example")
     */
    function someMethod()
    {
        dump($this->freeProxy);
        dump($this->getParameter('free_proxy'));die();
    }
}

Затем я перешел к новому проекту 4.2 и попробовал инъекцию действий:

class IndexController extends AbstractController
{
    public function index($freeProxy)
    {
        return new Response("Index $freeProxy");
    }
}

Инъекция действия работает, как и ожидалось, для 4.2, но не для 3.4. Внедрение в конструктор отлично работает в любой версии.

0 голосов
/ 03 января 2019

документация выглядит следующим образом:

parameters.yml :
parameters:
    mailer.transport: sendmail

для установки:

$container->setParameter('mailer.transport', 'sendmail');

для получения:

$container->getParameter('mailer.transport');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...