1

我想使用依赖注入通过PHP-DI 将Plates的实例传递给我的控制器,该控制器与我的路由系统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;
  }

?>

未捕获的 LogicException:模板名称“home”无效。默认目录尚未定义

我该如何解决这个问题?我还需要使用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);

这很棒,但我遇到了一个问题,我找不到解决方法。我得到这个与板的资产加载器相关的错误,似乎它被实例化了不止一次。我已经用我的基础控制器扩展了我的控制器,其中资产加载器被实例化,但我认为这不是问题吗?有解决办法吗?

未捕获的 Pecee\SimpleRouter\Exceptions\NotFoundHttpException:模板函数名称“asset”已注册

4

1 回答 1

2

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 引擎会更好。

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');
    }
}
于 2019-07-20T20:07:17.173 回答