将 Plates PHP 与依赖注入一起使用
Use Plates PHP with dependency injection
我想使用依赖注入来传递 Plates to my controllers with PHP-DI that is integrated with my routing system 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: The template name "home" is not valid. The default directory has not been defined
我该如何解决这个问题?我还需要使用 asset() 方法传递资产路径。任何帮助将不胜感激。
更新
感谢 jcHache 的帮助,我使用以下 DI 代码成功地在基本控制器中注入了一个 Plates 实例:
<?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: The template function name "asset" is already registered
Plates
引擎工厂需要查看文件夹参数(参见 Plates doc):
所以你必须在你的 PHP-DI
配置文件中添加这个创建:
对于板 V4:
// config.php
return [
// ...
\League\Plates\Engine::class => function(){
return League\Plates\Engine::create('/path/to/templates', 'phtml');
},
];
对于 Plates 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 引擎会更好class。
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');
}
}
我想使用依赖注入来传递 Plates to my controllers with PHP-DI that is integrated with my routing system 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: The template name "home" is not valid. The default directory has not been defined
我该如何解决这个问题?我还需要使用 asset() 方法传递资产路径。任何帮助将不胜感激。
更新
感谢 jcHache 的帮助,我使用以下 DI 代码成功地在基本控制器中注入了一个 Plates 实例:
<?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: The template function name "asset" is already registered
Plates
引擎工厂需要查看文件夹参数(参见 Plates doc):
所以你必须在你的 PHP-DI
配置文件中添加这个创建:
对于板 V4:
// config.php
return [
// ...
\League\Plates\Engine::class => function(){
return League\Plates\Engine::create('/path/to/templates', 'phtml');
},
];
对于 Plates 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 引擎会更好class。
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');
}
}