Code Monkey home page Code Monkey logo

bcbake's Introduction

BcBake plugin for baserCMS

baserCMSのスキャッフォルドを作成するためのプラグインです。
CakePHPの bake コマンドを拡張して、baserCMSのプラグインやテーマを作成するためのコマンドを提供します。

プラグインの作成

プラグインを作成するためのコマンドは次の通りです。

bin/cake bake bc_plugin {PluginName}

bake bc_plugin コマンドは、CakePHPが提供する bake plugin コマンドが生成するファイルに加えて次のファイルを生成します。
これによりすぐに baserCMSにインストール可能となります。

  • config.php
  • config/setting.php
  • src/ServiceProvider/PluginNameServiceProvider.php
  • src/Event/PluginNameControllerEventListener.php
  • src/Event/PluginNameModelEventListener.php
  • src/Event/PluginNameViewEventListener.php
  • src/Event/PluginNameHelperEventListener.php
  • src/View/Helper/PluginNameBaserHelper.php

不要なファイルは削除しましょう。

MVCに関連するファイルの作成

MVCに関連するファイルを作成するためのコマンドは次の通りです。

bin/cake bake bc_all {table_name} -p {PluginName} --prefix Admin

bake bc_all コマンドは、CakePHPが提供する bake all コマンドが生成するファイルに加えて次のファイルを生成します。

  • src/Service/TableNameService.php
  • src/Service/TableNameServiceInterface.php
  • src/Service/Admin/TableNameAdminService.php
  • src/Service/Admin/TableNameAdminServiceInterface.php

サービスクラスを利用するには、サービスプロバイダに登録が必要となります。

// src/ServiceProvider/PluginNameServiceProvider.php

// provides プロパティにインターフェイスを定義
protected array $provides = [
    TableNameAdminServiceInterface::class,
];

// services メソッドにインターフェイスと実装クラスの関連付けを登録
public function services($container): void
{
    $container->defaultToShared(true);
    $container->add(TableNameAdminServiceInterface::class, TableNameAdminService::class);
}

bcbake's People

Contributors

ryuring avatar

Stargazers

 avatar

Watchers

 avatar

bcbake's Issues

src/Plugin.phpについて

bin/cake bake bc_plugin Hoge
とした場合、src/HogePlugin.phpが作られますが、画面からインストールしようとすると、
「プラグインに Plugin クラスが存在しません。src ディレクトリ配下に作成してください。」
と、たぶんsrc/Plugin.phpがないと怒られます。
実際は、src/HogePlugin.phpとsrc/Plugin.phpはどちらが正解なのでしょうか?

テスト時のdefineについて

@ryuring
(フォーラムとどちらが良いんだろうと思いながら、こちらで質問します、)

https://qiita.com/ryuring/items/c0b517fc454ff7f08e4b
こちらを参考に、プラグインのテストを作ろうとしてますが、
プラグインディレクトリからテスト実行すると、プラグイン内のphpunit.xmlとtests/bootstrap.phpは実行されるんですよね?
という前提の元、

bin/cake bake bc_plugin Hoge
プラグインを作って、プラグインのディレクトリから、
../../vendor/bin/phpunit
テストを実行すると、
Warning: Constant ROOT already defined in /var/www/html/config/paths.php on line 31
2重定義してまっせというワーニングが大量に出ます。
config/paths.php

if (!defined('ROOT')) {
    define('ROOT', dirname(__DIR__));
}

こんな感じで直すと、ワーニングは出なくはなりますが、
何か使い方間違えてますでしょうか?
もしくは、config/paths.phpを修正してPR出した方が良いでしょうか?

Serviceクラスのテストについて

@ryuring
プラグインのServiceクラスのテストを、baserCMSに倣って書きたいのですが、
以下のようなエラーが出て、コンテナに登録されない(?)、エイリアスが無い(?)と怒られます。

1) DubOgp\Test\TestCase\Service\DubOgpConfigsServiceTest::test__construct
League\Container\Exception\NotFoundException: Alias (DubOgp\Service\DubOgpConfigsServiceInterface) is not being managed by the container or delegates

/var/www/html/vendor/league/container/src/Container.php:208
/var/www/html/vendor/league/container/src/Container.php:118
/var/www/html/plugins/baser-core/src/Utility/BcContainerTrait.php:33
/var/www/html/plugins/DubOgp/tests/TestCase/Service/DubOgpConfigsServiceTest.php:20
/var/www/html/vendor/bin/phpunit:122

ちなみにテストはdockerコンテナに入って、プラグインディレクトリから実行しています。

