Magentoのエクステンションを作ってみよう 〜概論編〜

今回からはMagentoのエクステンションの作り方をご紹介していきます。
Magentoをカスタマイズする場合、大きく分けて以下の2つの作業領域がでてきます。

  • テーマのカスタマイズ
  • 機能のカスタマイズ

エクステンションの作成は「機能のカスタマイズ」に当たる領域で、他のCMSやアプリケーションでは「プラグイン開発」とも呼ばれたりします。エクステンション開発ができるようになると、標準では不足する機能を自作できるようになり、Magentoを良い形でカスタマイズできるようになります。

エクステンションを作り始める前に

早速エクステンションの作り方をご紹介しよう、と思ったのですが、その前にMagentoのディレクトリ構成を解説しておきましょう。Magentoのディレクトリ構成を理解しないまま作業を始めてしまうと、いじってはいけないファイルをいじってしまい、取り返しのつかないことになる恐れがあります。
なお、以下の解説は「/var/www/magento」にMagentoをインストールしたと仮定しています。
(さくらのクラウドのスタートアップスクリプトを使っても同じ構成になります)

app

app下には、Magentoの設定ファイルや独自開発したテーマやエクステンションを配置します。カスタマイズを行う際に一番よく触る領域かもしれません。

bin

bin下にはコマンドラインツールが配置されています。インストールの手順などでご紹介したmagentoコマンドはエクステンション開発時にも活躍します。

dev

ユニットテストやインテグレーションテストなどのテストケースやテスト用のライブラリが入っています。

generated

Magentoが自動生成するクラスなどはこのディレクトリに配置されます。developerモード時はそこまで重要ではありませんが、productionモード時には自動生成クラスがきちんと生成されていなければなりません。不完全な状態の場合、パフォーマンスが低下するだけでなく、エラーが発生する可能性もあります。

lib

Magentoフレームワークと、JavaScriptライブラリが配置されています。

phpserver

PHP5.4から搭載されているビルトインWebサーバーでMagentoを動かす場合に使用します。ディレクトリの中にreadmeファイルが入っていますので、試したい方はよく読んでからお試しください。

pub

商品画像などの管理画面からアップロードする画像や、テーマが使用する静的ファイル(画像/CSS/JSファイル)が配置されます。テーマが使用する静的ファイルはdeveloperモードでは自動的に配置されますが、productionモードではデプロイコマンドを実行しない限り配置されません。

setup

MagentoのWebインストーラー画面のプログラムが入っています。インストール後は使うことはないでしょう。

update

Magentoを更新するためのプログラムが入っています。Webブラウザを使用してMagentoを更新する場合はこちらから行うことになります。

var

ログファイルやセッションデータ、アプリケーションキャッシュなどが配置されています。Magentoの公式Marketplaceの認証情報もこのディレクトリ下に保管されているので、誤って削除しないように気をつけてください。

vendor

composerでライブラリ管理を行っているPHPアプリケーションではおなじみのディレクトリですが、実はMagento本体のコードもここに入っています。なお、vendor下のファイルは決して編集してはいけません。

エクステンションのファイル・ディレクトリ構成

では次にエクステンションのファイル・ディレクトリ構成を解説しましょう。

エクステンションディレクトリの配置場所と命名規則

エクステンションのディレクトリは、(Magentoをインストールしたディレクトリ)/app/codeディレクトリの配下に下記の命名規則に従って作成します。

ベンダー名/エクステンション名

どちらも任意で決めて構いませんが、アルファベットの大文字小文字はOSによって区別するものとしないものがあるので、十分注意してください。
Magento的には先頭を大文字にする必要があります。あとは全て小文字でも構いません。

エクステンションディレクトリ内に作成するもの

作成したエクステンションディレクトリの配下に作成するものとしては、基本的にregistration.phpとetcディレクトリ以外は必須ではないので、必要に応じて定義します。

registration.php

エクステンションをMagentoに認識させるために不可欠なファイルです。このファイルがないとエクステンションは動作しません。

etc

各種設定を定義するXMLファイルを配置するディレクトリです。Magentoが使用するXMLファイルにはすべてスキーマ定義が行われています。XMLファイルごとに定義できるタグや属性が決まっていますので、定義されていない要素を書かないようにしましょう。統合開発環境などを使うとXMLファイルの定義内容をチェックしてくれるので、ミスが減ります。

Api

Magentoはインターフェイスを多用します。Apiディレクトリにはインターフェイスを配置します。

Block

Blockには画面上に配置するパーツのクラスを定義します。Blockが別途phtmlテンプレートを使用する場合は、viewディレクトリ以下にテンプレートファイルを配置します。

Helper

Magento2系になってあまり使用されなくなりつつありますが、Helperにはデータの変換を担当するクラスを格納します。なくても構わないレベルではありませんが、重要度はMagento1系よりも下がっています。

Model

ビジネスロジックやデータベース・ファイルシステムへの読み書きといった様々な処理を担当するクラスを定義します。また、Apiディレクトリで定義したインターフェイスに対応する実装クラスもこのディレクトリ下に定義します。

Controller

いわゆるMVCパターンで言うところのCつまりControllerを配置します。Magentoの場合、1アクションを1つのクラスで定義する仕組みのため、Controllerクラスの数はアクション数と同じだけ定義する必要があります。

Cron

定時バッチを実行するクラスを定義します。ここに配置したクラスに対応する定義をXMLで行うことで、指定したサイクルで定時バッチが実行されるようになります。

Command

bin/magentoコマンドから実行できるサブコマンドを定義します。

Observer

Magentoのプログラム中に埋め込まれているイベントをフックして処理を行うクラスを定義します。

Plugin

様々なクラスに定義されているpublicメソッドの処理に対して割り込み処理を行うプラグインを定義します。プラグインはpublicメソッドの前後に実行できるほか、処理まるごとを上書きできます。

Gateway

決済サービスとの連携を行う場合に必要になる処理を配置します。

Setup

エクステンション独自のテーブルの作成や更新、あるいはデータの追加を行う処理を定義します。エクステンションの初回インストールやアップデート時に実行させることができます。

view

PHPが使用するテンプレートや静的ファイル(画像/CSS/JavaScript)を配置します。

i18n

ロケールファイルを配置するディレクトリです。
「ja_JP.csv」のようなファイル名でロケールファイルを作成すると、自動的に処理してくれます。

エクステンション開発を手助けしてくれるツール

Magentoのエクステンション開発をテキストエディタだけで頑張るのはかなり大変です。普段私が使っているツール類をご紹介しておきましょう。これからエクステンション開発にチャレンジされる方の、お役に立てれば幸いです。

PHPStorm

まずは統合開発環境のPHPStormです。コレ1つでかなりのことがまかなえます。というよりPHPStormがないと開発はかなり非効率になると思います。もちろんEclipseやNetBeansでもいいのですが、動作の軽快さや機能の豊富さではPHPStormが一番向いているように思います。

Xdebug

PHPで開発をされる方ならかなりの方がご存知のXdebug。リモートデバッグ設定をPHPStormと組み合わせることで、ブレークポイントを張ってステップ実行による処理内容のチェックができます。これがないと、不具合の原因を見つけ出すのに無駄に時間を取られてしまいます。というのも、Magentoのコードは非常に多くのクラスの組み合わせでできているため、リモートデバッグなしに原因究明をするのは非常に大変です。

PHPUnit

Magento2系はユニットテストなどを書きやすいようにフレームワークレベルで設計されています。ビジネスロジックの動作を保証するためにユニットテストやインテグレーションテストを書いておくと、Magentoのバージョンアップ時の動作検証の手間が軽減できます。

Magento2系はPHP向けのユニットテストフレームワークとしてメジャーなPHPUnitをベースにしたテストケースが付属しています。
PHPUnitでテストを書くことに慣れている方であれば、違和感なくテストコードを書くことができるでしょう。

ターミナルとSSHクライアント

エクステンションの開発時にはMagentoのキャッシュをクリアしたり、データベース定義の更新処理を頻繁に実行したりします。ターミナルやSSHクライアントがないとそういったコマンドをすぐに実行できないので、手間がかかってしまいます。

MySQLWorkBench

Magentoは300近いテーブルをデータベース上に定義します。色々なところにデータが散らばっていることがあるため、MySQLのコマンドラインインターフェイスではデータを追いかけるのが手間です。MySQLWorkBenchを使うとGUIでデータを確認できるので便利なほか、各種パラメータや統計情報を簡単に確認できます。

Git

ほかのバージョン管理システムでも構わないのですが、一番良く使うのがGitです。エクステンションを作り始める時にリポジトリを作成し、後述するcomposerと組み合わせたエクステンションパッケージのバージョン管理を行っています。

composer

多くのPHPベースのパッケージやフレームワークで使用されている、PHP用のパッケージ管理システム・composer
MagentoはMagentoそのものとエクステンション・テーマ・ロケールといったあらゆるものをcomposerで管理・更新するようになっています。

エクステンションをcomposer対応で作成しておくと、packagistやMagentoのMarketplaceに登録する際もスムーズですし、インストール先の環境との不整合をインストール前にチェックすることもできます。

仮想環境

仮想マシン上にMagentoをインストールして開発を行っています。ぼちぼちDockerに乗り換えようかとも思ってはいますが、既存のVMが多いので二の足を踏んでいます・・・。

次回は

今回はMagentoのエクステンションに関するディレクトリ構造などをご紹介しました。次回は実際に簡単なエクステンションを作ってみたいと思います。