FuelPHP -- 1.5系でcomporserを導入する --


FuelPHP1.6からはcomposerが導入されるらしいですがまだdev版なので1.5系でcomposerを使用する為の方法を記載していきます


## 環境

* centos6.3
* fuelPHP1.5.3

## 事前準備に必要なもの
* php5.3以上
* mysql
* php[composer] 導入していない場合は[composerを使ってみた時のメモ](http://qiita.com/items/43beef25d26966fff8cc)を参考に導入してください。

## 参考にしたサイト
* [日本語版ドキュメント(1.5ドキュメント)](http://fuelphp.jp/docs/1.5/)
* [Using Composer with FuelPHP 1.x](http://tomschlick.com/2012/11/01/composer-with-fuelphp/)


## composerでいれるもの

ユニットテストを書くのでPHPUnit系のものを入れたいとおもいます。
今回入れるものは下記を入れます。

* phpunit/phpunit
* mockery/mockery
* phpunit/dbunit
* phpunit/phpunit-selenium
* phpunit/phpunit-story
* phing/phing
* pdepend/pdepend
* phpmd/phpmd
* squizlabs/php_codesniffer
* behat/behat


```shell
cd fuelPHPのカレントディレクトリ
vim composer.json
```

```shell:composer.json
{
    "require": {
        "phpunit/phpunit": "3.7.*",
        "mockery/mockery": "0.7.*",
        "phpunit/dbunit": ">=1.2",
        "phpunit/phpunit-selenium": ">=1.2",
        "phpunit/phpunit-story": "*",
        "phing/phing": "dev-master",
        "pdepend/pdepend": "dev-master",
        "phpmd/phpmd": "dev-master",
        "squizlabs/php_codesniffer": "dev-master",
        "behat/behat": "2.4.*@dev"
    },
    "config": {
        "bin-dir": "FuelPHPのカレントディレクトリのフルパス/fuel/app/vendor/bin",
        "vendor-dir": "FuelPHPのカレントディレクトリのフルパス/fuel/app/vendor"
    }
}
```

## install

コマンド一発

```shell
cd fuelPHPのカレントディレクトリ
composer update

Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing mockery/mockery (0.7.2)
    Loading from cache

  - Installing symfony/yaml (v2.2.0)
    Loading from cache

  - Installing phpunit/php-text-template (1.1.4)
    Loading from cache
    .
    .
    .
    .

mockery/mockery suggests installing Hamcrest (1.0.0)
phpunit/phpunit suggests installing phpunit/php-invoker (>=1.1.0,<1.2.0)
symfony/event-dispatcher suggests installing symfony/http-kernel (2.2.*)
behat/behat suggests installing behat/symfony2-extension (for integration with Symfony2 web framework)
behat/behat suggests installing behat/yii-extension (for integration with Yii web framework)
behat/behat suggests installing behat/mink-extension (for integration with Mink testing framework)
Writing lock file
Generating autoload files
```

### 確認

fuel/app/vendor/以下に入れたいパッケージがあればOK

```shell
ll fuel/app/vendor/
合計 4
-rw-r--r-- 1 root root 182  3月 20 14:55 2013 autoload.php
drwxr-xr-x 1 root root 136  3月 20 14:54 2013 behat
drwxr-xr-x 1 root root 306  3月 20 14:55 2013 bin
drwxr-xr-x 1 root root 272  3月 20 14:55 2013 composer
drwxr-xr-x 1 root root 102  3月 20 14:53 2013 mockery
drwxr-xr-x 1 root root 102  3月 20 14:53 2013 pdepend
drwxr-xr-x 1 root root 102  3月 20 14:53 2013 phing
drwxr-xr-x 1 root root 102  3月 20 14:54 2013 phpmd
drwxr-xr-x 1 root root 408  3月 20 14:54 2013 phpunit
drwxr-xr-x 1 root root 102  3月 20 14:54 2013 squizlabs
drwxr-xr-x 1 root root 306  3月 20 14:54 2013 symfony
```

## PHPUnitの設定をconfigでオーバーライドする

このままではFuelPHPのテストをかくことができません。なぜならばFuelPHPのPHPUnitはデフォルトでフルパスで指定しないでphpunitコマンドで実行しようとするからです。

```php:/fuel/packages/oil/config/oil.php
return array(
	'phpunit' => array(		
		'autoload_path' => 'PHPUnit/Autoload.php' ,
		'binary_path' => 'phpunit' ,
	),
);
```

このpackageの設定ファイルをfuel/app/configにコピーして設定を変更しましょう

```shell
cp fuel/packages/oil/config/oil.php fuel/app/config/
```

```php:fuel/app/config/oil.php
#編集前
		'autoload_path' => 'PHPUnit/Autoload.php' ,
		'binary_path' => 'phpunit' ,
#編集後
		'autoload_path' => dirname(COREPATH).'/app/vendor/autoload.php' ,
		'binary_path' => dirname(COREPATH).'/app/vendor/bin/phpunit' ,
```

## fuel oil testコマンドが動くか確認してみる

確認しましょう

```shell
php oil test
Tests Running...This may take a few moments.
PHPUnit 3.7.18 by Sebastian Bergmann.

Configuration read from /home/web/lo.fuel.base.org/fuel/core/phpunit.xml

...............................................................  63 / 330 ( 19%)
............................................................... 126 / 330 ( 38%)
............................................................... 189 / 330 ( 57%)
............................................................... 252 / 330 ( 76%)
............................................................... 315 / 330 ( 95%)
...............

Time: 4 seconds, Memory: 21.75Mb

OK (330 tests, 350 assertions)
```

動きましたがこれだとfuel本体のテストを毎回していてウザいですね

## phpunit拡張用にphpunit.xmlもpacakageから持ってくる

普段の開発ではcoreとpackage(Fuelが提供しているもの)はテストの必要がないはずなので設定を変更しましょう。

```shell
cp fuel/core/phpunit.xml fuel/app/phpunit.xml
```

```xml:fuel/app/phpunit.xml
#修正前
		<testsuite name="core">
			<directory suffix=".php">../core/tests</directory>
		</testsuite>
#修正後
		<!--		<testsuite name="core">
			<directory suffix=".php">../core/tests</directory>
		</testsuite> -->
```

## 再度確認

もう一回確認してfuel/app/phpunit.xmlに設定が向いているか確認しましょう

```shell
php oil test

Tests Running...This may take a few moments.
PHPUnit 3.7.18 by Sebastian Bergmann.

Configuration read from /home/web/lo.fuel.base.org/fuel/app/phpunit.xml



Time: 0 seconds, Memory: 3.50Mb

No tests executed!
```

fuel/app/phpunit.xmlの設定が反映されましたね。

## PHPUnit以外のcomposerも動作させるためには

上記はこれはあくまでPHPUnitの設定だけで他のcomporserのパッケージはこれでは動きませんので
bootstrap.phpにcomposerのautoload.phpをreqiureしてあげましょう。

```php:fuel/app/bootstrap.php
// Register the autoloader
Autoloader::register();

#追加
// Composer
require APPPATH.'/vendor/autoload.php';
```

ポイントは[Using Composer with FuelPHP 1.x](http://tomschlick.com/2012/11/01/composer-with-fuelphp/)でも記載されている通りにAutoloader::register();の後にcomposerのautoload.phpをrequireすることみたいです。（理由までは調べてませんが）

これでvendorパッケージ管理が容易になるかと思います。