Использование Plates PHP с внедрением зависимостей

Я хочу использовать внедрение зависимостей для передачи экземпляра Plates своим контроллерам с PHP-DI, который интегрирован с моей системой маршрутизации Simple Router. Я попытался ввести экземпляр Plates, но получаю такую ​​ошибку:

<?php

namespace Controllers;

use \League\Plates\Engine;
use \League\Plates\Template\Template;
use \League\Plates\Extension\Asset;

class Controller {

  public function __construct(\League\Plates\Engine $templates)
  {
    $this->templates = $templates;
  }

?>

Uncaught LogicException: имя шаблона "home" недопустимо. Каталог по умолчанию не определен

Как я могу решить эту проблему? Мне также нужно передать путь к активам с помощью метода asset(). Любая помощь будет оценена по достоинству.

ОБНОВИТЬ

Благодаря помощи jcHache мне удалось внедрить экземпляр Plates в мой базовый контроллер с помощью этого кода DI:

<?php 

// config.php
return [
  League\Plates\Engine::class => DI\create()
    ->constructor(TEMPLATE_ROOT)
    ->method('loadExtension', DI\get('League\Plates\Extension\Asset')),
  League\Plates\Extension\Asset::class => DI\create()
    ->constructor(APP_ROOT),
];

index.php файл

<?php 

use Pecee\SimpleRouter\SimpleRouter;
use DI\ContainerBuilder;

$container = (new \DI\ContainerBuilder())
  ->useAutowiring(true)
  ->addDefinitions('config.php')
  ->build();

SimpleRouter::enableDependencyInjection($container);

Это замечательно, но я столкнулся с проблемой и не могу ее исправить. Я получаю эту ошибку, относящуюся к загрузчику ресурсов тарелок, кажется, что он создается более одного раза. Я расширил свои контроллеры с помощью базового контроллера, в котором создается экземпляр загрузчика ресурсов, но я не думаю, что это проблема? Есть исправление?

Uncaught Pecee \ SimpleRouter \ Exceptions \ NotFoundHttpException: имя функции шаблона "asset" уже зарегистрировано

1 ответ

Решение

Platesфабрике двигателя требуется параметр папки просмотра (см. документ Plates):

поэтому вам нужно добавить это творение в свой PHP-DI Файл конфигурации:

Для пластин V4:

// config.php
return [
    // ...
    \League\Plates\Engine::class => function(){
        return League\Plates\Engine::create('/path/to/templates', 'phtml');
    },
];

Для пластин V3 я попробую:

// config.php
return [
    // ...
    \League\Plates\Engine::class => function(){
        return new League\Plates\Engine('/path/to/templates');
    },
];

или

// config.php
return [
    // ...
    \League\Plates\Engine::class =>  DI\create()
       ->constructor('/path/to/templates')
    ,
];

Примечание по дизайну:

Лично я не буду использовать внедрение зависимостей для механизма шаблонов, я думаю, что было бы лучше создать экземпляр движка Plates в базовом классе контроллера.

namespace controllers;

use League\Plates\Engine;

abstract class BaseController 
{
    /**
     * @var \League\Plates\Engine
     */
    protected $templates;

    public function __construct()
    {
        $this->templates=new Engine(\TEMPLATE_ROOT);
        $this->templates->loadExtension(new \League\Plates\Extension\Asset(\APP_ROOT));
    }

    protected function renderView(string $viewname, array $variables=[])
    {
        return $this->templates->render($viewname,$variables);
    }
}

Для дочернего контроллера, использующего Plates:

namespace controllers;

class MyController extends BaseController
{
    public function index()
    {
        return $this->renderView('home');
    }
}
Другие вопросы по тегам