Symfonyの学びかた (2014/04/19 講演資料)

## 2014/04/19 [Symfony 勉強会 #9](http://symfony.doorkeeper.jp/events/9791)

---

## 自己紹介

- Name : Takuto Wada
- github : [twada](https://github.com/twada)
- twitter : [t_wada](https://twitter.com/t_wada)
- hatena : [t-wada](http://t-wada.hatenablog.jp/)

[![t_wada](https://pbs.twimg.com/profile_images/421959794/TQ_LOGO.png)](https://twitter.com/t_wada)

---

## 業界での立ち位置(?)

[![savannah](https://connpass-tokyo.s3.amazonaws.com/event/27540/41d84cf0e6494e2e91e51ad8e9c85310.png)]((https://github.com/power-assert-js/power-assert))

---

## 監修/監訳した本

[![プログラマが知るべき97のこと](https://www.oreilly.co.jp/books/images/picture978-4-87311-479-8.gif)](https://www.oreilly.co.jp/books/9784873114798/)

[![SQLアンチパターン](https://www.oreilly.co.jp/books/images/picture978-4-87311-589-4.gif)](https://www.oreilly.co.jp/books/9784873115894/)

---

## プログラマとして

- Symfony 歴は 2 年くらい(フルタイムではない)
- Symfony1 時代はほぼ知らない
- Java, Ruby, JavaScript, elisp, PHP
- [github 上](https://github.com/twada)では JavaScript プログラマ?
- 代表作は [power-assert](https://github.com/power-assert-js/power-assert)

[![power-assert](https://raw.githubusercontent.com/power-assert-js/power-assert-js-logo/master/banner/banner-official-fullcolor.png)](https://github.com/power-assert-js/power-assert)

---

## Why Symfony?

- なぜ Symfony を選んだか
- 「コードがしっかりしている」
- メンテ方針がしっかりしている([長期サポート](http://symfony.com/doc/current/contributing/community/releases.html), [後方互換性](http://docs.symfony.gr.jp/symfony2/contributing/code/bc.html))
- DIベースの疎結合設計で自分でアーキテクチャを進化させやすい
- 中長期的な生産性が高まることを期待できる

---

## Agenda

- **Background of Symfony**
- What is Symfony?
- How to learn Symfony?

---

## Symfony の背景

---

## Symfony のバックグラウンド

Symfony には三つのバックグラウンドがある

 1. Web
 2. PHP
 3. OOP

---

## Web ── URL, HTTP, HTML(JSON)

- ["I don't like MVC because that's not how the web works. Symfony2 is an HTTP framework; it is a Request/Response framework."](http://fabien.potencier.org/article/49/what-is-symfony2)
- [Symfony2 と HTTP の基礎](http://docs.symfony.gr.jp/symfony2/book/http_fundamentals.html)
- [『Webを支える技術』](http://gihyo.jp/magazine/wdpress/plus/978-4-7741-4204-3)

![webtechbook](https://gihyo.jp/assets/images/cover/2010/9784774142043.jpg)

---

## PHP

- いわゆる「モダン PHP」が必要
- [PHP: The Right Way](http://ja.phptherightway.com/)
- [Composer](https://getcomposer.org/)
- [『パーフェクトPHP』](http://gihyo.jp/book/2010/978-4-7741-4437-5)

![パーフェクトPHP](https://gihyo.jp/assets/images/gdp/2014/978-4-7741-6756-5.jpg)

---

## OOP: Object Oriented Programming

- SOLID 原則: [アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技](http://www.amazon.co.jp/dp/4797347783)
- アーキテクチャと語彙: [エンタープライズ アプリケーションアーキテクチャパターン](http://www.amazon.co.jp/dp/4798105538)
- TDD と設計: [実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる](http://www.amazon.co.jp/dp/4798124583)

![アジャイルソフトウェア開発の奥義 第2版](https://images-fe.ssl-images-amazon.com/images/I/51-dAD2L2gL._AC_US160_.jpg)

---

## SOLID 原則

- **S**ingle responsibility principle<br/>単一責任の原則（SRP）
- **O**pen/closed principle<br/>オープン・クローズドの原則（OCP）
- **L**iskov substitution principle<br/>リスコフの置換原則（LSP）
- **I**nterface segregation principle<br/>インターフェイス分離の原則（ISP）
- **D**ependency inversion principle<br/>依存関係逆転の原則（DIP）

---

## Agenda

- Background of Symfony
- **What is Symfony?**
- How to learn Symfony?

---

## Symfony は何者なのか

---

## Java プログラマから見た Symfony

- ペロッ! これは……**SSH**!
- **S**pring (or **S**easar2)
- **S**pringMVC (or **S**truts)
- **H**ibernate
- DI がアーキテクチャの基盤
- とてもよく似ている
- 勝手知ったる世界
- もちろんデメリットも知っている
- n周目の知見を生かせるか

---

## Rails プログラマから見た Symfony

- (Symfony1 から見た Symfony2 でもある)
- 構造も思想も全く異なる(Symfony1は似ていた)
- Rails に DI は無い
- Rails は**密結合の強力さ**
- Symfony は**疎結合の柔軟さ**
- それでも似ているところ
- フルスタックフレームワーク
- RESTful, migration, asset pipeline

---

## Symfony is NOT opinionated

- Symfony には**レールが無い**
- (少なくともレールが無いように見える)
- 押しが弱い
- 短期的な生産性も低い
- そのかわりなんでも乗せられる
- なんでも共通化できる
- DDD を突き詰めるも良し
- シンプルなパラダイムに寄せるも良し

---

## 二つの顔

- **フルスタックフレームワーク**としての顔
- **コンポーネントの集合**としての顔
- [Symfony Standard Edition](https://github.com/symfony/symfony-standard) と [Symfony Components](http://symfony.com/components)
- 個々に完結した構成部品と、それをつなぎ合わせたフルスタックフレームワーク
- さらにそれを取り囲むコミュニティ
- ["Symfony is a PHP Framework, a Philosophy, and a Community - all working together in harmony."](http://symfony.com/what-is-symfony)

---

## ≠ MVC

- ["I don't like MVC because that's not how the web works. Symfony2 is an HTTP framework; it is a Request/Response framework."](http://fabien.potencier.org/article/49/what-is-symfony2)
- Symfony は MVC フレームワークではなく HTTP フレームワークであり、つまりは Request/Response フレームワークである

---

## 本当にザックリ理解すると

![httpkernel](http://stackphp.com/img/kernel.png)

---

## もう少し倍率を上げると

![symfony-request-flow](https://symfony2-document.readthedocs.io/en/latest/_images/request-flow.png)

---

## 全体像を掴むためのオススメ資料

[The Traveling Symfony Circus](https://speakerdeck.com/weaverryan/the-traveling-symfony-circus)

---

## Agenda

- Background of Symfony
- What is Symfony?
- **How to learn Symfony?**

---

## Symfony の学びかた

---

## English!

- 情報量に決定的な差がある
- ドキュメント量
- 書籍やブログの数
- ユーザ数にも差がある
- [Newest 'symfony2' Questions - Stack Overflow](http://stackoverflow.com/questions/tagged/symfony2)
- 少なからず英語に立ち向かうしかない
- でも[公式ドキュメント日本語訳](http://docs.symfony.gr.jp/symfony2/index.html)は強い味方
- そして[翻訳に参加](https://github.com/symfony-japan/symfony-docs-ja/wiki)しましょう!

---

## Symfony の公式ドキュメント

- [Symfony の公式ドキュメント](http://symfony.com/doc/current/index.html)
- [公式ドキュメント日本語訳](http://docs.symfony.gr.jp/symfony2/index.html)
- ドキュメントとしてはかなり充実している部類
- 実は調べるとだいたいのことが書いてある
- 本家は PDF にして読めるのでタブレットで読む
- 俯瞰の視点は Symfony 関係のカンファレンス資料で補う

---

## Symfony 情報収集

- [A week of symfony](http://symfony.com/blog/category/a-week-of-symfony)
- [Twitter の #symfony ストリーム](https://twitter.com/search?q=symfony&src=typd&f=realtime)
- [Twitter の #symfony_ja ストリーム](https://twitter.com/search?q=symfony_ja&src=typd&f=realtime)
- [はてブの symfony タグ](http://b.hatena.ne.jp/search/tag?safe=off&q=symfony&users=1)
- [PHPメンターズ -> "practical.symfony"タグ](http://phpmentors.jp/tagged/practical.symfony)
- [本家コミットログ(大量に流れてくる)](https://github.com/symfony/symfony/commits/master)

---

## Joind.in 便利

- 複雑なものを複雑なまま捉えない
- 講演にはシンプルな視点へのヒントがある
- Joind.in はカンファレンスのまとめサイト
- [Event: Symfony Live Portland 2013 - Joind.in](https://joind.in/event/view/1374)
- [Event: Symfony Live London - Joind.in](https://joind.in/event/view/1397)
- [Event: Symfony Live Berlin 2013 - Joind.in](https://joind.in/event/view/1580)
- [Event: SymfonyLive London 2014 - Joind.in](https://joind.in/event/view/2120)

---

## 2大難関 Component

### Form Component を知るなら

- [3 Steps to Symfony2 Form Mastery](https://speakerdeck.com/webmozart/3-steps-to-symfony2-form-mastery)

- [Symfony2 Forms: Do's and Don'ts](https://speakerdeck.com/webmozart/symfony2-forms-dos-and-donts)

### Security Component を知るなら

- [Love and Loss: A Symfony Security Play](http://www.slideshare.net/kriswallsmith/love-and-loss-a-symfony-security-play)

---

## コードを読む

- [PhpStorm](http://www.jetbrains.com/phpstorm/), [IntelliJ IDEA](http://www.jetbrains.com/idea/) 超強力
- (個人的にはこれらが無いと PHP のコードリーディングができない)
- Type hinting と indexing の使用感は、 Java で Eclipse を使う感じに近づいている
- Symfony のコードはドキュメントがキッチリ書かれていてテストコードもあるので、適切な道具があれば読みやすい
- デバッグパネルを見る
- 自分でテストを書いて動かしてみる

---

## シンプルな物から積み上げて学ぶ

- [Pimple](http://pimple.sensiolabs.org/)
- [Pimpleでシンプルに正しくDIを理解する](http://phpmentors.jp/post/28548053449/pimple-di)
- [Silex](http://silex.sensiolabs.org/)
- [フラットなPHPからSilexへ - ぷぎがぽぎ](http://d.hatena.ne.jp/brtRiver/20120728/1343499474)
- [Symfony2 vs フラットなPHP](http://docs.symfony.gr.jp/symfony2/book/from_flat_php_to_symfony2.html)
- Symfony Components を増やしながら理解を深める
- [Web フレームワークをつくろう - Symfony コンポーネントの上に](http://docs.symfony.gr.jp/symfony2/create-your-framework/part01.html)
- [The Traveling Symfony Circus // Speaker Deck](https://speakerdeck.com/weaverryan/the-traveling-symfony-circus)
- オレオレを育てると Symfony SE に近づく現象

---

## ありがとうございました

### 今日話したこと

- Background of Symfony
- What is Symfony?
- How to learn Symfony?