独学エンジニアのメモ帳

得た知識のアウトプットとか日常のメモとか。ゆるくやる。

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でやっていた。
いろいろ便利だし。
ただ、特定のライブラリをちょっと試したいとか、
そういう時はこっちの方が準備早いし楽そうだと思った。