EC-CUBEを使っていると、実際のビジネスに合わせて特殊な管理項目を作りたいというご要望は必ず出てくると思います。
今回は管理画面内に新規ページを作成し表示できるようにする方法を紹介します。

EC-CUBE3では、フレームワークでいうRouterの役割を果たしているクラスはControllerProviderです。
(ControllerProviderInterfaceを実装)
このクラスがアクセスされるURLとコントローラーを紐づける役割を果たしています。

例えば、AdminControllerProviderの中身を見てみると、次のような行があります。

$c->match('/order/new', '\Eccube\Controller\Admin\Order\EditController::index')->bind('admin_order_new');

この一文の意味は、/admin/order/newというURL(受注登録ページ)にアクセスがあれば、
Admin\Order\EditControllerのindexメソッドを呼べという記述です。

もう1行見てみましょう。

$c->match('/order/{id}/edit', '\Eccube\Controller\Admin\Order\EditController::index')->assert('id', '\d+')->bind('admin_order_edit');

この一文の意味は、/admin/order/(受注番号)/editというURL(受注編集ページ)にアクセスがあれば、
Admin\Order\EditControllerのindexメソッドを呼べという記述です。
{id}には任意の受注番号が対象となり、その情報もコントローラーへ渡されます。

以上のことを踏まえて、ある商品を購入したことがあるユーザーの一覧を表示するページを新規作成する場合、どのように書けば良いのでしょうか?
答えは様々ですが、例えば次のような表記になります。

$c->match('/product/{id}/customer', '\Eccube\Controller\Admin\Product\ProductController::customer')->assert('id', '\d+')->bind('admin_product_customer');

ProductControllerにcustomerというメソッドを追加し、twigを表示してやれば完成です。