Software Development with Symfony
-
Upload
atsuhiro-kubo -
Category
Technology
-
view
2.726 -
download
2
Transcript of Software Development with Symfony
Symfony によるソフトウェア開発入門
2012/4/7 第 3 回 関西 PHP 勉強会
PHP メンターズ久保敦啓 (KUBO Atsuhiro)
久保敦啓 (KUBO Atsuhiro)● 株式会社アイテマン 代表取締役● Piece Project プロジェクトリード● PHP メンターズ● Twitter @iteman
Piece Framework● PHP フレームワーク、ツール● オープンソースソフトウェア● Piece Project
開発者募集中 スポンサー募集中
Piece Framework● Twitter @piece_framework● ソースコード
https://github.com/piece● Web サイト
http://piece-framework.com/
PHP メンターズ● Twitter @phpmentors● ソースコード
https://github.com/phpmentors-jp● Web サイト・ブログ
http://phpmentors.jp/● 有償トレーニングサービス始めました。
良いソフトウェアとは?
“ ソフトウェアの核心は、ドメインに関係した問題をユーザのために解決する能力である。”— エリック・エヴァンスのドメイン駆動設計
巨人の肩の上に立つ
例えば…● 開発プロセス・方法論● アーキテクチャパターン・スタイル● デザインパターン● フレームワーク● ライブラリ● …
アーキテクチャパターン・スタイル● モデル・ビュー・コントローラ● レイヤ● REST● CQRS● DCI● …
“ 使い方を機能として実装する”— パターン、 Wiki 、 XP
ドメインとは?
ドメインモデル
レイヤーアーキテクチャとドメインモデル
Presentation
Domain
Data Source
Infrastructure
LoggingSecurity
Validationetc...
Controllers
Domain Objects Services
ORM
Views
ドメイン駆動設計
ドメイン駆動設計とは?● ドメインモデルは、ドメイン知識を深めながら反復
的( iterative )に深化させていく。
● ドメインモデルは、開発者とドメイン知識をもつ人(ユーザ、専門家等)との間の共通言語となるようにする。
● ドメインモデルは、実装コードときちんと対応付けられるようにする。
—Domain-Driven Design のエッセンス
代表的なパターン● ユビキタス言語● モデル駆動設計● 実践的モデラー
Symfony の歴史
Symfony の特徴
Symfony の特徴● DI コンテナ● コンフィギュレーション● バンドル
DI コンテナ
DI コンテナ● Dependency Injection
依存関係逆転の原則 (DIP: The Dependency Inversion Principle)
● コンポーネント間の疎結合化● テスタビリティの向上● コンポーネント構成知識の集約
コンポーネント構成定義言語
DependencyInjection コンポーネント
● 複数の定義フォーマット YAML, XML, PHP
● 複数のインジェクション方法 コンストラクタ、セッター、フィールド
● ファクトリクラス・サービス● タグによる拡張ポイント・拡張● コンパイル時の変形・最適化
DI コンテナ定義の例...services: piece_questetra.questetra_client: scope: prototype class: "%piece_questetra.questetra_client.class%" calls: - [ setRequestContext, [ "@piece_questetra.request_context" ] ] piece_questetra.request_context: class: "%piece_questetra.request_context.class%" arguments: - "%piece_questetra.context_root%" - "%piece_questetra.user_id%" - "%piece_questetra.password%"
コンフィギュレーション
コンフィギュレーション● 問題空間の言語
実装コンポーネントの構造に影響を受けない
● ドメイン特化言語 DSL: Domain-Specific Language コンフィギュレーション DSL
Configuration コンポーネント● グラマー言語 (PHP) による文法定義
● 複数の保存フォーマット
YAML, XML, PHP● DependencyInjection コンポーネントとの統合
DI エクステンション毎のスロット● 複数回の読み込み
例)構成ファイルとコマンドライン引数のマージ
文法定義の例$treeBuilder->root('piece_questetra') ->children() ... ->arrayNode('authentication') ->isRequired() ->children() ->scalarNode('user_id') ->isRequired() ->cannotBeEmpty() ->end() ->scalarNode('password') ->isRequired() ->cannotBeEmpty() ->end() ->end() ->end()
->end();
構成定義の例piece_questetra: context_root: "%piece_questetra.context_root%" authentication: user_id: "%piece_questetra.user_id%" password: "%piece_questetra.password%"
コンフィギュレーションから DI コンテナへの変換
バンドル
バンドル● Symfony におけるモジュール(パッケージ)● 粗粒度の機能(フィーチャー)の提供単位
Web フレームワーク (FrameworkBundle) Web アプリケーション
● DI コンテナ定義、コンフィギュレーション、クラス、 Web リソース等を束ねたもの
● エリック・エヴァンス「エリック・エヴァンスのドメイン駆動設計」、翔泳社、 2011 年。
● 江渡 浩一郎「パターン、 Wiki 、 XP ~ 時を超えた創造の原則」、技術評論社、 2009 年。
● クシシュトフ・チャルネッキ、ウールリシュ・ W ・アイセンアッカ「ジェネレーティブプログラミング」、翔泳社、 2008 年。
参考