質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

8937閲覧

cakePHP3でDBを使わずバリデーションを使いたい

k499778

総合スコア599

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

1グッド

0クリップ

投稿2016/03/04 19:04

現在cakePHP3を使ってアプリケーションを作っています。
Controller,Model/Table, Template直下にそれぞれファイルを作りました。

そこで質問があるのですが、
結論から言うと、

cakePHP3でDBを使わずにバリデーションチェックするプログラムはどう書いたらいいでしょうか?

以下のサイトを参考に作ってみました。
http://wataame.sumomo.ne.jp/archives/5162
ただcakePHP2なので書き方が違います。

モデルのvalidationの書き方を変えたり、
コントローラで「モデルに入力データを渡す」とき、setでなくnewEntityを使ったり。

そうすると以下のエラーが出ました。
Error:Call to a member function primaryKey() on array
File /home/~~~/vendor/cakephp/src/Marshaller.php
Line:117

その117行目のコードは以下です。

php

1$schema=$this->_table->schema(); 2$primaryKey=$schema->primaryKey();

モデルのschemaを書き換えてみたりしたのですがうまく動きません。

PHP初心者でかなり手こずっています。

もしわかる方がいらっしゃったら
・cakePHP3でDBを使わずにバリデーションするためのサンプルソース
・上記のエラー解決する方法

を教えていただけないでしょうか?

よろしくお願い致します。

ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

別回答にします。

いろいろ調べてみましたが、Model系を使うとできないようです。
それで、公式にも載せられていますが、Modelless Formという方法をとります。

Formを継承してバリデーションなどを行なう方法です。
ウェブにもサンプルがたくさんありました。

最初の回答のように、user_idとpasswordをバリデーションしてみます。

src/Form/UserForm.php

PHP

1<?php 2namespace App\Form; 3 4use Cake\Form\Form; 5use Cake\Form\Schema; 6use Cake\Validation\Validator; 7 8class UserForm extends Form 9{ 10 protected function _buildSchema(Schema $schema) 11 { 12 // フィールドの設定です。 13 return $schema 14 ->addField('user_id', 'string') 15 ->addField('password', ['type' => 'password']); 16 } 17 18 protected function _buildValidator(Validator $validator) 19 { 20 // バリデーションはここに書きます。 21 return $validator 22 ->notEmpty('user_id') 23 ->add('user_id', 'length', [ 24 'rule' => ['minLength', 10], 25 'message' => '最低でも10文字のはずです']) 26 ->notEmpty('password'); 27 } 28 29 protected function _execute(array $data) 30 { 31 // バリデーションが通った時に実行されます。 32 // ここでは単にtrueを返すだけです。 33 return true; 34 } 35}

src/Controller/UserController.php

PHP

1<?php 2namespace App\Controller; 3 4use App\Controller\AppController; 5use App\Form\UserForm; 6 7class UserController extends AppController 8{ 9 public function index() 10 { 11 $user = new UserForm(); 12 if($this->request->is('post')) { 13 if ($user->execute($this->request->data)) { 14 // 正常時に何か処理をする 15 $this->Flash->success('正常です'); 16 } else { 17 $this->Flash->error('エラーがあります'); 18 } 19 } 20 $this->set('user', $user); 21 } 22}

src/Template/index.php

PHP

1<?php 2echo $this->Form->create($user); 3echo $this->Form->input('user_id',['type'=>'text']); 4echo $this->Form->input('password'); 5echo $this->Form->button('Submit'); 6echo $this->Form->end();

なぜか、user_idだけが、selectだと認識されてしまうので、強制的にtextとしています。
これでエラーも表示されます。

TableやEntityは必ずDBと結びつくように作られていますので、これをDBなしでやろうとするのは、至難の業だと思います。こちらのFormを使う方法に変更されてはいかがでしょうか?

投稿2016/03/06 09:43

shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2016/03/06 14:21

shi_ueさん 返答ありがとうございます。 本当に感謝しています!試してみてまた返答いたします。
k499778

2016/03/06 14:53

今回答してくださったコードを試してみると無事出来ました! 本当にありがとうございます! すごく困っていてModel/Tableを使ってやる方法が難しいと知ることができたのも本当にshi_ueさんのおかげです。 cakePHP3のサンプルや資料も少なかったので教えていただき本当に助かりました。 もう少し自分でコードリーディングして解析してみてます。 本当にありがとうございました。
guest

0

フォームではuser_idとpasswordを設置するだけのものを使いました。

php

1use Cake\Validation\Validator; 2 3class UserController extends AppController 4{ 5 public function index() 6 { 7 // フォームを表示 8 } 9 10 public function login() 11 { 12 if($this->request->is('post')) { 13 // バリデータオブジェクト生成 14 $validator = new Validator(); 15 16 // 定義設定 17 $validator 18 ->notEmpty('user_id', [ 19 'message' => 'ユーザーIDが未入力' 20 ] 21 ); 22 $errors = $validator->errors($this->request->data); 23 if ($errors) { 24 // エラー処理 25 // Flashなどでエラーを出す。 26 $this->redirect(フォーム); 27 } 28 } 29 $this->redirect(完了画面); 30 } 31}

エラーは独自処理になってしまっていますが・・・

そうじゃなくて、Model/Entity、Model/Tableなどを使って、バリデーションエラーを自動で出したいんだー、ということなら、ごめんなさい。

投稿2016/03/05 09:51

shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2016/03/06 03:29

shi_ueさん 返答ありがとうございます。 そうですね。できればModel/Tableのやり方が知りたいです。 ただFormを使ってまだ試していないので参考にさせていただきます。 ちなみになんですが、ControllerとViewもサンプルコードを教えていただくことはできないでしょうか? その間でもうまくいかなかったりしているのでできれば教えていただきたいです。 おこがましくてすいません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問