cd plugins/DubOgp/
../../vendor/bin/phpunit tests/TestCase/Service/DubOgpConfigsServiceTest.php

basercms/plugins/bc-theme-config/tests/TestCase/Service/ThemeConfigsServiceTest.php
この辺を参考にしてるのですが、コンテナ登録はBcTestCaseが勝手にやってくれてるように見えるんですが、
なにか設定なり登録が必要でしょうか?
なにか気になる点や、ヒントだけでもいただけると助かります。
できれば、ServiceTestのサンプルがあると嬉しいです!

問題のテストコードは以下、
DubOgpConfigsServiceTest.php

<?php
namespace DubOgp\Test\TestCase\Service;

// use Cake\TestSuite\TestCase;
use BaserCore\TestSuite\BcTestCase;
use BaserCore\Utility\BcContainerTrait;
use DubOgp\Service\DubOgpConfigsService;
use DubOgp\Service\DubOgpConfigsServiceInterface;

class DubOgpConfigsServiceTest extends BcTestCase
{
    
    use BcContainerTrait;

    public $DubOgpConfigsService;

    public function setUp(): void
    {
        parent::setUp();
        $this->DubOgpConfigsService = $this->getService(DubOgpConfigsServiceInterface::class);
    }

    public function tearDown(): void
    {
        unset($this->DubOgpConfigsService);
        parent::tearDown();
    }

    public function test__construct()
    {
        $this->assertEquals('dub_ogp_configs', $this->DubOgpConfigsService->DubOgpConfigs->getTable());
    }

}

テスト対象のServiceは以下、
DubOgpConfigsService.php

<?php
declare(strict_types=1);

namespace DubOgp\Service;

use DubOgp\Model\Entity\DubOgpConfig;
use DubOgp\Model\Table\DubOgpConfigsTable;
use Cake\Datasource\EntityInterface;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;

/**
 * DubOgpConfigs Service
 */
class DubOgpConfigsService implements DubOgpConfigsServiceInterface
{
    
    public DubOgpConfigsTable|Table $DubOgpConfigs;

    /**
     * キャッシュ用 Entity
     * @var MailConfig
     */
    protected $entity;

    /**
     * constructor
     */
    public function __construct()
    {
        $this->DubOgpConfigs = TableRegistry::getTableLocator()->get('DubOgp.DubOgpConfigs');
    }

    /**
     * get new
     * @return \Cake\Datasource\EntityInterface
     以下bakeされたコードが続く
     */

}

プロバイダーは登録してあって、以下のテストコードは通りました。
DubOgpServiceProviderTest.php

<?php

namespace DubOgp\Test\TestCase\ServiceProvider;

use BaserCore\TestSuite\BcTestCase;
use DubOgp\Service\DubOgpConfigsServiceInterface;
use DubOgp\ServiceProvider\DubOgpServiceProvider;
use Cake\Core\Container;

class DubOgpServiceProviderTest extends BcTestCase
{
    public function setUp(): void
    {
        parent::setUp();
        $this->DubOgpServiceProvider = new DubOgpServiceProvider();
    }

    public function tearDown(): void
    {
        unset($this->DubOgpServiceProvider);
        parent::tearDown();
    }

    public function testServices()
    {
        $container = new Container();
        $this->DubOgpServiceProvider->services($container);
        $this->assertTrue($container->has(DubOgpConfigsServiceInterface::class));
    }

}

対象コードは以下、
DubOgpServiceProvider.php

<?php
declare(strict_types=1);

namespace DubOgp\ServiceProvider;

use DubOgp\Service\DubOgpConfigsService;
use DubOgp\Service\DubOgpConfigsServiceInterface;
use DubOgp\Service\Admin\DubOgpConfigsAdminService;
use DubOgp\Service\Admin\DubOgpConfigsAdminServiceInterface;
use Cake\Core\ServiceProvider;

/**
 * DubOgp Service Provider
 */
class DubOgpServiceProvider extends ServiceProvider
{

    protected $provides = [
        // TableNameAdminServiceInterface::class,
        DubOgpConfigsServiceInterface::class,
        DubOgpConfigsAdminServiceInterface::class,
    ];

    public function services($container): void
    {
        $container->defaultToShared(true);
        //$container->add(TableNameAdminServiceInterface::class, TableNameAdminService::class);
        $container->add(DubOgpConfigsServiceInterface::class, DubOgpConfigsService::class);
        $container->add(DubOgpConfigsAdminServiceInterface::class, DubOgpConfigsAdminService::class);
    }

}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.