CakePHP3で保存前にバリデーション結果を取得する「$topic->errors()」と「$topic->hasErrors()」の 2つの方法 CakePHP3で、データベースに値を保存する前にバリデーションの結果を取得し、その結果によって処理を振り分けたい、そんな場合の方法について解説します。 解説のためのサンプルのテーブル 例えば、下記のような「トピックス」のテーブルがあったとします。 CREATE TABLE `topics` ( `id` int(11) NOT NULL AUTO_INCREMENT, `topics_date` date NOT NULL, `title` text NOT NULL, `body` text NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMA
CakePHP2の時は save でバリデーションが実行されてましたね。 もちろんCakePHP3でも save でバリデーションが実行されますが、 2種類のバリデーション実行タイミングがあります。 どこで実行されるの? 1個目が以下のように newEntity と patchEntity にPOST値等のデータを与えて Entity を作ったタイミングでバリデーションが実行されます。 $entity = $table->newEntity($data); $patchEntity = $table->patchEntity($entity, $data); // src/Model/Table/HogeTable.php // ここにEntity作成時のバリデーションを記述します。 public function validationDefault(Validator $validato
バリデーションの必須項目の動的変更 バリデーションルールの動的な変更 バリデーションの必須項目の動的変更 モデルで定義したバリデーションルールを、コントローラから動的に、必須項目の設定(‘required’=>true)を追加、削除できるコードが紹介されています。フィールド単位で、必須項目を削除(remove)、または、残す(keep)ことができるようです。 Simple Way to Unbind Validation & Set Remaining Rules to Required 「英語を読むのがつらい…」という方の為に、簡単に使い方を説明します。 1-1. app_model.php を作成 app/modeles フォルダ内に、app_model.php ファイルを作成して、以下のコードをコピペします。 <?php class AppModel extends Model {
CakePHP で docomo と au の RFC 非準拠メールアドレスを例外的に許可する email バリデーション 2011年11月28日 10:59CakePHP CakePHP の組み込みバリデーションルール email は メールアドレスの書式をチェックしてくれて便利なんだけど 特に携帯のキャリアメールに関して困ることがある。 かつて docomo と au で RFC 違反というか非準拠のアドレスが登録可能だった。 具体的に言うと .(ドット)が連続するものと @ の直前に . があるもの。 今はもうこれらは登録できないはずだけど 以前に作られたアドレスはまだ生きていて 実際に使っている人もたくさんいる。 使われてはいるけれども メールアドレスの仕様には沿っていないので これを入力すると email のバリデーションで弾かれてしまいますね。 yabmin に登録しようとした
データベースのユニークキー制約 データベースにおいて、複数のフィールド(カラム)値の組み合わせがユニークであることを保証するためには、データベーステーブルのカラムにユニークキー制約を定義します。 CREATE TABLE IF NOT EXISTS `users` ( `id` int(10) unsigned NOT NULL auto_increment, `first_name` varchar(255) NOT NULL, `last_name` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `first_name_last_name` (`first_name`,`last_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; これで「first_
CakePHP 2になっていくつか数値用バリデーションルールが追加されています。 数値用 (コア)バリデーション decimal - 十進数であること numeric - 数値であること naturalNumber - 自然数(正の整数)であること range - 数値の範囲(超え・未満)であること comparison - 大・小・一致・不一致の比較に合致すること 5つともnotEmptyとなるので、必須としない場合は'allowEmpty' => trueを追加する必要があります。 decimal 十進数であることであることを検証します。 decimal(integer $check, integer $places = null, string $regex = null) 小数点以下の桁数を限定する場合は第2引数($places)で指定します。 第3引数で正規表現を指定した場合は、
CakePHPのモデル内のバリデーションで利用できるバリデーションルールをまとめました。いちいちコメント付けてたらとんでもない時間がかかってしまいましたが、不可解な部分はソースコードを読んで処理を追ったり、サンプルを作って確認したので、cookbookより濃厚なコメントができたと思いますがどうでしょうかね。個人的には色々不明な部分が晴れた気がしたのでスッキリです! なお確認したバージョンは2.4.6です。 バリデーションの書き方バリデーションのルールはモデルに書きます。 モデル内のプロパティとして設定する方法と、後付けで登録する方法(version2.2以降)がありますが、ここではプロパティとして設定する方法を紹介します。 基本形として1つのルールをつける場合は以下のようにします。 Class Hoge extends AppModel { public $validate = array
CakePHPで組み込みバリデーションルールをつくる方法は、正規表現を定義する方法と独自メソッドを定義する方法の2つがあるようです。 参考 Custom Validation Rules 正規表現を使用 'rule'に正規表現を直書きしてもいいようです。 正規表現はスラッシュで囲まれている必要があります。最後にiを付与すると大文字・小文字を区別しなくなります。 ここでは、「文字と数字のみで3文字以上となる値を入力」というバリデーション public $validate = array( 'code' => array( 'rule' => '/^[a-z0-9]{3,}$/i', 'message' => 'Only letters and integers, min 3 characters', 'allowEmpty' => true ), ); 「custom」ルールを使用 コアにも
今回は、プロフィール情報に使用されるデータに絞ったバリデーションルールです。 バリデーションルール 以下の5つのバリデーションルールがコアに用意されています。 email メールアドレス url URL postal 郵便番号 phone 電話番号 ip IPアドレス email (メールアドレス) email(string $check, boolean $deep = false, string $regex = null) 第2引数$deepがtrueの場合、getmxrrもしくはcheckdnsrrもしくはgethostbynamelを使用してドメインの有無まで検証してくれます。第3引数$regexに正規表現を使用してドメインを限定してくれます。 public $validate = array( 'mailaddress' => array( 'rule' => array( '
「isUnique」は、特定カラムの一意性を検証してくれるメソッドです。 2.5.6からは、複数フィールドにまたがる一意性検証にも対応するようになったようです。 使用方法 public $validate = array( // 単一のフィールドに対する一意性を検証 'culumn_a' => array( 'rule' => 'isUnique', 'message' => 'culumn_a has already been taken.' ), // 複数のフィールドに対する一意性を検証 (AND) 'culumn_a' => array( 'rule' => array( 'isUnique', array( 'culumn_a', 'culumn_b'), false), 'message' => 'culumn_a & culumn_b combination has alre
単一のフィールドでバリデーションを行うには、モデルでバリデーションを定義してやればいいのですが、複数のフィールドにかかるバリデーションはどうすればいいのかわかりませんでした。 今回取り扱う、複数のフィールドにまたがるバリデーションというのは以下のような電話番号のフィールドや名前のフィールドなどです。 結論からいうと、 自分で関数を定義する ことによって解決しました。 例えば、空のフィールドを許さないバリデーションを行う場合は以下のようにモデルに書くと思います。 モデル <?php class Posts extends AppModel { public $validate = array( 'test_field' => array( 'rule' => array('notEmpty'), 'message' => '文字を入力してください。' ) ); } ここでruleに指定してあ
データバリデーション¶ データバリデーションは、どのようなアプリケーションにおいても重要な部分です。 なぜなら、これはモデル内のデータがアプリケーションのビジネスルールに 則していることを保証する仕組みだからです。 たとえば、パスワードの長さが8文字以上あることや、 ユーザ名がユニークであることを保証したい場合などが考えられます。 バリデーションルールを定義することで、フォームの扱いが非常に楽になります。 データバリデーションのプロセスには、いろいろと異なった側面があります。 そのうちこのセクションで扱うのは、モデルに特化した部分です。基本的には、 あなたのモデルで save() メソッドをコールした時に起こる内容です。 FormHelper には、バリデーションエラーの 表示がどのように処理されるのかについての記載があります。 データバリデーションへの最初のステップは、 まずモデルの中に
Tutoriel CakePHP : Validate & Redirect - YouTube 登録画面やログイン画面なんかは、たいていアクションとビューが一致しているので特に気にしなくてもバリデーションエラーの時に、Cake側がメッセージ等々を表示してくれます。 ところが、たとえば記事に対するコメントや、一覧画面に追加フォームを設置したいこともあります。その場合、たいていはバリデーションエラーでsaveができないと、元の画面にリダイレクトしたかったりします。そうするとsetFlashしたメッセージは表示できてもバリデーションエラーはリダイレクト時に破棄されるためフォームが書いてあるビューには表示されません。 上の動画では、そういった場合の対応方法が解説されています。 具体的には、バリデーションのエラーがあった場合にセッションに書き込んでそれをコントローラ側で読み取ってコントロー
CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.xではエラーとなったルールのメッセージが配列になって返されます。 複数ルールを設定して、全てのルールを実行する方法(2.x系・1.3系共通) バリデーションはモデルの$validateに設定した各ルールを上から行っていきます。デフォルトでは、ひとつのルールがエラーとなるとそのフィールドに対するバリデーションを停止しますが、'last'=>falseを設定するとエラー有無にかかわらず後続のバリデーションルールも実行するようになります。3つある場合は、1つ目・2つ目に設定するようなかたちになります。 // 例 var $validate = array( 'errormsgtest' => arr
CakePHPでは、saveメソッドの際にバリデーション処理も自動で行われますが、save処理と切り離してバリデーションを行うこともできます。このときは、save時と若干異なる処理体系になります。 バリデーションをsaveから切り出して行う ポイントは、1.のvalidatesの前にデータ($this->request->data)をdataをModelにsetする必要があるところです。(「若干異なる処理体系」とはここのことです。)この処理を行わないとvalidatesは常にtrueを返します。 validatesメソッド内で、invalidFieldsメソッドが呼び出されます。このメソッドは[Model]->validationErrorsにバリデーションのエラーメッセージ(message)を格納します。バリデーションNGの場合、ここからメッセージの取り出しが可能です。 // 1. モデ
まだまだあけましておめでとうございます。 年始をいかがお過ごしでしょうか。 私はいつものように、日常と変わらない生活をしています。 さてさて、ユニットテストの件ですが、以前更新して随分時間が経ってしまいましたが、書いていこうかなぁと思います。 今回はバリデーションをテストするための方法を書こうと思います。 前回の routes.php に対するテストの記事は以下になります。 CakePHP2でユニットテスト 〜route.php編〜 バリデーションを適応していく 今回はUserモデルに対してnameにnotEmptyを、telに対して独自のバリデーションであるcheckNotEmptyとnumericOnlyを適応していると仮定します。 User.php App::uses('AppModel', 'Model'); class User extends AppModel { public
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く