「Magento2システムアーキテクチャの基礎」をざっくり翻訳しました

毎日かけ蕎麦ばかり食べている新兵＠Magento日本コミュニティの@kzkiq2ndです。おはようございます。

[Magento Advent Calendar 2015](http://www.adventar.org/calendars/931) 16日目は、公式ドキュメントの「[Architecture Guide](http://devdocs.magento.com/guides/v2.0/architecture/bk-architecture.html)」内「[Architectural basics](http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/ABasics_intro.html)」の項をざっくりと翻訳しました。

[Architecture Guide](http://devdocs.magento.com/guides/v2.0/architecture/bk-architecture.html)


# 何が書かれているか？
__アーキテクチャガイド自体が公式ドキュメントの概要書__といった立ち位置にあり、各々の詳細ガイドへの目次の役割も担いつつ、システム全体の構造と特徴・利用技術とその目的について__大きな視点で解説__しています。

最初に読み出すドキュメントとして適切ですし、各分野の詳細を理解していく際に__迷ったらこのアーキテクチャガイドに立ち戻る__といった使い方ができると思います。

以下、公式ガイドでの掲載順で要点をまとめます。

# Magentoとは何か？
- 一貫したオブジェクト指向プログラミング
- MVCをベースに改良した、レイヤー構造のはっきりしたシステム
- DI(Dependency Injection)と[Service Contracts](http://alankent.me/2014/10/31/magento-2-service-contract-patterns/)によるAPI設計
- モジュール化によって拡張しやすいシステム
- テーマ・機能・言語、どれに対しても確実なカスタマイズが可能
- Linux OS, Apache/Nginx, MySQL, Zend, ComposerなどのOSSに支えられた強靭なシステム

という特徴をもつ、__高い拡張性とスケーラビリティを備えたECシステムです。__

# アーキテクチャーの基礎
## 拡張性・モジュール性
Magentoは利用者が目的にあわせたカスタマイズを容易にできる事を重視し、__より高い拡張性__を目標に掲げています。

これは、

- メンテナンス性を高めるための、置き換えよりも拡張と上書きを良しとする設計思想
- Composerを利用した依存関係の処理など、オープンソースツールに依拠する姿勢
- コーディングスタンダードの採用（例えばPHPはZend Framework Coding Standards）
- 適切なバージョン付け・依存管理のルール

等によって実現しています。

## フロントエンド開発
フロントエンド開発においても、適切なカスタマイズがしやすいように設計しています。中心となるのは、拡張・改造のための3つのツールです。

### 1. 開発のスタート地点となるデフォルトテーマ「Blank」
開発の起点として活用するためのデフォルトテーマを用意しています。

### 2. 基礎にある「Magento UI Library Components」
一貫性と開発速度向上のために、ECサイトで使うだろうパーツは再利用可能な形で定義済みです。

### 3. 管理画面のパーツ集である「Magento Admin Pattern Library」
管理画面の拡張・改造のためのUIパーツを用意済みです。

## 拡張性のための設計
Magento2の高い拡張性を支えるいくつかの特長を紹介します。

### モジュール式
機能ごとに分けられた疎結合なモジュールの組み合わせがMagentoシステム設計の根幹です。拡張・置き換え時の影響を最小限に抑えることができます。

### デザインパターン
良く利用されているデザインパターンを多くとりこむことで、開発者の問題解決をサポートし、学習コストを抑えています。

### コーディングスタンダード
"Zend Framework Coding Standards"ベースのコーディングスタンダードを採用しています。

### 拡張機能を販売・購入できるマーケットプレイス
アフターマーケットであるMagento Connectがあり、拡張機能を購入・販売できます。

### 柔軟な属性管理
管理画面から必要な商品属性を柔軟に追加することができます。

### Web API
CRM、ERP、CMSの連携するための外部API（REST、もしくはSOAPを通したXML）を提供しています。

### モジュール用API
Service contracts, Dependency injection, Dependency inversionによって疎結合なモジュール連携をサポートしています。

### Plugin Class
各メソッドの振る舞いを変更する`Plugin Class`が用意されています。

## ストアフロントの改造
Magentoではデフォルトのストアフロント（= ECサイトの表側）への小さなカスタマイズから、完全な置き換えまでをシンプルにおこなえるよう配慮しています。

以下は難易度順カスタマイズ手段です。

### レベル1. 簡単なスタイル変更
簡単な見た目の変更には既存CSS（LESS）を拡張することで対処できます。

### レベル2. マークアップの変更
さらに見た目を変更したい場合、例えばマークアップの変更、CSSのクラス名を追加したい等の要望には、既存のPHTMLを置き換えることで対処できます。この際、一部のJavascriptを新しいマークアップに対応させる必要がでる場合もあります。

### レベル3. さらに大きな変更
既存のCSSライブラリー全体を置き換えることも可能です。CSSライブラリーが適切にパッケージングがされていれば他のMagentoシステムでも再利用が可能です。

### レベル4. PHTMLもCSSもJSも全て置き換える
見た目に関わるファイルの全てを置き換えることも可能です。ただし、将来拡張機能を追加する際に必要なパーツが足りないなどの問題とトレードオフでもあります。

※ すべてのカスタマイズはMagento2のルールに従って用意されている限り、標準のアップグレードやパフォーマンス向上のための最適化が行われます。

## アプリケーション構造図
[こちらは公式の図を確認ください。](http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/arch_diagrams.html)

## 利用技術スタック

__WEBサーバー__

* Apache 2.x
* Nginx 1.7+

__PHP__

*  5.5, 5.6x, 7.0

__データベース__

* MySQL 5.6.x
* MySQL Percona 5.6.x
* （MariaDBに関しては、エバンジェリストのBen Marksさんに、「使えるけど公式サポートにはしていない」と返答を頂きました）

__Reverse Proxy/Web Accelerator__

* Varnish 3.x
* Varnish 4.x

__Cache Storage__

* Redis 2.x
* Redis 3.x
* Memcache 1.4.x

__Search__

* Solr 4.x

__その他__

* HTML5
* CSS3 (LESS CSS pre-processor)
* jQuery (primary JavaScript library)
* （公式にはなぜか書いていませんが、`KnockoutJS`も利用しています）
* RequireJS (library that helps load JavaScript resources on demand)
* Third-party libraries (Zend Framework 1, Zend Framework 2, Symfony)

* コーディングスタンダード PSR-0 (autoloading standard), PSR-1 (basic coding standards), and PSR-2 (coding style guide), PSR-3, PSR-4

* Composer (PHPライブラリーの依存関係の処理) 

__以下はオプションになります__

* Varnish (caching)
* Redis (used for session or page caching)
* Solr (search engine)

__HHVMは互換はありますがサポートはしていません__

* HHVM 3.9 PHP interpreter 

### 後方互換・バージョニング
Magento2のアップデートでは、可能な限り後方互換が維持されます。

- セマンティックバージョン2.0によるバージョニングを行います
- マイナーレベル以下での`@api`変更はしないことを約束します
- 変更される`@api`は`@deprecated`をつけてアナウンスします
- `@api`変更はメジャーアップデート時におこなわれます
- メジャーアップデートは年に一回以下おこないます
- メジャーアップデートはホリデーシーズンを避けます

## おまけ：セキュリティに関して
- パスワードはSHA-256で管理
- XSSへの対策が向上
- システム全体のパーミッションに気を使っている
- 開発版とプロダクション版のモード切り替えでファイルパーミッションを自動で変更する（CLIでの切り替え時のみ）
- クリックジャッキングへの対策が向上
- 管理画面のURIは簡単に変更できる（だから変えてください）

以上になります！

次は、@macsetoさんよろしくお願いします！