Motomichi Works Blog

モトミチワークスブログです。その日学習したことについて書いている日記みたいなものです。

vagrantその19-48 cakephp入門をやってみる(まとめ)

はじめに

初心者のためのCakePHP2.0 プログラミング入門を参考にさせて頂いて、最後まで実際にやってみたので、ここまでやってきた事を復習しながら一通りまとめてみる。

1.準備

cakephpのダウンロードや、xamppを使用して環境構築するようなことについて書いてあった。
自分自身はここまでに作成してきたvagrantの環境なので置き換えて学習を進めた。

2.Controller

vagrantその19-2 cakephp入門をやってみる(Controllerその1)ControllerとactionとURL - MOTOMICHI WORKS BLOG

Controllerのファイル名、その中に書くクラス名、アクション名とURLとの関係性について学んだ。
Controllerの命名規則複数形だったりそういう事をまだわかっていなかった。

vagrantその19-3 cakephp入門をやってみる(Controllerその2) redirectとsetAction - MOTOMICHI WORKS BLOG

リダイレクトについて学んだ。

  • Viewを使用しないページは$this -> autoRender = false;
  • リダイレクトさせる記述は$this->redirect("./other/");
  • URLはそのままにして、処理を別のアクションに行わせる場合は$this->setAction("other");

vagrantその19-4 cakephp入門をやってみる(Controllerその3) 値の受け渡し - MOTOMICHI WORKS BLOG

リダイレクトするときに値を渡す方法について学んだ。

vagrantその19-5 cakephp入門をやってみる(Controllerその4) redirect時の値の受け渡しでurlに:や/を含めるとエラーが出る - MOTOMICHI WORKS BLOG

redirect時の値の受け渡しでurlに:や/を含めるとエラーが出るということについて学んだ。
:/%の3つの記号はredirectするときに良くなさそう。または気をつける必要がありそう。

vagrantその19-6 cakephp入門をやってみる(Controllerその5) redirect時に複数の引数を渡す - MOTOMICHI WORKS BLOG

リダイレクト時に複数の引数を渡すことについて学んだ

3.View

vagrantその19-7 cakephp入門をやってみる(Viewその1) Viewの基本的な使い方-ディレクトリ構造とURLの関係 - MOTOMICHI WORKS BLOG

Viewファイルのファイル名がURLと関係する事を学んだ。
Controllerの命名規則複数形だったりということがわかっていないので、View直下のディレクトリ名も複数形になってなかったりしていた。

  • $this->autoLayout = false;とするとLayoutsを使用しない。
  • $this -> autoRender = false;とするとViewを使用しない。

vagrantその19-8 cakephp入門をやってみる(Viewその2) autoLayoutを使う - MOTOMICHI WORKS BLOG

Layoutsを使用する、しないについて学んだ。

  • $this->autoLayout = false;とするとLayoutsを使用しない。
  • 何も書かない場合はLayouts/default.ctpが使用される。
  • $this->layout=”Sample”;とすると任意のレイアウトを指定できる。

vagrantその19-9 cakephp入門をやってみる(Viewその3) ControllerからViewに変数を渡す。setを使う。 - MOTOMICHI WORKS BLOG

ControllerからViewに変数を渡す$this->set();について学んだ。

  • $this->set("title_for_layout","Index Page");はもともとある変数で、タイトル要素の文字列を設定する。
  • あとは任意で自分の好きな変数名で$this->set("変数名","値");とする。

4.Form

vagrantその19-10 cakephp入門をやってみる(Formその1) 入力したvalueの送信と取得の基本 - MOTOMICHI WORKS BLOG

Formヘルパーを使用していないformから送信したvalueをControllerで受け取る方法を学んだ。
あとUtilityパッケージのSanitizeクラスの使い方について学んだ。
Utilityパッケージが他にどんな物をもっているか把握する必要がありそう。

vagrantその19-11 cakephp入門をやってみる(Formその2) UtilityパッケージのSanitizeクラスを使う - MOTOMICHI WORKS BLOG

