я использую Zend Expressive Framework с помощью приложение по умолчанию ZE скелет с Zend ServiceManager в качестве DIC и Тарелки в качестве шаблона двигателя.
Допустим, у меня есть index.phtml
шаблон. Я хочу получить какой-нибудь сервис, который сбрасывает мне активы, что-то вроде:
<?= $this->getContainer()->get('my service class')->dumpAssets() ?>
Сервис зарегистрирован через фабрику и доступен в приложении:
<? $container->get('my service class') ?>
Как передать экземпляр внешнего сервиса или его результат в шаблон?
Практически плохая практика — вставлять весь контейнер службы в шаблон (или любой другой класс, кроме фабрики). Лучшим подходом было бы написать расширение для сброса ресурсов.
Класс расширения:
<?php
namespace App\Container;
use League\Plates\Engine;
use League\Plates\Extension\ExtensionInterface;
use App\Service\AssetsService;
class DumpAssetsExtension implements ExtensionInterface
{
public $assetsService;
/**
* AssetsExtension constructor.
* @param $container
*/
public function __construct(AssetsService $assetsService)
{
$this->assetsService = $assetsService;
}
public function register(Engine $engine)
{
$engine->registerFunction('dumpAssets', [$this, 'dumpAssets']);
}
public function dumpAssets()
{
return $this->assetsService->dumpAssets();
}
}
Фабрика:
<?php
namespace App\Container;
use Interop\Container\ContainerInterface;
class DumpAssetsFactory
{
public function __invoke(ContainerInterface $container)
{
$assetsService = $container->get(App\Service\AssetsService::class);
return new PlatesExtension($assetsService);
}
}
Конфигурация:
<?php
return [
// ...
'factories' => [
App\Container\DumpAssetsExtension::class => App\Container\DumpAssetsFactory::class,
]
];
В вашем шаблоне:
<?php
$service = $this->dumpAssets();
?>
Я понял, как получить доступ к контейнеру из движка шаблонов через расширения. Это не понятно MVC-лы, но …
Сначала добавьте конфиг плит в 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,
]
];
Наконец, получите контейнер и необходимый сервис из шаблона «Плиты»:
<?
$service = $this->container()->get('my service class');
?>