### 問題: 手続きを定義しなさい。引数には `method`と`path`を受け取る。 `method` は `GET`, `POST`, `HEAD`, `PUT`などの文字列である。 path は `/` から始まる任意の文字列である。 (`"/"` だけの場合もありうる) 返り値は `[status, contents]` からなるリスト/配列とする。 `status`は`"200 OK"`, `"404 NotFound"`などの文字列である。 `contents`は、method, path の関係ごとに紐付けられた文字列である 以下の要件を満たすように実装せよ。 ``` GET "/hello" → ("200 OK", "こんにちは") GET "/bye" → ("200 OK", "さよなら") POST "/bye" → ("200 OK", "ばいばい") 該当なし → ("404 NotFound", "ないです") ``` 処理とデータは可能な限り分離せよ。 `if (path == "/hello") 〜 elseif (path == "/bye")`のように、条件文にマジックナンバーが含まれるコードは望ましくない。 ## 回答 ```php <?php class Router { private array $routes; public fucntion __construct($routes) { $this->routes = $routes; } /** * @return array{0:string, 1: string} */ public function funcA(string $method, string $path): array { return $this->routes[$path][$method] ?? ['404 NotFound', 'ないですう']; } } $ja = new Route([ "/hello" => [ "GET" => ["200 OK", "こんにちは"] ], "/bye" => [ "GET" => ["200 OK", "さよなら"], "POST" => ["200 OK", "ばいばい"], ], ]); $en = new Route([ "/hello" => [ "GET" => ["200 OK", "Hello"] ], "/bye" => [ "GET" => ["200 OK", "Good bye"], "POST" => ["200 OK", "bye bye"], ], ]); assert($en->funcA('GET', '/hello') === ["200 OK", "Hello"]); assert($ja->funcA('GET', '/hello') === ["200 OK", "こんにちは"]); assert($ja->funcA('GET', '/fuga') === ["404 NotFound", "ないです"]); ```