Использование 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');
}
}