Windows10で『基本からしっかり学ぶ Symfony2入門』を学習する


[『基本からしっかり学ぶ Symfony2入門』](https://www.amazon.co.jp/dp/4774178039)

> **Symfony 2.7** のサポートは、**終了**しましたが、
> 写経と下記の作業手順は、動作します　(**2021/01**)
> 
> **変更点1**
> 以前、動作していた composer **requir**e は、エラーが出るので
> composer **install**　([**ライブラリのインストール**](#ライブラリのインストール)) で対応します
> 
> **変更点2**
> 以前、動作していた **Symfony Installer** は、使えなくなったので
> **composer** を使用して Symfony 2.7.4 をインストールします　[(**Symfony 2.7.4 インストール**)](#symfony-274-インストール)

# 準備作業

## XAMPP  5.6.36 (xampp-win32-5.6.36-0-VC11.zip)
[XAMPP 5.6.36](https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/5.6.36/) (**xampp-win32-5.6.36-0-VC11.zip** ダウンロード)

- C:\XAMPP\xampp_5.6.36 (**任意のフォルダ**)　<font color="Red">XAMPP 複数バージョンを使用する環境</font> 前提
   - xampp-win32-5.6.36-0-VC11.**zip**　(xampp-win32-5.6.36-0-VC11-installer.**exe** 不可)
    - xampp-win32-5.6.36-0-VC11.zip 解凍後、フォルダ名変更 xampp → xampp_5.6.36
- C:\XAMPP\xampp_5.6.36 の **<font color="Red">setup_xampp.bat</font>** 実行　(**重要**　設定ファイル内の**「パス情報」**が修正される)　<font color="Red">解凍後、実行は1回のみ</font>
- **システム環境変数 Path** に C:\XAMPP\xampp_5.6.36\\**php** 追加

> **任意のフォルダ**は、深い階層での使用は避けてください
> Windows の **MAX_PATH の制約** のため
>

## Symfony 2.7, 2.8

| バージョン | メンテナンス終了  | EOL (End of Life)|
|:--|:--|:--|
| ~~2.7~~ | ~~2018/05~~ | ~~**2019/05**~~ |
| ~~2.8~~ | ~~2018/11~~ | ~~**2019/11**~~ |

## Composer

- composer.phar　[Composer](https://getcomposer.org/download/) (**v1.0.0** ダウンロード)

- composer.bat の作成

```bat:composer.bat
@ECHO OFF
php "%~dp0composer.phar" %*
```

composer.phar と composer.bat を C:\XAMPP\xampp_5.6.36\php にセット

### Symfony 2.7.4 インストール

インストール先 C:\XAMPP\xampp_5.6.36\\**htdocs**\\**classic-symfony.localhost**
(**classic-symfony.localhost** 自動作成)

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs
composer create-project symfony/framework-standard-edition classic-symfony.localhost "2.7.4"
```

インストール直後の **app/<font color="Red">bootstrap.php.cache</font>** をバックアップ！
([ch04start.zip (symfony2-book) ～ end.zip (symfony2-book)](#ch04startzip-symfony2-book--endzip-symfony2-book) の時に使用します)

- インストールの最初に **Warning** が出ますが、正常に処理されます
- composer.phar **v2.0 以上** を使うとエラーになります
- インストールの最後に問合せがありますが、すべて **Enter** を入力します
  - (database_name は、[3-1 データベース作成 (P57)](#3-1-データベース作成-p57)で設定します)




## Apache

注 ビルトインWebサーバでも問題ありません
ただし、以降は Apache 使用　(phpMyAdmin 使用のため)

### ドキュメントルート設定

C:\XAMPP\xampp_5.6.36\apache\conf\extra\httpd-vhosts.conf

```apache:httpd-vhosts.conf
<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "C:/XAMPP/xampp_5.6.36/htdocs"
    DirectoryIndex index.php index.html

    <Directory "C:/XAMPP/xampp_5.6.36/htdocs">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName classic-symfony.localhost
    DocumentRoot "C:/XAMPP/xampp_5.6.36/htdocs/classic-symfony.localhost/web"
    DirectoryIndex index.php index.html

    <Directory "C:/XAMPP/xampp_5.6.36/htdocs/classic-symfony.localhost">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

### hosts ドメイン設定

C:\Windows\System32\drivers\etc\hosts

```:hosts
127.0.0.1 localhost
127.0.0.1 classic-symfony.localhost
```

## Xdebug

C:\XAMPP\xampp_5.6.36\php\php.ini (最終行に追加)

```ini:php.ini
[XDebug]
zend_extension = "C:\XAMPP\xampp_5.6.36\php\ext\php_xdebug.dll"
;xdebug.remote_autostart=on
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_mode=req
;xdebug.idekey="netbeans-xdebug"
xdebug.profiler_enable = 0
xdebug.profiler_enable_trigger = 1
```

## date.timezone

C:\XAMPP\xampp_5.6.36\php\php.ini を修正
**最後の** date.timezone (2ヶ所あるため)

```ini:php.ini
[Date]
date.timezone=Asia/Tokyo
```

## デバッグ

### NetBeans IDE 8.2

- 新規　メニュー　[ファイル] - [新規プロジェクト]&nbsp;&nbsp;&nbsp;[PHP] - [既存のソースを使用するPHPアプリケーション]
- 修正　メニュー　[実行] - [プロジェクトの構成を設定] - [カスタマイズ]　(カテゴリ: 実行環境)

#### Webアプリケーション

| 実行構成 |　 |
|:--|:--|
| 実行方法 | ローカルWebサイト(ローカルWebサーバーで実行中) |
| プロジェクトURL | <span>http</span>://localhost/classic-symfony.localhost/ |
| 開始ファイル | web/app_dev.php |

#### CLI (7章～)

**例** php app/console doctrine:fixtures:load (P177)

| 名前と場所 |　 |
|:--|:--|
| ソース・フォルダ | C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost_cli<br />(classic-symfony.localhost をコピーする<br />nbproject フォルダがある場合、削除する) |
| プロジェクト名 | classic-symfony.localhost_cli |

| 実行構成 |　 |
|:--|:--|
| 実行方法 | スクリプト(コマンド行で実行) |
| PHPインタプリタ | C:\XAMPP\xampp_5.6.36\php\php.exe |
| 開始ファイル | app/console |
| 引数 (**修正のみ**) | doctrine:fixtures:load |

| ウィンドウ |　 |
|:--|:--|
| 出力 - デバッグ | コマンド プロンプト 機能 |

#### オプション

- メニュー　[ツール] - [オプション]&nbsp;&nbsp;&nbsp;[PHP] - [デバッグ]
最初の行で停止　OFF (デフォルト ON)

# 写経

> <font color="Red">ここまでが準備作業</font>
> **写経は 4章 から開始**

- 2章 デモアプリケーション (省略)　(<font color="Red">4章以降に関連がありませんので、作業を省略します</font>)
- 3章 (省略)　<font color="Red">同上</font>

# (省略) 2-4 デモアプリケーション (P33)

<font color="Red">4章以降に関連がありませんので、作業を省略します</font>
[Symfony2.7 のデモアプリをWindows7にインストール成功しました！](https://www.juku90.com/post-1934/) (ビルトインWebサーバ)

| 　 | 上記サイトの変更 |
|:--|:--|
| 誤 | （４）コマンドプロンプトで php composer.phar install –no-interaction を実行 |
| 正 | （４）コマンドプロンプトで php composer.phar install –<font color="Red">–</font>no-interaction を実行 |

# データベース

## 3-1 データベース作成 (P57)

**xampp-control.exe 起動 (<font color="Red">Apache, MySQL</font>)**　C:\XAMPP\xampp_5.6.36\xampp-control.exe

C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
　app\config\\<font color="Red">parameters.yml</font> **編集**　(database_name: **classic-symfony**)

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
php app/console doctrine:database:create
```

- **phpMyAdmin** で データベースの確認 と 下記の修正　http://localhost/phpmyadmin/
- xampp-control.exe が起動している場合 (Apache, MySQL) http://localhost/phpmyadmin/ をクリックしてください

> 操作タブ
> 照合順序 <font color="Red">utf8_general_ci</font> 選択　(文字化け対策)　実行ボタン クリック
> (テーブル作成前なので Change all tables collations オフのままで可)

#  (省略) 3-1 不要なファイルの削除 (P58)

<font color="Red">4章以降に関連がありませんので、作業を省略します</font>

```console:コマンドプロンプト
del C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost\src\AppBundle\Controller\DefaultController.php
del C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost\src\AppBundle\Tests\Controller\DefaultControllerTest.php
```

- 「クラシックシンフォニー楽団」のトップページを表示するために削除
- トップページの表示の確認 (P64)

# サンプルコード

[サンプルコード](https://github.com/hidenorigoto/symfony2-book/tree/master/download/symfony2-book-download-20151125.zip) (**symfony2-book-download-20151125**.zip ダウンロード)

**例** D:\temp\temp1

- D:\temp\temp1 内で サンプルコード (**symfony2-book-download-20151125**.zip) を解凍

- D:\temp\temp1\\**symfony2-book-download-20151125**\\**symfony2-book-download**
 - **application** (**ch04**start.zip (symfony2-book) ～ **end**.zip (symfony2-book))
 - **assets** (**ch04\web\\*.\***, **ch05**\sql\blog_article.sql, **ch09**\templates\Blog\index.html.twig)
 - links
 - lists

# application (4章以降)

## データベース作成

- **xampp-control.exe (再)起動 (<font color="Red">Apache, MySQL)**　 C:\XAMPP\xampp_5.6.36\xampp-control.exe
-  [3-1 データベース作成 (P57)](#3-1-データベース作成-p57) (データベース classic-symfony **未作成**の場合)

---

## ch04start.zip (symfony2-book) ～ end.zip (symfony2-book)

> ch04start.zip ～ end.zip 解凍
> 各章開始時点の「最初にする作業」 (4章～最終)

**例** D:\temp\temp1

- コピー元　D:\temp\temp1\\**symfony2-book-download-20151125**\\**symfony2-book-download**
- コピー先　C:\XAMPP\xampp_5.6.36\\**htdocs**\\**classic-symfony.localhost**

Symfony 2.7.4 インストール直後の **app/<font color="Red">bootstrap.php.cache</font>** をバックアップ！ (下記 参照)

D:\temp\temp1\symfony2-book-download-20151125\symfony2-book-download\\**application**\\**symfony2-book**

- **app**, **src**, **web** をコピー (<font color="Red">注 上書きコピーは「しない」　元の app, src, web 削除後 コピー！</font>)
- バックアップした **app/<font color="Red">bootstrap.php.cache</font>** を **app** へコピー

---

## デバッグ環境 最適化

- [Symfonyでdebug環境を最適化しコードを追いやすくする](http://okapon-pon.hatenablog.com/entry/symfony-debug) (web/**app_dev.php**)
 - bootstrap.php.cache → autoload.php
 - \$kernel->loadClassCache(); → // \$kernel->loadClassCache();

![デバッグ環境_最適化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217511/5ac6de4a-7ee0-b47f-c84f-d6202eac327b.jpeg)

---

## 各章開始時点

**注** 4章の開始時点 とは、**3章**の終了(完成)時点 です
**注** 4章の [4-1 表示の確認](#4-1-表示の確認) は、**3章**の終了(完成)時点 です
**注** **<font color="Red">assets</font>\ch04\web**　D:\temp\temp1\symfony2-book-download-20151125\symfony2-book-download\\**<font color="Red">assets</font>\ch04\web**

| 章 | 　 | 処理 | 各<br />4 | 章<br />5 | 開<br />6 | 始<br />7 | 時<br />8 | 点<br /> 9 | 最終 |
|:--|:--|:--|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| - | **<font color="Red">assets</font>**\\**ch04**\\**web** | **bootstrap**, css, **fontawesome**,<br /> **img**, **jquery**, js を **web** へコピー<br />(css, js は設定済) |   | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 |
| 4 | シンボリックリンク | [4-1 シンボリックリンク (P93)](#4-1-シンボリックリンク-p93) |   | 〇 | 〇 |  | 　 | 　 | 　 |
| 　 | メール通知機能の作成 | [4-3 メール通知機能の作成 (P114)](#4-3-メール通知機能の作成-p114) |   | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 |
| 5 | blog_article | [テーブル作成](#テーブル作成) |   |   | 〇 | 〇 |   |   |   |
| 　 | blog_article | [データセット](#データセット-1)　重複確認 (〇) |   |   | 〇 | (〇) |  |  |  |
| 6 | app/config/**security.yml** | [注2 生成したパスワードハッシュの設定　(P151, P152)](#注2-生成したパスワードハッシュの設定) |   |   |   | 〇 | 〇 | 〇 | 〇 |
| 　 | (inquiry) | ([テーブル作成](#テーブル作成)) |   |   |   |   |   |   |   |
| 7 | (inquiry) | ([データセット](#データセット)) |   |   |   |   |   |   |   |
| 　 | ライブラリ | [**ライブラリのインストール**](#ライブラリのインストール) **重要**<br />(**8章, 9章, 最終**)<br />(シンボリックリンク 含む) |   |   |   | 〇<br />**8** | 〇<br />**9** | 〇<br />**最終** | 〇<br />**最終** |
|  | concert | [テーブル作成](#テーブル作成) |   | 　 |   |   | 〇 | 〇 | 〇 |
|  | inquiry, concert | [データセット](#データセット) |   |   |   |   | 〇 | 〇 | 〇 |
| 　 | blog_article | [データセット](#データセット-1) |   |   |   |   | 〇 | 〇 | 　 |
| - | 　 | [メニュー等変更](#メニュー等変更) |   |   |   |   |   |   | 〇 |
| - | 　 | [4-1 表示の確認](#4-1-表示の確認) | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 |

###注2 生成したパスワードハッシュの設定

app/config/**security.yml**　(password: にパスワードハッシュの設定)

```console:コマンドプロンプト(生成したパスワードハッシュの設定)
　php -r "echo password_hash('password', PASSWORD_BCRYPT, ['cost' => 13]) . PHP_EOL;"
```
　**admin**ユーザ の パスワード: **password**
　ハッシュ　: \$2y\$13\$agv1iPIH0mp0QkFMSpDuPOkyvQPDnQecjWQRkeQ/fwoEjJjWKP6Su
　　(ハッシュ値は、コマンドを実行するたびに変わります)

---

### テーブルの処理

#### テーブル作成

5-4 blog_article (P140)
6-2 (inquiry) (P158)
7-4 concert (P195)

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
php app/console doctrine:schema:update --force
```

- phpMyAdmin で確認　http://localhost/phpmyadmin/

####  データセット

7-1 (inquiry) (P177)
7-4 inquiry, concert (P196)

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
php app/console doctrine:fixtures:load
```

- phpMyAdmin で確認　http://localhost/phpmyadmin/

# ライブラリのインストール

- composer **install**　(ライブラリのインストール)
- composer **require**　(**使用しません**)

composer **require** について
　2018/06　 　　　エラー**無**
　2019/09？ 以降　エラー**有**

　
**例** ライブラリのインストール
　 「<font color="Red">**7章**</font>」開始時点

　 例 D:\temp\temp1
　 　 D:\temp\temp1\symfony2-book-download-20151125\symfony2-book-download\application\\**ch08**start.zip

 「**次の章**」

　 **ch08**start.zip (「**8章**」開始時点 = <font color="Red">**7章**</font>の<font color="Red">終了(完成)時点</font>) 解凍後の 
　 D:\temp\temp1\symfony2-book-download-20151125\symfony2-book-download\application\symfony2-book の
　 <font color="Red">composer.json, **composer.lock**</font> を
　 C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost に**コピー後**
　 下記のコマンドを実行します

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
composer install
```

# 4-1 シンボリックリンク (P93)

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
php app/console assets:install web
```

# 4-1 表示の確認

## app_dev.php

**注** 4章の開始時点の **表示の確認** は、**3章**の終了(完成)時点 です

| 章 | タイトル | URL |
|:--|:--|:--|
| **3章**<br >4章 | トップページ<br />(P64) (P97) | http://classic-symfony.localhost/app_dev.php |
| **3章**<br >4章 | 公演情報<br />(P78) (P97) | http://classic-symfony.localhost/app_dev.php/concert/ |
| 4章 | お問い合わせ (P108) | http://classic-symfony.localhost/app_dev.php/inquiry/ |
| 6章<br >7章 | お問い合わせ管理<br />(P171) (P178) | http://classic-symfony.localhost/app_dev.php/admin/<br >http://classic-symfony.localhost/app_dev.php/admin/inquiry/search |
| 8章 | 団員情報 (P244) | http://classic-symfony.localhost/app_dev.php/member |
| 9章 | ブログ記事一覧 (P271) | http://classic-symfony.localhost/app_dev.php/blog/ |

アプリケーションに変更が反映されない場合 (キャッシュクリア)

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
php app/console cache:clear --no-warmup
```

## app.php

**注** 4章の開始時点の **表示の確認** は、**3章**の終了(完成)時点 です

| 章 | タイトル | URL |
|:--|:--|:--|
| **3章**<br >4章 | トップページ<br />(P64) (P97) | http://classic-symfony.localhost/ |
| **3章**<br >4章 | 公演情報<br />(P78) (P97) | http://classic-symfony.localhost/concert/ |
| 4章 | お問い合わせ (P108) | http://classic-symfony.localhost/inquiry/ |
| 6章<br >7章 | お問い合わせ管理<br />(P171) (P178) | http://classic-symfony.localhost/admin/<br >http://classic-symfony.localhost/admin/inquiry/search |
| 8章 | 団員情報 (P244) | http://classic-symfony.localhost/member |
| 9章 | ブログ記事一覧 (P271) | http://classic-symfony.localhost/blog/ |

アプリケーションに変更が反映されない場合 (キャッシュクリア)

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
php app/console cache:clear --no-warmup --env=prod --no-debug
```

# 4-3 メール通知機能の作成 (P114)

[**mailtrap**](https://mailtrap.io/) (開発用SMTPサーバ) を使用
　(Pricing Free $0 を選択)
送信されたメールは、mailtrap にログインして確認します

app/config/**config.yml**

```yml:config.yml
# Swiftmailer Configuration
swiftmailer:
    transport: "%mailer_transport%"
    host:      "%mailer_host%"
    username:  "%mailer_user%"
    password:  "%mailer_password%"
    auth_mode: "%mailer_auth_mode%"
    port:      "%mailer_port%" 
    spool:     { type: memory }

```

<!-- ![4-3_メール通知機能の作成_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217511/4e2a1993-3f6c-c4ac-d021-1b8fd01d7538.jpeg) -->

---

app/config/**parameters.yml**

```yml:parameters.yml
    mailer_transport: smtp
    mailer_host:      smtp.mailtrap.io
    mailer_user:      ************** ← mailtrap Username を記述
    mailer_password:  ************** ← mailtrap Password を記述
    mailer_auth_mode: cram-md5
    mailer_port:      2525

```

mailtrap Username, mailtrap Password は、ログイン時の Email アドレス, Password とは異なります

　
**【mailtrap Username, mailtrap Password について】**
　mailtrap に Log in 後、
　　Home / Demo inbox　　SMTP Settings タブ　**参照**　(Show Credentials クリック)

```yml
SMTP
Host: smtp.mailtrap.io
Port: 25 or 465 or 587 or 2525
Username: ************** ← mailtrap Username
Password: ************** ← mailtrap Password
Auth: PLAIN, LOGIN and CRAM-MD5
TLS: Optional (STARTTLS on all ports)

POP3
Host: pop3.mailtrap.io
Port: 1100 or 9950
Username: ************** ← mailtrap Username
Password: ************** ← mailtrap Password
Auth: USER/PASS, PLAIN, LOGIN, APOP and CRAM-MD5
TLS: Optional (STARTTLS on all ports)
```
**注** \************** には、値がセットされています

<!-- ![4-3_メール通知機能の作成_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217511/dac45db5-e1c4-06ab-e3e0-3c35763a0fc0.jpeg) -->

---

**注** app/config/**parameters.yml.<font color="Red">dist</font>** に、
　 app/config/**parameters.yml** の
　 **mailer_transport: smtp** ～ **secret: 346d635ccdebbd213cf9e074baa5a7cce799e093**
　 を追加

![4-3_メール通知機能の作成_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217511/616c3dfc-e90a-efc4-c5b3-6fff3fa67f66.jpeg)

# 5-4 ブログ記事一覧のデータベースからの読み込み (P138)

## データセット

5-4 blog_article (P140)

**例** D:\temp\temp1
　 D:\temp\temp1\symfony2-book-download-20151125\symfony2-book-download\\**assets**\\**ch05**\\sql\\**blog_article.sql**

http://localhost/phpmyadmin/

![5-4_blog_article.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217511/410b3231-978e-e2d6-9134-b2d89a853e11.jpeg)

# 7章, 8章, 9章

**バージョン情報** (例 ^2.2) は、**composer.json** を参照 (以下 同)

## 7-1 データフィクスチャ

P174

```console:コマンドプロンプト
使用中止

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
composer require --dev doctrine/doctrine-fixtures-bundle:^2.2
```

## 7-2 CSVダウンロード機能の作成

P178

```console:コマンドプロンプト
使用中止

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
composer require league/csv:^7.1
```

## 7-3 コマンドの作成

P190 (省略可)

注 以下は Apache の場合 (ビルトインWebサーバの場合は不要)

app/config/parameters.yml.dist

```yml:parameters.yml.dist
parameters:
    ...
    url_base:          http://classic-symfony.localhost/app_dev.php
```

app/config/parameters.yml

```yml:parameters.ym
parameters:
    ...
    url_base:          http://classic-symfony.localhost/app_dev.php
```

P191, P194

```console:コマンドプロンプト
chcp 65001 ← 文字コード UTF8

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
php app/console | more
```

```console:コマンドプロンプト
chcp 65001 ← 文字コード UTF8

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
php app/console cs:inquiry:notify-unprocessed
```

## 7-4 APIの開発

P194

```console:コマンドプロンプト
使用中止

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
composer require friendsofsymfony/rest-bundle:^1.7
composer require jms/serializer-bundle:1.5.0
```

P202, 204

| 修正 | url |
|:--|:--|
| 前 | http://127.0.0.1:8000/api/concerts.json |
| 後 | http://classic-symfony.localhost/app_dev.php/api/concerts.json |

P205

```console:コマンドプロンプト
使用中止

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
composer --dev require nelmio/api-doc-bundle:^2.9
```

P206

| 修正 | url |
|:--|:--|
| 前 | http://127.0.0.1:8000/api/doc |
| 後 | http://classic-symfony.localhost/app_dev.php/api/doc#get--api-concerts.{_format} |

### APIのCORS対応

P207

```console:コマンドプロンプト
使用中止

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
composer require nelmio/cors-bundle:^1.4
```

C:\XAMPP\xampp_5.6.36\apache\conf\httpd.conf

```apache:httpd.conf
...
#Listen 12.34.56.78:80
Listen 80
Listen 8080
...
```

C:\XAMPP\xampp_5.6.36\apache\conf\extra\httpd-vhosts.conf

```apache:httpd-vhosts.conf
#Listen 80
NameVirtualHost *:80
#Listen 8080
NameVirtualHost *:8080

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "C:/XAMPP/xampp_5.6.36/htdocs"
    DirectoryIndex index.php index.html

    <Directory "C:/XAMPP/xampp_5.6.36/htdocs">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80 *:8080>
    ServerName classic-symfony.localhost
    DocumentRoot "C:/XAMPP/xampp_5.6.36/htdocs/classic-symfony.localhost/web"
    DirectoryIndex index.php index.html

    <Directory "C:/XAMPP/xampp_5.6.36/htdocs/classic-symfony.localhost">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

P208 リスト 7-27 CORS動作確認画面のHTML (web/cors.html)

| 修正 | url |
|:--|:--|
| 前 | http://127.0.0.1:8000/api/concerts.json |
| 後 | http://classic-symfony.localhost/app_dev.php/api/concerts.json |

P209 ブラウザ1

| 修正 | url |
|:--|:--|
| 前 | http://127.0.0.1:8000/cors.html |
| 後 | http://classic-symfony.localhost/cors.html |

P209 ブラウザ2

| 修正 | url |
|:--|:--|
| 前 | http://127.0.0.1:8888/cors.html |
| 後 | http://classic-symfony.localhost:8080/cors.html |

P210 リスト 7-28 NelmioCorsBundle の設定を変更 (app/config/config.yml)

| 修正 | url |
|:--|:--|
| 前 | http://127.0.0.1:8888 |
| 後 | http://classic-symfony.localhost:8080 |

## 8-3 独自のサービスの定義

P228

```console:コマンドプロンプト
使用中止

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
composer require jms/di-extra-bundle:^1.6
```

## 9-1 テストのための準備

P249
PHPUnit のインストール (**composer** 使用)

```console:コマンドプロンプト
使用中止

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
composer --dev require phpunit/phpunit:^4.8
```

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
.\bin\phpunit.bat --version
```

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
.\bin\phpunit.bat -c app
.\bin\phpunit.bat -c app --debug
.\bin\phpunit.bat -c app --tap ← エラー
```

P251

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
.\bin\phpunit.bat -c app --testsuite=unit
.\bin\phpunit.bat -c app --testsuite=funcrional
.\bin\phpunit.bat -c app --testsuite=all
````

```console:コマンドプロンプト
del C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost\src\AppBundle\Tests\Controller\*.php
`````

## 9-2 ユニットテスト

P254 ～ P263

```console:コマンドプロンプト
chcp 65001 ← P258

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
.\bin\phpunit.bat -c app
```

## 9-3 ファンクショナルテスト

P264

```console:コマンドプロンプト
使用中止

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
composer --dev require hautelook/alice-bundle:^0.2.0
composer --dev require liip/functional-test-bundle:^1.2
```

P271

```console:コマンドプロンプト
cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
php app/console doctrine:fixtures:load
```

P273

assets\ch09\templates\Blog\\**index.html.twig** を app\Resources\views\Blog\index.html.twig へコピー
コピーをしないと**エラー**になります

```console:コマンドプロンプト
chcp 65001

cd C:\XAMPP\xampp_5.6.36\htdocs\classic-symfony.localhost
.\bin\phpunit.bat -c app src/AppBundle/Tests/Controller/BlogControllerTest.php
```
　

---

#メニュー等変更

app\Resources\views\Common\navbar.html.twig

```Twig:navbar.html.twig
                <li><a href="{{ path("app_member_index") }}">楽団プロフィール</a></li>
                <li><a href="{{ path("app_blog_index") }}">ブログ</a></li>
                <li><a href="{{ path("app_inquiry_index") }}">お問い合わせ</a></li>
```

![メニュー等変更_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217511/dce77156-b780-5cf5-62ad-4402f1dea920.jpeg)

app\Resources\views\Toppage\index.html.twig

```Twig:index.html.twig
                <a href="{{ path("app_member_index") }}" class="btn btn-primary">詳細</a>
                ...
                <a href="{{ path("app_blog_index") }}" class="btn btn-primary">詳細</a>
```

![メニュー等変更_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217511/b368d77e-0575-a23e-8773-4c1cee84fe89.jpeg)