CakePHP4? Cookbookの「Articles の検証ルールの更新」で “Declaration of ~ must be compatible with ~”エラー

投稿者: Anonymous

いまCakePHP4? CookbookのCMSチュートリアルを試しています。
CakeはPHPバージョン7.3.xのサーバーでホストしています。

CakePHP4 Cookbook 「Articles の検証ルールの更新」の箇所で指示通り

use CakeValidationValidator;

の読み込みと、

public function validationDefault(Validator $validator)
{
    $validator
        ->allowEmptyString('title', false)
        ->minLength('title', 10)
        ->maxLength('title', 255)

        ->allowEmptyString('body', false)
        ->minLength('body', 10);

    return $validator;
}

のメソッド追加をして

<?php
namespace AppModelTable;

use CakeORMTable;
//Textクラス
use CakeUtilityText;

use CakeValidationValidator;

class ArticlesTable extends Table
{
    public function initialize(array $config) : void
    {
        $this->addBehavior('Timestamp');
    }

    public function beforeSave($event, $entity, $options)
    {
        if ($entity->isNew() && !$entity->slug) {
            $sluggedTitle = Text::slug($entity->title);
            //スラグをスキーマで定義されている最大長に調整
            $entity->slug = substr($sluggedTitle, 0, 191);
        }
    }

    public function validationDefault(Validator $validator)
    {
        $validator
            ->allowEmptyString('title', false)
            ->minLength('title', 10)
            ->maxLength('title', 255)

            ->allowEmptyString('body', false)
            ->minLength('body', 10);

        return $validator;
    }

}

というコードにして/articles/をリロードしたところ、

Fatal error: Declaration of AppModelTableArticlesTable::validationDefault(CakeValidationValidator $validator) must be compatible with CakeORMTable::validationDefault(CakeValidationValidator $validator): CakeValidationValidator in /home/***/++++.com/public_html/cms/src/Model/Table/ArticlesTable.php on line 10

というエラーが出てしまい、回避できずに困っております。
どなたかこちらのエラー回避方法をご存知ありませんか?
よろしくお願いいたします。

解決

Fatal error: Declaration ~ は親クラスのメソッドと引数、戻り値の型定義が異なる場合に出るエラーです。

親クラスの CakeORMTable::validationDefault は、

public function validationDefault(Validator $validator): Validator

となっていますので同様に戻り値の型指定 : Validator を入れてください。


そもそもドキュメントのソースコードが3.xのままの記述だったので、間違いの元でしたね。

該当ページで、英語版のソースコードとの差分は以下になります。

https://github.com/cakephp/docs/pull/6651/files

修正リクエストは投げましたので、そのうち反映されるはずです。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *