yokai / sonata-workflow
在 Sonata Admin 中集成 Symfony 工作流组件
v0.7.2
2024-01-12 08:43 UTC
Requires
- php: ^7.4|^8.0
- sonata-project/admin-bundle: ^4.0
- symfony/workflow: ^4.4|^5.0|^6.0
Requires (Dev)
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.5
README
简介
此库添加了 Symfony 工作流组件在 Sonata Admin 中的集成。
特性
- 为您的管理详情页面添加一个下拉菜单,其中包含应用可用转换的按钮
- 发送一个控制器来应用转换
- 允许在应用转换过程中挂钩以显示中间页面
代码
- 一个 Sonata Admin 扩展 : WorkflowExtension
- 一个控制器特质 : WorkflowControllerTrait
- 一个控制器 : WorkflowController
安装
$ composer require yokai/sonata-workflow
配置
假设您有一个名为 PullRequest
的实体,它处于工作流中,并且您为它有一个管理员。
# config/packages/workflow.yml framework: workflows: pull_request: type: state_machine marking_store: type: state_machine property: status supports: - App\Entity\PullRequest places: - opened - pending_review - merged - closed initial_marking: - opened transitions: start_review: from: opened to: pending_review merge: from: pending_review to: merged close: from: pending_review to: closed
一个扩展解决所有问题
该扩展可用于许多实体,无需配置。
您只需要创建一个服务,配置将处理转换动作的控制器,并配置在哪个管理员中可用。
例如
# config/packages/sonata_admin.yml services: admin.pull_request: class: App\Admin\PullRequestAdmin public: true arguments: [~, App\Entity\PullRequest, Yokai\SonataWorkflow\Controller\WorkflowController] tags: - { name: 'sonata.admin', manager_type: orm, label: PullRequest } admin.extension.workflow: class: Yokai\SonataWorkflow\Admin\Extension\WorkflowExtension public: true arguments: - '@workflow.registry' Yokai\SonataWorkflow\Controller\WorkflowController: autowire: true tags: ['controller.service_arguments'] sonata_admin: extensions: admin.extension.workflow: admins: - admin.pull_request
注意:您可能已经注意到我们还注册了控制器
Yokai\SonataWorkflow\Controller\WorkflowController
作为服务。这很重要,因为它需要工作流注册服务来工作。
针对每个管理员的更具体扩展
但是,如果您想自定义行为,扩展接受许多选项。
例如
# config/packages/sonata_admin.yml services: admin.pull_request: class: App\Admin\PullRequestAdmin public: true arguments: [~, App\Entity\PullRequest, 'Yokai\SonataWorkflow\Controller\WorkflowController'] tags: - { name: 'sonata.admin', manager_type: orm, label: PullRequest } admin.extension.pull_request_workflow: class: Yokai\SonataWorkflow\Admin\Extension\WorkflowExtension public: true arguments: - '@workflow.registry' - render_actions: [show] workflow_name: pull_request no_transition_label: No transition for pull request no_transition_icon: fa fa-times dropdown_transitions_label: Pull request transitions dropdown_transitions_icon: fa fa-archive transitions_default_icon: fa fa-step-forward transitions_icons: start_review: fa fa-search merge: fa fa-check close: fa fa-times Yokai\SonataWorkflow\Controller\WorkflowController: autowire: true tags: ['controller.service_arguments'] sonata_admin: extensions: admin.extension.pull_request_workflow: admins: - admin.pull_request
这些选项是什么?
render_actions
:扩展应渲染其菜单的管理员操作名称(默认为[显示,编辑]
)workflow_name
:要处理的工作流名称(默认为null
)no_transition_display
:是否显示禁用转换时的按钮(默认为false
)no_transition_label
:禁用转换时的按钮标签(默认为workflow_transitions_empty
)no_transition_icon
:禁用转换时的按钮图标(默认为fa fa-code-fork
)dropdown_transitions_label
:启用转换时下拉按钮的标签(默认为workflow_transitions
)dropdown_transitions_icon
:启用转换时下拉按钮的图标(默认为fa fa-code-fork
)transitions_default_icon
:所有转换的默认转换图标(默认为null
:无图标)transitions_icons
:一个哈希,其中转换名称作为键,图标作为值(默认为[]
)
挂钩到转换过程
假设您开始对拉取请求进行审查时,作为用户,您将被要求输入参与审查的用户。
为了实现这一点,您将需要填写一个专用表单。
您只需要为您的实体管理员创建一个自定义控制器
# config/packages/sonata_admin.yml services: admin.pull_request: class: App\Admin\PullRequestAdmin public: true arguments: [~, App\Entity\PullRequest, App\Admin\Controller\PullRequestController] tags: - { name: 'sonata.admin', manager_type: orm, label: PullRequest }
<?php // src/Admin/Controller/PullRequestController.php declare(strict_types=1); namespace App\Admin\Controller; use App\Entity\PullRequest; use App\Form\PullRequest\StartReviewType; use Sonata\AdminBundle\Controller\CRUDController; use Symfony\Component\HttpFoundation\Response; use Yokai\SonataWorkflow\Controller\WorkflowControllerTrait; class PullRequestController extends CRUDController { use WorkflowControllerTrait; protected function preApplyTransition(object $object, string $transition): ?Response { switch ($transition) { case 'start_review': return $this->startReview($object, $transition); } return null; } protected function startReview(PullRequest $object, string $transition): ?Response { $form = $this->createForm( StartReviewType::class, [], [ 'action' => $this->admin->generateObjectUrl( 'workflow_apply_transition', $object, ['transition' => $transition] ), ] ); $form->handleRequest($this->getRequest()); if (!$form->isSubmitted() || !$form->isValid()) { $formView = $form->createView(); return $this->renderWithExtraParams('admin/pull-request/start-review.html.twig', [ 'action' => 'edit', 'form' => $formView, 'object' => $object, 'objectId' => $this->admin->getNormalizedIdentifier($object), ], null); } $data = $form->getData(); // do something with the submitted data before returning null to continue applying transition return null; } }
MIT 许可证
许可证可以在 这里 找到。
作者
此库最初由 Yann Eugoné 创建。请参阅 贡献者列表。
感谢 Prestaconcept 对本库的支持。