99
モダンなアーキテクチャのPHPベース OSS CMS 長谷川智希

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

Embed Size (px)

Citation preview

モダンなアーキテクチャの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

😢