t3/extbase-session-entities

通过扩展TYPO3的Extbase框架,提供了在不持久化的情况下与session entities进行交互的功能,包括部分模型验证。

安装: 989

依赖者: 0

建议者: 0

安全: 0

类型:typo3-cms-extension

1.0.0 2018-04-01 15:50 UTC

This package is auto-updated.

Last update: 2024-09-20 22:48:25 UTC


README

本扩展通过扩展TYPO3的Extbase框架,提供了

  • 与session entities交互的可能性
  • 在不持久化的情况下
  • 包括部分模型验证。

安装

只需使用 TER 下载扩展,或使用composer要求它

$ composer require t3/extbase-session-entities

在TYPO3的扩展管理器中检查是否已安装扩展。

示例 & 开发包

存在一个父级git仓库,它使用git子模块包含此仓库。它提供了一个完整的开发环境,随时可以工作/测试/玩耍,并且安装超级简单。

它还包括一个 示例扩展,该扩展实现了并演示了此扩展的功能。

检出: https://bitbucket.org/t--3/extbase_session_entities-dev

使用方法

与session entities交互的能力分为三个部分

  1. 您的模型需要从 \T3\ExtbaseSessionEntities\Mvc\AbstractSessionEntity 扩展

  2. 您的控制器必须从 \T3\ExtbaseSessionEntities\Mvc\AbstractSessionEntityController 扩展

  3. 包含 <f:form> 视图助手 fluid模板 必须 使用提供的表单视图助手

     {namespace e=T3\ExtbaseSessionEntities\ViewHelpers}
     <e:form name="order" action="step2" object="{order}"> ... </e:form>
    

现在您可以在不丢失其数据(存储在fe_user会话中)的情况下通过操作传递实体。

创建会话实体

在您的流程的第一个操作中,您需要创建模型的新实例。

还需要在将对象传递给表单视图助手之前调用 prepare() 方法!否则,会话实体将无法正确传递到下一个操作。示例

/**
 * @param \T3\Example\Domain\Model\Order $order
 * @return void
 *
 * @ignorevalidation $order
 */
public function step1Action(\T3\Example\Domain\Model\Order $order = null)
{
    if (null === $order) {
        /** @var \T3\Example\Domain\Model\Order $order */
        $order = $this->objectManager->get(\T3\Example\Domain\Model\Order::class);
        $order->prepare();
    }
    $this->view->assign('order', $order);
}

注意:您不需要在这里使用objectManager。一个 new \T3\Example\Domain\Model\Order() 也会工作。

保存会话实体

与Extbase中处理常规模型一样,您需要通过将实体添加到持久化管理器(例如 $this->orderRepository->add($order);)来指定何时持久化。

对于会话实体,您需要执行相同的操作,但是使用由AbstractSessionController提供的 sessionRepository。示例

/**
 * @param \T3\Example\Domain\Model\Order $order
 * @validate $order \T3\ExtbaseSessionEntities\Mvc\PartialObjectValidator(validate="firstName,name")
 */
public function step2Action(\T3\Example\Domain\Model\Order $order)
{
    $this->sessionRepository->set($order);
    // $this->updateSessionEntity($order, $this->orderRepository); // see next chapter
    $this->view->assign('order', $order);
}

"更新会话实体" 辅助函数

控制器还提供了一个辅助函数来更新会话 数据库中的实体,具体取决于它们的状态(具有数字uid)。因此,您可以重用相同的操作:会话或数据库实体。

只需将sessionRepository的调用替换为

$this->updateSessionEntity($order, $this->orderRepository);

将实体从会话移动到数据库

一旦您想将会话实体持久化到数据库,只需将实体添加到您的常规extbase仓库

/**
 * @param \T3\Example\Domain\Model\Order $order
 * @validate $order \T3\ExtbaseSessionEntities\Mvc\PartialObjectValidator()
 */
public function saveAction(\T3\Example\Domain\Model\Order $order)
{
    $this->orderRepository->add($order);
    $this->persistAll();
    $this->redirect('thanks', null, null, ['order' => $order]);
}

持久化管理器是x-classed的,并自动将会话实体转换为数据库实体。

注意:当您不将实体传递到UriBuilder(例如,通过重定向)时,不需要执行 $this->persistAll();

会话实体解释

当会话实体被创建并且调用过 prepare() 后,它们会得到一个新的非数字uid。这个字符串是 会话标识符,稍后用于在用户的会话中存储对象。

我们在这里伪造持久化的实体。此外,此扩展还提供了一个SessionObjectConverter,当映射下一个操作参数时,它从会话中加载实体。

会话实体也获得了__finalize()方法。它是公开的,但是下划线和@internal注解意味着不建议自行使用。您不需要使用它,因为PersistenceManager的extbase会自动调用它。

每次您将会话实体添加到您的存储库时,它都会被终止。这意味着uid将被重置为null,因此持久化管理器将其视为一个常规的新对象。

部分实体验证

会话实体默认不进行验证!

因为Extbase始终对整个对象及其所有属性进行验证。所以当您将属性拆分为多个操作时,您总会得到您不希望在此操作中检查的字段的验证错误。

要部分(或全部)验证您的模型,您可以在您的操作中使用这个提供的验证器

/**
 * @param \T3\Example\Domain\Model\Order $order
 * @validate $order \T3\ExtbaseSessionEntities\Mvc\PartialObjectValidator(validate="firstName,name")
 */
public function step2Action(\T3\Example\Domain\Model\Order $order)
{
}

验证选项是可选的。当您留空时,它会验证给定实体的所有属性

您可以与子实体一起工作,但您还不能部分验证它们的属性。

路线图 / 待办事项

  • 提供将模型实例绑定到fe_user的能力(当前步骤1操作将在实体未从上一个操作传递时始终创建新实例)
  • 在生产环境中测试它