Zend Expressive, воспользуйтесь шаблоном Php Plates

я использую Zend Expressive Framework с помощью приложение по умолчанию ZE скелет с Zend ServiceManager в качестве DIC и Тарелки в качестве шаблона двигателя.

Допустим, у меня есть index.phtml шаблон. Я хочу получить какой-нибудь сервис, который сбрасывает мне активы, что-то вроде:

<?= $this->getContainer()->get('my service class')->dumpAssets() ?>

Сервис зарегистрирован через фабрику и доступен в приложении:

<? $container->get('my service class') ?>

Как передать экземпляр внешнего сервиса или его результат в шаблон?

0

Решение

Практически плохая практика — вставлять весь контейнер службы в шаблон (или любой другой класс, кроме фабрики). Лучшим подходом было бы написать расширение для сброса ресурсов.

Класс расширения:

<?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();
?>
1

Другие решения

Я понял, как получить доступ к контейнеру из движка шаблонов через расширения. Это не понятно 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');
?>
0

По вопросам рекламы [email protected]