インスパイヤされて掲示板を作りたくなった(1)

[PHP+SQLite3で２ちゃんねるっぽい掲示板を作る](http://qiita.com/torokko/items/8a07519782f01a68c627)にインスパイヤされて。そういや私、いままでの人生でスレッドフロート掲示板とか作ったことない。作ってみよう。

## PHPを入れる

PHP 7をインストールしよう。それ以下のバージョンはレガシーだ。特に5.4系以下はセキュリティサポートも終了してるので相手にしてはいけない。

Macなら、こんな感じで入れるのがいいです。

```
brew tap homebrew/php
brew install php70 php70-gmp php70-intl php70-pcntl
```

WindowsでまじめにPHPやるのとか正直微妙なので、[VirtualBox](https://www.virtualbox.org/)と[Vagrant](https://www.vagrantup.com/)入れて[rlerdorf/php7dev](https://github.com/rlerdorf/php7dev)とか動かしてみるといいです。

やりかたは[pixiv/intern2015w](https://github.com/pixiv/intern2015w)とかに書いたので、よくわからなかったらこれが動くようにしてみるのがいいですかね。

Linuxでは… まあよしなにやってください。

## Composerを入れる

[Composer](https://getcomposer.org/)はPHPのパッケージの依存性を管理するツールです。`php -r 'echo file_get_contents("https://getcomposer.org/composer.phar");' > ./composer; chmod +x ./composer` とかでダウンロードしておくのがいいですね。

## 設計

* **パッケージ名**: `zonuexe/inspire-bbs`
* **名前空間**: `InspireBBS`
* **OS**: Windowsじゃなきゃいいや
* **Webサーバ**: めんどくさいし[ビルトインウェブサーバー](http://php.net/manual/features.commandline.webserver.php)でいいや
* **RDBMS**: めんどくさいしSQLiteで。手元にあったのは3.8.10.2だった。

なんかそれっぽく作っておけば後で本番にリリースするときに変更できるし良いでしょ。

## じゃあ作ってみよう

はじめにディレクトリから。作る場所は自分のホームディレクトリでいいです。私は`$HOME/repo/php`みたいなディレクトリに作ってるよ。

```sh
cd inspire-bbs
mkdir inspire-bbs
git init
touch README.md
echo "## inspire BBS" > README.md
touch .gitignore
edit .gitignore

git add .gitignore README.md
git commit -m "Init repository"

git remote add origin git@github.com:$USER/inspire-bbs.git
git push origin master
```

`.gitignore`ファイルはこんな感じにしとくと良い。

```:.gitignore
/cache
/phpunit.xml
/vendor/*
/.env
/.idea
/*.iml
/.vagrant
```

最初からGitHubにアップロードしていきましょうねー。この先「ここで`git commit`する」とかいちいち書かないので、自分でわかりやすい範囲でやってみよう。

## ディレクトリ構成を作る

わかりやすいように、こんな感じにしていきましょうか。

```
% tree
.
├── README.md
├── cache
│   ├── db.sq3
│   └── twig
├── public
│   └── index.php
└── src
    └── functions.php
```

DBのファイルは`cache/db.sq3`にします。テンプレートエンジンは[Twig - The flexible, fast, and secure PHP template engine](http://twig.sensiolabs.org/)を選ぶことにするので、そのディレクトリとかも置きますね。

## PDOを作るラッパーを用意してみる

DBは一個あればいい<sup>*[要出典]*</sup>ので、おてがるに`db()`って函数を用意しておきましょうね。

```php:src/functions.php
<?php
/**
 * @author    USAMI Kenta
 * @copyright 2016 USAMI Kenta
 * @license   WTFPL
 */

/**
 * @return \PDO
 */
function db()
{
    static $db;

    if (!$db) {
        $db = new \PDO(getenv('DB_DSN'), null, null, [PDO::ATTR_PERSISTENT => true]);
    }

    return $db;
}
```

### Composerでパッケージを入れてみる

てはじめに、いくつかパッケージを置いてみますね。PHPのライブラリは[Packagist](https://packagist.org/)から探してきます。

- **[vlucas/phpdotenv](https://packagist.org/packages/vlucas/phpdotenv)**: 設定ファイルをかんたんに読み込めるすごいやつだよ
- **[twig/twig](https://packagist.org/packages/twig/twig)**: いい感じに良いテンプレートエンジンだよ
- **[twig/extensions](https://packagist.org/packages/twig/extensions)**: Twigの標準に入ってない機能が追加されてるパッケージだよ
- **[filp/whoops](https://packagist.org/packages/filp/whoops)**: エラーをかっこよく画面表示するやつだよ

シェルでこんな感じに実行してみよう。

```sh
composer require vlucas/phpdotenv twig/twig twig/extensions
composer require --dev filp/whoops
```

Whoopsは開発環境用では便利だけど外部公開すると脆弱性とか個人情報漏洩みたいなことも発生しうるので気をつけてね。

## `index.php`をつくる

じゃ、作ってみましょうか。

```public/index.php
<?php
/**
 * @author    USAMI Kenta
 * @copyright 2016 USAMI Kenta
 * @license   WTFPL
 */
namespace InspireBBS;

require_once dirname(__DIR__) . '/vendor/autoload.php';

// エラーは漏らさず捕捉する
error_reporting(E_ALL | E_STRICT);

// カッコイイエラー画面を表示するための魔法の呪文
$whoops = new \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();

echo "こんにちはこんにちは";
```

PHPの`E_NOTICE`を潰すやつは生かしておいてはいけないので`E_ALL | E_STRICT`って書こう。長いので`error_reporting(-1)`って書いてもいいです。

### サーバーを起動します

PHPを起動するにはApacheが要るんじゃないかって? お前がサーバーになるんだよ！

```sh
php -S localhost:3939 public/index.php
```

コマンドラインでこのコマンドを実行すると、PHPちゃんがWebサーバーになってくれます。それが[ビルトインウェブサーバー](http://php.net/manual/features.commandline.webserver.php)ってやつです。ローカル開発がしたいだけならApacheとかnginxとか要らない。

ブラウザで http://localhost:3939/ を開いてみる。

![スクリーンショット 2016-02-19 2.06.45.png](https://qiita-image-store.s3.amazonaws.com/0/4121/41bcebfc-a05a-187f-880b-2fe7d9d4d71a.png)

こんな感じになれば良いですね。

### エラーを見てみる

せっかくのカッコイイエラー表示ツールを入れたので、エラーを起こしてみましょうか。

こんにちはこんにちは、の下あたりに`echo $foo;`って書いてみます。

![スクリーンショット 2016-02-19 2.13.35.png](https://qiita-image-store.s3.amazonaws.com/0/4121/02b03532-69aa-5162-0d83-ee1478a9c169.png)

ちなみにデフォルトのエラー表示だと、こんな感じ。

![スクリーンショット 2016-02-19 2.16.16.png](https://qiita-image-store.s3.amazonaws.com/0/4121/ae6eb909-6f3a-4a49-09d9-b628bb1aee4a.png)

まあ、これでも事は足りるけど… って感じですね。特にエラーが発生する箇所がネストの深い場所だと、わかりやすさにかなりの差があります。

## 本日のまとめ

* PHPは新鮮な7を入れよう
* Composerを入れよう
* ローカルで開発するならApacheとか要らないよ
* Whoopsは良いものだよ

まだ掲示板は影も形もないし、せっかくインストールしたTwigも使ってないけど… 本日はここまで。

おやすみなさい ヾ(〃＞＜)ﾉﾞ ZZz...

**次スレ**: [インスパイヤされて掲示板を作りたくなった(2)](http://qiita.com/tadsan/items/adaade6b675ac344f373)