今でも覚えています。Laravelを使い始めた時にとても気に入ったのがartisanコマンドであったことを。その当時の他のPHPフレームワークと異なり、Laravelでは最初からコマンドの開発がMVCのUIの開発と肩を並べて上級扱いされていました。Unix系のコマンドに慣れている私には感激でした。しかし、コマンドだけの開発しか必要ないときがあります。つまりブラウザの画面を必要としない開発です。そのようなときにLaravelをインストールすると、ウェブのためのコントローラなどが一緒についてくるので煩わしく思えます。そこで登場するのが、Laravel Zeroです。

Laravel Zeroとは

Laravel Zero(ゼロ)は、Laravelのコアの開発者であるNuno Maduros氏が開発したコマンド開発に特化したフレームワークです。ここでは、以前に記事としたGoogle AnalyticsのデータをAPIで取得(2)コマンドを作成のコマンドを、Laravel Zeroでその説明とともに書き直します。

インストール

Laravelと同様に、Laravel Zeroはcomposerを利用してプロジェクトを作成します。

$ composer create-project --prefer-dist laravel-zero/laravel-zero ga4

現時点では、Laravel 11xをもとにしているのでPHP 8.2が必要ですが、まだその環境が用意されていないなら、例えばLaravel 10xのPHP 8.1なら、以下のようにブランチを指定してインストールも可能です。

$ composer create-project --prefer-dist laravel-zero/laravel-zero:10.x ga4

インストール後に、ディレクトリを見てみましょう。

$ ls -al
app/
bootstrap/
config/
tests/
vendor/
application
box.json
composer.json
composer.lock
.editorconfig
.gitattributes
.gitignore
phpunit.xml.dist
README.md

Laravelがインストールされたディレクトリと似ていますが、database, public, resources, routes, storageなどのディレクトリがありません。また、artisan.envのファイルもありません。

appのディレクトリの中身を見てみると、

$ tree app
app
├── Commands
│   └── InspireCommand.php
└── Providers
    └── AppServiceProvider.php

すっきりしてこれだけなのです。しかも、InsupireCommand.phpはデモのコマンドです。

最初のコマンドの作成

早速、Google Analyticsからデータを取得するコマンドを作成しましょう。

コマンドの作成のためのコマンドはLaravelと似ていますが、以下のようにartisanの代わりにapplicationを使います。

$ php application make:command Ga4Command

上で作成されるファイルは、app/Console/Commandsではなくapp/Commandsに置かれます。
これを編集します。

namespace App\Commands;

use Google\Analytics\Data\V1beta\Metric;
use Google\Analytics\Data\V1beta\OrderBy;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\OrderBy\MetricOrderBy;
use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Illuminate\Support\Str;
use LaravelZero\Framework\Commands\Command;

class Ga4Command extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'ga4';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Get GA4 data';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $client = new BetaAnalyticsDataClient([
            'credentials' => storage_path('ga4.key'),
        ]);

        $response = $client->runReport([
            'property' => 'properties/'.config('google.ga4.property_id'),
            'dateRanges' => [
                new DateRange([
                    'start_date' => '28daysAgo',
                    'end_date'   => 'today',
                ]),
            ],
            'dimensions' => [
                new Dimension(['name' => 'pageTitle']),
                new Dimension(['name' => 'pagePath']),
            ],
            'metrics' => [
                new Metric(['name' => 'screenPageViews']),
            ],
            'orderBys' => [
                new OrderBy([
                    'metric' => new MetricOrderBy([
                        'metric_name' => 'screenPageViews',
                    ]),
                    'desc'   => true,
                ]),
            ],
            'limit' => 100,
        ]);

        $rows = [];

        foreach ($response->getRows() as $row) {
            $title = $row->getDimensionValues()[0]->getValue() ?? null;
            $url = $row->getDimensionValues()[1]->getValue() ?? null;
            $count = $row->getMetricValues()[0]->getValue() ?? null;

            if ($url === '/') {
                continue;
            }

            $rows[] = (object) [
                'title' => Str::before($title, ' – ララジャパン'),
                'url'   => $url,
                'views' => $count,
            ];
        }

        $html = view('ranking', compact('rows'))->render();

        echo $html;

        return Command::SUCCESS;
    }
}

Google AnalyticsのデータをAPIで取得(2)コマンドを作成に掲載されているコードと比べると、唯一の違いはnamespaceのパスと継承するCommandのクラスがLaravelZero\Framework\Commands\Commandと変わっただけです。

このコマンドを実行可能とさせるには、インストールすべきライブラリがいくつかあります。

まず、Googleのライブラリです。

$ composer require google/analytics-data

そして、Google AnalyticsのプロパティIDを保存する、.envも必要なのでdotenvのライブラリを以下のようにインストールします。
しかし、composerではなく、ゼロのコマンドのapp:installオプションでインストールします。以下のように、.env, .env.exampleなどのLaravelではお馴染みのファイルがここで初めて作成されます。どうしてこれがプロジェクトを作成したときにインストールされないのはちょいと不思議。

$ php application app:install dotenv
Installing dotenv component...
Creating .env: ✔
Creating .env.example: ✔
Updating .gitignore: ✔

さらに、Ga4Commandでは、出力にブレードを使うのでview()のヘルパーも必要です。こちらのインストールはこれもapp:installを使用します。

$ php application app:install view
Installing view component...
...
Require package via Composer: ✔
Creating resources/views folder: ✔
Creating default view configuration: ✔
Creating cache storage folder: ✔

これで、resources/viewsのディレクトリや、storageのディレクトリも作成されます。だんだんとLaravelらしくなってきましたね。

実行をartisanとする

コマンドが作成されたところで、実行と行きましょう。
実行するには、以下のコマンドラインとなります。

$ php application ga4

このapplicationが気に入らないなら違う名前にもできます。例えば、Laravelに合わせてartisanにしてみましょう。
以下の改名コマンドにおいてartisanを指定します。

$ php application app:rename artisan
Renaming the application...
Renaming application to "artisan": ✔
Updating config/app.php "name" property: ✔
Updating composer "bin": ✔

実行のコマンドラインは、以下のようになります。

$ php artisan ga4

参照

Laravel Zero(2)データベースを使う

メルマガ購読の申し込みはこちらから。

By khino