UtilityパッケージのSanitizeクラスの使い方について学んだ。

$this -> set("text1", Sanitize::stripAll($text1));
Utilityパッケージどころか、Sanitize自体の詳細な使い方について把握する必要がありそう。

vagrantその19-12 cakephp入門をやってみる(Formその3) FormHelperによるform要素の生成 - MOTOMICHI WORKS BLOG

Form要素の出力について学んだ。createの第一引数はモデル名とのこと。
あんまりちゃんと理解できていないので、使いながら覚える。
endはsubmitボタンも出せるけど、使わなそう。

<?php
  echo $this->Form->create(null,array(// 2.1では、null→false
    'type'=>'post',
    'action'=>'.'
  ));
  echo $this->Form->text('text1');
  echo $this->Form->end("送信");
?>

vagrantその19-13 cakephp入門をやってみる(Formその4) コントローラーでForm Helperを処理する - MOTOMICHI WORKS BLOG

  • 送信されたvalueは$this->request->data連想配列で格納される。
  • モデルを使用しないときは$this->modelClass = null;とのこと。createの第一引数と連携させると思う。

cakephpのバージョンによって、createの第一引数はnullだったりfalseだったりするそうなので、 $this->modelClass = null;なのか$this->modelClass = false;なのかも、今のところ正式な記述がわからないので、今後注意が必要そう。

vagrantその19-14 cakephp入門をやってみる(Formその5) FormHelperでtext以外の構成要素を生成する - MOTOMICHI WORKS BLOG

FormHelperでtext以外の構成要素を生成する方法について学んだ。

vagrantその19-15 cakephp入門をやってみる(Formその6) FormHelper textフォームについての詳細 - MOTOMICHI WORKS BLOG

type="text"の要素を出力するヘルパーに渡すオプションについて学んだ。

vagrantその19-16 cakephp入門をやってみる(Formその7) FormHelper checkboxについての詳細 - MOTOMICHI WORKS BLOG

type="checkbox"の要素を出力するヘルパーに渡すオプションについて学んだ。

vagrantその19-17 cakephp入門をやってみる(Formその8) FormHelper radioについての詳細 - MOTOMICHI WORKS BLOG

type="radio"の要素を出力するヘルパーに渡すオプションについて学んだ。

vagrantその19-18 cakephp入門をやってみる(Formその9) FormHelper selectについての詳細 - MOTOMICHI WORKS BLOG

select要素を出力するヘルパーに渡すオプションについて学んだ。

vagrantその19-19 cakephp入門をやってみる(Formその10) FormHelper まとめ - MOTOMICHI WORKS BLOG

ここまでのFormヘルパー学習内容についてまとめた。

  • label要素はecho $this->Form->label('check1',"checkbox1");のように出力する。

5.Layouts

vagrantその19-20 cakephp入門をやってみる(Layoutその1) - MOTOMICHI WORKS BLOG

Leyoutの使い方について学んだ。

  • $this->autoLayout = false;とするとLayoutsを使用しない。
  • 何も書かない場合はLayouts/default.ctpが使用される。
  • $this->layout=”Sample”;とすると任意のレイアウトを指定できる。

6.Modelについての基礎

vagrantその19-21 cakephp入門をやってみる(モデルとデータベースその1) - MOTOMICHI WORKS BLOG

モデルを使うサンプルの前に、Sequel Proを使って、データベースとテーブルを作成した。

以下はデータベース作成。

CREATE DATABASE MySampleData DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

以下はテーブル作成。

