joomla / renderer
Joomla 渲染器包
3.0.0
2023-10-08 14:21 UTC
Requires
- php: ^8.1.0
Requires (Dev)
- illuminate/events: ^6.0|^7.0
- illuminate/filesystem: ^6.0|^7.0
- illuminate/view: ^6.0|^7.0
- joomla/test: ^3.0
- league/plates: ^3.0
- mustache/mustache: ^2.3
- phan/phan: ^5.4.2
- phpstan/phpstan: ^1.10.7
- phpunit/phpunit: ^9.5.28
- squizlabs/php_codesniffer: ^3.7.2
- symfony/templating: ^5.0
- twig/twig: ^3.5.0
Suggests
- illuminate/view: Install ^6.0|^7.0 if you are using Laravel's Blade template engine.
- league/plates: Install ^3.0 if you are using the Plates template engine.
- mustache/mustache: Install ^2.3 if you are using the Mustache template engine.
- symfony/templating: Install ^3.4|^4.4|^5.0 if you are using Symfony's PHP template component.
- twig/twig: Install ^2.14.11|^3.3.8 if you are using the Twig template engine.
Conflicts
- illuminate/view: <6.0
- league/plates: <3.0
- mustache/mustache: <2.3
- symfony/templating: <3.4
This package is auto-updated.
Last update: 2024-09-03 21:17:13 UTC
README
接口
Renderer\RendererInterface
Renderer\RendererInterface
是一个接口,用于提供通用的渲染 API。
类
Renderer\MustacheRenderer
Renderer\PhpEngineRenderer
Renderer\PlatesRenderer
Renderer\TwigRenderer
除了 PlatesRenderer
之外的所有类都扩展了父渲染引擎类,以使这些引擎能够实现 RendererInterface
。
使用方法
可以通过与父实现相同的方式实例化 Renderer\RendererInterface
类,有关更详细的信息,请参阅供应商文档。
为了帮助使用这些类,此存储库的 samples 文件夹中共享了示例服务提供商,以及这些提供商所依赖的示例配置。
示例用例
这里提供了一个使用 Renderer\RendererInterface
的示例。在此示例中,我们的控制器类基于 Joomla\View\ViewInterface
构建了一个视图类,并注入了所需的依赖项。
示例控制器
namespace Joomla\Controller; use Joomla\Renderer\RendererInterface; use Joomla\Controller\AbstractController; use Joomla\DI\ContainerAwareInterface; use Joomla\DI\ContainerAwareTrait; use Joomla\View\ViewInterface; /** * Default controller class for the application * * @since 1.0 */ class DefaultController extends AbstractController implements ContainerAwareInterface { use ContainerAwareTrait; /** * The default view for the application * * @var string * @since 1.0 */ protected $defaultView = 'dashboard'; /** * State object to inject into the model * * @var \Joomla\Registry\Registry * @since 1.0 */ protected $modelState = null; /** * Execute the controller * * This is a generic method to execute and render a view and is not suitable for tasks * * @return boolean True if controller finished execution * * @since 1.0 * @throws \RuntimeException */ public function execute() { try { // Initialize the view object $view = $this->initializeView(); // Render our view. $this->getApplication()->setBody($view->render()); return true; } catch (\Exception $e) { throw new \RuntimeException(sprintf('Error: ' . $e->getMessage()), $e->getCode()); } } /** * Method to initialize the model object * * @return \Joomla\Model\ModelInterface * * @since 1.0 * @throws \RuntimeException */ protected function initializeModel() { $model = '\\Joomla\\Model\\' . ucfirst($this->getInput()->getWord('view')) . 'Model'; // If a model doesn't exist for our view, revert to the default model if (!class_exists($model)) { $model = '\\Joomla\\Model\\DefaultModel'; // If there still isn't a class, panic. if (!class_exists($model)) { throw new \RuntimeException(sprintf('No model found for view %s', $vName), 500); } } return new $model($this->modelState); } /** * Method to initialize the renderer object * * @return RendererInterface Renderer object * * @since 1.0 * @throws \RuntimeException */ protected function initializeRenderer() { $type = $this->getContainer()->get('config')->get('template.renderer'); // Set the class name for the renderer's service provider $class = '\\Joomla\\Service\\' . ucfirst($type) . 'RendererProvider'; // Sanity check if (!class_exists($class)) { throw new \RuntimeException(sprintf('Renderer provider for renderer type %s not found.', ucfirst($type))); } // Add the provider to the DI container $this->getContainer()->registerServiceProvider(new $class); return $this->getContainer()->get('renderer'); } /** * Method to initialize the view object * * @return ViewInterface View object * * @since 1.0 * @throws \RuntimeException */ protected function initializeView() { // Initialize the model object $model = $this->initializeModel(); $view = ucfirst($this->getInput()->getWord('view', $this->defaultView)); $class = '\\Joomla\\View\\' . $view . 'HtmlView'; // Ensure the class exists, fall back to default otherwise if (!class_exists($class)) { $class = '\\Joomla\\View\\DefaultHtmlView'; // If we still have nothing, abort mission if (!class_exists($class)) { throw new \RuntimeException(sprintf('A view class was not found for the %s view.', $view)); } } // HTML views require a renderer object too, fetch it $renderer = $this->initializeRenderer(); // Instantiate the view now /* @type \Joomla\View\AbstractHtmlView $object */ $object = new $class($model, $renderer); // We need to set the layout too $object->setLayout(strtolower($view) . '.' . strtolower($this->getInput()->getWord('layout', 'index'))); return $object; } }
在此示例中,视图类扩展了从 \Joomla\View\AbstractView
扩展的此示例类
namespace Joomla\View; use Joomla\Renderer\RendererInterface; use Joomla\Model\ModelInterface; use Joomla\View\AbstractView; /** * Abstract HTML View class * * @since 1.0 */ abstract class AbstractHtmlView extends AbstractView { /** * The data array to pass to the renderer engine * * @var array * @since 1.0 */ private $data = array(); /** * The name of the layout to render * * @var string * @since 1.0 */ private $layout; /** * The renderer object * * @var RendererInterface * @since 1.0 */ private $renderer; /** * Class constructor * * @param ModelInterface $model The model object. * @param RendererInterface $renderer The renderer object. * * @since 1.0 */ public function __construct(ModelInterface $model, RendererInterface $renderer) { parent::__construct($model); $this->setRenderer($renderer); } /** * Retrieves the data array * * @return array * * @since 1.0 */ public function getData() { return $this->data; } /** * Retrieves the layout name * * @return string * * @since 1.0 * @throws \RuntimeException */ public function getLayout() { if (is_null($this->layout)) { throw new \RuntimeException('The layout name is not set.'); } return $this->layout; } /** * Retrieves the renderer object * * @return RendererInterface * * @since 1.0 */ public function getRenderer() { return $this->renderer; } /** * Method to render the view. * * @return string The rendered view. * * @since 1.0 * @throws \RuntimeException */ public function render() { return $this->getRenderer()->render($this->getLayout(), $this->getData()); } /** * Sets the data array * * @param array $data The data array. * * @return $this Method allows chaining * * @since 1.0 */ public function setData(array $data) { $this->data = $data; return $this; } /** * Sets the layout name * * @param string $layout The layout name. * * @return $this Method allows chaining * * @since 1.0 */ public function setLayout($layout) { $this->layout = $layout; return $this; } /** * Sets the renderer object * * @param RendererInterface $renderer The renderer object. * * @return $this Method allows chaining * * @since 1.0 */ public function setRenderer(RendererInterface $renderer) { $this->renderer = $renderer; return $this; } }
在上述示例控制器中建立的视图类
namespace Joomla\View; use Joomla\Model\DefaultModel; /** * HTML view class for the Dashboard * * @since 1.0 */ class DashboardHtmlView extends AbstractHtmlView { /** * Redeclared model object for proper typehinting * * @var DefaultModel * @since 1.0 */ protected $model; /** * Method to render the view. * * @return string The rendered view. * * @since 1.0 */ public function render() { $this->setData(['data' => $this->model->getData()]); return parent::render(); } }
通过 Composer 安装
您只需在命令行中运行以下命令即可
composer require joomla/renderer "~3.0"