merophp/view-engine

基于简单插件的视图引擎,用于隐藏复杂性。

0.1-alpha 2021-12-22 10:52 UTC

This package is auto-updated.

Last update: 2024-09-18 21:46:47 UTC


README

易于使用的视图引擎,带有隐藏复杂性的视图插件。

安装

通过composer

composer require merophp/view-engine

基本用法

要使用视图引擎,您必须创建或使用外部视图插件。

示例

require_once 'vendor/autoload.php';

use MyPackage\HtmlPlugin\HtmlView;
use MyPackage\TextPlugin\TextView;
use MyPackage\JsonPlugin\JsonView;
use MyPackage\TemplatePlugin\TemplateView;
use MyPackage\TemplatePlugin\TemplateViewConfiguration;

use Merophp\ViewEngine\ViewEngine;
use Merophp\ViewEngine\ViewPlugin\Collection\ViewPluginCollection;
use Merophp\ViewEngine\ViewPlugin\Provider\ViewPluginProvider;
use Merophp\ViewEngine\ViewPlugin\ViewPlugin;

$templateViewConfiguration = new TemplateViewConfiguration();
$templateViewConfiguration->setViewDir('.');

$collection = new ViewPluginCollection();
$collection->addMultiple([
    new ViewPlugin(TextView::class),
    new ViewPlugin(HtmlView::class),
    new ViewPlugin(JsonView::class),
    new ViewPlugin(TemplateView::class, $templateViewConfiguration)
]);

$provider = new ViewPluginProvider($collection);

$viewEngine = new ViewEngine($provider);

$view = $viewEngine->initializeView();
$view->json(['test' => 1]);
echo $viewEngine->renderView($view);

视图代理

视图引擎使用代理来处理视图类。特点是您可以通过调用$viewEngine->initializeView()来获取一个视图代理实例,而不需要一个真正的视图。将要包装的视图将由下一个调用的方法确定。

例如

$view = $viewEngine->initializeView();
echo $view->getViewType(); //Will print 'undefined'
$view->json(['test' => 1]);
echo $view->getViewType(); //Will print 'Json'
echo $viewEngine->renderView($view);

一旦确定了视图类型,该实例的类型就不能更改。

视图插件

一个视图插件至少由一个实现Merophp\ViewEngine\ViewPlugin\ViewInterface的视图类组成,并且至少有一个带有@api标记的公共非魔术非静态方法。

use Merophp\ViewEngine\ViewPlugin\ViewInterface;

class DummyView implements ViewInterface{

    public function render(): string
    {
        return 'test';
    }

    /**
     * Method calls are forwarded by the view proxy
     * @param $value
     * @api
     */
    public function dummy($value)
    {
        return 'foo';
    }

    /**
     * Method calls are not forwarded by the view proxy due to their static type 
     * @param $value
     * @api
     */
    public static function dummy2($value)
    {
        echo 'foo';
    }

    public function getContentType(): string
    {
        return '';
    }
}

目标

目标是使用视图引擎作为框架的一部分,以简化框架用户创建视图的过程。因此,您可以在控制器动作中提供一个空的视图代理实例,用户可以通过调用代理实例上的方法来在几种视图类型之间进行选择。

注意缺陷

由于这种机制,无法使用IDE功能,如自动填充或接口提示。在某些情况下,由于代理的动态接口,这也可能有些令人困惑。作为使用此库的框架开发者,您应该很好地记录代理的可能视图接口。