将 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');
    }
}