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