[EC-CUBE] 4.0.1(新規)
[レンタルサーバ] ローカルのバーチャルマシン
[OS] CentOS7
[PHP] PHP 7.2.12
[データベース] MySQL 8.0.13
[WEBサーバ] Apache 2.4.6
[ブラウザ] Chrome
[導入プラグインの有無] SalesReport4 4.0, DeliveryFreeProduct 1.0.2, GmoPaymentGateway4 1.0.2, ProductReview4 4.0, Recommend4 4.0, RelatedProduct4 4.0,
[カスタマイズの有無] 有
[現象]
複数のデータベースを利用したく doctrine.yaml を設定したところ、Plugin\SalesReport4\Service\SalesReportService のコンストラクタのタイプヒントの定義に問題がある、とのエラーでEC-CUBE全体が動作しなくなりました。
○エラーメッセージ
Cannot autowire service "Plugin\SalesReport4\Service\SalesReportService": argument "$entityManager" of method "__construct()" references class "Doctrine\ORM\EntityManager" but no such service exists. Try changing the type-hint to one of its parents: interface "Doctrine\ORM\EntityManagerInterface", or interface "Doctrine\Common\Persistence\ObjectManager".
○該当箇所 Plugin\SalesReport4\Service\SalesReportService line 111
public function __construct(EntityManager $entityManager, EccubeConfig $eccubeConfig)
{
$this->entityManager = $entityManager;
$this->eccubeConfig = $eccubeConfig;
}
これを以下のように修正すると正常に動作するようになりました。
public function __construct(EntityManagerInterface $entityManager, EccubeConfig $eccubeConfig)
{
$this->entityManager = $entityManager;
$this->eccubeConfig = $eccubeConfig;
}
バグと呼べるかどうかちょっと判断しかねますが、ご報告しておきます。
以下、念のため複数DBの接続設定をしたdoctrine.yamlも掲載しておきます。
○doctrine.yaml
parameters:
# Adds a fallback DATABASE_URL if the env var is not set.
# This allows you to run cache:warmup even if your
# environment variables are not available yet.
# You should not need to change this value.
env(DATABASE_URL): ''
env(DATABASE_SERVER_VERSION): ~
env(V2_DATABASE_URL): ''
env(V2_DATABASE_SERVER_VERSION): ~
doctrine:
dbal:
default_connection: default
connections:
default:
driver: 'pdo_sqlite'
server_version: "%env(DATABASE_SERVER_VERSION)%"
charset: utf8
# for mysql only
default_table_options:
collate: 'utf8_general_ci'
# With Symfony 3.3, remove the `resolve:` prefix
url: '%env(DATABASE_URL)%'
v2:
server_version: "%env(V2_DATABASE_SERVER_VERSION)%"
charset: utf8
# for mysql only
default_table_options:
collate: 'utf8_general_ci'
# With Symfony 3.3, remove the `resolve:` prefix
url: '%env(V2_DATABASE_URL)%'
# types
types:
datetime: 'Eccube\Doctrine\DBAL\Types\UTCDateTimeType'
datetimetz: 'Eccube\Doctrine\DBAL\Types\UTCDateTimeTzType'
orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: default
entity_managers:
default:
naming_strategy: doctrine.orm.naming_strategy.underscore
connection: default
auto_mapping: true
dql:
string_functions:
NORMALIZE: Eccube\Doctrine\ORM\Query\Normalize
numeric_functions:
EXTRACT: Eccube\Doctrine\ORM\Query\Extract
filters:
option_nostock_hidden:
class: Eccube\Doctrine\Filter\NoStockHiddenFilter
enabled: false
incomplete_order_status_hidden:
class: Eccube\Doctrine\Filter\OrderStatusFilter
enabled: false
v2:
naming_strategy: doctrine.orm.naming_strategy.underscore
connection: v2
dql:
string_functions:
NORMALIZE: Eccube\Doctrine\ORM\Query\Normalize
numeric_functions:
EXTRACT: Eccube\Doctrine\ORM\Query\Extract
filters:
option_nostock_hidden:
class: Eccube\Doctrine\Filter\NoStockHiddenFilter
enabled: false
incomplete_order_status_hidden:
class: Eccube\Doctrine\Filter\OrderStatusFilter
enabled: false