EC-CUBE4 Repositoryのカスタマイズ方法

EC-CUBE4

EC-CUBE4 での Repositoryのカスタマイズ方法 をご紹介します。

RepositoryとはEntityデータのを操作するためのクラスのことですね。

こちらの記事で、Serviceクラスのカスタマイズ方法を紹介してますので一緒にご覧ください。
EC-CUBE4 Serviceクラスのカスタマイズ方法

Repositoryのカスタマイズ

今回は例として、OrderRepositoryをカスタマイズしようと思います。

Step1. Services.yamlの編集

app/config/eccube/services.yamlにカスタマイズしたいRepositoryクラスを追記します。

services:
    ....
    Customize/Service/OrderRepository:
        decorates: Eccube\Repository\OrderRepository

3行目でカスタマイズファイルを指定して、
4行目にてカスタマイズしたいRepositoryを指定していします。

今回で言うと、カスタマイズファイルがCustomize/Repository/OrderRepository.phpカスタマイズ対象ファイルがsrc/Eccube/Repository/OrderRepository.phpになります。

Step2. カスタマイズファイルの作成

Customize/Repository/OrderRepository.phpを作成しましょう。

<?php
namespace Customize\Repository;
use Eccube\Repository\OrderRepository as BaseOrderRepository;
use Doctrine\ORM\NoResultException;
use Doctrine\ORM\QueryBuilder;
use Customize\Common\OrderStatus as CustomizeOrderStatus;
use Eccube\Doctrine\Query\Queries;
use Eccube\Entity\Member;
use Eccube\Entity\Customer;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Entity\Order;
use Eccube\Entity\Shipping;
use Eccube\Request\Context;
use Eccube\Util\StringUtil;
use Eccube\Repository\QueryKey;
use Symfony\Bridge\Doctrine\RegistryInterface;

class OrderRepository extends BaseOrderRepository
{
}

これで、カスタマイズする準備は整いました。

Step3. カスタマイズ

Step2で作成したクラスに変更した関数をオーバーライドするなり、新しい関数を作成するなり自分の目的にあった方法でカスタマイズすれば完了です。

カスタマイズできたら、キャッシュを削除しておきましょう。

コマンドはこちら、

$ php bin/console cache:clear --no-warmup

以上です!

簡単なサンプル

Customize/Repository/OrderRepository.phpを以下のように、カスタマイズしてみます。

<?php
namespace Customize\Repository;
use Eccube\Repository\OrderRepository as BaseOrderRepository;

use Doctrine\ORM\NoResultException;
use Doctrine\ORM\QueryBuilder;
use Customize\Common\OrderStatus as CustomizeOrderStatus;
use Eccube\Doctrine\Query\Queries;
use Eccube\Entity\Member;
use Eccube\Entity\Customer;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Entity\Order;
use Eccube\Entity\Shipping;
use Eccube\Request\Context;
use Eccube\Util\StringUtil;
use Eccube\Repository\QueryKey;
use Symfony\Bridge\Doctrine\RegistryInterface;

class OrderRepository extends BaseOrderRepository
{
    public function sample()
    {
        var_dump('SAMPLE');die();
    }
}

このカスタマイズしたものをCustomize/Controller/Admin/Order/OrderController.phpで呼び出してみましょう。
ちなみに、コントローラーのカスタマイ方法はこちらで紹介しています。コントローラーのカスタマイズ方法

下記のようにカスタマイズしてみましょう。

<?php
/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace Customize\Controller\Admin\Order;
...
use Eccube\Repository\OrderRepository;  ## これがあればOKです
...
class OrderController extends AbstractController
{
    ...
    public function __construct(
        ...
        OrderRepository $orderRepository,
        ...
    ) {
        ...
        $this->orderRepository = $orderRepository;
        ...
    }
    /**
     * 受注一覧画面.
     ...
     */
    public function index(Request $request, $page_no = null, PaginatorInterface $paginator)
    {
        $this->orderRepository->sample();
        ...
    }
}

キャッシュも削除できたら、http://localhost:8080/admin/orderに接続してみましょう。
(※ http://localhost:8080は自分の環境にあったものに変更してください)

カスタマイズ結果

「SAMPLE」が表示されていれば完了です。

おわりに

最後までご覧いただきありがとうございます!

簡単なサンプルでは、新しい関数を作成していますがオーバーライドするのは、カスタマイズしたい関数名で関数を作成すれば良いのであまり難しくないと思います。

ちないみに、公式でもRepositoryのカスタマイズ方法が紹介されています。Repositoryカスタマイズ

お疲れ様でした。

コメント

  1. 名無し より:

    services:
    ….
    Customize/Service/OrderRepository:

    Customize\Repository\OrderRepository:
    ではないでしょうか

タイトルとURLをコピーしました