cakePHP(v3.x)、ある2つのフィールドの符号が一致しているかどうかのバリデーションをかける。

消費税と単価をそれぞれ別々のカラムに保存しているモデルがある時、両者の符号が一致しているかどうかでバリデーションをかけたい時があります。 そういう時はテーブルのビルドルールを追加すると良いです

いまここでモデルは$Carという名前で、CarsTableにおいて、priceとtaxの符号を一致させるようバリデーションをかけたい時、

    public function buildRules(RulesChecker $rules)
    {
        // 消費税と金額の符号が一致しない品目はNG
        $rules->add(
            function($item, $options){
                return $item->price * $item->tax >= 0;
            },
            'sign_integrity_tax',
            [
                'errorField' => 'tax',
                'message' => '単価と消費税の符号が一致していません',
            ]
        );
        return $rules
    }

などとすると良いと思われます。