モデル名およびテーブル名のキャメル記法とスネーク記法の変換 | 英語の特殊複数化ルールにも対応


	// スネーク記法のテーブル名をキャメル記法のモデル名に変更する
	$tbl_name = 'neko_mutexes'; // テーブル名:英語の特殊複数形(sでなくesになっている)
	$model_name = Inflector::singularize($tbl_name); // 英語の単数形に変換する。例:NekoMutexes → NekoMutex
	$model_name= Inflector::camelize($model_name); // キャメル記法に変換する
	var_dump($model_name); // → NekoMutex
	
	// キャメル記法のモデル名をスネーク記法のテーブル名に変換する
	$tbl_name2 = Inflector::pluralize($model_name); // 英語の複数形にする。 例:NekoMutex → NekoMutexes
	$tbl_name2 = Inflector::underscore($tbl_name2); // スネーク記法に変換する
	var_dump($tbl_name2); // → neko_mutexes
	

参考

レンダリングするビュー(ctp)を指定する | $this->render('xxx');

レンダリングするビュー(ctp)を指定できる。
AJAX用のJSON文字列をレスポンスするビューを指定する場合、下記のように記述できる。

コントローラのメソッド(アクション)でビューを指定する


	public function test_action(){
		$data = array('id'=>999,'name'=>'ヤンバルクイナ');
		$this->set('jsonData',$data);
		$this->render('/Elements/json_ajax',false);
	}
	

/app/View/Elements/json_ajax.ctp


	<?php 
	$json_str = json_encode($jsonData,JSON_HEX_TAG | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_HEX_APOS);
	echo $json_str;
	?>
	


自動採番が連番になるようauto_incrementをリセットする


	/**
	 * 自動採番が連番になるようauto_incrementをリセットする。
	 * 
	 * @param $tbl_name テーブル名
	 */
	private function resetAutoIncrement($tbl_name){
		
		// 最大IDを取得する
		$max_id_sql = "SELECT MAX(id) AS max_id FROM {$tbl_name}";
		$res = $this->query($max_id_sql);
		$max_id = 0;
		if(!empty($res)){
			$max_id = $res[0][0]['max_id'];
			if(empty($max_id)){
				$max_id = 0;
			}
		}
		
		$next_id = $max_id + 1;// 次ID
		
		// 順位・日集計テーブルの自動採番(auto_increment)をリセットする
		$reset_sql = "ALTER TABLE {$tbl_name} AUTO_INCREMENT = {$next_id}";
		$this->query($reset_sql);
		
	}
	


CakePHPのDaoをインタフェース化する


	App::uses('DaoForCake','Model');
	$dao = new DaoForCake();
	

DaoForCake.php

	App::uses('Model', 'Model');
	App::uses('IDao', 'Vendor/Wacg');
	
	/**
	 * CakePHP用のDao
	 *
	 * @date 2018-5-31
	 * @version 1.0
	 *
	 */
	class DaoForCake extends AppModel implements IDao{
		
		public $useTable = false; // 特定のテーブルと関連づけない。
		
		public function sqlExe($sql){
			return $this->query($sql);
		}
	}
	

IDao.php

	interface IDao{
		public function sqlExe($sql);
	}
	


コンポーネントを使う

コンポーネントはオブジェクト指向の概念の一つ。
複雑になったソースコードから特定の処理だけ切り出してまとめたクラスがコンポーネント。

「app/Controller/Component」ディレクトリにコンポーネントクラスファイルを作成する。
クラスへComponentを継承させるだけでコンポーネントクラスになる。

	class LionComponent extends Component{
		
		public function __construct($collection){
			parent::__construct($collection);
		}
		
		public function bark(){
			debug('ガオーと吠える');
		}
	}
	

コントローラにコンポーネントを登録する。

	class CrudBaseController extends AppController {
		
		public $components = ['Lion']; // コンポーネントの登録
		
		...略...
	

動的にコンポーネントを登録する場合。必要な時だけに宣言して使う。
 $this->Lion = $this->Components->load('Lion');

コンポーネントの使い方
 $this->Lion->bark();


CakePHPのhttpsリダイレクト


	class AppController extends Controller {
		public $uses = array();
	
		public $components = array(
			'Security',
		);
	
	
		public function beforeFilter(){
			
			// httpsにリダイレクトする処理 (if文はログアウト時に起こるエラー対策)
			if(!empty( $this->Security)){
				$this->Security->blackHoleCallback = 'forceSSL';
				$this->Security->requireSecure();
				$this->Security->validatePost = false; // httpsでもPOSTが動くようにする
				$this->Security->csrfCheck = false;  // httpsでもPOSTが動くようにする
			}
	
		}
		
		// httpsにリダイレクトする
		public function forceSSL() {
			$this->redirect('https://' . env('SERVER_NAME') . $this->here);
		}
	

旧式

.htaccessに記述する方式はAjax通信で不具合がでるので使えない
httpにアクセスしたならhttpsにリダイレクトさせたい。
しかし下記のサンプルではどうしてもhttpsのトップページにリダイレクトしてまうので暫定版とする。
CakePHPの場合、htaccessだけでhttpsにリダイレクトさせるのは難しい。


<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{HTTPS} off
	RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^ index.php [L]
</IfModule>
	


セッションタイムアウト


Configure::write('Session', array(
	'defaults' => 'php',
	'timeout' => 10 // 分を指定
));
	

AppController.phpや各種コントローラのbeforeFilterメソッド内に実装すると良い。


内ログイン | フォームなし、プログラム内部で自動ログイン

HTMLのフォームを使わず、プログラム内部中でログインすることができる。
新規会員登録などサインイン登録後にログイン状態にしたいときに活用できる。



App::uses('AppController', 'Controller');
class UsersController extends AppController {

	// public $components = null;// ←これするとAuthがnullになり、エラーになるので注意

	public function test(){

		$id = 4; // ログイン対象のユーザーID
		
		// ユーザーエンティティ
		$user = $this->User->find('first', [
				'conditions' => ['User.id' => $id],
				'recursive' => -1
				]
			);
		
		
		// パスワードは削除
		unset($user['User']['password']);
		
		// ログインする。
		if ($this->Auth->login($user['User'])) {
			echo 'login success';
		}else{
			
			echo 'login false';
		}
		die();
	}
	
UsersControllerコントローラクラス以外でも実現可能。
usersのレコードと$this->Authが使えればよい。
この方法は公式で紹介されている。→ 公式:手動でのユーザーログイン


ログイン状態が他のプロジェクトとかぶる | セッションIDがかぶる

core.phpのSession項目に以下にcookieの情報を記述する。

	Configure::write('Session', array(
		'cookie'=>'neko_prj', // ← プロジェクトごとに任意の文字列を入力
		'defaults' => 'php'
	));
	


現在のコントローラ名、アクション名を取得する


	echo $this->name; // コントローラ名
	echo $this->action; // アクション名
	

ログアウトそしてリダイレクト


	$this->redirect($this->Auth->logout());