cscfa/twig_ui_bundle

TwigUIBundle是一个symfony2包,提供使用模块的处理过程。

1.0.1 2016-03-23 00:00 UTC

This package is not auto-updated.

Last update: 2024-09-20 19:24:58 UTC


README

版本:1.0.0

TwigUIBundle是一个symfony2包,提供使用模块的处理过程。

#####安装

在app/appKernel.php中注册该包

// app/AppKernel.php
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            [...]
            new Cscfa\Bundle\TwigUIBundle\CscfaTwigUIBundle(),
        );
        
        [...]
    }
}

创建一个模块

TwigUIBundle允许创建模块以处理作为分层模块的twig渲染。

存在两种模块类型

  • TopLevelModule
  • StepModule

TopLevelModule代表直接注入到控制器模块集中的模块。要创建TopLevelModule,必须创建一个扩展AbstractTopLevelModule的类。这个抽象类实现了注入模板和渲染到模块环境的基类方法和处理过程。

StepModule代表TopLevelModule的子模块。它的工作方式与TopLevelModule相同,但你必须扩展AbstractStepModules。

use Cscfa\Bundle\TwigUIBundle\Modules\AbstractTopLevelModule;
// or
use Cscfa\Bundle\TwigUIBundle\Modules\AbstractStepModule;

你必须定义'getName()'和'render(EnvironmentContainer $environment)'方法。'getName'方法必须返回尽可能唯一的字符串,用作模板调用定义别名的占位符。'render'方法是你可以编写PHP逻辑的地方。

'render'方法可以返回'null'或'TwigRequest'的实例。返回null表示模块不会创建任何twig视图。

传递给'render'方法的'EnvironmentContainer'实例允许访问控制器提供的信息。

// Get a registed object. By default, only the User instance is given by the controller
$environment->getObjectsContainer()->getObject($alias);

// Get the current controller name
$environment->getControllerInfo()->getControllerName();

// Get the current controller method
$environment->getControllerInfo()->getMethodName();

创建一个twig请求

'TwigRequest'类允许在EnvironmentContainer使用后存储要渲染的twig模板的信息。

'TwigRequest'实例存储模板名称和调用参数。

$twigRequest = new TwigRequest();
$twigRequest->setTwigPath("AcmeBundle:Default:index.html.twig");
$twigRequest->setArguments(array(
    "fooArgument" => "foo",
    "barArgument" => "bar",
));
$twigRequest->remArgument("barArgument");
$twigRequest->hasArgument("fooArgument");

'TwigRequest'类允许存储子项,但当前这是由模块的分层管理。

// Note the constructor allow to pass the template path and the arguments.
$twigRequest->addChildRequest(
    new TwigRequest(
        "AcmeBundle:Default:index.html.twig",
        array("fooArgument" => "foo")
    ),
    "ChildAliasName"
);

注册你的模块

模块作为标记服务注册。

需要定义的标记是

  • name : 'cs.module'
  • cs.module.parent : 父模块的名称
  • cs.module.hydrate : 调用来注册到父模块的方法

'name'标记的值可以在TwigUIBundle配置中进行自定义。

指向父模块的标记可以在TwigUIBundle配置中进行自定义。

定义要调用方法的标记可以在TwigUIBundle配置中进行自定义。

以下是一个TwigUIBundle配置示例

# /app/config.yml
cscfa_twig_ui:
    modules:
        - tag_name: cs.module
        - parent_tag: cs.module.parent
        - method_tag: cs.module.hydrate

默认情况下,服务存储在一个ModuleSet实例中,该实例按优先级顺序处理包含的模块。优先级可以在服务定义中定义。优先级存储为浮点值。

以下是单元测试中模块定义的示例

cscfa_twig_ui.test.main:
    class: Cscfa\Bundle\TwigUIBundle\Modules\ModuleSet

cscfa_twig_ui.test.firstTop:
    class: Cscfa\Bundle\TwigUIBundle\FunctionalTest\Object\FirstTopLevel
    calls:
        - [ setPriority, [ 10 ]]
    tags: 
        - { name: cs.module, cs.module.parent: cscfa_twig_ui.test.main, cs.module.hydrate: addModule }

在你的控制器中使用模块

在上面的最后一个例子中,你可以看到第一个服务是一个ModuleSet的实例。这是控制器将调用来处理模块的服务,因此你必须创建一个实例化ModuleSet的服务。

要创建处理模块的控制器,你必须扩展'ModulableController'。这个类提供了对'processModule'方法的访问。

在以下示例中,控制器直接返回第一个参数模板的twig结果。第二个参数定义了当前方法,第三个表示包含模块的主要ResultSet服务。

class AcmeController extends ModulableController
{
    public function processAction()
    {
        return $this->processModule(
            'CscfaTwigUIBundle:test:controllerResult.html.twig',
            __METHOD__,
            'cscfa_twig_ui.test.main'
        );
    }
}

'processModule'方法接受一个可选的第四个参数'EnvironmentOptionBuilder'。它允许向环境提供可选参数。

以下示例使当前内容可用于模块

class AcmeController extends ModulableController
{
    public function processAction(Request $request)
    {
        $builder = new EnvironmentOptionBuilder();
        $builder->addOption(
            $builder::OBJECT_CONTAINER_OBJECT, 
            array($request, "request")
        );
        
        return $this->processModule(
            'CscfaTwigUIBundle:test:controllerResult.html.twig',
            __METHOD__,
            'cscfa_twig_ui.test.main',
            $builder
        );
    }
}

class module extends AbstractTopLevelModule
{
    public function render(EnvironmentContainer $environment)
    {
        $environment->getObjectsContainer()
            ->getObject("request");
    }
}

'EnvironmentOptionBuilder'允许注册以下类型的选项

创建一个模块模板

显示控制器结果的模板必须调用'twigUIEnvironment'函数。模块环境直接作为'environment'变量传递。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    {{ twigUIEnvironment(environment) }}
</body>
</html>

步骤模板接收TwigRequest中定义的参数以及额外的'moduleName'和'moduleChilds'变量。它们必须调用'twigUIModule'函数来渲染子模块。

<!-- module : {{ moduleName }} -->
<div>
    <p>{{ argument }}</p>
    
    {{ twigUIModule(moduleChilds) }}
</div>