Symfony 2.8: не удается использовать контейнер в пользовательском классе

Я хотел бы использовать $ this-> container-> get в пользовательском классе, который я создал.
Я прочитал и обнаружил, что должен использовать ContainerInterface в конструкторе, что я и делаю, но я все еще получаю эту ошибку:

Ошибка: вызов функции-члена get () для необъекта

Вот код:

MyClass.php

namespace path\to\MyClass;

use Symfony\Component\DependencyInjection\ContainerInterface;

class MyClass {

private $container;
public $user_id;

public function __contruct(ContainerInterface $container) {

$this->container = $container;
$this->user_id = $user_id;

return $this;
}

/**
* @param string $data Some data
* @return array A response
*/
public function generatePDF($data)
{
// Create the folders if needed
$pdf_folder =  __DIR__.'/../../../../web/pdf/'.$this->user_id.'/';

if(!file_exists($pdf_folder))
mkdir($pdf_folder, 0755, TRUE);

$file_id = "abc1";

// Set the file name
$file = $pdf_folder.$file_id.'.pdf';

// Remove the file if it exists to prevent errors
if(file_exists($file)) {
unlink($file);
}

// Generate the PDF
$this->container->get('knp_snappy.pdf')->generateFromHtml(
$this->renderView(
'StrimeGlobalBundle:PDF:invoice.html.twig',
$data
),
$file
);
}
}

Ребята, вы понимаете, в чем может быть проблема?

Спасибо за вашу помощь.

0

Решение

Вы должны объявить свой класс как сервис в конфигурации Symfony.

Пожалуйста, посмотрите на Страница контейнера службы Symfony.

Вот объяснение, чтобы вставить контейнер в конструктор:

# services.yml
services:
app.my_class:
class: TheBundle\Service\MyClass
arguments: ['@service_container']

Или, как сказал JimL в комментарии, вы можете внедрить нужный вам сервис (который рекомендуется):

class MyClass
{
private $pdfService;
public function __construct(\Your\Service\Namespace\Class $pdfService)
{
$this->pdfService = $pdfService;
}

// ...
}

И в вашем файле service.yml

# services.yml
services:
app.my_class:
class: TheBundle\Service\MyClass
arguments: ['@knp_snappy.pdf']

Контейнер также может быть введен с помощью сеттера. Увидеть эта ссылка

Надеюсь это поможет!

2

Другие решения

Ваш класс не может «увидеть» какой-либо сервис (включая контейнер), если вы не «внедрили» его. В YourCustomBundle / Resources / config / services.xml вам нужно определить сервис и его зависимости. Следить за публикациями Внедрение зависимости и это должно иметь больше смысла.

Кроме того, @JimL прав: вам не нужно вводить весь контейнер для доступа к одному сервису, просто добавьте один сервис (knp_snappy.pdf)

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector