かまずにまるのみ。

文鳥とかビールとか

Symfony入門以前

この記事はSymfony Advent Calendar 2014 13日目の記事です。

この記事について

プログラミング勉強中の大学生さんがウェブアプリケーションの企画と実装をすることになりました。
使用する言語は PHP、アプリケーションフレームワークはいろいろあって Symfony に決定。
Symfony2 クイックツアーを見ているようなのですがちょっと苦戦している様子。何か少しでも役に立てたらなーと思い、この記事を書くことにしました。

今回 Symfony で開発を行う大学生さんはこんな感じの方です。

  • HTML, CSS が書けるようになりました
  • プログラミングは PHP, JavaScript を少し
  • プログラミング、Web のこと、技術用語などについては鋭意勉強中!
  • 知らない用語もまだまだあるので、英語で技術系のドキュメントを読むのはちょっとつらい

ちなみに私も Symfony に関してはとりあえずチュートリアルやったよーってレベルなので、これを機に一緒に学んでいけたらなと思います。

 

おさらい

Symfony での開発に必要そうなことをざっくりとおさらいしましょう。

サーバとブラウザの関係

普段見ている PC やスマートフォンで見ているウェブサイトは、どういう仕組みで表示されているのでしょうか。
コンピューターの世界でクライアントサーバー(C/S)と呼ばれる仕組みがあります。ウェブサイトもこの仕組みを使っています。

  • クライアント
    普段使っているブラウザやアプリ、PC やスマートフォン
  • サーバー
    クライアントからのリクエストを受け取って処理するコンピューターのこと。

たとえばブラウザから http://symfony.com へアクセスすると Symfony に関する文書が表示されます。これはクライアント(ブラウザ)から symfony.com サーバへ「Symfony のサイト見たい!」という要求が送られ、symfony.com サーバがこの要求に応えることで実現しています。

f:id:tdakak:20141213153208p:plain

PHP

クライアントからのリクエストを受け付けたサーバーは、リクエスト内容に応じた処理を行います。
たとえば会員制のサイトで、ログイン情報として ログインID とパスワードがサーバーへ送られてきたとします。
この ID とパスワードが合っているかどうかをチェックする処理が必要ですよね。
このような処理をプログラム言語で記述し、サーバー側で実行します。

PHP もサーバー側で実行される言語のひとつです。
Ruby, Python, Java などの言語でも同様の仕組みを作ることができます。

Composer

PHP のパッケージ管理システムです。
パッケージ管理システムは、特定の処理を行うプログラム群(パッケージ)をみんなで共有できる仕組みです。どの言語にも大抵存在します。
composer の仕組みは以下のようにして使うことができます。

  • composer.json というファイルに「このパッケージを使いたい!」と書く
  • composer のインストールコマンドを実行する
  • composer.json に記述したパッケージたちを composer が取ってきてくれる

Packagist というサイトに、PHP で書かれた便利パッケージがたくさん登録されています。composer はここからパッケージを取ってきます。

アプリケーションフレームワーク

SymfonyPHP で作られたアプリケーションフレームワークです。 フレームワークは "枠組み" と訳されることがあります。
アプリケーションフレームワークはアプリケーション作成の枠組みを提供します。

では枠組みとは一体何でしょうか。
ここでいう枠組みは、アプリケーション作成の基本となる設計やルールです。 プログラミングでもなんでも、何かを作るときには大抵 "設計" が必要です。
特に複数人でひとつのものを作るときにはルールや約束事が大切ですよね。

アプリケーションフレームワークを使用することで、しっかりとした設計の土台を得ることができ、設計思想やルールをみんなで共有しやすくなります。
ただ使い方や考え方、ルールを覚えるのはちょっと大変かもしれません。
でも大丈夫です、何とかなります。

f:id:tdakak:20141213161237p:plain

 

Symfony の世界

SymfonyPHP 製のウェブアプリケーションフレームワークです。
読み方は「しんふぉにー」です。
設計思想がとてもしっかりしているフレームワークだと思います。

Symfony1 と Symfony2

2014/12/13 現在、Symfony にはバージョン1とバージョン2があります。
それぞれを Symfony1, Symfony2 と呼んで区別することも。
Symfony1 と Symfony2 とで仕様がガラッと変わっているので、ドキュメントやサンプルコードを参照する場合はバージョンに注意してください。

現在の最新バージョンを確認すると "Symfony 2.6" って書いてあります。
Download

ドットの前はメジャーバージョン、ドットの後ろはマイナーバージョンを表しています。マイナーバージョン間の違いはメジャーバージョンの違いほど大きくないことが一般的ですが、それでも変更点がたくさんあります。

Symfony クイックツアー

実際に動かしてみながら、Symfony のしくみを見ていきましょう。
Symfony2 の全体像 | Symfony2日本語ドキュメント

ここで使われる Symfony2 Standard Edition は Symfony2 のサンプルアプリケーションです。
使いやすいディレクトリ構造や基本設定が入っています。

f:id:tdakak:20141213182627p:plain

ドキュメント

困ったときはドキュメントを読みましょう。
公式です。本家です。英語です。
Symfony, High Performance PHP Framework for Web Development

日本語版はこちらです。
有志の方々が英語版の内容を日本語に翻訳してくださっています。
Symfony2 ドキュメントポータル

当然ながら、更新は日本語版より英語版の方が早いです。
英語が苦手な方は日本語版で雰囲気を掴んでから、英語版を見ていくとよいかもしれません。

用語

知らない単語が出てきたときはまず用語集で探してみましょう。
用語集 | Symfony2日本語ドキュメント

用語集に見当たらない単語は Symfony ドキュメントページにある「クイック検索」を使うと便利です。
技術用語の意味が分からない場合は Google などで検索してみましょう。

Symfony のディレクトリ構造

Symfony の基本的なディレクトリ構造は以下の通りです。
アーキテクチャ | Symfony2日本語ドキュメント

  • app/
    アプリケーションに関する大事なファイルを置きます。設定とか。
  • src/
    アプリケーションのためのコードを置くところです。
  • vendor/
    他の人が作ったライブラリはここに配置します。
  • web/
    公開されるディレクトリ。
    app.php というファイルが配置されます。
    そのほか、画像や CSS, JavaScriptなど、プログラムに関係しない静的なファイルはここに置きます。
バンドル?

Symfony ではひとつの機能を実装するために必要なファイルをひとつのセットにして扱います(これをバンドルと呼びます)。
これにより、機能同士がべったりくっつくことが減ります。
機能同士がべったりくっついていると、片方の機能を修正した際にもう片方への影響が大きくなります。大変です。
ひとつひとつの機能が独立しているので、ある機能を別のアプリケーションでも使うことができます。みんなで共有することもできます。同じ機能を持つ別のバンドルに差し替えることも比較的容易になります。

ソフトウェアの世界ではべったりしていることを密結合、べったりしていないことを疎結合と言ったりもします。
Symfony疎結合フレームワークです。

サービス?サービスコンテナ?

Symfony では、ある仕事を行うオブジェクトをサービスと呼びます。
たとえばデータベースとやりとりするオブジェクトとか。
(オブジェクトについてはひとまず、特定の処理を行うプログラムとデータの集まりだと思ってください……)

サービスコンテナはオブジェクトを別のオブジェクトに渡したいときに使用します。 DI コンテナと呼ばれたりもします。
これについてもひとまず「そういうものがあるんだなー」くらいで大丈夫です。

f:id:tdakak:20141213171409p:plain

 

困ったとき

まずは調べてみます。
それでも分からないときは誰かに聞いてみましょう。
もしかしたら誰かが答えてくれるかもしれません。
インターネットすごい。

参考サイト

何はともあれ公式のドキュメントを当たりましょう。
リファレンス以外にもガイドブックやベストプラクティス、クックブックなどがあります。
Symfony2 ドキュメント日本語版 | Symfony2日本語ドキュメント

用語集やサイト内のクイック検索も利用してみてください。
用語集 | Symfony2日本語ドキュメント

メーリングリスト

Google Groups に、日本 Symfony ユーザー会のグループがあります。
質問を送ると誰かが答えてくれるかもしれません。
Google グループ

質問内容が「動きません」「分かりません」だけだと答えづらいので、
自分が困っている状況が相手に伝わるよう気をつけてみましょう。

  • 自分の環境(OS, PHP, Symfony のバージョン)
  • どういう機能を作りたいのか
  • そのために何をしたのか(公式サイトのこのページを読んでみたとか、こんなコードを書いたとか)
  • 期待する結果(データベースに入力内容を保存したい!とか)
  • 実際に得られた結果(でもこんなエラーが出てしまって保存できない!とか)
Twitter

困ったことや疑問を呟くと誰かが拾ってくれるかもしれません。
ハッシュタグ#symfony_ja です。

勉強会

Symfony 好きな方々に直接会って、分からないところを質問することもできます。
Doorkeeper でコミュニティのメンバー登録をしておくと、イベントの開催情報を受け取れます。おすすめです。
日本Symfonyユーザー会 | Doorkeeper

参加する前に、分からない点やもっと知りたいことを整理しておくとよいと思います。

書籍

Symfony2 に関する書籍は今の所ありません(たぶん)
発売を待ちましょう。

Symfony メインの本ではありませんが、「効率的な Web アプリケーションの作り方」という本で Symfony2 を扱っています。フレームワークを用いた開発の流れを知るのによい本だと思います。
ただし本の中で扱っているバージョンがやや古くなってしまっているので、現在のバージョンでは動かないところがあるはずです。

f:id:tdakak:20141213161539p:plain

 

最後に

ここまで読んでくださった方、ありがとうございます。
お気づきの点などありましたらぜひご連絡いただけると嬉しいです。

Symfony 勉強中の方へ

Symfony 自体が決して小さくない、しっかりとした仕組みのウェブアプリケーションフレームワークなので、馴染むまでに時間はかかってしまうかもしれません。なのでとりあえず動かしてみたりお手本を見たりしつつ、焦らずゆっくりなかよくなっていけたらよいのかなーと思います。
そして Symfony のコミュニティにもぜひ参加してみてください。
Symfony コミュニティには、プログラミングやアプリケーション開発について真剣に取り組んでいる方がたくさんいます。自ら学ぼうとしている方に対してはきっと温かく接してくれると思います。
ぜひ一緒に勉強していきましょうー。

f:id:tdakak:20140426215023p:plain