Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

プラグインをアンインストールしたらテーブルが削除されてしまう場合がある #4097

Closed
kurozumi opened this issue Feb 28, 2019 · 4 comments
Labels
Milestone

Comments

@kurozumi
Copy link
Contributor

概要(Overview)

BlockTraitを実装しているプラグインAと、Blockというクラス名のエンティティを実装しているプラグインBがインストールされている場合、プラグインBをアンイストールするとdtb_blockテーブルが削除されました。

期待する内容(Expect) or 要望 (Requirement)

再現手順(Procedure)

  1. BlockAプラグインをbin/console eccube:plugin:generateで作成
  2. BlockAプラグインに以下のようなBlockTraitを作成
namespace Plugin\BlockA\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation as Eccube;

/**
 * @Eccube\EntityExtension("Eccube\Entity\Block")
 */
trait BlockTrait {
    
    /**
     * @ORM\Column(name="sample", type="boolean", options={"default":false})
     */
    private $sample;
}
  1. BlockBプラグインをbin/console eccube:plugin:generateで作成
  2. BlockBプラグインに以下のようなBlockエンティティを作成
namespace Plugin\BlockB\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Block
 *
 * @ORM\Table(name="plg_block_b_block")
 * @ORM\Entity(repositoryClass="Plugin\BlockB\Repository\BlockRepository")
 */
class Block
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer", options={"unsigned":true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
}
  1. bin/console eccube:plugin:install --code BlockAでBlockAプラグインをインストール
  2. bin/console eccube:plugin:install --code BlockBでBlockBプラグインをインストール
  3. bin/console eccube:plugin:uninstall --code BlockBでBlockBプラグインをアンインストール

これでdtb_blockテーブルが削除されました。

BlockAプラグインなしでBlockBプラグインのインストール・アンインストールした場合はdtb_blockテーブル削除されませんでした。

上記、bin/console eccube:installで初期化を行ったあとも同様の現象が起こりました。

環境 (environment)

  • EC-CUBE: 4.0.2
  • PHP: 7.2.9
  • DB:
    • PostgreSQL x.x.x
    • MySQL 5.7.23

関連情報 (Ref)

@chihiro-adachi chihiro-adachi added this to the 4.0.3 milestone Feb 28, 2019
@chihiro-adachi
Copy link
Contributor

@kurozumi
ありがとうございます、再現確認しました。
原因箇所の調査すすめていきます。

@nanasess
Copy link
Contributor

nanasess commented Mar 22, 2019

通常、ここでは Plugin\BlockB\Entity の namespace が取得されるはずだが Eccube\Entity を取得してしまっているのが原因ぽい

$namespace = $tokens->generatePartialCode($tokens->getNextMeaningfulToken($namespaceIndex), $tokens->getPrevMeaningfulToken($namespaceEndIndex));
$className = $tokens[$classNameTokenIndex]->getContent();
$fqcn = $namespace.'\\'.$className;

@nanasess
Copy link
Contributor

ここで namespace を考慮せずにパスを置換しているため、 既存のエンティティと同名のエンティティは上書きされてしまう

$proxyFile = str_replace($path, $this->trait_proxies_directory, $sourceFile);

@kazumiiiiiiiiiii
Copy link
Contributor

マージいたしましたので、クローズします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants