Итак, здесь есть две загадки. Во-первых, почему контейнер не внедряется, что в свою очередь приводит к сбою 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. Внедрение в конструктор отлично работает в любой версии.