diff --git a/docs/reference.md b/docs/reference.md index 1b06970..df8e8fa 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -151,7 +151,7 @@ interface UserRepository interface UserRepository { #[DbQuery('user_stats', type: 'row')] - public function getStats(string $id): array; // ['total' => 10, 'active' => 5] + public function getStats(string $id): ?array; // ['total' => 10, 'active' => 5], or null when no row matches } ``` diff --git a/docs/tutorial/README.ja.md b/docs/tutorial/README.ja.md index b056262..3162fc8 100644 --- a/docs/tutorial/README.ja.md +++ b/docs/tutorial/README.ja.md @@ -12,7 +12,7 @@ permalink: /tutorial/ja/ ブログサービスを題材に、Ray.MediaQuery 1.1.0 までの主要機能を第0章から第13章+補章で体験する入門。 -- 前提: PHP 8.2+ / Composer / SQL の基礎 / DI の概念 +- 前提: PHP 8.2+ / Composer / `ext-pdo` / `ext-mbstring` / `ext-tokenizer` / `pdo_sqlite` / SQL の基礎 / DI の概念 - DB: SQLite (`:memory:`) — 追加 DB サーバーは不要 ## このチュートリアルの読み方 @@ -27,7 +27,7 @@ permalink: /tutorial/ja/ 書き上がったコードは [`docs/tutorial/src/`](https://github.com/ray-di/Ray.MediaQuery/tree/1.x/docs/tutorial/src) 配下に「答え」として置いてある。詰まったら参照してよい。 -> **完成版 `run.php` について**: [`docs/tutorial/src/run.php`](https://github.com/ray-di/Ray.MediaQuery/blob/1.x/docs/tutorial/src/run.php) は全章を通しで実行する完成形の統合デモである。各章の「期待出力」には、その意味が分かりやすい参照フレームを選んで `(単独実行)` または `(統合 run.php)` のラベルを付けてある。 +> **完成版 `run.php` について**: [`docs/tutorial/src/run.php`](https://github.com/ray-di/Ray.MediaQuery/blob/1.x/docs/tutorial/src/run.php) は全章を通しで実行する完成形の統合デモである。各章の「期待出力」には、その意味が分かりやすい参照フレームを選んで `(単独実行)`、`(統合 run.php)`、または `paginated` のような確認対象のラベルを付けてある。 > > - `(単独実行)` … その章のコードだけを小さな `run.php` で動かしたときの出力。前半の機能紹介ではこちらを使う。 > - `(統合 run.php)` … 完成版 `run.php` を頭から通しで実行し、前の章のデータ投入・UPDATE / DELETE まで積み上がった状態での出力。`id` や件数が前章までの累積に依存する後半ではこちらを使う。 @@ -139,16 +139,16 @@ docs/tutorial/src/ - composer の autoload を準備 - SQLite メモリ DB に空のスキーマを流して動作確認できる状態にする -### Step 1. リポジトリを clone して composer install +### Step 1. リポジトリを clone して composer install --no-dev ```bash -php -m | grep '^pdo_sqlite$' +php -m | grep -E '^(PDO|mbstring|pdo_sqlite|tokenizer)$' git clone https://github.com/ray-di/Ray.MediaQuery.git cd Ray.MediaQuery -composer install +composer install --no-dev ``` -`pdo_sqlite` が表示されれば OK。 +`PDO`、`mbstring`、`pdo_sqlite`、`tokenizer` が表示されれば OK。チュートリアル実行には本体の依存だけで足りるので `--no-dev` を付けている。開発ツールやテストスイートも使う場合は、プロジェクトの対応 PHP バージョンに合わせて `composer install` を実行する。 ### Step 2. ディレクトリ構造を作る @@ -164,11 +164,11 @@ mkdir -p mywork/blog mywork/sql ### Step 3. `composer.json` に autoload を追加 -自分の `MyBlog\` 名前空間を `mywork/blog/` に対応づける。`run.php` を動かすだけなら次章のブートストラップ (`$loader->addPsr4()`) で足りるので必須ではないが、IDE 補完や PHPUnit から自分のクラスを使うなら登録しておく。 +自分の `MyBlog\` 名前空間を `mywork/blog/` に対応づける。`run.php` を動かすだけなら次章のブートストラップ (`$loader->addPsr4()`) で足りるので必須ではないが、IDE 補完や PHPUnit から自分のクラスを使うなら登録しておく。第0章では `composer install --no-dev` を使うので、`autoload-dev` ではなく通常の `autoload` に登録する。 ```json { - "autoload-dev": { + "autoload": { "psr-4": { "MyBlog\\": "mywork/blog/" } @@ -571,7 +571,7 @@ Hello - 戻り値型 `Article|null` (単一) や docblock `@return array
` (複数) を見て、フレームワークが `Article` を組み立てる。 - 今回の `Article` は constructor を持つので、`FetchNewInstance` が選ばれて `PDO::FETCH_FUNC` で組み立てられる。**SELECT カラム順が constructor 引数順にそのまま渡される**。詳細は次章。 - Constructor Promotion のおかげで getter / setter は不要。`readonly` で意図せぬ変更を防ぐ。 -- PHP 8.4 以降なら `final readonly class Article { ... }` と書けばさらに簡潔。 +- PHP 8.2 以降なら `final readonly class Article { ... }` と書けばさらに簡潔。 --- @@ -1272,7 +1272,7 @@ printf("page 1 has %d items, hasNext=%s\n", count($page1->data), $page1->hasNext echo $page1->data[0]->title, "\n"; ``` -### 期待出力 (第11章 / paginated) +### 期待出力 (第11章 / paginated / 写経 run.php) ```text total items=31 @@ -1325,7 +1325,7 @@ printf( ); ``` -### 期待出力 (第11章 / statsPaginated) +### 期待出力 (第11章 / statsPaginated / 写経 run.php) ```text first stats row=MyBlog\ArticleStats commentCount=2 excerpt='Updated body.'