monsieurbiz/sylius-plus-adapter-plugin

本插件提供工具,以适配您的插件至Sylius Plus RBAC系统。

v1.1.0 2024-07-03 14:32 UTC

This package is auto-updated.

Last update: 2024-09-03 14:53:54 UTC


README

Menu Plugin license Tests Status Recipe Status Security Status

本插件提供工具,以适配您的插件至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文件。