【PHP】composer+cakePHP+log4php開発環境構築手順


# **開発環境構築**

> XAMPP：`ApacheFriends XAMPP Version 5.6.15` 
`XAMPP Control Panel Version 3.2.1` 
> PHP：`PHP 5.6.15 + PEAR`
> Log4php：`apache-log4php-2.3.0`
> Composer：`Composer version 1.6.2 2018-01-05 15:28:41`
> CakePHP：`CakePHP 3.5`
> IDE：`Eclipse Luna SR2 (4.4.2)`

# **XAMPPインストール**

(省略) 

# **Composer インストール**

## Composer ダウンロード

[Windows Installer - Composer-Setup.exe](https://getcomposer.org/download/)

## インストール注意点

**１．パスが設定できるように、開発モードをチェックしてください。**

- [x] Developer mode　

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152228/62bc2630-814b-53d8-bf24-ae351b082ace.png)

**２．インストール先がローカルXAMPPのphp.exeと同じのパスに指定ください。**

Composerインストール先：`C:\xampp\php`

**３．PHPコマンドラインを使えるように、ローカルXAMPPのphp.exeを設定ください**

PHPコマンドライン：`C:\xampp\php\php.exe`

**４．動作確認**

C:\xampp\phpの配下に以下三つのファイルがあることを確認してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152228/f2cfa46c-a83b-1527-434c-f2d782d12071.png)

CMDを起動して、以下のコマンドを実施してみてください。

```console:
cd C:\xampp\php
composer -V
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152228/59ab601e-d51e-273e-413f-d6a03ae72e9a.png)



# **cakePHPのプロジェクトAppの作成**

## composerで既存のパッケージから新規作成

composerで以下のコマンドを実施して、既存のパッケージからローカルに新しいプロジェクトAppを作成します。

格納先：`C:\xampp\htdocs\App`

```console:
cd C:\xampp\php
php composer.phar create-project --prefer-dist cakephp/app C:\xampp\htdocs\App
```

##  eclipseにインポート

eclipseを起動して、プロジェクトAppをインポートします。

**注意点１：eclipseインポートエラー**
「インポートするプロジェクトが見つかりません」というeclipseエラーが出るときは、以下の.projectファイルをC:\xampp\htdocs\Appの直下に置いて、インポート作業をやり直してください。

```.project:
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>App</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
	</buildSpec>
	<natures>
	</natures>
</projectDescription>
```
**注意点２：PHPサポート機能**

PHP のコード補完がうまく効き、宣言／定義ジャンプができるように、PHPサポート機能を追加しましょう。

プロジェクトを選択しコンテキストメニューを表示（右クリック）-[構成]-[PHPサポートの追加]


## プロジェクトAppの環境配置

###  Apache設定

C:\xampp\apache\conf\httpd.confに以下の設定を追加して、Apacheを再起動ください。

```httpd.conf:
# App
    Alias /App "C:/xampp/htdocs/App"
    <Directory "C:/xampp/htdocs/App">
    	order deny,allow
    	Allow from all
    	Require all granted
    </Directory>
```

ホーム画面が出来ました！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152228/dbbef830-f890-eb6e-7ccf-73a1479296af.png)


###  log4phpパーケージ導入

####  log4phpインストール

Apache公式サイトからlog4phpのzipをダウンロードして、解凍してからプロジェクトにインストールします。

  - Apache公式サイト：
[Apache log4PHP](https://logging.apache.org/log4php/download.html)

  - ダウンロードソース：
apache-log4php-2.3.0-src.zip

  - 解凍したlog4phpフォルダーの格納場所：
C:\xampp\htdocs\App\vendor\apache\log4php


####  composer設定

```json:composer.json
# 追加行："apache/log4php": "2.3.0"
"require": {
        "php": ">=5.6",
        "cakephp/cakephp": "3.5.*",
        "cakephp/migrations": "^1.0",
        "cakephp/plugin-installer": "^1.0",
        "josegonzalez/dotenv": "2.*",
        "mobiledetect/mobiledetectlib": "2.*",
        "apache/log4php": "2.3.0"
},

```

####  log4php.xml配置

#####   log4php.xmlファイル作成

```xml:log4php.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://logging.apache.org/log4php/">
    <appender name="default" class="LoggerAppenderConsole">
        <layout class="LoggerLayoutPattern">
            <param name="conversionPattern" value="[%date{Y/m/d H:i:s.u}] [%logger][%-5level] %msg%n" />
        </layout>
    </appender>
    
    <!-- APP用 -->
    <appender name="appAppender" class="LoggerAppenderDailyFile">
        <param name="file" value="C:\xampp\htdocs\App\logs\APP.%s.log" />
        <param name="datePattern" value="Ymd" />
        <layout class="LoggerLayoutPattern">
            <param name="conversionPattern" value="[%date{Y/m/d H:i:s.u}] [%logger][%-5level] %msg%n" />
        </layout>
    </appender>

     <!-- APP用 -->
     <logger name="APP">
        <level value="debug" />
        <appender_ref ref="appAppender" />
    </logger>
