我想出了如何通过扩展从模板引擎访问容器。目前尚不清楚 MVC-ly,但是...
首先,将板配置添加到config/autoload/templates.global
:
return [
// some othe settings
'plates' => [
'extensions' => [
App\Container\PlatesExtension::class,
],
],
],
其次,App\Container\PlatesExtension.php
用代码创建:
<?php
namespace App\Container;
use League\Plates\Engine;
use League\Plates\Extension\ExtensionInterface;
class PlatesExtension implements ExtensionInterface
{
public $container;
/**
* AssetsExtension constructor.
* @param $container
*/
public function __construct($container)
{
$this->container = $container;
}
public function register(Engine $engine)
{
$engine->registerFunction('container', [$this, 'getContainer']);
}
public function getContainer()
{
return $this->container;
}
}
第三,创建工厂App\Container\PlatesExtensionFactory.php
将容器注入到板块扩展中:
<?php
namespace App\Container;
use Interop\Container\ContainerInterface;
class PlatesExtensionFactory
{
public function __invoke(ContainerInterface $container)
{
return new PlatesExtension($container);
}
}
接下来,在 ServiceManager ( ) 中注册车牌扩展config/dependencies.global.php
:
return [
// some other settings
'factories' => [
App\Container\PlatesExtension::class => App\Container\PlatesExtensionFactory::class,
]
];
最后,从 Plates 模板中获取容器和所需的服务:
<?
$service = $this->container()->get('my service class');
?>