Slim3 Framework×slim-skeleton不使用×twigでプロジェクトを作成する（1. プロジェクト作成～各種設定）

# はじめに
今回はslim-skeletonを使用しないSlim3フレームワークとtwigを使用したプロジェクトを作成します。
[Slim3フレームワークおすすめチュートリアル](https://qiita.com/erik_t/items/13c68de4f75416213614)で紹介した、
[@nunulk](https://qiita.com/nunulk)さんの[チュートリアル](https://qiita.com/nunulk/items/4b5c15f13ade660cafbc)を[Daniel Opitz](https://odan.github.io/about.html)さんのやりかたで再現してみるイメージです。
成果物としては[@nunulk](https://qiita.com/nunulk)さんの[チュートリアル](https://qiita.com/nunulk/items/4b5c15f13ade660cafbc)を通してできるものと同じものができます。
人の褌で相撲を取ってる感がすごいですが、許してください。

# 前提
下記記事で構築した環境を前提とします。

- Windows10にVagrantをを入れてCentOS7をインストールしよう([1](https://qiita.com/erik_t/items/d7f7abbf7deafa4c6fe4)、[2](https://qiita.com/erik_t/items/909efb63fd389f486ec3)、[3](https://qiita.com/erik_t/items/2e3c43cfe8731621b82d)、[4](https://qiita.com/erik_t/items/8d006b599815c8fbf38b)、[5](https://qiita.com/erik_t/items/9fbe7b5630b1f62893a1)、[6](https://qiita.com/erik_t/items/11f24633f4248e4f33f0)) 
- ローカルでLAMP環境を構築しよう（[0](https://qiita.com/erik_t/items/9c7c49db061a250cbc32)、[1](https://qiita.com/erik_t/items/e36235896b327f5cb461)、[2](https://qiita.com/erik_t/items/8dc3f2a5e8e8c9376e27)、[3](https://qiita.com/erik_t/items/617503557020a4a6ba82)、[4](https://qiita.com/erik_t/items/a898d0f547bff6b3d8ff)）
- [CentOS7にComposerをインストールしよう](https://qiita.com/erik_t/items/0b3492f38f6cd8605a4c)

- 私家版 Slim Framework チュートリアル ([1](https://qiita.com/nunulk/items/4b5c15f13ade660cafbc)、[2](https://qiita.com/nunulk/items/8492548678aac697d0aa#_reference-1dc558a7a78d9b00868b)、[3](https://qiita.com/nunulk/items/33adfbba55057a7d0c5c#_reference-8903d1023c2501e00d0b)、[4](https://qiita.com/nunulk/items/fb5ef759c1337e99d878#_reference-56dbec1889beef3f7f4d)、[5](https://qiita.com/nunulk/items/92d06bada7657ce212e7#_reference-1e4198f2501e274dbdd8)、[6](https://qiita.com/nunulk/items/99c12ac8e7b631bd8ed3#_reference-11f698acaecbfe32d5ff))
[@nunulk](https://qiita.com/nunulk)さんのチュートリアルを一通り。
ここで作成したDBを使いまわします。

# 手順
**1. 専用のユーザーを作成**
**2. プロジェクトディレクトリを作成・slim3インストール**
**3. 各種設定**
4. DocumentRootを変更＆表示確認
5. Twigを使ってみよう
6. Loggingしてみよう
7. Controllerを作成しよう
8. PDOを使用してデータベースに接続しよう
9. @nunulkさんのチュートリアルで作成したチケット管理システムをtwigを使って再現しよう

# やってみよう
今回の記事では、手順1～3を行います。
## 1. 専用のユーザーを作成
[PHP Slim3フレームワークのサンプルアプリを作ろう
（2-1. First Application Walkthrough Getting Set Upまで）](https://qiita.com/erik_t/items/9e9f6c93d2403ac90242)の
[1. 専用のユーザーを作成](https://qiita.com/erik_t/items/9e9f6c93d2403ac90242#1-%E5%B0%82%E7%94%A8%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90)の手順で専用のユーザーを作成します。
## 2. プロジェクトディレクトリを作成・slim3インストール
slimuserユーザーが作成されると
/home/ディレクトリ内にslimuserディレクトリが作成されます。
その中に以下のプロジェクトディレクトリを作成します。

```
/home/slimuser/projects/slim/SampleApplication
```
以下のコマンドで、slim3をインストールします。

```
composer require slim/slim:3.*
```
## 3. 各種設定
SampleApplicationの下に以下のようにディレクトリ・ファイルを作成します。
[Creating your first Slim 3 Framework Application](https://odan.github.io/2017/11/30/creating-your-first-slim-framework-application.html)にある手順に従って設定していきます。

```:ディレクトリ構成
.
├── config/             Configuration files
│   └── bootstrap.php
│   └── container.php
│   └── middleware.php
│   └── routes.php
│   └── settings.php
├── public/             Web server files (DocumentRoot)
│   └── .htaccess       Apache redirect rules for the front controller
│   └── index.php       The front controller
├── templates/          Twig templates
├── src/                PHP source code (The App namespace)
├── tmp/                Temporary files (cache and logfiles)
├── vendor/             Reserved for composer（slim3インストール時に自動生成）
├── composer.json       slim3インストール時に自動生成    
└── composer.lock       slim3インストール時に自動生成
├── .htaccess           Internal redirect to the public/ directory
└── .gitignore          Git ignore rules
```

### Front controller
Apacheのリダイレクトの設定が記述されるファイルです。以下のように記述します。

```:public/.htaccess
# Redirect to front controller
RewriteEngine On
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
```

```:.htaccess
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
```
### Bootstrap
名前からしてTwitter社が開発したのBootstrapのことかな？と思いましたがどうもそうではない様子。
`config/bootstrap.php`に使用する各種設定ファイルについて記述し、
`public/index.php`から呼び出しているようです。
`config/bootstrap.php`と`public/index.php`をそれぞれ以下のように記述します。

```:public/index.php
<?php

/** @var Slim\App $app */
$app = require __DIR__ . '/../config/bootstrap.php';

$app->run();
```

```:config/bootstrap.php
<?php

require_once __DIR__ . '/../vendor/autoload.php';

$app = new \Slim\App(['settings' => require __DIR__ . '/../config/settings.php']);

require __DIR__ . '/container.php';

require __DIR__ . '/middleware.php';

require __DIR__ . '/routes.php';

return $app;
```
### Container
アプリの依存関係の設定を行うファイルです。以下のように記述します。

```:config/container.php
<?php

use Slim\Container;
/** @var \Slim\App $app */
$container = $app->getContainer();

// Activating routes in a subfolder
$container['environment'] = function () {
    $scriptName = $_SERVER['SCRIPT_NAME'];
    $_SERVER['SCRIPT_NAME'] = dirname(dirname($scriptName)) . '/' . basename($scriptName);
    return new Slim\Http\Environment($_SERVER);
};
```
### Middleware
今の時点でミドルウェアはありません。

```:config/middleware.php
<?php

// Slim middleware
```
### Routes
ルーティングを行うファイルです。以下のように記述します。

```:config/routes.php
<?php

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

$app->get('/', function(ServerRequestInterface $request, ResponseInterface $resp
onse) {
    $response->getBody()->write("It works! This is the default welcome page");

    return $response;
})->setName('root');

$app->get('/hello/{name}', function(ServerRequestInterface $request, ResponseInterface $response) {
    $name = $request->getAttribute('name');
    $response->getBody()->write("Hello, $name");

    return $response;
});
```
### Configuration

```:config/settings.php
<?php

$settings = [];

$settings['displayErrorDetails'] = true;
$settings['determineRouteBeforeAppMiddleware'] = true;
$settings['addContentLengthHeader'] = false;

$settings['root'] = dirname(__DIR__);
$settings['temp'] = $settings['root'] . '/tmp';
$settings['public'] = $settings['root'] . '/public';

return $settings;
```
### Composer
slim3インストール時に自動生成されたcomposer.jsonを以下のように編集します。

```:composer.json(編集前)
{
    "require": {
        "slim/slim": "3.*"
    }
}
```

```:composer.json(編集後)
{
    "require": {
        "php": ">=5.6",
        "slim/slim": "3.*"
    },
    "autoload": {
      "psr-4": {
        "App\\":"src/"
      }
    },
    "autoload-dev": {
      "psr-4": {
        "App\\Test\\": "tests/"
      }
    },
    "config": {
      "sort-packages": true
    },
    "scripts": {
        "start": "php -S 192.168.33.90:8080 -t public public/index.php",
        "test": "phpunit"
    }
}
```
`192.168.33.90`部分はご自分の環境に置き換えてください。
composer.jsonを編集した後は以下のコマンドを実行しておきましょう。

```
composer dump-autoload
```
### .gitignore
vendorディレクトリはgitにコミットしませんので、以下のように記述します。

```:.gitignore
vendor/
.idea/
```
###動作確認
以下のコマンドを実行します。何か記述間違いがあれば、この時点で警告されます。

```
composer start
```

ブラウザで下記のURLを開きます。
`It works! This is the default welcome page`と表示されればOKです。

```
http://192.168.33.90:8080/
```

ブラウザで下記のURLを開きます。
`Hello, world`と表示されればOKです。

```
http://192.168.33.90:8080/hello/world
```


# 参考サイト
[Creating your first Slim 3 Framework Application](https://odan.github.io/2017/11/30/creating-your-first-slim-framework-application.html)
[私家版 Slim Framework チュートリアル (1) 〜 特徴と準備編](https://qiita.com/nunulk/items/4b5c15f13ade660cafbc)
[私家版 Slim Framework チュートリアル (2) 〜 ルーティングと新規作成編](https://qiita.com/nunulk/items/8492548678aac697d0aa#_reference-1dc558a7a78d9b00868b)
[私家版 Slim Framework チュートリアル (3) 〜 表示編](https://qiita.com/nunulk/items/33adfbba55057a7d0c5c#_reference-8903d1023c2501e00d0b)
[私家版 Slim Framework チュートリアル (4) 〜 編集と削除、ついでにパーシャルビュー編](https://qiita.com/nunulk/items/fb5ef759c1337e99d878#_reference-56dbec1889beef3f7f4d)
[私家版 Slim Framework チュートリアル (5) 〜 Controllerクラス編](https://qiita.com/nunulk/items/92d06bada7657ce212e7#_reference-1e4198f2501e274dbdd8)
[私家版 Slim Framework チュートリアル (6) 〜 テスト編](https://qiita.com/nunulk/items/99c12ac8e7b631bd8ed3#_reference-11f698acaecbfe32d5ff)

# 関連ページ
## Windows10にVagrantをを入れてCentOS7をインストールしよう
[1. VagrantインストールからVagrantfileを設置まで](https://qiita.com/erik_t/items/d7f7abbf7deafa4c6fe4)
[2. 仮想マシンの操作](https://qiita.com/erik_t/items/909efb63fd389f486ec3)
[3. WinSCP、Tera Termに秘密鍵でログイン ](https://qiita.com/erik_t/items/2e3c43cfe8731621b82d)
[4. WinSCP、Tera Termにrootユーザーでパスワードログイン](https://qiita.com/erik_t/items/8d006b599815c8fbf38b)
[5. zip/unzipをインストール](https://qiita.com/erik_t/items/9fbe7b5630b1f62893a1)
[6. Vagrantにて仮想環境を配布](https://qiita.com/erik_t/items/11f24633f4248e4f33f0)

## ローカルでLAMP環境を構築しよう
[0. 事前準備](https://qiita.com/erik_t/items/9c7c49db061a250cbc32)
[1. Apacheをインストール](https://qiita.com/erik_t/items/e36235896b327f5cb461)
[2. MySQLをインストール](https://qiita.com/erik_t/items/8dc3f2a5e8e8c9376e27)
[3. PHPをインストール](https://qiita.com/erik_t/items/617503557020a4a6ba82)
[4. ファイアウォールとか停止する](https://qiita.com/erik_t/items/a898d0f547bff6b3d8ff)

## Composerをインストール
[CentOS7にComposerをインストールしよう](https://qiita.com/erik_t/items/0b3492f38f6cd8605a4c)

## PHP Slim3フレームワークのサンプルアプリを作ろう
[2-1. First Application Walkthrough Getting Set Upまで](https://qiita.com/erik_t/items/9e9f6c93d2403ac90242)

## Apache
 [DocumentRootを変更しよう](https://qiita.com/erik_t/items/d8f4746d2dc2992f329e)

## Slim3 Framework×slim-skeleton不使用×twigでプロジェクトを作成する
1．プロジェクト作成～各種設定
[2. DocumentRoot変更～Twigを使用](https://qiita.com/erik_t/items/9d896867234c904409de)
[3. LoggingとController](https://qiita.com/erik_t/items/308091f436e74e2a232e)
[4.PDO使用](https://qiita.com/erik_t/items/7571f214142be628afac)
[5. チケット管理システムを再現➀](https://qiita.com/erik_t/items/fff0edee3ddfa509b2a5)
[6. チケット管理システムを再現➁](https://qiita.com/erik_t/items/28f2cabc460312ea5111)