ZF3 PhpRenderer не находит путь к шаблону - PullRequest
0 голосов
/ 22 ноября 2018

Я знаю, что есть десятки вопросов о том, что PHPRenderer не может найти путь к шаблону, но я думаю, что проблема здесь совершенно иная.

Во-первых, цель состоит в том, чтобы представить представление переменной по порядку.чтобы отправить его в PDF Renderer (я использую модуль ZF3 TCPDF).Если есть какой-нибудь лучший способ сделать это, пожалуйста, скажите мне.

Вот примерно архитектура проекта: https://imgur.com/UhQ7hgP

В AlertAction() из ToolsController, я возвращаюпосмотреть, как это, и это работает, что заставляет меня думать, что путь к шаблону в порядке.

$view = new ViewModel();
$view->setTemplate('tools/tools/alert');
return $view;

Однако, когда я пытаюсь сделать то же представление с тем же путем в exportPDFAction(), он не работаети выдает следующую ошибку:

Zend \ View \ Renderer \ PhpRenderer :: render: Невозможно отобразить шаблон "tools / tools / alert";распознаватель не может преобразовать в файл

Код в exportPDFAction():

$view = new ViewModel();
$renderer = new PhpRenderer();
$view->setTemplate('tools/tools/alert');
$html = $renderer->render($view);

Я предполагаю, что последняя строка привинчивает его, так как это разница, но я не могу 'Почему, кто-нибудь знает?

Во всех темах о Путь к шаблону на SO говорилось о карте шаблонов в module.config.php, но я думаю, что это не проблема, поскольку она прекрасно работает вAlertAction().

РЕДАКТИРОВАТЬ

PhpRenderer вводится в контроллер непосредственно в module.config.php:

'controllers' => [
    'factories' => [
        ToolsController::class => function($container) {
            return new ToolsController(
                $container->get(Adapter::class),
                $container->get(\TCPDF::class),
                $container->get(PhpRenderer::class)
            );
        },
    ],
],

РЕДАКТИРОВАТЬ 2

Это конструктор контроллера:

public function __construct($db, $tcpdf, $renderer)
{
    $this->db = $db;
    $this->tcpdf = $tcpdf;
    $this->renderer = $renderer;
    ...
}

1 Ответ

0 голосов
/ 22 ноября 2018

Ошибка, которую вы получаете, может быть связана с тем, что ваш Renderer не вводится через Factory.

Попробуйте:

class MyCustomControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        /** @var \Zend\View\Renderer\PhpRenderer $renderer */
        $renderer = $container->get('ViewRenderer')

        return new MyCustomController($renderer);
    }
}

В контроллере установите его в функции __construct():

public function __construct(PhpRenderer $renderer)
{
    // ... set it somewhere, e.g.:
    $this->setRenderer($renderer);
}

Затем используйте его в своей функции:

$view = new ViewModel();
$renderer = $this->getRenderer();
$view->setTemplate('tools/tools/alert');
$html = $renderer->render($view);

Почему, спросите вы?

Поскольку Renderer настроен через конфигурацию Zend.Вы можете найти это в классе \Zend\Mvc\Service\ServiceManageFactory. псевдоним имеет следующую конфигурацию:

'ViewPhpRenderer'                      => 'Zend\View\Renderer\PhpRenderer',
'ViewRenderer'                         => 'Zend\View\Renderer\PhpRenderer',
'Zend\View\Renderer\RendererInterface' => 'Zend\View\Renderer\PhpRenderer',

псевдоним сопоставлен с Factory :

'Zend\View\Renderer\PhpRenderer' => ViewPhpRendererFactory::class,

Эта фабрика:

class ViewPhpRendererFactory implements FactoryInterface
{
    /**
     * @param  ContainerInterface $container
     * @param  string $name
     * @param  null|array $options
     * @return PhpRenderer
     */
    public function __invoke(ContainerInterface $container, $name, array $options = null)
    {
        $renderer = new PhpRenderer();
        $renderer->setHelperPluginManager($container->get('ViewHelperManager'));
        $renderer->setResolver($container->get('ViewResolver'));

        return $renderer;
    }
}

Как таковая, в нее включены некоторые предустановки при использовании ее с $this->getRenderer, а именно с наборами HelperPluginManager и Resolver.Таким образом, он знает, где можно получить дополнительные ресурсы (если необходимо), и знает, как разрешить (т.е. отрендерить) представление.

...