# PHPでフレームワークを作ってみるハンズオン 事前準備 ## 環境構築 OSは何でも構いませんが、以下のツールが使えることを確認してください。 * PHP * 7.1以上必須、7.3推奨 * 既にセットアップ済みのPHPがあればそれで可 * コマンドラインから `php -v` を起動してバージョンを確認してください * [Composer](https://getcomposer.org/download/) * Git * [heroku-cli](https://devcenter.heroku.com/articles/heroku-cli) ## Gitリポジトリ ハンズオン開始前までに、以下のように各自リポジトリを準備してください。 開始時間までに準備ができていないとハンズオンの進行に支障があるので注意してください。 1. 空のGitリポジトリを作成してください * リポジトリ名は何でも構いません * 名前は半角英数字と`-`だけを使うのが推奨です * `ore-php-framework` のように単純な名前でも良いですし、好きな名前をつけても構いません * かっこいい名前の方がテンション上がりますからね * `mkdir super-ore-framework && cd super-ore-framework && git init` * ライセンスを決めてください * こだわりがなければ[Apache Licenseがおすすめ](https://qiita.com/tadsan/items/c16e443db39fcf13a0fa)です 2. 空のGitリポジトリをPHPプロジェクトとして初期化してください * `composer require php` と実行してください * `.gitignore` ファイルを用意してください ([下記参照 #gitignore](#gitignore)) * テキストエディタで `composer.json` ファイルを編集して `"name"`, `"description"`, `"license"` の項目を埋めます ([下記参照 #composerjson](#composerjson)) * 書き換え終わったら `composer require ext-mbstring ext-intl` を実行してください * `composer v` (validate) を実行して **`./composer.json is valid`** と出力されたら成功です * せっかくなので `README.md` に**何かいい感じのこと**を書いておいてください * プロジェクト内の全ファイルの文字コードは **UTF-8(BOMなし)** になるようにしてください * ここまでできたら `git add -A` で生成されたファイルを追加し `git commit` しましょう 3. PHPファイルを設置します * ドキュメントルートのディレクトリ名を決めます * `public` でも `web` でも `htdocs` でも大丈夫です * プロジェクトルートの `Procfile` というファイルに書き込みます * `web: vendor/bin/heroku-php-apache2 public/` * ドキュメントルートに `phpinfo.php` というファイルを置きます * 中身は `<?php phpinfo();` にします * `php -S localhost:8080 -t public/` で[ビルトインサーバー](https://www.php.net/manual/ja/features.commandline.webserver.php)を起動します * http://localhost:8080/phpinfo.php を開いて表示されたら成功です * キーボード `Control+c` で終了できます * ここまで動作確認できたら、また変更差分を `git commit` しましょう。 4. 関数とファイルを追加する * 新しいファイル `src/functions.php` を追加してください * [`htmlspecialchars()`](https://www.php.net/htmlspecialchars)をラップした関数 `h()` を定義してください * オプションに `ENT_QUOTES, 'UTF-8'` を指定してください * `composer.json` を編集し、`"autoload": {"files": ["src/functions.php"]},` を追加してください (好みの位置で改行) * 追加し終ったら `composer v` でエラーがないことを確認し、 `composer dump-autoload` コマンドを実行してください * ドキュメントルート以下に新しいファイル `index.php` 追加してください * このファイルに `require __DIR__ . '/../vendor/autoload.php';` を含めてください * 内容は何でも良いですが、 `h()` を使って何か値を出力してください * ~~おもしろいねたが思い浮かばなければ、~~ [下記のindex.php](#indexphp)をコピーしてください * http://localhost:8080/ を開いて動作確認できれば、また `git commit` してください 5. Herokuにデプロイします * https://signup.heroku.com/ からHerokuアカウント作成またはログインします * [heroku-cli](https://devcenter.heroku.com/articles/heroku-cli)をインストールします * `heroku create` でHeroku上にプロジェクトを作成します * `git push heroku master` でデプロイされます * 画面上に **`https://xxxxx.herokuapp.com/ deployed to Heroku`** のような表示があるのでブラウザで開き、 `phpinfo.php` が表示されることを確認します おつかれさまでした! ここまでできれば準備完了です。 ### `.gitignore` こだわりがなければ、このようにしてください。 ```.gitignore .DS_Store ._.DS_Store .php_cs.cache .phpunit.result.cache /.idea/ /cache/ /log/ /node_modules/ /vendor/ ``` ### `composer.json` `composer require` を実行した状態では、このようになっているはずです。 ```json { "require": { "php": "^7.3" } } ``` `composer.json` をエディタで開き、下記のように書き換えてください。 ```json { "name": "zonuexe/oira", "description": "Oira is a simple web framework", "license": "AGPL-3.0-or-later", "require": { "php": "^7.3" }, "config": { "sort-packages": true } } ``` * `"name"` は `自分のGitHubアカウント名/リポジトリ名` になるように設定するのが推奨です * 例: `"tadsan/ore-php-framework"` * パッケージ名はアルファベット小文字・数字と`-`が使えます * `"description"` の内容は何でもいいです (極論、空文字列でもいいです) * `"license"` は、先に自分が選んだライセンスを記入します * Apache Licenseの場合は `"Apache-2.0"` です * MIT Licenseの場合は `"MIT"` です * `"config"` の内容はそのままコピーすればOKです * https://getcomposer.org/doc/06-config.md#sort-packages ### index.php ```php <?php require __DIR__ . '/../vendor/autoload.php'; echo "<!DOCTYPE html>\n"; echo "<title>test</title>\n"; echo "<p>現在は" . h(date('Y年m月d日H時i分s秒')). "です</p>\n"; echo "<ul><li><a href='/phpinfo.php'><code>phpinfo()</code></a></ul>\n"; ``` ## 著作権表示 この記事(2019年10月7日版)は[うさみけんた](https://www.zonu.me/)([@tadsan](https://twitter.com/tadsan))が[PHPでフレームワークを作ってみるハンズオン](https://1000php.connpass.com/event/150058/)のために作成しました。 <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />この作品は<a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.ja">クリエイティブ・コモンズ 表示-継承 4.0 国際ライセンス(CC BY-SA 4.0)</a>の下に提供されています。