Edit me

プラグイン側でルーティング定義やFormの定義等々プラグインに対しての設定を行う場合、ServiceProviderで行います。
プラグインコードがSampleTestとした場合、サービスプバイダーのファイル名とディレクトリの配置はconfig.ymlへの定義は以下の通りです。

  • config.ymlにサービスプロバイダーを定義
service:
    - SampleTestService
  • ファイル名
SampleTestServiceProvider.php

ファイル名は[プラグインコード]ServiceProvider.phpという命名規則で作成します。
厳密にはconfig.ymlで定義したserviceの値に合わせます。

  • サービスプロバイダーファイル配置場所
SampleTest
  ├── ServiceProvider
  │   └── SampleTestServiceProvider.php

サービスプロバイダーの全体像

よく利用されるであろう内容を記載しています。下記はプラグインをSampleというプラグインコードで作成しています。

<?php

namespace Plugin\Sample\ServiceProvider;

use Eccube\Common\Constant;
use Plugin\Sample\Form\Type\SampleConfigType;
use Plugin\Sample\Form\Type\Extension\EntryTypeExtension;
use Plugin\Sample\Service\XXXXService;
use Silex\Application as BaseApplication;
use Silex\ServiceProviderInterface;

require_once(__DIR__.'/../log.php');

class SampleServiceProvider implements ServiceProviderInterface
{

    public function register(BaseApplication $app)
    {
        // 管理画面定義
        $admin = $app['controllers_factory'];
        // 強制SSL
        if ($app['config']['force_ssl'] == Constant::ENABLED) {
            $admin->requireHttps();
        }

        // プラグイン用設定画面
        $admin->match('/plugin/Sample/config', 'Plugin\Sample\Controller\ConfigController::index')->bind('plugin_Sample_config');

        $app->mount('/'.trim($app['config']['admin_route'], '/').'/', $admin);

        // フロント画面定義
        $front = $app['controllers_factory'];
        // 強制SSL
        if ($app['config']['force_ssl'] == Constant::ENABLED) {
            $front->requireHttps();
        }

        $front->match('/plugin/sample/hello', 'Plugin\Sample\Controller\SampleController::index')->bind('plugin_Sample_hello');

        $app->mount('', $front);

        // Form
        $app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
            $types[] = new SampleConfigType();

            return $types;
        }));

        // Form Extension
        $app['form.type.extensions'] = $app->share($app->extend('form.type.extensions', function ($extensions) use ($app) {
            $extensions[] = new EntryTypeExtension($app);

            return $extensions;
        }));

        // Repository
        $app['sample.repository.[エンティティ名]'] = $app->share(function () use ($app) {
            return $app['orm.em']->getRepository('Plugin\Sample\Entity\[エンティティ]');
        });

        // 既存Repositoryを継承したRepository定義
        $app['sample.repository.category'] = $app->share(function () use ($app) {
            return new XXXXRepository($app['orm.em'], $app['orm.em']->getMetadataFactory()->getMetadataFor('Eccube\Entity\Category'));
        });

        // Service
        $app['sample.service.[サービス名]'] = $app->share(function () use ($app) {
            return new XXXXService($app);
        });

        // メッセージ登録
        $file = __DIR__.'/../Resource/locale/message.'.$app['locale'].'.yml';
        $app['translator']->addResource('yaml', $file, $app['locale']);

        // 管理画面メニュー追加
        $app['config'] = $app->share($app->extend('config', function ($config) {
            $config['nav'][1]['child'][] = array(
                'id' => 'sample',
                'name' => 'サンプル',
                'url' => 'plugin_Sample_hello',
            );
            $config['nav'][] = array(
                'id' => 'sample2',
                'name' => 'サンプル',
                'has_child' => true,
                'icon' => 'cb-shopping-cart',
                'child' => array(
                    array(
                        'id' => 'sample3',
                        'name' => 'サンプル',
                        'url' => 'plugin_Sample_hello',
                    )
                )
            );

            return $config;
        }));

        // ログファイル設定
        if (!method_exists('Eccube\Application', 'getInstance')) {
            eccube_log_init($app);
        }

        $app['monolog.logger.sample'] = $app->share(function ($app) {
            $config = array(
                'name' => 'sample',
                'filename' => 'sample',
                'delimiter' => '_',
                'dateformat' => 'Y-m-d',
                'log_level' => 'INFO',
                'action_level' => 'ERROR',
                'passthru_level' => 'INFO',
                'max_files' => '90',
                'log_dateformat' => 'Y-m-d H:i:s,u',
                'log_format' => '[%datetime%] %channel%.%level_name% [%session_id%] [%uid%] [%user_id%] [%class%:%function%:%line%] - %message% %context% %extra% [%method%, %url%, %ip%, %referrer%, %user_agent%]',
            )

            return $app['eccube.monolog.factory']($config);
        });

    }

    public function boot(BaseApplication $app)
    {
    }

}
Tags: plugin