Я хотел бы использовать $ 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
);
}
}
Ребята, вы понимаете, в чем может быть проблема?
Спасибо за вашу помощь.
Вы должны объявить свой класс как сервис в конфигурации 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']
Контейнер также может быть введен с помощью сеттера. Увидеть эта ссылка
Надеюсь это поможет!
Ваш класс не может «увидеть» какой-либо сервис (включая контейнер), если вы не «внедрили» его. В YourCustomBundle / Resources / config / services.xml вам нужно определить сервис и его зависимости. Следить за публикациями Внедрение зависимости и это должно иметь больше смысла.
Кроме того, @JimL прав: вам не нужно вводить весь контейнер для доступа к одному сервису, просто добавьте один сервис (knp_snappy.pdf)