CREATE TABLE `my_sample_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `mail` varchar(255) NOT NULL,
  `tel` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

今後SQLの学習も必要。

vagrantその19-22 cakephp入門をやってみる(モデルとデータベースその2) databese.phpを編集する - MOTOMICHI WORKS BLOG

app/Config/databese.phpを編集することについては既にやっていたけど一応書いた。

vagrantその19-23 cakephp入門をやってみる(モデルとデータベースその3)Modelファイルを作成してModelクラスを用意する - MOTOMICHI WORKS BLOG

Modelファイルの作成と、その中に記述するModelクラスについて一番シンプルな例を学んだ。

vagrantその19-24 cakephp入門をやってみる(モデルとデータベースその4)Controllerファイルと$scaffold - MOTOMICHI WORKS BLOG

$scaffoldをコントローラーに記述することで、簡単にフォームを作成する方法を学んだ。

vagrantその19-25 cakephp入門をやってみる(モデルとデータベースその5)モデルとデータベース基礎についてのまとめ - MOTOMICHI WORKS BLOG

ここまでModelについて学習した内容を自分の中で整理する為に一旦まとめた。

7.データを検索する

vagrantその19-26 cakephp入門をやってみる(データを検索するその1)全データを取り出す - MOTOMICHI WORKS BLOG

Controllerに$datas = $this->MySampleData->find('all');を書いてSELECTするのを学んだ。

vagrantその19-27 cakephp入門をやってみる(データを検索するその3)「find」メソッドの第2パラメータ - MOTOMICHI WORKS BLOG

findの第二引数について学んだ。
データを条件付きでSELECTするときに使う。

8.データの追加・更新・削除

vagrantその19-28 cakephp入門をやってみる(データを追加する)INSERT - MOTOMICHI WORKS BLOG

テーブルにレコードを追加する方法について学んだ。
$this->MySampleData->save($this->request->data);を使う。 INSERT文だと思う。

if ($this->request->is('post')) {
  $this->MySampleData->save($this->request->data);
}

vagrantその19-29 cakephp入門をやってみる(データを更新する)UPDATE - MOTOMICHI WORKS BLOG

テーブルのデータを更新する方法について学んだ。
これも$this->MySampleData->save($this->request->data);を使う。
UPDATE文だと思う。

以下のようにidを指定して実行する。プライマリーキーを指定するということだと思う。

$this->MySampleData->id = $id;
if ($this->request->is('post') || $this->request->is('put')) {
  //postまたはputでこのURLにアクセスした場合(データベースの更新とリダイレクト)
  $this->MySampleData->save($this->request->data);
  $this->redirect(array('action' => 'index'));
} else {

getとpostの他にputというのがあるのを学んだ。

vagrantその19-30 cakephp入門をやってみる(データを削除する)DELETE - MOTOMICHI WORKS BLOG

テーブルのレコードを削除する方法について学んだ。
これも$this->MySampleData->delete($this->request->data('MySampleData.id'));を使う。
DELETE文だと思う。

if ($this->request->is('post') || $this->request->is('put')) {
  //postまたはputでこのURLにアクセスした場合(データベースの更新とリダイレクト)
  $this->MySampleData->delete($this->request->data('MySampleData.id'));
} else {

聞いたところによると、レコードは削除せずにフラグで有効・無効を切り替えるだけという事が実運用では多いのだとかなんとか。

9.bakeによる高速開発

vagrantその19-31 cakephp入門をやってみる(bakeによる高速開発その1)まず準備してcake bakeを実行するまで - MOTOMICHI WORKS BLOG

app/Consoleディレクトリで、cake bakeではなく./cake bakeとするとbakeコマンドが実行できた。

bake/app/Config/core.phpタイムゾーンを設定していなくて、Warningが出たので、date_default_timezone_set('UTC');とかdate_default_timezone_set('Japan');とか設定するとWarningが出なくなった。

vagrantその19-32 cakephp入門をやってみる(bakeによる高速開発その2)Database Configurationの作成 - MOTOMICHI WORKS BLOG

bakeでいくつかの事ができるうちの、Database Configurationをやった。
Interactive Bake Shellというものらしい。みたいな事について知った。

vagrantその19-33 cakephp入門をやってみる(bakeによる高速開発その3)データベースの作成 - MOTOMICHI WORKS BLOG

bakeを試していくにあたって、データベースが必要だったのでデータベースとテーブルを作成した。

Sequel Proを使って、cakeというデータベースを作成して、以下のSQLでテーブルを作成した。

CREATE TABLE `cake`.`mydatas` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `name` VARCHAR( 255 ) NOT NULL ,
  `mail` VARCHAR( 255 ) NOT NULL ,
  `tel` VARCHAR( 255 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

vagrantその19-34 cakephp入門をやってみる(bakeによる高速開発その4)Modelの作成 - MOTOMICHI WORKS BLOG

Interactive Bake ShellでMを選択したら、なんかエラーが出て、調べながら色々やってみたけど上手くいかなかったので、bakeはここで諦めた。

詳細はブログに残して、「もしかしたら仮想環境じゃなくて実際のサーバーでやったら上手くいくかもしれない。」と思う事にした。
実際はどうなんだろう。

だいたいこんな事はbakeしなくて手でやっても良いのかもしれない。

vagrantその19-35 cakephp入門をやってみる(bakeによる高速開発その5)Modelの作成 - MOTOMICHI WORKS BLOG

前回の記事でbakeを諦めたわけだけど、参考にさせて頂いているページについては一応目を通した。
みたいな記事。

10.クエリー、マジック検索、AND/OR検索

vagrantその19-36 cakephp入門をやってみる(マジック検索) - MOTOMICHI WORKS BLOG

  • findByフィールド名(値);
  • findAllByフィールド名(値);

みたいな感じで以下のように検索ができる事について学んだ。

//$変数 = $this->Modelクラス->findBy項目名( 検索する値 );
$sampleData        = $this->NumTenSample->findByName('dummy');
$sampleDataAll     = $this->NumTenSample->findAllByName('dummy');

vagrantその19-37 cakephp入門をやってみる(AND/OR検索) - MOTOMICHI WORKS BLOG

Controllerに以下のように書くことでAND/OR検索ができる事について学んだ。

// post時の処理
if ($this->request->is('post')) {
   $name = $this->request->data('NumTenSample.name');//postされた文字列
   $mail = $this->request->data('NumTenSample.mail');//postされた文字列
   //テーブルから検索する為の配列を設定
   $opt = array("OR" => array (
       "NumTenSample.name" => $name,
       "NumTenSample.mail" => $mail
     )
   );
   //上で設定した配列$optを引数にして、テーブルからデータを取得
   //findallを使用している
   $data = $this->NumTenSample->
       find('all',array('conditions' => $opt));
   //テーブルから取得した$dataをset
   $this->set('data',$data);
}

vagrantその19-38 cakephp入門をやってみる(クエリー検索について) - MOTOMICHI WORKS BLOG

引数に直接SQL文を渡す方法について学んだ。

以下は引用ですが。

この方法には問題点もあります。まず、直接クエリーを実行するわけですから、データベースアクセスへの攻撃を行うSQLインジェクションなどへの対策をすべて自前で用意しなければいけません

引用元 : クエリー、マジック検索、AND/OR検索(3/3):初心者のためのCakePHP2.0 プログラミング入門

以下はサンプルコード。

public function sample() {
  //$変数 = $this->Modelクラス->query( クエリーテキスト );
  $str = "dummy";
  $data = $this->NumTenSample->
    query("select * from num_ten_samples where name like '%{$str}%';");
    $this->set('data',$data);
}

11. バリデーション

vagrantその19-39 cakephp入門をやってみる(バリデーション 簡易設定) - MOTOMICHI WORKS BLOG

一番簡易的なバリデーションの書き方について学んだ。

以下のような感じでModelクラスを書く。

<?php
App::uses('AppModel', 'Model');

class MySampleData extends AppModel {
  public $validate = array(
    'name'=>'notEmpty',
    'mail'=>'email',
    'tel'=>'alphaNumeric'
  );
}

以下のような感じでViewに書くとエラー文言が出る。

echo $this->Form->error('name属性');

バリデーションを設定した要素には、デフォルトではrequired属性が付与されるので、submitしたときにブラウザに実装されたツールチップが出たりする。

vagrantその19-40 cakephp入門をやってみる(詳細なバリデーション設定) - MOTOMICHI WORKS BLOG

一つ前の19-39で学んだ

  • name
  • mail
  • tel

はそれぞれがinput要素のname属性を表しているけど、そのひとつひとつに配列で

class User extends AppModel {
    public $validate = array(
        'login' => array(
            'alphaNumeric' => array(
                'rule'     => 'alphaNumeric',
                'required' => true,
                'message'  => 'Letters and numbers only'
            ),
            'between' => array(
                'rule' => array('between', 5, 15),
                'message' => 'Between 5 to 15 characters'
            )
        ),
        'password' => array(
            'rule' => array('minLength', '8'),
            'message' => 'Minimum 8 characters long'
        ),
        'email' => 'email',
        'born' => array(
            'rule'       => 'date',
            'message'    => 'Enter a valid date',
            'allowEmpty' => true
        )
    );
}

みたいな感じに設定できる事を学んだ。

設定できる項目についての詳細は公式サイトで確認するのが良さそう。

vagrantその19-41 cakephp入門をやってみる(オリジナル・バリデーションを定義する) - MOTOMICHI WORKS BLOG

オリジナルのバリデーションルールを作成する方法について学んだ。

12.複数モデルの連携

vagrantその19-42 cakephp入門をやってみる(複数Modelの連携その1)テーブルを用意する - MOTOMICHI WORKS BLOG

複数のテーブルを連携させることを学習する為に、DB内に新たにテーブルを作成した。

vagrantその19-43 cakephp入門をやってみる(複数Modelの連携その2)テーブルにデータを挿入する - MOTOMICHI WORKS BLOG

guest_booksテーブルにデータを挿入する為に以下のようなModel,Controller,Viewの組み合わせを作成した。

  • Model/GuestBook.php
  • Controller/GuestBooksController.php
  • View/GuestBooks/add.ctp

このぐらいの頃にはようやく少し命名規約にもなれてきた。
ここで作成したものは今後もスニペット的に使えそう。

vagrantその19-44 cakephp入門をやってみる(複数Modelの連携その3)一対一対応 $hasOne - MOTOMICHI WORKS BLOG

一対一でデータを紐付ける方法について学んだ。
idフィールドの値をもとに、hoge_idが等しいレコードをひとつだけ紐付ける方法について学んだ。
以下のようにMySampleDataクラスの中で、$hasOneにGuestBookモデルを紐付けるような使い方らしい。

public $hasOne = "GuestBook";

まだ理解が浅いので、今後も繰り返しcakephpで制作を行っていくことで理解を深めていく必要がある。
これは内部では、MySQLでいうと(LEFT) JOINというもので結合しているらしい。

vagrantその19-45 cakephp入門をやってみる(複数Modelの連携その4)一対多対応 $hasMany - MOTOMICHI WORKS BLOG

一対多対応のデータ紐付け方法について学んだ。
idフィールドの値をもとに、hoge_idが等しいレコードを複数紐付ける方法について学んだ。

public $hasMany = "GuestBook";

hasManyアソシエーションの配列に指定できるキーなど、詳細についてはアソシエーション: モデル同士を繋ぐ — CakePHP Cookbook 2.x ドキュメントを参照すると良さそう。

vagrantその19-46 cakephp入門をやってみる(複数Modelの連携その5)LEFT JOINを行う「belongsTo」 - MOTOMICHI WORKS BLOG

$belongsToにを値を設定することで、これまでとは逆向きの紐付けに使用してるらしい。
hoge_idをもとに、idを紐付けるサンプルについて学習した。

public $belongsTo = "MySampleData";

13.ページネーションを行う

vagrantその19-47 cakephp入門をやってみる(ページネーションを行う) - MOTOMICHI WORKS BLOG

ページネーター実装について学んだ。
各フィールドの項目で昇順・降順にソートできる機能もすぐに実装できてすごい。

まとめ

vagrantその19-48 cakephp入門をやってみる(まとめ) - MOTOMICHI WORKS BLOG

このページです。
これまで19-*で学習してきた事をまとめた。

ときどき上から見返すと良いかもしれない。