モダンなアーキテクチャのPHPベース OSS CMS
長谷川智希
長谷川智希
とも き
@tomzoh

とむぞう
趣味 Webサイト開発, iOSアプリ開発
レンタルカートレース, ビール, 電子工作 (mbed), …
TOMZOH
デジタルサーカス㈱ 副団長CTO
Facebook CakePHP iOS
デジタルサーカス(株)
・ Webサイト開発
・ スマホアプリ開発
・ 自社サービス
( )
(iOS, Android)
(http://appbuilder.jp)
Twitter: @tomzoh
Twitter: @tomzoh
Twitter: @tomzoh
モダンなアーキテクチャのPHPベース OSS CMS
オープンソースとは、ソフトウェアの設計図にあたる
ソースコードを、インターネットなどを通じて無償で
公開し、誰でもそのソフトウェアの改良、再配布が行
えるようにすること。また、そのようなソフトウェア。
OSS
出展: http://e-words.jp
CMSとは、Webコンテンツを構成するテキストや画
像、レイアウト情報などを一元的に保存・管理し、サ
イトを構築したり編集したりするソフトウェアのこ
と。広義には、(Webサイトに限らず)デジタルコン
テンツの管理を行うシステムの総称。
CMS
出展: http://e-words.jp
•Drupalって?
•Drupalの概要
•Drupalのアーキテクチャ
•Drupalのモジュール開発
•Drupal on PHP7
って?
•Drupalって?
•Drupalの概要
•Drupalのアーキテクチャ
•Drupalのモジュール開発
•Drupal on PHP7
Come for the software, stay for the community
Drupal is an open source content management
platform powering millions of websites and
applications. It’s built, used, and supported by an
active and diverse community of people around the
world.
https://www.drupal.org
の概要
•Drupalって?
•Drupalの概要
•Drupalのアーキテクチャ
•Drupalのモジュール開発
•Drupal on PHP7
Drupal8の機能
ユーザ管理 コンテンツ管理
検索 テーマ
多言語 モバイルファースト
ɔ拡張性 コメント
フォーム RSS などなど
Drupal8の特徴
https://www.drupal.com/product/web-content-management
Drupal8の特徴
https://www.drupal.com/product/web-content-management
Drupal8の特徴
https://www.drupal.com/product/web-content-management
コンテンツタイプ コンテンツ
コメントタイプ コメント
ボキャブラリー
ターム
ビュー
コンテンツタイプ
コンテンツのフォーマットを定義できる
コンテンツタイプ
コンテンツのフォーマットを定義できる
フィールド
フィールド
コンテンツタイプ
コンテンツ
コンテンツ
コンテンツタイプ コンテンツ
コメントタイプ コメント
ボキャブラリー
ターム
ビュー
• 一般的なCMSでのカテゴリやタグ
• コンテンツタイプのフィールドとして使える。
• 択一 / 複数選択
• 選択UI(テキスト入力 / ドロップダウン)
• 択一にすればカテゴリ的に、複数選択にすれば
タグ的に使える。
ボキャブラリー
ターム
コンテンツタイプ コンテンツ
コメントタイプ コメント
ボキャブラリー
ターム
ビュー
コンテンツタイプ コンテンツ
コメントタイプ コメント
ボキャブラリー
ターム
ビュー
ビュー
コンテンツの出力方法を定義できる
ビュー
コンテンツの出力方法を定義できる
ビュー
コンテンツの出力方法を定義できる
ビュー
コンテンツの出力方法を定義できる
ビュー
コンテンツの出力方法を定義できる
ビュー
コンテンツの出力方法を定義できる
ビュー
Drupal8の拡張性
• モジュール … Drupalの機能をカスタマイズする
• drupal.orgで集中管理されている。
• “17,712 Modules match your search”😍
• テーマ … Drupalの外観をカスタマイズする
• drupal.orgで管理されている。
• drupal.org外にも沢山ある。
• ディストリビューション … モジュールとテーマのパッケージ
• EC用, SNS用など、モジュールとテーマをパッケージしたもの
EC
コーポレートサイト コミュニティサイト
人材マッチングサイト
グループウェア
ネットニュース
政府・公共機関
の
アーキテクチャ
•Drupalって?
•Drupalの概要
•Drupalのアーキテクチャ
•Drupalのモジュール開発
•Drupal on PHP7
その前に…
PHPフレームワーク
PHPフレームワーク
• モノリシックフレームワーク
• 昔のPHPフレームワークは巨大な1つのプロダクトだった。
Symfony1, CakePHP2, Mojavi, Ethna …
• フレームワークの一部の機能だけを使う、ということが難しかった。
PHPフレームワーク
• モノリシックフレームワーク
• 昔のPHPフレームワークは巨大な1つのプロダクトだった。
Symfony1, CakePHP2, Mojavi, Ethna …
• フレームワークの一部の機能だけを使う、ということが難しかった。
PHPフレームワーク
• モノリシックフレームワーク
• 昔のPHPフレームワークは巨大な1つのプロダクトだった。
Symfony1, CakePHP2, Mojavi, Ethna …
• フレームワークの一部の機能だけを使う、ということが難しかった。
• マイクロフレームワーク
• 最近のPHPフレームワークはプロジェクト内外のライブラリを組み合わせ
たプロダクトになっている。
Symfony, CakePHP3, Laravel, CodeIgniter …
• すべての機能を自前で用意せず外部のライブラリを積極的に使用。
• フレームワークの一部の機能だけを使うことも可能。
PHPフレームワーク
• モノリシックフレームワーク
• 昔のPHPフレームワークは巨大な1つのプロダクトだった。
Symfony1, CakePHP2, Mojavi, Ethna …
• フレームワークの一部の機能だけを使う、ということが難しかった。
• マイクロフレームワーク
• 最近のPHPフレームワークはプロジェクト内外のライブラリを組み合わせ
たプロダクトになっている。
Symfony, CakePHP3, Laravel, CodeIgniter …
• すべての機能を自前で用意せず外部のライブラリを積極的に使用。
• フレームワークの一部の機能だけを使うことも可能。
PSR-4
PSR-4
PSR-4
PSR-4
PHPフレームワーク
• モノリシックフレームワーク
• 昔のPHPフレームワークは巨大な1つのプロダクトだった。
Symfony1, CakePHP2, Mojavi, Ethna …
• フレームワークの一部の機能だけを使う、ということが難しかった。
• マイクロフレームワーク
• 最近のPHPフレームワークはプロジェクト内外のライブラリを組み合わせ
たプロダクトになっている。
Symfony, CakePHP3, Laravel, CodeIgniter …
• すべての機能を自前で用意せず外部のライブラリを積極的に使用。
• フレームワークの一部の機能だけを使うことも可能。
PHPフレームワーク
• モノリシックフレームワーク
• 昔のPHPフレームワークは巨大な1つのプロダクトだった。
Symfony1, CakePHP2, Mojavi, Ethna …
• フレームワークの一部の機能だけを使う、ということが難しかった。
• マイクロフレームワーク
• 最近のPHPフレームワークはプロジェクト内外のライブラリを組み合わせ
たプロダクトになっている。
Symfony, CakePHP3, Laravel, CodeIgniter …
• すべての機能を自前で用意せず外部のライブラリを積極的に使用。
• フレームワークの一部の機能だけを使うことも可能。
PHPフレームワーク
• モノリシックフレームワーク
• 昔のPHPフレームワークは巨大な1つのプロダクトだった。
Symfony1, CakePHP2, Mojavi, Ethna …
• フレームワークの一部の機能だけを使う、ということが難しかった。
• マイクロフレームワーク
• 最近のPHPフレームワークはプロジェクト内外のライブラリを組み合わせ
たプロダクトになっている。
Symfony, CakePHP3, Laravel, CodeIgniter …
• すべての機能を自前で用意せず外部のライブラリを積極的に使用。
• フレームワークの一部の機能だけを使うことも可能。
が使う外部ライブラリ
{
"name": "drupal/core",
"description": "Drupal is an open source
content management platform powering
millions of websites and applications.",
"type": "drupal-core",
"license": "GPL-2.0+",
"require": {
"php": ">=5.5.9",
"symfony/class-loader": "2.7.*",
"symfony/console": "2.7.*",
"symfony/css-selector": "2.7.*",
"symfony/dependency-injection": "2.7.*",
"symfony/event-dispatcher": "2.7.*",
"symfony/http-foundation": "2.7.*",
"symfony/http-kernel": "2.7.*",
"symfony/routing": "2.7.*",
"symfony/serializer": "2.7.*",
"symfony/translation": "2.7.*",
"symfony/validator": "2.7.*",
"symfony/process": "2.7.*",
"symfony/yaml": “2.7.*",
"twig/twig": "1.20.*",
"doctrine/common": "~2.4.2",
"doctrine/annotations": "1.2.*",
"guzzlehttp/guzzle": “dev-master#1879fbe8…
"symfony-cmf/routing": "1.3.*",
"easyrdf/easyrdf": "0.9.*",
"phpunit/phpunit": "4.6.*",
"zendframework/zend-feed": "2.4.*",
"mikey179/vfsStream": "~1.2",
"stack/builder": "1.0.*",
"egulias/email-validator": "1.2.*",
"behat/mink": "~1.6",
"behat/mink-goutte-driver": “dev-master#c…
"fabpot/goutte": "~3.1",
"masterminds/html5": "~2.1",
"symfony/psr-http-message-bridge": "v0.2",
"zendframework/zend-diactoros": "1.1.0"
},
が使う外部ライブラリ
{
"name": "drupal/core",
"description": "Drupal is an open source
content management platform powering
millions of websites and applications.",
"type": "drupal-core",
"license": "GPL-2.0+",
"require": {
"php": ">=5.5.9",
"symfony/class-loader": "2.7.*",
"symfony/console": "2.7.*",
"symfony/css-selector": "2.7.*",
"symfony/dependency-injection": "2.7.*",
"symfony/event-dispatcher": "2.7.*",
"symfony/http-foundation": "2.7.*",
"symfony/http-kernel": "2.7.*",
"symfony/routing": "2.7.*",
"symfony/serializer": "2.7.*",
"symfony/translation": "2.7.*",
"symfony/validator": "2.7.*",
"symfony/process": "2.7.*",
"symfony/yaml": “2.7.*",
"twig/twig": "1.20.*",
"doctrine/common": "~2.4.2",
"doctrine/annotations": "1.2.*",
"guzzlehttp/guzzle": “dev-master#1879fbe8…
"symfony-cmf/routing": "1.3.*",
"easyrdf/easyrdf": "0.9.*",
"phpunit/phpunit": "4.6.*",
"zendframework/zend-feed": "2.4.*",
"mikey179/vfsStream": "~1.2",
"stack/builder": "1.0.*",
"egulias/email-validator": "1.2.*",
"behat/mink": "~1.6",
"behat/mink-goutte-driver": “dev-master#c…
"fabpot/goutte": "~3.1",
"masterminds/html5": "~2.1",
"symfony/psr-http-message-bridge": "v0.2",
"zendframework/zend-diactoros": "1.1.0"
},
が使う外部ライブラリ
{
"name": "drupal/core",
"description": "Drupal is an open source
content management platform powering
millions of websites and applications.",
"type": "drupal-core",
"license": "GPL-2.0+",
"require": {
"php": ">=5.5.9",
"symfony/class-loader": "2.7.*",
"symfony/console": "2.7.*",
"symfony/css-selector": "2.7.*",
"symfony/dependency-injection": "2.7.*",
"symfony/event-dispatcher": "2.7.*",
"symfony/http-foundation": "2.7.*",
"symfony/http-kernel": "2.7.*",
"symfony/routing": "2.7.*",
"symfony/serializer": "2.7.*",
"symfony/translation": "2.7.*",
"symfony/validator": "2.7.*",
"symfony/process": "2.7.*",
"symfony/yaml": “2.7.*",
"twig/twig": "1.20.*",
"doctrine/common": "~2.4.2",
"doctrine/annotations": "1.2.*",
"guzzlehttp/guzzle": “dev-master#1879fbe8…
"symfony-cmf/routing": "1.3.*",
"easyrdf/easyrdf": "0.9.*",
"phpunit/phpunit": "4.6.*",
"zendframework/zend-feed": "2.4.*",
"mikey179/vfsStream": "~1.2",
"stack/builder": "1.0.*",
"egulias/email-validator": "1.2.*",
"behat/mink": "~1.6",
"behat/mink-goutte-driver": “dev-master#c…
"fabpot/goutte": "~3.1",
"masterminds/html5": "~2.1",
"symfony/psr-http-message-bridge": "v0.2",
"zendframework/zend-diactoros": "1.1.0"
},
が使う外部ライブラリ
{
"name": "drupal/core",
"description": "Drupal is an open source
content management platform powering
millions of websites and applications.",
"type": "drupal-core",
"license": "GPL-2.0+",
"require": {
"php": ">=5.5.9",
"symfony/class-loader": "2.7.*",
"symfony/console": "2.7.*",
"symfony/css-selector": "2.7.*",
"symfony/dependency-injection": "2.7.*",
"symfony/event-dispatcher": "2.7.*",
"symfony/http-foundation": "2.7.*",
"symfony/http-kernel": "2.7.*",
"symfony/routing": "2.7.*",
"symfony/serializer": "2.7.*",
"symfony/translation": "2.7.*",
"symfony/validator": "2.7.*",
"symfony/process": "2.7.*",
"symfony/yaml": “2.7.*",
"twig/twig": "1.20.*",
"doctrine/common": "~2.4.2",
"doctrine/annotations": "1.2.*",
"guzzlehttp/guzzle": “dev-master#1879fbe8…
"symfony-cmf/routing": "1.3.*",
"easyrdf/easyrdf": "0.9.*",
"phpunit/phpunit": "4.6.*",
"zendframework/zend-feed": "2.4.*",
"mikey179/vfsStream": "~1.2",
"stack/builder": "1.0.*",
"egulias/email-validator": "1.2.*",
"behat/mink": "~1.6",
"behat/mink-goutte-driver": “dev-master#c…
"fabpot/goutte": "~3.1",
"masterminds/html5": "~2.1",
"symfony/psr-http-message-bridge": "v0.2",
"zendframework/zend-diactoros": "1.1.0"
},
が使う外部ライブラリ
{
"name": "drupal/core",
"description": "Drupal is an open source
content management platform powering
millions of websites and applications.",
"type": "drupal-core",
"license": "GPL-2.0+",
"require": {
"php": ">=5.5.9",
"symfony/class-loader": "2.7.*",
"symfony/console": "2.7.*",
"symfony/css-selector": "2.7.*",
"symfony/dependency-injection": "2.7.*",
"symfony/event-dispatcher": "2.7.*",
"symfony/http-foundation": "2.7.*",
"symfony/http-kernel": "2.7.*",
"symfony/routing": "2.7.*",
"symfony/serializer": "2.7.*",
"symfony/translation": "2.7.*",
"symfony/validator": "2.7.*",
"symfony/process": "2.7.*",
"symfony/yaml": “2.7.*",
"twig/twig": "1.20.*",
"doctrine/common": "~2.4.2",
"doctrine/annotations": "1.2.*",
"guzzlehttp/guzzle": “dev-master#1879fbe8…
"symfony-cmf/routing": "1.3.*",
"easyrdf/easyrdf": "0.9.*",
"phpunit/phpunit": "4.6.*",
"zendframework/zend-feed": "2.4.*",
"mikey179/vfsStream": "~1.2",
"stack/builder": "1.0.*",
"egulias/email-validator": "1.2.*",
"behat/mink": "~1.6",
"behat/mink-goutte-driver": “dev-master#c…
"fabpot/goutte": "~3.1",
"masterminds/html5": "~2.1",
"symfony/psr-http-message-bridge": "v0.2",
"zendframework/zend-diactoros": "1.1.0"
},
が使う外部ライブラリ
{
"name": "drupal/core",
"description": "Drupal is an open source
content management platform powering
millions of websites and applications.",
"type": "drupal-core",
"license": "GPL-2.0+",
"require": {
"php": ">=5.5.9",
"symfony/class-loader": "2.7.*",
"symfony/console": "2.7.*",
"symfony/css-selector": "2.7.*",
"symfony/dependency-injection": "2.7.*",
"symfony/event-dispatcher": "2.7.*",
"symfony/http-foundation": "2.7.*",
"symfony/http-kernel": "2.7.*",
"symfony/routing": "2.7.*",
"symfony/serializer": "2.7.*",
"symfony/translation": "2.7.*",
"symfony/validator": "2.7.*",
"symfony/process": "2.7.*",
"symfony/yaml": “2.7.*",
"twig/twig": "1.20.*",
"doctrine/common": "~2.4.2",
"doctrine/annotations": "1.2.*",
"guzzlehttp/guzzle": “dev-master#1879fbe8…
"symfony-cmf/routing": "1.3.*",
"easyrdf/easyrdf": "0.9.*",
"phpunit/phpunit": "4.6.*",
"zendframework/zend-feed": "2.4.*",
"mikey179/vfsStream": "~1.2",
"stack/builder": "1.0.*",
"egulias/email-validator": "1.2.*",
"behat/mink": "~1.6",
"behat/mink-goutte-driver": “dev-master#c…
"fabpot/goutte": "~3.1",
"masterminds/html5": "~2.1",
"symfony/psr-http-message-bridge": "v0.2",
"zendframework/zend-diactoros": "1.1.0"
},
モダンなアーキテクチャのPHPベース OSS CMS
モダンなアーキテクチャのPHPベース OSS CMS
• Drupal7
• PHP5.2.4 or later
• Drupal8
• PHP5.5.9 or later
Drupalが要求するPHP
PHP 5.3.0
PHP 5.4.0
名前空間クロージャ
トレイトarray() → []
2005
2007
2009
2010
2011
2015
2014
2006
2013
2008
2004
6⽉ PHP 5.3.0
3⽉ PHP 5.4.0 2012
6⽉ PHP 5.5.0
8⽉ PHP 5.6.0
PHP5.2.4+
名前空間クロージャ
トレイトarray() → []
7⽉ PHP 4.4.0
7⽉ PHP 5.0.0
11⽉ PHP 5.1.0
12⽉ PHP 5.2.0
7⽉ 12⽉でPHP4サポート終了発表
Composer 1.0.0-alpha1
PSR−4
PHP Standard Recommendation
5⽉ Drupal 7
2016
9⽉ code freeze for Drupal 7
2⽉ Drupal 6 PHP5+
1⽉ Drupal 5 PHP4.x.x
PSR-2
2005
2007
2009
2010
2011
2015
2014
2006
2013
2008
2004
6⽉ PHP 5.3.0
3⽉ PHP 5.4.0 2012
6⽉ PHP 5.5.0
8⽉ PHP 5.6.0
PHP5.2.4+
名前空間クロージャ
トレイトarray() → []
7⽉ PHP 4.4.0
7⽉ PHP 5.0.0
11⽉ PHP 5.1.0
12⽉ PHP 5.2.0
7⽉ 12⽉でPHP4サポート終了発表
Composer 1.0.0-alpha1
PSR−4
PHP Standard Recommendation
5⽉ Drupal 7
2016
9⽉ code freeze for Drupal 7
2⽉ Drupal 6 PHP5+
11⽉ Drupal 8
🎉
1⽉ Drupal 5 PHP4.x.x
PSR-2
2005
2007
2009
2010
2011
2015
2014
2006
2013
2008
2004
6⽉ PHP 5.3.0
3⽉ PHP 5.4.0 2012
6⽉ PHP 5.5.0
8⽉ PHP 5.6.0
PHP5.2.4+
PHP5.5.9+
名前空間クロージャ
トレイトarray() → []
7⽉ PHP 4.4.0
7⽉ PHP 5.0.0
11⽉ PHP 5.1.0
12⽉ PHP 5.2.0
7⽉ 12⽉でPHP4サポート終了発表
Composer 1.0.0-alpha1
PSR−4
PHP Standard Recommendation
5⽉ Drupal 7
2016
9⽉ code freeze for Drupal 7
2⽉ Drupal 6 PHP5+
11⽉ Drupal 8
🎉
1⽉ Drupal 5 PHP4.x.x
PSR-2
2005
2007
2009
2010
2011
2015
2014
2006
2013
2008
2004
6⽉ PHP 5.3.0
3⽉ PHP 5.4.0 2012
6⽉ PHP 5.5.0
8⽉ PHP 5.6.0
PHP5.2.4+
PHP5.5.9+
名前空間クロージャ
トレイトarray() → []
7⽉ PHP 4.4.0
7⽉ PHP 5.0.0
11⽉ PHP 5.1.0
12⽉ PHP 5.2.0
7⽉ 12⽉でPHP4サポート終了発表
Composer 1.0.0-alpha1
PSR−4
PHP Standard Recommendation
5⽉ Drupal 7
2016
9⽉ code freeze for Drupal 7
2⽉ Drupal 6 PHP5+
11⽉ Drupal 8
🎉
12⽉ PHP 7
🎉
1⽉ Drupal 5 PHP4.x.x
PSR-2
モダンなアーキテクチャのPHPベース OSS CMS
モダンなアーキテクチャのPHPベース OSS CMS
の
モジュール開発
•Drupalって?
•Drupalの概要
•Drupalのアーキテクチャ
•Drupalのモジュール開発
•Drupal on PHP7
のモジュール構成
のモジュール構成
モジュール単位で名前空間を定義。
のモジュール構成
モジュール内でMVC
モジュール単位で名前空間を定義。
のモジュール構成
ymlの設定で出来ることも多い。
モジュール内でMVC
モジュール単位で名前空間を定義。
のアプリケーション開発
• 管理画面からの設定とモジュール開発
• 層の厚いフレームワークを使っているイメージ。
• iOS/Android開発の感覚とも近い。
• 初期の学習コストは高いが習得すると速い。
•Drupalって?
•Drupalの概要
•Drupalのアーキテクチャ
•Drupalのモジュール開発
•Drupal on PHP7
on PHP7
https://www.youtube.com/watch?v=1IiEPF1x95o
ありがとうございました
@tomzoh
DrupalCon
おまけ1
DrupalCon Asia

レポート有ります
http://blog.livedoor.jp/dgcircus/
の
コーディング規約
おまけ2
😢

Drupal8 〜 モダンなアーキテクチャのPHPベース OSS CMS