Drupal と eZ Publish

普段は eZ Publish や Drupal をはじめとしたオープンソース CMS 全般を用いたサイト構築の支援を主に行っています。

[Drupal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/drupal) の23日目の記事として、同じ Symfony ベースの CMS である <i class="fa fa-drupal" aria-hidden="true"></i> Drupal と <i class="fa fa-clone" aria-hidden="true"></i> eZ Publish の違いをまとめました。

Drupal を他の CMS と比較することで相対的に評価し、得手不得手を確認してみたいと思います。

## <i class="fa fa-clone" aria-hidden="true"></i> eZ Publish とは
[eZ Publish](http://qiita.com/bezeklik/items/5faf803ab30c9254a167) とは、ノルウェー王国の eZ Systems 社によって Drupal の2年前の1999年から PHP で開発されているエンタープライズ向けオープンソース CMS です。
Drupal で言うところの「エンティティ」に似た「クラス（またはコンテンツタイプ）」という概念があるなど、Drupal と同じく汎用性の高い CMS となっています。

## シェア
OpenSourceCMS のデータでは Drupal は3位、eZ Publish は14位となっています。 [^cms-market-share]

[^cms-market-share]: http://www.opensourcecms.com/general/cms-marketshare.php

![cmsmarketing.png](https://qiita-image-store.s3.amazonaws.com/0/15175/365e3d9e-1f64-25f8-acff-a1be7fbeee7b.png)

## 事例
#### Drupal
[ホワイトハウス](https://www.drupal.org/u/whitehouse)
#### eZ Publish
[米国国防総省 SERDP & ESTCP](https://ez.no/Clients-Partners/Clients/US-Department-of-Defense)

## システム要件
ミドルウェア|Drupal 8 |Drupal 7  |eZ Platform|eZ Publish 5
-------|:-------:|:--------:|:---------:|:----------:
Apache |         |          |2.2, 2.4   |2.2, 2.4
nginx  |         |          |1.4, 1.6, 1.8. 1.10|1.4以上
PHP    |5.5.9以上 |5.2.5以上 |5.5以上    |5.4.4以上
MySQL  |5.5.3以上 |5.0.15    |5.5, 5.6   |○
MariaDB|5.5.20以上|5.1.44    |5.5, 10.0  |○
PostgreSQL|9.1.2以上|8.3以上 |experimental|○

https://www.drupal.org/docs/7/system-requirements/overview
https://doc.ez.no/display/EZP/Requirements+5.4
https://doc.ez.no/pages/viewpage.action?pageId=31429536

## 拡張機能
#### モジュール数
Drupal の公開されているモジュール数は 7.x 互換が 12,470 件、8.x 互換が 2,371 件と圧倒的な数に対して、eZ Publish のエクステンション（またはバンドル）数は 1,309 件に留まっています。

ただし、Drupal は core の機能を極力シンプルにし、モジュール追加によって機能拡張する戦略なのに対して、eZ Publish では初期状態から基本的なエンタープライズ機能は kernel に実装済みのため単純な数の比較は出来ません。が、Drupal のコミュニティ力が圧倒的なのは間違いなさそうです。

#### インストール
Drupal では管理画面からモジュール追加できたり、Drush によりコンソールで簡単にモジュール追加できるのに対して、eZ Publish では管理画面からのエクステンション追加はできません。
なお、エクステンションのオンオフは管理画面から可能で、また eZ Publish 5 から Composer が導入されているのでコンソールからワンコマンドでインストール可能です。

## 最近の動向
Drupal 7 Entity 概念の導入
Drupal 8 Symfony の採用、多言語対応
eZ Publish 5 Symfony の採用（レガシースタックとの併用）
eZ Platform (eZ Publish 6) フルスタック Symfony への完全移行、Symfony ベースの新しい管理画面

## Symfony 
Drupal は 8 から Symfony を導入しましたが、eZ Publish は前バージョンの 5 から導入しているので、以下のように先輩風を吹かせています。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Welcome to the Symfony community Drupal. We have been waiting for you. <a href="https://t.co/PkWy5pcrVe">https://t.co/PkWy5pcrVe</a> <a href="https://twitter.com/hashtag/Drupal8?src=hash">#Drupal8</a> <a href="https://t.co/H27FLdgUmW">pic.twitter.com/H27FLdgUmW</a></p>&mdash; eZ Systems (@eZSystems) <a href="https://twitter.com/eZSystems/status/667766189733621760">2015年11月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

冗談はさておき、 Drupal では Symfony はあくまで部分的な利用に留めており、過去からの仕様をなるべく引き継いでいます。 concrete5 なんかもそうですね。
それに対して eZ Publish では、前バージョンの eZ Publish 5 でデュアルカーネルとしてレガシースタックと新スタック (Symfony) を併用させるという面白い対応をしましたが、eZ Platform (eZ Publish 6) では完全に新スタックのみとなり、フルスタックで Symfony を利用しています。
そのためファイル構成も Symfony のオーソドックスな構成に従ったものになっており、追加モジュールやデザインテンプレートも Symfony の Bundle として作成します。

## カスタムモジュールの作成
```
drush mb my_module menu cron --write --quiet --name="My module" --dep="forum views"
```
https://drushcommands.com/drush-7x/module-builder/mb-build/

http://makeadrupalmodule.com/

```
php app/console generate:bundle 
```

## データベース
Drupal のメリットでありデメリットでもあるのがデータベースの利用方法です。

eZ Publish や Pimcore といった汎用的な CMS は通常、各オブジェクト（Drupal でいうエンティティ）のメタデータは1つのテーブルで一元的に管理します。それに対して Drupal はエンティティを作成するごとに個別にテーブルを作成します。
このメリットとしては、メタデータを一元的に集約してしまうとデータが膨大になってきたときにパフォーマンスが急激に悪化するので、これを避けることができることがあります。
また、サーバー移行時にも1テーブルのデータ量が多いとインポートに非常に時間がかかります。Drupal はテーブルがエンティティ単位に分割されているため、この影響が非常に少なくて済みます。

デメリットとしては、あとからエンティティの情報を変更するときの制約が大きくなることです。

大規模なサイトでは後から気軽にデータ構造を変更することは少ないと思いますが、汎用性が高いからと油断していると思わぬ制約を受けることがあるので、事前によく認識しておく必要があります。