</configuration>

```

-  リリース用ログ出力設定

同じようにリリース用の設定も用意しておきます。
`log4php_release.xml`
設定内容はほぼ同じですが、ログの保存パスをlinuxの設定と合わせる必要があります。


#####  プロジェクトApp用環境設定

```php:app.php

# 下記の環境設定レベル切り替え用のソースコードを追加
/**
 * Environment Level:
 *
 * develop
 * release
 *
 */
'Env' => 'develop',       // ローカル用
/*'Env' => 'release', */  // リリース用

/**
 * Configures logging options
 */
'Log' => [
         # 下記のAppログ設定のソースコードを追加 
		'app' => [
				'className' => 'App',
				'model' => 'LogEntry',
				'path' => LOGS,
				'file' => 'debug',
				'url' => env('LOG_DEBUG_URL', null),
				'scopes' => false,
				'levels' => ['debug', 'info', 'warn', 'error', ],
		],

    'debug' => [
        'className' => 'Cake\Log\Engine\FileLog',
        'path' => LOGS,
        'file' => 'debug',
        'url' => env('LOG_DEBUG_URL', null),
        'scopes' => false,
        'levels' => ['notice', 'info', 'debug'],
    ],
    'error' => [
        'className' => 'Cake\Log\Engine\FileLog',
        'path' => LOGS,
        'file' => 'error',
        'url' => env('LOG_ERROR_URL', null),
        'scopes' => false,
        'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
    ],
    // To enable this dedicated query log, you need set your datasource's log flag to true
    'queries' => [
        'className' => 'Cake\Log\Engine\FileLog',
        'path' => LOGS,
        'file' => 'queries',
        'url' => env('LOG_QUERIES_URL', null),
        'scopes' => ['queriesLog'],
    ],
],

```

#####  独自ログクラスAppLog.php

cakePHPでは、app.phpに設定あるLogクラスはデフォルトでCake\Log\Engine\FileLogを使ってログ出力するようになっています。
上記app.phpには`debug`,`error`,`queries`のデフォルト設定があり、ログレベルも既に配置され、便利なので、それをそのまま使ってもいいです。

どうしても、独自のlogクラスを作りたいとしたら、事前に「XxxxLog.php」を作って、`src\Log\Engine\`の直下に「XxxxLog.php」を配置しなければならなりません。なぜなら、cakePHPはカスタマイズのログ仕組みを読み込み手段は、黙然に`src\Log\Engine\`の直下に`XxxxLog.php`があるかをチェックしてカスタマイズログクラスを読み込んで使うようになっています。
というのは、app.phpのログclassNameは必ず「Xxxx」にセットしてください。
そうじゃないと、cakePHPさんが見つからなくて、エラーで怒られるのです。

独自のログクラスを作るときに、ちゃんとルールを守りましょう。
例え、自分が「AppLog.php」を作りました。
そして、`src\Log\Engine\`の直下に配置しています。
`src\Log\Engine\AppLog.php`
app.phpにログclassNameを設定するとは、
`'className' => 'App',`という書き方です。

####  log4php.xml配置の読み込み

```php:bootstrap.php

// app.phpを呼ぶ処理（既存のまま）
try {
    Configure::config('default', new PhpConfig());
    Configure::load('app', 'default', false);
} catch (\Exception $e) {
    exit($e->getMessage() . "\n");
}

# 下記のソースコードを追加
// log4phpを格納した場所(C:\xampp\htdocs\App\vendor\apache\log4php)
require(ROOT . DS . 'vendor' . DS . 'apache' . DS . 'log4php' . DS . 'Logger.php');
try {
 $env = Configure::read('Env');
 if ($env === 'release') {
  Logger::configure ( ROOT . DS . 'config' . DS . 'log4php_release.xml' );
 } else {
  Logger::configure ( ROOT . DS . 'config' . DS . 'log4php_develop.xml' );
 }
} catch (\Exception $e) {
 die($e->getMessage() . "\n");
}

```
####  ログ出力の動作確認


```php:AppController.php
use Logger;

public function index()
{
    // getLoggerにlog4php.xmlに定義したlogger nameをセットする
    $logger = Logger::getLogger('APP');

    $logger->info( 'ログ確認' );
    $logger->debug( 'ログ確認' );
    $logger->error( 'ログ確認' );
    $logger->warn( 'ログ確認' );
}

```

-  ログ出力ファイル確認


```php:APP.20180228.log
[2018/02/28 13:59:57.427] [APP][INFO ] ログ確認
[2018/02/28 13:59:57.427] [APP][DEBUG] ログ確認
[2018/02/28 13:59:57.427] [APP][ERROR] ログ確認
[2018/02/28 13:59:57.427] [APP][WARN ] ログ確認

```


以上、何があれば、どうぞお気軽にご指摘ください。




*参考*
[Windows Installer - Composer-Setup.exe](https://getcomposer.org/download/)
[ CakePHP 3.5 Red Velvet Cookbook](https://book.cakephp.org/3.0/ja/installation.html)


`---I Love PHP (｡･ω･｡)ﾉ♡`