モダンなアーキテクチャのPHPベース OSS CMS
デジタルサーカス(株)長谷川智希
#phpcon2015_6
#phpcon2015_6
長谷川智希
とも き
@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
って?
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.
?
today
増えてた…
の概要
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
コーポレートサイト コミュニティサイト
⼈材マッチングサイト
グループウェア
ネットニュース
政府・公共機関
の
アーキテクチャ
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 …
• すべての機能を自前で用意せず外部のライブラリを積極的に使用。
• フレームワークの一部の機能だけを使うことも可能。
なぜ外部のライブラリを
使える様になったのか
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
• Drupal7
• PHP5.2.4
• Drupal8
• PHP5.5.9
Drupalが要求するPHP
• Drupal7
• PHP5.2.4
• Drupal8
• PHP5.5.9
Drupalが要求するPHP
PHP 5.3.0
PHP 5.4.0
名前空間クロージャ
トレイトarray() → []
モダンなアーキテクチャのPHPベース OSS CMS
ありがとうございました
@tomzoh
デジタルサーカス(株)
Drupalエンジニア
絶賛 募集中!
ありがとうございました
@tomzoh
デジタルサーカス(株)
Drupalエンジニア
絶賛 募集中!
懇親会出ます。声かけてください!
の
モジュール開発
おまけ1
のモジュール構成
のモジュール構成
モジュール単位で名前空間を定義。
のモジュール構成
モジュール内でMVC
モジュール単位で名前空間を定義。
のモジュール構成
ymlの設定で出来ることも多い。
モジュール内でMVC
モジュール単位で名前空間を定義。
のアプリケーション開発
• モジュール開発
• 層の厚いフレームワークを使っているイメージ。
• iOS/Android開発の感覚とも近い。
• 初期の学習コストは高いが習得すると速い。
の
コーディング規約
おまけ2
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS

Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS