EC-CUBE / EC-CUBE/ec-cube

app/proxyディレクトリをシンボリックリンクにしているとProxyファイル生成時にシステムエラーが発生する

Open
#4,252 1 comment 0 reactions 0 assignees View on GitHub
improvement
Dominant language
PHP
Stars
788
Forks
719
Avg merge
4d 4h
Merged PRs (30d)
39

Description

## 概要(Overview)
app/proxyディレクトリを別のディレクトリのシンボリックリンクにしていると、プラグイン有効/無効時のProxyファイル生成時に以下のようなエラーが発生する

```
[Eccube\Log\Logger:log:68] - システムエラーが発生しました。 ["Compile Error: Cannot declare class Eccube\\Entity\\Product, because the name is already in use","/mnt/ec-cube/app/proxy/entity/mnt/ec-cube/src/Eccube/Entity/Product.php",1054,"#0 {main}"]
```

通常の利用ではシンボリックリンクにすることは無いが、クラスタリングするためにapp/proxyディレクトリをファイルサーバーにおいてそれぞれのサーバーにマウントするようなケースでは、シンボリックリンクにすることもある。

#4117 により `app/proxy` 以下はディレクトリを分けるよう修正された。
この修正により、Proxy再生成時に以下のような `src` から始まるディレクトリとリンク先のディレクトリ以下に同じ完全修飾クラス名のクラスが作成され衝突する。

```
app/proxy/entity/mnt/ec-cube/src/Eccube/Entity/Product.php
app/proxy/entity/src/Eccube/Entity/Product.php
```

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

#### 案1. app/proxy/entity 以下をnamespaceのディレクトリだけにする
現状は `app/proxy/entity` 以下に `src` や `mnt/ec-cube` などのディレクトリが含まれてしまうが、`app/proxy/entity/Eccube/Entity/Product.php` の様にnamespaceのディレクトリだけにしてしまえば、衝突することはなくなる。

この方法ができればいいが、[AnnotationDriver](https://github.com/EC-CUBE/ec-cube/blob/7a5a53744c1555d5ecd5898dbc3067c8b6752a9b/src/Eccube/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php#L80) でクラスをロードする前に本体のEntityかProxyかを決定しないといけないため、クラスをロードせずにnamespaceを判定しなければいけなくなるので難しい。

#### 案2. Proxy出力場所を環境変数等で変更できるようにする
現状は `app/proxy/entity` 固定になっているが、これを環境変数で変更できるようにする

## 再現手順(Procedure)
1. ドキュメントルートを `/var/www/ec-cube` とする。
1. 以下のように `/var/www/ec-cube/app/proxy` を `/mnt/ec-cube/app/proxy` のシンボリックリンクとしておく。
```
$ ln -s /mnt/ec-cube/app/proxy /var/www/ec-cube/app/proxy
```
1. Entity拡張を利用しているプラグインをインストールする
1. プラグインを有効化する
1. プラグインを無効化する
1. エラーが発生する

### 環境 (environment)
+ EC-CUBE: 4.0.3

## 関連情報 (Ref)
#4117

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.