CakePHP

【CakePHP3】Bakeの流れ。

  • まずDBにテーブルを作成する。 ※例えばusersテーブルを作成する。

  • んで次のコマンドを実行。

これでCRUD機能の完成。

【CakePHP3】をComposerでインストールする。

プロジェクトを作成する

上記を実行すると、本体のインストール、tmpフォルダの権限設定、DebugKitのインストールまでもが完了した状態となる。

あとはMigrationsプラグインでもいれればとりあえず自分的に完了。

【CakePHP3】AuthComponentでログイン認証を実装する。

ほぼほぼCake2系の時の手順と変わらない。

今回も同じくusersテーブルにusernameカラムとpasswordカラムを用意しておくと勝手にそこを見に行ってくれるようになっている。

コンポーネントを読み込む際に下記のように設定を記述する。

な感じ。

loginメソッドは下記のような感じで実装してやれば良い。

あとは公式にまかせた。

http://book.cakephp.org/3.0/en/tutorials-and-examples/blog-auth-example/auth.html

【CakePHP3】Migrationsプラグインを道入する。

bakeも問題無く動作するしいよいよCake3も熱くなってきたね。モデル周り以外は2系とそんなに使い方に差異はないかも。session周りが若干変わったくらい?

インストール手順

  • まずはcomposer.jsonに下記を追記
  • したらupdate
  • 最後にプラグインをロード

まぁ読み込めればどこでもいいんだけどbootstrap.phpあたりで読み込むのがベターかと。

使い方

cliからbin/cake migrationsで呼び出せる。

  • まずは初期化

これをすると一番はじめのマイグレーションファイルが生成されて、DBにも履歴管理用のテーブルが生成される。
この生成されたファイルのup()メソッドにアップグレード用のSQLを記述。
down()メソッドにダウングレード用のメソッドを記述する。

※Symfony2のようなDBの差分自動算出機能はない模様。(これはマジで不便)

なので下記のように自分で書いてやる。
※SQLは適当なので注意。

down()メソッドに差し戻し用のSQLも書いてやったら、migrateを実行。

差し戻したければrollback

とりあえずこれだけ知ってれば使えるはず。
あとは公式を参照されたし。

https://github.com/cakephp/migrations

【CakePHP2.X】トランザクションを実行する。

トランザクションとは

例えばSQLが複数回発行される場面で、それらが全て成功したか、全て失敗したかのどちらかを保証してくれるシステム。

使ってみる

トランザクションを実行するためにはテーブルの種類がトランザクションをサポートしている必要があるので注意。

まずはモデル内でデータソースオブジェクトを取得する。

後はこんな感じで使う。

トランザクションをネスト化さたりも出来るみたいなので詳しくは公式を参照されたし。

http://book.cakephp.org/2.0/ja/models/transactions.html

【CakePHP2.X】のfind()メソッドでjoinを指定する際。

はfieldsも下記のように指定すること。
※でないと取得した結果が意図したとおりに取れない。

$this->Post->find('all', [
	'joins' => [
		'Comment' => [
			'table' => 'comments',
			'alias' => 'Comment',
			'type' => 'left',
			'conditions' => [
				'Post.id = Comment.post_id'
			]
		]
	],
	'fields' => '*'
])

てな感じ。

 

【CakePHP2.5】Cookieコンポーネントの有効期限を動的に設定する。

コントローラーから有効期限を指定しなおして発行したい場合、

「$this->Cookie->time」を直接書き換えても反映されないので注意が必要。

有効期限を動的に書き換えたい場合は、write()メソッドの第4引数に期限を渡せばOK。

$this->Cookie->write('data', $data, true, 0);

と言った感じ。

 

【CakePHP2.4】jsonpでビューを出力する。

CakePHP2.4以降からjsonp出力がサポートされたのでやってみる。

// コントローラー内のメソッド
public function index {
	// 出力したいデータ
	$result = ['hoge', 'piyo', 'fuga'];
	$this->viewClass = 'Json';
	$this->set([
		'result' => $result,
		'_serialize' => ['result'],
		// 下記変数をセットすると出力がjsonpになる。
		'_jsonp' => true
	]);
}

呼び出しの際は、上記メソッドにアクセスし、クエリストリングで「?callback=functionName」を渡す。
※functionNameは任意の関数名。

これでレスポンスヘッダの「Content-Type」も「application/Javascript:」になってくれる。