【CakePHP】1人前のケーキ職人になるまで

パティシエじゃないよエンジニアだよ

バリデーションとは?

今回は、バリデーションについて説明したいと思います。

バリデーションとは、簡単にいうと「入力チェック」のことです。

だいたい

入力チェック
書式チェック

のことで、入力チェックは入力フォームに指定した文字数以上文字が入力してあるとか、例えばフォームの電話番号の欄に数字ではなく文字が入っていないかをチェックします。

書式チェックは、データをファイルから読み込む時、変なファイルを読み込まないように読み込む前にファイルの内容が妥当であるかをチェックします。

そしてCakePHP のバリデーションは、任意の配列データに対するバリデーションを簡単に行うための バリデーター構築のパッケージを提供します。

今回は、入力チェックに関したバリデーターを作ってみましょう。

バリデーターを作成する
use Cake\Validation\Validator;

$validator = new Validator();

一度作成した後、バリデーションを適用したいフィールドに対して、実際にルールを設定して行きます。

public function validationDefault(Validator $validator)
  {
    $validator

      ->notEmpty('title') //タイトルがないのを許さない
      ->requirePresence('title') //タイトルがあるのを保証する

      ->notEmpty('body')
      ->requirePresence('body')
      ->add('body', [
        'length' => [
          'rule' => ['minLength', 10], //文字数を10文字以上に指定
          'message' => 'body length must be 10+'
        ]
      ]);

    return $validator;
  }
}

これで、「入力フォームが空でない」かつ「bodyが10文字以上である」というルールでバリデーションを設定することができました。

<参考したサイト>
バリデーション - 3.x

【CakePHP】データベースを削除したい時

アプリでデータベースを削除したい時は、delete()を使います。

Delete

delete(integer $id = null, boolean $cascade = true);

$id で特定されるレコードを削除します。 デフォルトでは、削除される該当レコードに依存しているレコードも削除されます。

$this->Model->delete(1) //id = 1のレコードを削除します。

戻り値はbooleanで、成功したらtrue、失敗したらfalseを返す。

DeleteAll

deleteAll(mixed $conditions, $cascade = true, $callbacks = false)

deleteAll() は delete() と似ていますが、 異なる点は deleteAll() が与えられた条件にマッチするレコードを全て削除する $conditions 配列は SQL の断片または配列で与えます。

conditions マッチさせる条件
cascade 真偽値、true に設定するとそのレコードに依存するレコードも削除する
callbacks 真偽値、コールバックを走らせる
戻り値は真偽値で、成功したら true を、失敗したら false を返します。

$this->Model->deleteAll(['1=1']);

deleteAllで全削除を行う場合、パラメータに何も渡さないと実行されないためダミーデータを渡す。

【CakePHP】 データベースの更新、登録

データベースの登録の機能が欲しいと思ったので、具体的にどうすれば良いのか調べて見ました。

データベースの更新、登録がしたい場合はsaveメソッドを使います。saveメソッドが使い方によって更新(update)、登録(insert)ができるみたいです。

データの形式

CakePHPではモデルを保存するとき、以下の形式で保存します。

Array
(
    [ModelName] => Array
    (
        [fieldname1] => 'value'
        [fieldname2] => 'value'
    )
)
更新する場合

データを更新する場合、更新したいテーブルのidを指定してあげれば、そのidのデータがupdateされます。

// Update: id に整数値がセットされている
$this->Recipe->id = 2;
$this->Recipe->save($this->request->data);

$data = array('id' => 10, 'title' => 'My new title');
// id が 10 のレシピを更新
$this->Recipe->save($data);
登録する場合

データを登録したい場合は、テーブルのid(プライマリキー)を指定せずに登録するデータを用意してあげれば、insertと判断し新規登録してくれます。

// Create: id がセットされていない
$this->Recipe->create();
$this->Recipe->save($this->request->data);

!ループ中にsaveを呼び出すときは、createメソッドを忘れないこと。

【CakePHP】Hashクラス

cakeで配列を扱うときに、ハッシュクラスが便利だと出てきたのでメモです。

例えば

Array
(
    [Servant] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => 織田信長
                    [type] => Buster
                )

            [1] => Array
                (
                    [id] => 2
                    [name] => 沖田総司
                    [type] => Quick
                )

            [2] => Array
                (
                    [id] => 3
                    [name] => マーリン
                    [type] => Arts
                )

            [3] => Array
                (
                    [id] => 4
                    [name] => ギルガメッシュ
                    [type] => Buster
                )

        )

)

こういう配列があったとして、

「idが4のサーヴァントを取り出したい時」、

print_r( Hash::extract( $data, 'Servant.{n} [id=4]')); 

としてあげれば配列からデータを取り出してあげることができます。

条件式で指定したデータの配列を生成したい時

例えば、バスタータイプのサーヴァントを配列に入れるとします。 その場合は

print_r( Hash::combine( $data, 
        'Servant.{n}[type=Buster].id', 
        'Servant.{n}[type=Buster].name'
    )
);

