美文网首页
12. the 5.2 plugin system / 插件系统

12. the 5.2 plugin system / 插件系统

作者: _chuuuing_ | 来源:发表于2017-07-06 21:30 被阅读0次

    装饰(修改)一个Service

    /htdocs/engine/Shopware/Bundle/StoreFrontBundle/Service/Core/ListProductService.php
    可以在上面路径中找到ListProductService.php文件 ==> 该 service 已存在。

    定义该service的xml配置文件在/htdocs/engine/Shopware/Bundle/StoreFrontBundle/services.xml。在这里面看到ListProductService.php被定义,如下:

    <service id="shopware_storefront.list_product_service" 
      class="Shopware\Bundle\StoreFrontBundle\Service\Core\ListProductService">
                <argument type="service" id="shopware_storefront.list_product_gateway"/>
                <argument type="service" id="shopware_storefront.graduated_prices_service"/>
                <argument type="service" id="shopware_storefront.cheapest_price_service"/>
                <argument type="service" id="shopware_storefront.price_calculation_service"/>
                <argument type="service" id="shopware_storefront.media_service"/>
                <argument type="service" id="shopware_storefront.marketing_service"/>
                <argument type="service" id="shopware_storefront.vote_service"/>
                <argument type="service" id="shopware_storefront.category_service" />
                <argument type="service" id="config" />
     </service>
    

    我们自己定义的services.xml这样写:
    属性id是新建的service的id,而decorate中是将要被修改的service的id。
    这句代码的功能为:告诉服务器将用swag_example.list_product_service代替 id 为shopware_storefront.list_product_service的service。而旧的service通过<argument>被重命名为swag_example.list_product_service.inner,通过这种办法将旧的service注入到我们新建的service中。

    注意:这里的<argument>的id的命名基于新service的id,但有一定自由度,你也可以命名为比如swag_example.list_product_service.wooz

    <?xml version="1.0" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
      
        <services>
            <service id="swag_example.list_product_service"
                     class="SwagExample\Bundle\StoreFrontBundle\ListProductService"
                     decorates="shopware_storefront.list_product_service"
                     public="false">
                <argument type="service" id="swag_example.list_product_service.inner"/>
            </service>
        </services>
    </container>```
    更多关于service decorate的信息
    这里相关的修改已经涉及到Symfony的知识点,跟多相关接下来对该service进行修改。
    

    <?php

    namespace SwagExample\Bundle\StoreFrontBundle;

    // 引用需要用到的两个接口(这两个接口在原本的ListProductService.php中就有被引用,原文件中有许多许多被引用的文件,但这里只引用我们需要的)
    use Shopware\Bundle\StoreFrontBundle\Service\ListProductServiceInterface;
    use Shopware\Bundle\StoreFrontBundle\Struct\ProductContextInterface;

    class ListProductService implements ListProductServiceInterface
    {
    private $service;

    public function __construct(ListProductServiceInterface $service)
    {
        $this->service = $service;
    }
    
    public function getList(array $numbers, ProductContextInterface $context)
    {
        $products = $this->service->getList($numbers, $context);
        //...
        return $products;
    }
    
    public function get($number, ProductContextInterface $context)
    {
        return array_shift($this->getList([$number], $context));
    }
    

    }

    到这里service decoration的内容告一段落 END
    
    #### 实例
    

    SwagSloganOfTheDay
    ├── Resources
    │ └── services.xml xml为配置文件; 该文件中可新定义services; 或重写 / 修改核心service
    ├──SloganPrinter.php
    ├──RouteSubscriber.php
    └──SwagSloganOfTheDay.php 主php文件,入口文件; 包含安装 / 卸载函数; 调用service.xml中的services

    在shopware新的插件系统中,我们可以在services.xml中利用service的`tag`标签添加subscriber ==> 通过这种方式,Shopware能够自动加载所有事件监听器(event subscriber)而不用再手动声明。
    > service的 `tag` 标签该service用于某个特定目的(specific purpose) 
    
    

    <?xml version="1.0" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    <services>
    <service id="swag_slogan_of_the_day.subscriber.route" class="SwagSloganOfTheDay\Subscriber\Route">
    <argument type="service" id="swag_slogan_of_the_day.slogan_printer" />
    <tag name="shopware.event_subscriber" />
    </service>
    <service id="swag_slogan_of_the_day.slogan_printer" class="SwagSloganOfTheDay\SloganPrinter">
    <argument type="service" id="dbal_connection" />
    </service>
    </services>
    </container>```

    注册带tpl的Controller

    首先在插件的主php文件中注册controller:

    <?php
    namespace SwagControllerExample;
    
    use Shopware\Components\Plugin;
    
    class SwagControllerExample extends Plugin
    {
        /**
         * @inheritdoc
         */
        public static function getSubscribedEvents()
        {
            return [
                'Enlight_Controller_Dispatcher_ControllerPath_Frontend_MyController' => 'registerController',
            ];
        }
        // 注册控制器
        public function registerController(\Enlight_Event_EventArgs $args)
        {
            // 获取模板文件路径
            $this->container->get('template')->addTemplateDir(
                $this->getPath() . '/Resources/views/'
            );
            return $this->getPath() . '/Controllers/Frontend/MyController.php';
        }
    }
    

    编写的插件中,Controller需要放在固定路径下:SwagControllerExample/Controllers/(Backend|Frontend|Widgets|Api)/MyController.php
    Controller的命名也需要遵守规则。在Controller的preDispatch()方法中,我们完成了模板template的注册。

    class Shopware_Controllers_Frontend_MyController extends \Enlight_Controller_Action
    {
        public function preDispatch()
        {
            $pluginPath = $this->container->getParameter('swag_controller_example.plugin_dir');
            // 添加模板路径
            $this->get('template')->addTemplateDir($pluginPath . '/Resources/views/');
            $this->get('snippets')->addConfigDir($pluginPath . '/Resources/snippets/');
        }
    }```

    相关文章

      网友评论

          本文标题:12. the 5.2 plugin system / 插件系统

          本文链接:https://www.haomeiwen.com/subject/kjaxhxtx.html