Labo

EC-CUBE3 分室

【3.0.12-p1】データベースの操作

2016年12月25日 / 投稿者名:chiharu


前回はプラグインによるデータベースの定義を行いました。
今回は定義したデータベースへの処理を行いたいと思います。
 
ECサイトを作成する為にはデータベースが重要な割合を占める部分かと思います。
実際にはデータベースへの操作は必須な気もしますのでしっかり理解したいですね。
それでは進めて行きたいと思います。
 
 ・
 ・
 ・
 
出来ました。
ファイル自体は前回の内容を流用する形です。
とりあえず、以下の形式で問題ないと思うのですが・・・
 
■プラグインファイル
 config.yml
 PluginManager.php
 Entity/NakwebTest006.php
 Migration/Version20161218094000.php
 Repository/NakwebTest006Repository.php
 Resource/doctrine/Plugin.NakwebTest006.Entity.NakwebTest006.dcm.yml
 ServiceProvider/NakwebTest006ServiceProvider.php
 
 ▼config.yml

name: データベース関連確認のプラグイン
code: NakwebTest006
version: 0.0.1
service:
    - NakwebTest006ServiceProvider
orm.path:
    - /Resource/doctrine

 最後に使用する service に関しての記載が増えています。
 これからプラグインが複雑化すると記載される内容も増えていきますね。
 
 ▼PluginManager.php

<?php
/**
 * This file is part of EC-CUBE
 */

namespace Plugin\NakwebTest006;

use Eccube\Plugin\AbstractPluginManager;

class PluginManager extends AbstractPluginManager
{

    public function install($config, $app)
    {
        // データベース作成
        $this->migrationSchema( $app, __DIR__ . '/Migration', $config['code'] );
    }

    public function uninstall($config, $app)
    {
        // データベース削除
        $this->migrationSchema( $app, __DIR__ . '/Migration', $config['code'], 0 );
    }

    public function enable($config, $app)
    {
        // プラグイン有効処理
        $this->exeInputLog( $app, 'enable' );
    }

    public function disable($config, $app)
    {
        // プラグイン無効処理
        $this->exeInputLog( $app, 'disable' );
    }

    public function update($config, $app)
    {
    }


    public function exeInputLog($app, $eventType)
    {

        // 登録情報
        $name = $eventType;
        $data = $eventType . ' : ' . date( 'Y/m/d H:i:s' );

        $inputData = new \Plugin\NakwebTest006\Entity\NakwebTest006();
        $inputData->setName( $name );
        $inputData->setData( $data );

        // DB更新
        $app['orm.em']->persist($inputData);
        $app['orm.em']->flush($inputData);

    }

}

 本来はここでする内容でも無いかもしれませんが、データベースの操作テストとして「有効/無効」のログをデータベースに保存しています。
 実際にはエンティティの内容を読み込んでオブジェクトを作成していく形ですね。
 
 ▼Entity/NakwebTest006.php
 ※Entityフォルダに保存しています。

<?php
/**
 * This file is part of EC-CUBE
 */

namespace Plugin\NakwebTest006\Entity;

class NakwebTest006 extends \Eccube\Entity\AbstractEntity
{

    private $id;
    private $name;
    private $data;


    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;

        return $this;
    }


    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }


    public function getData()
    {
        return $this->data;
    }

    public function setData($data)
    {
        $this->data = $data;

        return $this;
    }

}

 ログを記録するときに使用していたエンティティです。
 個別にファイルを作成する必要があるのは少々手間かもしれません。
 
 ▼Migration/Version20161218094000.php
 ※Migrationフォルダに保存しています。

<?php

namespace DoctrineMigrations;

use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;

class Version20161218094000 extends AbstractMigration
{
    public function up(Schema $schema)
    {

        // データベースの削除
        $table = $schema->createTable( 'plg_nakweb_test006' );

        $table->addColumn(
            'plg_test_id', 
            'integer', 
            array(
                'autoincrement' => true
            )
        );

        $table->addColumn(
            'test_name', 
            'text', 
            array(
                'notnull' => false
            )
        );

        $table->addColumn(
            'test_data', 
            'text', 
            array()
        );

        $table->setPrimaryKey( array( 'plg_test_id' ) );

    }

    public function down(Schema $schema)
    {

        // データベースの削除
        $schema->dropTable( 'plg_nakweb_test006' );

    }

}

 EC-CUBE内で操作するデータベース定義ですね。
 今回はデータ登録の際にオートインクリメントをする設定にしています。
 
 ▼Repository/NakwebTest006Repository.php
 ※Repositoryフォルダに保存しています。

namespace Plugin\NakwebTest006\Repository;

use Doctrine\ORM\EntityRepository;

class NakwebTest006Repository extends EntityRepository
{
}

 今回は作成していますが特には何もしていません。
 必要との記述を読んだ気はするのですが、フォームが無い場合はあまり意味はないかもしれません。
 
 ▼Resource/doctrine/Plugin.NakwebTest006.Entity.NakwebTest006.dcm.yml
 ※Resource/doctrineフォルダに保存しています。

Plugin\NakwebTest006\Entity\NakwebTest006:
    type: entity
    table: plg_nakweb_test006
    repositoryClass: Plugin\NakwebTest006\Repository\NakwebTest006Repository
    id:
        id:
            type: integer
            nullable: false
            unsigned: false
            id: true
            column: plg_test_id
            generator:
                strategy: AUTO
    fields:
        name:
            type: text
            nullable: true
            column: test_name
        data:
            type: text
            nullable: true
            column: test_data
    lifecycleCallbacks: {  }

 今回の作業で一番重要な部分になります。
 データベースの本体とEC-CUBE側のデータオブジェクトの連携を行います。
 ここがしっかりしていないとデータベースとの連携はできません。
 
 ▼ServiceProvider/NakwebTest006ServiceProvider.php
 ※ServiceProviderフォルダに保存しています。

<?php
namespace Plugin\NakwebTest006\ServiceProvider;

use Eccube\Application;
use Silex\Application as BaseApplication;
use Silex\ServiceProviderInterface;

class NakwebTest006ServiceProvider implements ServiceProviderInterface
{
    public function register(BaseApplication $app)
    {
        //Repository
        $app['nakwebtest006.repository.nakwebtest006'] = $app->share(function () use ($app) {
            return $app['orm.em']->getRepository('Plugin\NakwebTest006\Entity\NakwebTest006');
        });

    }

    public function boot(BaseApplication $app)
    {
    }
}

 リポジトリの設定を行います。
 今回はリポジトリに特殊な起債はしていないため、EC-CUBE標準の機能をそのまま使用している様ですね。
 
 
 
まぁ、こんな感じでデータべエースへの登録が可能になります。
実際にはフォームからの入力などをするプラグインが多いと思います。
その辺りは次回以降に見ていきたいと思います。
ということで今回はここまでです。
 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

* Copy This Password *

* Type Or Paste Password Here *

*

コメント欄にコードを挿入したい場合は、[php][/php] を使ってください。