monsieurbiz / sylius-plus-adapter-plugin
本插件提供工具,以适配您的插件至Sylius Plus RBAC系统。
Requires
- php: ^8.0
- sylius/sylius: >=1.11 <1.14
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.16
- phpmd/phpmd: ^2.15
- phpspec/phpspec: ^7.0
- phpstan/phpstan: ^1.8.4
- phpstan/phpstan-doctrine: ^1.3.2
- phpstan/phpstan-webmozart-assert: ^1.1
- phpunit/phpunit: ^10.5
This package is auto-updated.
Last update: 2024-09-03 14:53:54 UTC
README
本插件提供工具,以适配您的插件至Sylius Plus RBAC系统。
兼容性
安装
composer config --no-plugins --json extra.symfony.endpoint '["https://api.github.com/repos/monsieurbiz/symfony-recipes/contents/index.json?ref=flex/master","flex://defaults"]'
composer require monsieurbiz/sylius-plus-adapter-plugin
如何使用
为了说明以下示例,我们将使用一个Foo
插件和一个MyResource
资源。
您的资源实体
namespace Foo\SyliusBarPlugin\Entity; use Sylius\Component\Channel\Model\ChannelsAwareInterface; use Sylius\Component\Resource\Model\ResourceInterface; class MyResource implements ResourceInterface, ChannelsAwareInterface { // ... }
您的资源配置
sylius_resource: resources: foo_bar.my_resource: classes: model: Foo\SyliusBarPlugin\Entity\MyResource
在路由上添加权限
这是Sylius的本地功能,您无需安装此插件!
您只需在路由定义中添加permission: true
即可。
如果您这样做,您的路由将可在权限树中使用。
示例
foo_bar_my_resource_admin: resource: | alias: foo_bar.my_resource section: admin permission: true templates: "@SyliusAdmin\\Crud" redirect: update grid: foo_bar_my_resource type: sylius.resource
在资源上添加渠道限制
如果您想在渠道相关的资源上添加渠道限制,您必须遵循以下2个步骤
- 您的资源(实体)需要实现
\Sylius\Component\Channel\Model\ChannelAwareInterface
或\Sylius\Component\Channel\Model\ChannelsAwareInterface
。 - 您需要在您的bundle扩展类中包含
\MonsieurBiz\SyliusPlusAdapterPlugin\DependencyInjection\SyliusPlusCompatibilityTrait
特性,并在prepend
方法中调用prependRestrictedResources
方法。
示例
您的插件扩展文件
namespace Foo\SyliusBarPlugin\DependencyInjection; use MonsieurBiz\SyliusPlusAdapterPlugin\DependencyInjection\SyliusPlusCompatibilityTrait; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; class FooSyliusBarPluginExtension extends Extension implements PrependExtensionInterface { use SyliusPlusCompatibilityTrait; public function prepend(ContainerBuilder $container): void { $this->prependRestrictedResources($container, ['my_resource']); } }
使用渠道限制过滤资源网格
为了使用渠道限制过滤资源网格,您需要在您的bundle扩展类中包含\MonsieurBiz\SyliusPlusAdapterPlugin\DependencyInjection\SyliusPlusCompatibilityTrait
特性,并在prepend
方法中调用replaceInGridOriginalQueryBuilderWithChannelRestrictedQueryBuilder
方法。
此方法的目标是用一个新查询构建器替换网格的原生查询构建器,该构建器在需要时将过滤当前渠道的资源。
配置此功能较为复杂,请参考以下示例。
示例
您当前的资源网格配置
sylius_grid: grids: foo_bar_my_resource: driver: name: doctrine/orm options: class: '%foo.model.my_resource.class%' repository: method: createListQueryBuilder arguments: ["%locale%"] # ...
您的插件扩展文件
namespace Foo\SyliusBarPlugin\DependencyInjection; use MonsieurBiz\SyliusPlusAdapterPlugin\DependencyInjection\SyliusPlusCompatibilityTrait; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; class FooSyliusBarPluginExtension extends Extension implements PrependExtensionInterface { use SyliusPlusCompatibilityTrait; public function prepend(ContainerBuilder $container): void { $this->replaceInGridOriginalQueryBuilderWithChannelRestrictedQueryBuilder( $container, 'foo_bar_my_resource', // This is the grid name '%foo_bar.model.my_resource.class%', // This is the resource class as in your original grid "expr:service('foo_bar.repository.my_resource').createListQueryBuilder('%locale%')" // This is the original query builder but called as an expression ); } }
使用渠道限制过滤渠道选择类型
为了使用渠道限制过滤渠道选择类型,您需要在您的bundle扩展类中包含\MonsieurBiz\SyliusPlusAdapterPlugin\DependencyInjection\SyliusPlusCompatibilityTrait
特性,并在load
方法中调用enabledFilteredChannelChoiceType
方法。
示例
您当前的资源表单类型
namespace Foo\SyliusBarPlugin\Form\Type; use Sylius\Bundle\ChannelBundle\Form\Type\ChannelChoiceType; use Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType; use Symfony\Component\Form\FormBuilderInterface; class MyResourceType extends AbstractResourceType { /** * @inheritdoc */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('channels', ChannelChoiceType::class, [ 'label' => 'fo_bar_my_resource.ui.form.channels', 'required' => false, 'multiple' => true, 'expanded' => true, ]) // ... ; }
您的插件扩展文件
namespace Foo\SyliusBarPlugin\DependencyInjection; use Foo\SyliusBarPlugin\Form\Type\MyResourceType; use MonsieurBiz\SyliusPlusAdapterPlugin\DependencyInjection\SyliusPlusCompatibilityTrait; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; class FooSyliusBarPluginExtension extends Extension implements PrependExtensionInterface { use SyliusPlusCompatibilityTrait; public function load(array $config, ContainerBuilder $container): void { // Loading your plugin configuration ... $this->enabledFilteredChannelChoiceType($container, ['my_resource' => MyResourceType::class]); } }
开发
由于此插件是您插件的一种辅助工具,它不打算在独立项目中使用。
更不用说,它需要Sylius Plus才能发挥作用。我们的传统测试应用似乎就毫无用处。
但为了公平起见,我们仍然添加了一个带有CMS插件并已安装和配置以使用SyliusPlusCompatibilityTrait
特性的测试应用。
这将在Sylius插件安装和使用的情况下,确保一切按预期正常工作。
许可
此插件遵循MIT许可。有关更多信息,请参阅LICENSE文件。