ComposerでピュアなPHPプロジェクトを作る
PHPの依存関係管理ツールである
「Composer」
Laravelでの開発に使用しているが、何となく使ってて単体で使ったことなかったので、ちょっといじってみた。
公式にも記述があるが、
JavaScriptのnpm(yarn), RubyのBundler
に影響を受けている。
Rubyは経験ないので分からないが、JavaScriptは普段から使っているので
npmと考え方使い方だいたい似たような感じだとは思う。
前提条件
この記事でインストール方法については扱わない。調べればいくらでも出るので。
$ composer -v ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.0.4 2020-10-30 22:39:11
この状態からスタート。
プロジェクト作成
プロジェクトディレクトリを作る
$ mkdir sample $ cd sample
composer.jsonを作る
$ composer init
もちろん、自分でも作れるが、
今回は一応対話式で作成してみた。(全てEnterでスキップ)
すると、こんな感じのファイルが作られる
[composer.json]
{ "name": "yourname/sample", "authors": [ { "name": "yourname", "email": "youremail" } ], "require": {} }
パッケージを追加してみる
[composer.json]
"require": { "monolog/monolog": "1.0.*" }
$ composer install
初回はvendorディレクトリが自動で作られ、以降はvendor内にパッケージがインストールされる。
実行ファイルを作る
まだ、パッケージしかないので、実行ファイルを空で作っておく。
$ touch index.php
とりあえず空で。後で書き足す。
土台は完成。
自動読み込みの設定
公式より
自動ロード情報を指定するライブラリーの場合、Composerはvendor/autoload.phpファイルを生成します。このファイルをインクルードして、追加の作業なしでこれらのライブラリが提供するクラスの使用を開始できます。
ということなので、index.phpに一旦これだけ書いておく。
[index.php]
<?php require __DIR__ . '/vendor/autoload.php';
動かしてみる
最低限の準備ができたので実際に動かしてみる
実行ファイルに追記
[index.php]
<?php require __DIR__ . '/vendor/autoload.php'; $log = new Monolog\Logger('name'); $log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING)); $log->addWarning('Foo');
実行
php index.php
app.log
が作られ、ログが出力されているのが分かる。
オートロードの設定を追加する
インストールしたパッケージのオートロードはできるようになったが、
自分で作成したファイルについては、追加で設定が必要。
クラスを作る
[sample/app/Greeting/Greeting.php]
<?php namespace App\Greeting; class Greeting { public function hello() { echo 'hello'; } }
helloメソッドを呼ぶと、helloを出力するだけのクラス。
ディレクトリに合わせてnamespacceを付けた。
使ってみる
[index.php]
+ $greeting = new App\Greeting\Greeting(); + $greeting->hello();
実行
$ php index.php
当然失敗する。
エラー文
PHP Fatal error: Uncaught Error: Class 'App\Greeting\Greeting' not found in ~~~index.php
要するに、「そんなクラス、index.phpで見つかりませんけど」ということ。
これを、オートロードするようにする。
composer.jsonを修正
[composer.json]
"autoload": { "psr-4": {"App\\": "app/"} }
Appというnamespaceがappディレクトリを指すように設定した。
設定を反映させる。
$ composer dump-autoload Generating autoload files Generated autoload files
再度、実行してみる。
$ php index.php hello
helloが出力されれば、完了。
まとめ
普段PHPを触る時、何の気なしにとりあえず慣れているLaravelでやっていた。
いろいろ便利だし。
ただ、特定のライブラリをちょっと試したいとか、
そういう時はこっちの方が準備早いし楽そうだと思った。