とすることで欲しい配列が返ってきます。
phpでarray_searchとかarray_key_existsとか多用する人は特に便利ですね。

<参考にしたサイト>
qiita.com

www.mikame.net

【Javascript】Ajaxとは

さて、今回はAjaxについて復習したいと思います。

Ajaxとは?

Ajax(エイジャックス、アジャックス)は、ウェブブラウザ内で非同期通信を行いながらインターフェイスの構築を行うプログラミング手法である。XMLHttpRequest(HTTP通信を行うためのJavaScript組み込みクラス)による非同期通信を利用し、通信結果に応じてダイナミックHTML (DHTML) で動的にページの一部を書き換えるというアプローチを取る。

つまり

ページ遷移のない通信を非同期通信といい、それを利用したのがAjaxです。

簡単なものを作ってみる

f:id:nagisa-ito:20171127202657p:plain

こんな感じで適当にフォームを作ってみました。これをそのまま送信するとページが変わってしまいます。ページ遷移の無いように、以下のようなコードを書きます。

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Ajax</title>
</head>
<body>
    <h3>Ajaxを学ぶ</h3>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
        <p><input type="text" name ="sample_text" id ="sample" placeholder="適当な文字を入れてみる" style="width: 200px;">
          <button id="send">send</button></p>
    <span>ここに表示</span>
    <div class="result"></div>

    <script type="text/javascript">

        $(function(){
            //button click
            $('#send').on('click',function(){
                $.ajax({
                    url:'sample.php',
                    type:'POST',
                    data:{
                        'sample_text':$('#sample').val(),
                    }
                })
                .done(function(data){
                    $('.result').html(data);
                    console.log(data);
                });

            });
        });

    </script>
</body>
</html>

sample.php

<?php
    header('Content-type: text/plain; charset= UTF-8');
    if(isset($_POST['sample_text'])){
        $text = $_POST['sample_text'];
        echo $text;
    }else{
        echo 'Error!';
    }
?>

f:id:nagisa-ito:20171127203550p:plain

こんな感じで、Ajax通信ができました。

【cakePHP】Controllerが見つからないエラー

オッス、オラ伊藤! cakePHPがさ〜っぱりわからんで苦労しているぞ!

別のページを作成していたところ、リンク先で

f:id:nagisa-ito:20171120144806p:plain

こーんなエラー分が出ていました。ウェブで調べていたのですが、それらしき答えは見つからず、ずっとコントローラをいじっていました。

が、直らない。ドットインストールの動画も見直すも、それらしき間違いは見当たらない。

ふと前のページからブラウザでリンクを確認してみたら、

f:id:nagisa-ito:20171120145325p:plain

こんなリンクになっていて、もしかしてURLの文法が間違っているのかな、と思い修正。

f:id:nagisa-ito:20171120145526p:plain

お?何か綺麗に表示できているな?と思いクリックしてみたら、無事別のページに飛べました。

エラー文はコントローラの話だったけど、そもそもurlが間違っててアクセスできなかったらコントローラもそりゃ無いよって言われるよねって話でした。

githubを理解する

アプリ開発も進んできて、そろそろgit使わんといけないな〜と感じ初めてきたので、個人用メモです。(正直なところ、githubの仕様が未だにわかっておらず、とりあえずプッシュしておけばいいっしょ!みたいな感覚で使ってました)

ざっくりと書いていきたいと思います。

初期設定したい時

github側でそれ用のリポジトリは既に作っている前提です。

Gitを使う宣言

・.gitファイルが作成されます。
git init

・もしGitで管理させたくないファイルがあれば、ここで設定しておきましょう。(configなど)
vi .gitignore

GitHubで登録したメールアドレスとユーザー名をここで設定します。
git config user.email メールアドレス
git config user.name "ユーザ名"

・設定は以下で確認、編集できます。
git config --list
git config 確認したい設定
git config --unset 削除したい設定

コミットさせる

・ファイルの状態を確認できます。
git status

・差分を確認できます。
git diff

・管理対象にしたいものを追加してあげます。 (ファイル名を . に置き換えることですべてのファイルが追加されます。)
git add 管理対象にしたいもの

・ファイルの状態を確認できます。
git status

・差分を確認できます。
git diff --cached

・コメント付きでコミットできます。
git commit -m "コメント"

・コミットのログを見ることができます。
git log

・共有レポジトリを登録します。
!この時、githubからレポジトリのURLを引っ張ってくるのですが、赤字の部分の様にユーザー名を追加しないと403エラーになるので注意です。
git remote add origin https://username@github.com/xxx/xxx.git


・共有レポジトリに反映
ローカルで開発したものを共有レポジトリにも反映させます。
git push -u origin master

更新したい時

上の内容とほぼ一緒ですが、

git status
git diff
git add .
git status
git commit -m "コメント"
git push origin master

とさえすればとりあえず更新はできます。

以前のコミットに戻したい時

・コミットの履歴を確認し、戻したいコミットの文字列をコピペします
git log

・文字列を貼り付けて戻ります
git reset --hard 文字列

<参考にしたサイト>

qiita.com

qiita.com

qiita.com