---
# System prepended metadata

title: Untitled

---

### 問題：

手続きを定義しなさい。引数には `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", "ないです"]);
```
