Как я могу сгенерировать PDF из веб-URL с помощью Symfony 4? - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь сгенерировать pdf из webURL с помощью пакета snappy:

class PagesController extends AbstractController
{
 /**
  * @Route("/pdf", name="pdf")
  */

  public function pdf(Request $request)
  {
    $snappy = $this->get("knp_snappy.pdf");
    $snappy->setOption("encoding","UTF-8");

    $filename = "mypdf";
    $webSiteURL = "http://www.stackoverflow.com";
    return new Response(
      $snappy->getOutput($webSiteURL),
      200,
      array(
        'Content-Type' => 'application/pdf',
        'Content-Disposition' => 'inline; filename="'.$filname.'.pdf"'
      )
    );
  }

Но когда я пытаюсь открыть PDF, я получаю сообщение об ошибке:

Служба "knp_snappy.pdf" не найдена: даже если она существует в приложении контейнер, контейнер внутри "App \ Controller \ PagesController" является меньший сервисный локатор, который знает только о «доктрине», "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "сериализатор", услуги "сессия" и "веточка". Попробуйте использовать внедрение зависимостей вместо

Это мой файл config / packages / knp_snappy.yaml:

knp_snappy:
    pdf:
        enabled:    true
        binary:     /usr/local/bin/wkhtmltopdf
        options:    []
    image:
        enabled:    true
        binary:     /usr/local/bin/wkhtmltoimage
        options:    []

Один из подходов к решению этой проблемы состоял в том, что я попытался добавить use Knp\Component\Pager\PaginatorInterface; к своему контроллеру, но затем я получил сообщение об ошибке:

Невозможно определить аргумент контроллера для «App \ Controller \ PagesController :: pdf ()»: аргумент $ paginator подсказка типа с несуществующим классом или интерфейсом: "Knp \ Component \ Пейджер \ PaginatorInterface".

Другим подходом к решению этой проблемы было добавление в мой контроллер:

  public static function getSubscribedServices(): array
{
    $services = parent::getSubscribedServices();
    $services['fos_elastica.manager'] = RepositoryManagerInterface::class;
    $services['knp_paginator'] = PaginatorInterface::class;

    return $services;
}

Но тогда я получаю сообщение об ошибке:

Служба "App \ Controller \ PagesController" зависит от несуществующая служба "App \ Controller \ RepositoryManagerInterface".

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Вы можете напрямую добавить свои зависимости в действие контроллера, например

class PagesController extends AbstractController
{
  /**
  * @Route("/pdf", name="pdf")
  */

  public function pdf(Request $request, Pfd $snappy)
  {
      $snappy->setOption("encoding","UTF-8");

      $filename = "mypdf";
      $webSiteURL = "http://www.stackoverflow.com";
      return new Response(
         $snappy->getOutput($webSiteURL),
      200,
      array(
         'Content-Type' => 'application/pdf',
         'Content-Disposition' => 'inline; filename="'.$filname.'.pdf"'
      )
    );
   } 

Убедитесь, что автосервис включен в файле service.yml https://symfony.com/doc/current/service_container/autowiring.html#

1 голос
/ 26 мая 2019

Когда Controller расширяет AbstractController, у него нет доступа к container, который отвечает за содержание сервисов. Попробуйте расширить Controller (обратите внимание, что этот класс будет удален в Symfony 5) или внедрите сервисы snappy в Контроллер в файле services.yaml

...