t3 / extbase-session-entities
通过扩展TYPO3的Extbase框架,提供了在不持久化的情况下与session entities进行交互的功能,包括部分模型验证。
Requires
- typo3/cms-core: ^8.7
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交互的能力分为三个部分
您的模型需要从
\T3\ExtbaseSessionEntities\Mvc\AbstractSessionEntity
扩展您的控制器必须从
\T3\ExtbaseSessionEntities\Mvc\AbstractSessionEntityController
扩展包含
<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操作将在实体未从上一个操作传递时始终创建新实例)
- 在生产环境中测试它