環境
モデル
アプリケーションモデル
すべてのモデルの基底クラスを定義したい場合。
// @path app/app_model.php
class AppModel extends Model {
}
ビヘイビア
継承を使わずにメソッドをモデルに追加したい場合。
作り方
Myaclビヘイビアの作成。
// @path app/model/behaviors/myacl.php
class MyaclBehavior extends ModelBehavior {
function check(){
// TODO: nothing special.
}
}
参考リンク
- CakePHP API Ref: ModelBehavior Class Info
使い方
モデル内で。
// @path app/models/mymodel.php
class Mymodel extends AppModel {
public $name = 'Mymodel';
public $actsAs = array('Myacl');
}
コントローラー内
参考リンク
- CakePHP API Ref: 3.8.1 ビヘイビアを使用する
コントローラー
アプリケーションコントローラー
コントローラー全体で共通して使うメソッドを集めたコントローラーを定義する。
// @path app/app_controller.php
class AppController extends Controller
{
}
コンポーネント
コントローラー全体で使い回せるツールを定義する。
作り方
// @path app/controllers/components/hoge
class HogeComponent extends Object
{
function someMethod(){
// ...
}
}
使い方
コントローラー内で。
$components = array('Hoge');
// ...
$this->Hoge->someMethod();
// ...
レイアウトの切り替え
コントローラー内で。
$this->layout = 'other'; // app/views/layouts/other.ctp を使う。
自動レンダリングの無効化
コントローラー内で。
$this->autoRender = false;
ページネーション
コントローラー内で。
$this->pagenator = array();
GROUP BY対策
// @path app/app_model.php
function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
$parameters = compact('conditions');
$this->recursive = $recursive;
$count = $this->find('count', array_merge($parameters, $extra));
if (isset($extra['group'])) {
$count = $this->getAffectedRows();
}
return $count;
}
バリデーション
モデル内で。
// @path app/models/hoge.php
class Hoge extends AppModel
{
public $name = "Hoge";
public $validate = array(
'myfield' => array(
'rule1'=>array(
'rule'=>'notEmpty',
'message'=>'なんか入力してください。',
)
)
);
}
コントローラー内で。
// ...
public $uses = array("Hoge");
// ...
function add($id)
{
// TODO: 初期化処理
$hoge = $this->Hoge->findById($id);
$errors = array();
if( ! empty($this->data))
{
$this->Hoge->set($this->data);
if($this->Hoge->validates() )
{
// 入力検査クリア
// TODO: 確認ページ表示処理
$this->render('add_confirm');
}
else
{
// 入力検査失敗
$errors = $this->Hoge->invalidFields();
}
}
// TODO: デフォルト表示処理
$this->set('hoge', $hoge);
}
Ajax
ビュー内で
// jqueryロード済み
<script type="text/javascript">
$.getJSON("/controller/myaction", function(o){
// コールバック処理
if(o.hasError){
// エラー;
}
else{
// 成功;
}
});
</script>
コントローラー内で
function myaction()
{
if($this->RequestHandler->isAjax() ){
$this->layout = 'ajax';
Configure::write("debug", 0);
$data = $this->Mydata->findById(1);
if(empty($data) ){
$err = array("hasError"=>"エラー");
echo json_encode($err);
exit; //=> exitしないとjquery側のコールバックが動作しない。
}
echo json_encode($data);
exit; //=> exitしないとjquery側のコールバックが動作しない。
}
else{
// エラーにする場合。
$this->cakeError('error404');
}
}
ビュー
ヘルパー
データを変換して出力するためのフィルターとかを定義する。
作り方
// @path app/views/helpers/hoge.php
class HogeHelper extends AppHelper
{
function someMethod(){}
}
使い方
コントローラー内で。
$helpers = array('Hoge');
ビューテンプレート内で。
<?php $hoge->someMethod(); ?>
トランザクション
コントローラー内で。
$db =& ConnectionManager::getDataSource('default');
$db->begin($this->Mymodel);
if( ! $this->Employee->save($data ) ) {
$db->rollback($this->Mymodel);
}
$db->commit($this->Mymodel);
エラー関連
404エラーにする
404エラービュー
<!-- @path app/views/errors/error404.ctp -->
ERROR: ページが見つかりませんでした。
コントローラー内で。
$this->cakeError('error404');
アプリケーションエラーハンドラ
// @path app/error.php
class AppError extends ErrorHandler
{
function error404($params)
{
$this->controller->layout='error'; // レイアウトを切り替える場合。
parent::error404($params);
}
}
キャッシュ
無効化
// @path app/cofig/core.php
Configure::write('Cache.disable', true);
プラグイン
使い回せるモデル/コントローラー/ビューのセットを定義する場合。
作り方
使い方
テスト
ログ出力
- モデル内で
- コントーラー内で
- コンポーネント内で
- ビュー内で
- ヘルパー内で
$this->log($somevar, LOG_DEBUG);
つまり、logメソッドで行けます。
ログが多くなるとラベル必要になるので、以下のようにしてます。
$this->log("なんかラベル:" . print_r($somevar, TRUE), LOG_DEBUG);
自分は、unix系なので、
$ tail -f app/tmp/logs/debug.log
でデバッグ出力を見張って、変数の内容を確認してます。