3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ドキュメントは実装に追いついていてほしい、という話

Last updated at Posted at 2023-10-23

公式ドキュメントを参考にしてコードを書いたら、deprecated の Notice が大量に出た。

これは、

  • ドキュメントには、それを知りうるように書いてあったか
  • いつからこうなっていたか
  • どうすればよいのか

を追いかけた記録である。

ことの始まり

ドキュメントを見ながら CakePHP 4.4 を利用したコードを書き始めた。

if (!$query->isEmpty()) {
  // ~~
}

しかし、デバッグのためにログを見たところ deprecated の Notice が大量に出ていてエラーが埋もれていた。これではデバッグどころではない。
このコードはドキュメントを見ながら書いたはずなのに、一体どういうことなんだろうか。

ドキュメントを確認

私が見たはずの、データ取得のドキュメントを再度確認してみた。

日本語のドキュメント(4.x)

Document 4.x (ja) [2023-10-22 閲覧]

// クエリーをチェックします
$query->isEmpty();

// 結果をチェックします
$results = $query->all();
$results->isEmpty();

確かに私はこれを見て書いた。では英語のドキュメントはどうなっているだろう。

英語のドキュメント(4.x)

Document 4.x (en) [2023-10-22 閲覧]

// Check a query.
$query->isEmpty();

// Check results
$results = $query->all();
$results->isEmpty();

こちらも $query->isEmpty(); を使うように書いてある。

CakePHP 4.4 で deprecated が出るということは、最近出たという CakePHP 5.x ではこの書き方が廃止されているかもしれない。そのドキュメントがどうなっているか確認してみる。

日本語ドキュメント(5.x)

Document 5.x (ja) [2023-10-22 閲覧]

// クエリーをチェックします
$query->isEmpty();

// 結果をチェックします
$results = $query->all();
$results->isEmpty();

同じだ。では英語ではどうだろう?

英語ドキュメント(5.x)

Document 5.x (ja) [2023-10-22 閲覧]

// Check results
$results = $query->all();
$results->isEmpty();

英語はでは変わっている。

データ取得のドキュメントのまとめ [2023-10-22 時点]

日本語ドキュメント 英語ドキュメント
4.x 古い 古い
5.x 古い 新しい

移行ガイドの記述

CakePHP 4.3 移行ガイド には、このような記述がある。

クエリをプロキシするすべての ResultSetInterface メソッド( CollectionInterface を含む) (これらは強制的に結果を取得し、その結果に対してプロキシされたメソッドを呼び出します)は非推奨になりました。 非推奨な使い方の例として、 $query->combine('id', 'title'); があります。 これを $query->all()->combine('id', 'title'); に変更する必要があります。

このドキュメントを読んで isEmpty() が該当するかどうか判るには、isEmpty() が Query オブジェクトのメソッドではなく ResultSet のメソッドであることを知っていなければならない。私がこれ(4.3 にこの記述があること)を見つけられたのはそのことを知っていたからではなく、ソースの変更を追いかけたところ 4.3.0RC という文字があったからである。

いつからこうなった?

  • [2015-03-23] CakePHP 3.0 リリース
    • 3.x のドキュメントでも $query から isEmpty() を呼ぶコードがあるので、3.0 からこのように書けるようだ。
  • [2021-07-07] deprecated の Notice を出すソースの変更はここで行われた
  • [2021-10-24] CakePHP 4.3 リリース
    • deprecated の Notice が出るようになる
    • ドキュメントの移行ガイドには記述がある
    • ドキュメントのサンプルは古いまま
  • [2023-01-25] CakePHP 5.x のドキュメント(英語のみ)が更新された。
  • [2023-09-10] CakePHP 5.0.0 リリース
    • 本当に削除されたのかどうかは、試していないのでわからない。
    • ドキュメントのサンプルは、英語は改訂されているが日本語のは古いまま

どうなっていてほしいか

CakePHP 3.x のドキュメントにはこのような書き方をしているところがある。

// コントローラーやテーブルのメソッド内で
// Prior to 3.6 use TableRegistry::get('Articles')
$articles = TableRegistry::getTableLocator()->get('Articles');
$query = $articles->find('ownedBy', ['user' => $userEntity]);

このようにどちらの書き方も紹介されていれば、メジャーバージョン内で変化があっても理解することができる。

Pull Request を出してみた

自分で直せるのが OSS だし、言い出しっぺの法則というものがあるし、ただ文句をたれるだけでは生産性がない。
そこで、マージされるかわからないが Pull Request を出してみた。

Pull Request がマージされた(2023/10/28 追記)

これでわかりやすくなったことだろう。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?