🐘

PHP のビルトインサーバーは symfony server:start です

2022/04/13に公開

PHP のフレームワーク Symfony には開発をサポートする CLI コマンドがバイナリで提供されていますが、そのローカルサーバー機能がとてもお手軽で便利です。PHP のビルトインサーバーでちょっと試したいなあ、ぐらいの用途でもぜんぜん使える、というよりむしろより楽チンです。

https://symfony.com/doc/current/setup/symfony_server.html

やってみましょう。(Symfony CLI が事前にインストールされている前提です)

symfony new helloworld
cd helloworld
symfony server:start

セットアップはあっという間 (ダウンロード量が最小なのでほんとに 3 〜 5 秒ぐらい) に終わります。

いやコーディングしたいんだよ。はいそうですね。でもほら <?php とか function(){ } とか手で書くのめんどくさいじゃないですか。そんなあなたには maker バンドルがぴったり。

composer require maker doctrine/annotations --dev

maker とだけ短く指定できるのは Flex のレシピだからです。これ Packagist のパッケージじゃなくて、実体はこれです。(この記事を書いているときは組み合わせの都合で doctrine/annotations が足りてなかったので一時的に足しておきます)

この maker にポイラープレートを書かせましょう。

symfony console make:controller HelloWorldController

生成された src/Controller/HelloWorldController.php はこんな感じです。

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloWorldController extends AbstractController
{
    #[Route('/hello/world', name: 'app_hello_world')]
    public function index(): Response
    {
        return $this->json([
            'message' => 'Welcome to your new controller!',
            'path' => 'src/Controller/HelloWorldController.php',
        ]);
    }
}

こんだけもう書いてあるんだから、あと部分的にやりたいことに書き換えるのはすぐですね。クエリのパス要素も安全かつ簡単に取ってこれます。

 class HelloWorldController extends AbstractController
 {
-    #[Route('/hello/world', name: 'app_hello_world')]
-    public function index(): Response
+    #[Route('/hello/{who}', name: 'app_hello_world')]
+    public function index(string $who): Response
     {
         return $this->json([
-            'message' => 'Welcome to your new controller!',
-            'path' => 'src/Controller/HelloWorldController.php',
+            'message' => 'Hello ' . ucfirst($who),
         ]);
     }
 }

curl を使いたいんだけどターミナルをもうひとつ開くのは面倒なので、-d で立ち上げますね。^C の代わりに server:stop しとかないとなのでご注意を。

コーディングしたのは 3 行だけでした。

  • パス要素どこ取る?
  • 受け取る引数書いてね
  • なに出力する?

おてがるですね。make:command を使えば、同じ要領で CLI コマンドも作れちゃいます。

「またまた〜、実は難しいライブラリをもりもりにされてんじゃないの?」とか言う人がいるんですよね。でも他に意識して使うものがあるとしたら、せいぜい dotenv と YAML を読むやつぐらいなんですよね。まあそれはしょうがないです。config/*.yml.env がもうあるので。

あ、大事なことを忘れていました。このスカスカのフレームワークをビルトインサーバーの代わりに使うと何が嬉しいかというと、ゼロコンフィグで依存性がオートワイヤリングされることです。たとえば composer require logger したあと、インターフェースをコンストラクタで受け取るだけで、ほらこのとおり。

class HelloCommand extends Command
{
    public function __construct(private LoggerInterface $logger)
    {
        parent::__construct();
    }
    
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        // ...
        $this->logger->debug("Hello");
        // ...
        return Command::SUCCESS;
    }
}

「あー、ちょっと試したいだけなのに必要な依存ライブラリめんどくさくなってきたなー」ってなるアレ、やりたいことだけ書きたいのに、なんか嫌じゃないですか。

おためしディレクトリはちょっと大きくなるけど、これだけしか書いてないなら、捨ててもぜんぜん惜しくないですよね。じゃんじゃん作って、軽く試したら気軽に捨てていきましょう。

Discussion