Home > PHP > CakePHP

CakePHP Archive

Firecakeのコメントにcakeinfoが

この記事の所要時間: 027

FirecakeはCakePHPのデバッグ情報をFirebugに表示する便利なHelperです。

Bakeryでソースを見ているとコメントにこんな記述が。

Looking for more ideas, I also used cakeinfo.php, * a script released under MIT license by Masashi Shinbara.

cakeinfoを参考にして頂いているようです。嬉しい事です。

CakePHP Model#save()内でvalidates()を呼ばない

この記事の所要時間: 11

ref: CakePHPの何か-CakePHPのModelを使う

お馴染みyandoさんのプレゼン資料で気になったソースがあったので勝手に添削w。

35p:Validation設定例

<?php
class UsersController extends AppController {
  function fuga(){
    $data&#91;'User'&#93; = array(
      'login_id' => '+*+*+*+*',
      'password' => 'abcde',
      'name' => ''
      );
      if ($this->User->validates($data)) {
        $this->User->save($data);
      } else {
        $this->validateErrors($this->User);
      }
   }
}
?>

User#save()の部分ですが、Model#save()メソッド内ではModel#validates()が呼ばれるので、このままだとUser#validates()が2度実行されることになります。

このソースのようにsave()の前にvalidates()を実行するならsave()の第2引数にfalseを渡します。これならsave()内でvalidates()は実行されません。

<?php
      if ($this->User->validates($data)) {
        // validates()はsave()内では呼ばれない
        $this->User->save($data, false);
      }
?>

あとこの例のようにController#validationErrorsを参照しないのなら、Controller#validateErrors()は呼ばなくても良いです。

なので↓のようにシンプルに書けたりします。

<?php
class UsersController extends AppController {
  function fuga(){
    $data&#91;'User'&#93; = array(
      'login_id' => '+*+*+*+*',
      'password' => 'abcde',
      'name' => ''
      );
      $this->User->save($data);
   }
}
?>

まあ実際は登録完了後はリダイレクトしたりビューテンプレートを変えたりするので結局上のソースのようになるのですが。;-)

CakePHPをWebサイトの一部で使う

この記事の所要時間: 053

以前依頼を受けた案件でこんなのがありました。

  • 現在稼働中のサイトに機能(ページ)追加
  • 実装方法はお任せ(既存のライブラリ等は使用しなくて良い)
  • 但し、Smartyは必須
  • あとSmartyテンプレート、PHPの内部エンコーディングはSJIS

仕様自体はそれほど複雑で無いのでDBライブラリ(PEAR::DBとか)+Smaryでゴリゴリ書いても良いのですが、せっかくの機会なのでCakePHPを使ってみる事にしました。

DocumentRoot以下には既に稼働中のページがあるので、イメージとしてはそこにPageControllerを置き、そこからCakePHPを呼び出すといった感じです。

(CakePHP自体を追加ディレクトリに入れるという力業もあるのですが、ファイル構成が複雑になって、メンテナンスされる方が困りそうなのと個人的にもDocumentRoot以下にライブラリがあるのは抵抗があるのでそれはやめました。。。)

構成としてはこんな感じです。

[cake] <-- CakePHPを置く
  + [app]
  + [cake]
  + [vendors]
[DocumentRoot]
  + [new]
    + index.php
    + add.php
    + update.php
    + delete.php
  + [new2]
    + index.php
    + add.php
    + update.php
    + delete.php

DocumentRoot以下では単純にCakeのappを呼びます。

<?php
$_GET&#91;'url'&#93; = '/new/index';
// cake/をinclude_pathに入れたら
include('app/webroot/index.php');
// cake/をinclude_pathに入れないなら
//include('../../cake/app/webroot/index.php');
?>

$_GET['url']に渡すパスを変えれば任意のコントローラ・アクションが呼べます。

この方法ならブラウザから見るパスとCake用のパスを異なるものにできるので小さな案件ならわりと使えるシーンはあるのではないかと思います。(突然「URLを変えてくれ」とかありません?)

Smarty関係も小ネタがあるので、それはまた書きたいと思います。

# 昨今のWebフレームワークはFrontControllerが主流ですが、PageControllerももうちょっと見直されても良いかなと思ったり。

CakePHP1.1.13.4450&1.2.0.4451alphaリリース

この記事の所要時間: 026

CakePHP1.1.13.4450&1.2.0.4451alphaがリリースされています。

1.1.13.4450はバグフィックスリリース、1.2.0.4451alphaは1.2系のアルファ版となっています。

双方ともに多くの変更・修正が行われており、CakePHP Sessonコンポーネントに任意のコードが実行できる脆弱性 | Shin x blogも修正されています。

1.2の正式リリースが一歩一歩近づいてきましたね。

CakePHP Sessonコンポーネントに任意のコードが実行できる脆弱性

この記事の所要時間: 19

Sessionコンポーネントですが値を保存するキーに特定の値を仕込むと任意のコードが実行できる脆弱性があります。

この問題は1.1/1.2どちらにも存在します。

Sessionコンポーネントの親クラスであるCakeSessionクラス[cake/libs/session.php]では、セッション関連の処理にeval()を使用しています。このeval()に渡すPHPコード(evalで実行されるコード)を生成する過程で、セッションキーを使用するのですが、変数のチェックが不十分なため、任意の処理を書くことができてしまいます。

通常セッションのキーにGET/POST/COOKIEといった外部からの値は使用しないと思うのであまり影響は無いかもしれませんが、もしセッションキーにこれらの値を使用している場合は値のチェックを厳密に行う必要がありますのでご注意を。

念のためtikcet投げておいたのでいずれ修正されるかと思います。
早速パッチを適用してもらいました。openだったのは正味20分くらいでした。(早!)
Thanks phpnut!!

[.]区切りのセッションキーを配列にして使うためにeval()を使っているのですが、これはわざわざeval()を使う必要があるのでしょうか。安全性を考えるとこういった関数は極力使わない方が吉かと。

CakePHP phpinfo()風に設定を表示-CakeInfo-

この記事の所要時間: 138

CakePHPアプリケーションの設定内容をphpinfo()風に表示するスクリプト[CakeInfo]を作ってみました。

CakeInfo-0.1.0
対応バージョン:1.1.11.4064以降

Cheesecake Photoblogを表示するとこんな感じです。

現在表示される内容は以下です。

  • PHP
    アプリケーションを実行しているPHP情報
  • Core
    [app/webroot/index.php][app/config/core.php]で設定されていているフレームワーク定数
  • Path
    Configureオブジェクトが持つ各パス情報
  • Database(デフォルトは非表示)
    [app/webroot/database.php]で設定されていているDB接続情報
  • Controller
    アプリケーション内のコントローラ情報。Controllerクラスとの差分を表示。
  • Model
    アプリケーション内のモデル情報。Modelクラスとの差分を表示。

設置

設置方法は簡単です。
まずこちらのzipファイルを解凍します。
あとは解凍した[cakeinfo.php][logo-mini.gif]を[app/webroot/]に設置するだけです。

設定

現在のところ設定項目は[DATABASE_CONFIG_FLAG]一つだけです。

  • DATABASE_CONFIG_FLAG
    この定数が設定されていればDatabase項目が表示されます。(デフォルトはコメントアウト)

Cakeを使った事例も増えているようですし、特に大きなサイトではアプリケーション全体を俯瞰できるものがあれば便利だと思います。設置も簡単ですのでお試し頂ければ嬉しいです。

いずれは表示だけでなくてWeb上からアプリケーションを構築できるような仕組みにできれば面白いですね。;-)

CakePHP 1.1環境で1.2を試す

この記事の所要時間: 212

1.1.x環境で1.2.xフレームワークを試す方法です。

まずcake1.2をCakeForge or リポジトリからダウンロードして設置します。ここでは[app/vendors/cake1.2]に設置します。

次に1.1.xの[app/]から1.2フレークワークを読み込みます。

1.1.xの[app/webroot/index.php]にてCAKE_CORE_INCLUDE_PATHの定義を以下のように変更すればokです。

< ?php
// snip
/**
 * This only needs to be changed if the cake installed libs are located
 * outside of the distributed directory structure.
 */
	if (!defined('CAKE_CORE_INCLUDE_PATH')) {
		 //define ('CAKE_CORE_INCLUDE_PATH', FULL PATH TO DIRECTORY WHERE CAKE CORE IS INSTALLED DO NOT ADD A TRAILING DIRECTORY SEPARATOR';
		 //You should also use the DS define to seperate your directories
//		 define('CAKE_CORE_INCLUDE_PATH', ROOT);
		 define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . APP_DIR . DS . 'vendors' . DS . 'cake1.2');
	}
// snip
?>

これで[app/vendors/cake1.2/cake]がフレームワークとして読み込まれます。

また別の方法として、include_pathに[app/vendors/cake1.2]を記述する方法もあります。

こちらの場合、php.iniやhttpd.conf、.htaccessなど設定ファイルに記述する場合は問題無いですが、PHPスクリプトに記述する場合は[app/webroot/index.php]の62行目以前に記述する必要があります。

1.2を試すだけでなく、1.1.x用に書いたアプリケーションが1.2で正しく動作するか確かめるのにも使えそうです。(フレームワーク側にこんな機能があっても良いですけどね)

CakePHPとRuby on Railsトレンド

この記事の所要時間: 045

SDozonoさんのエントリにインスパイアされました。:-)

恒例のGoogleトレンド。

CakePHP のおいしい食べ方: Zend Framework が間もなく Symfony をトレンドで追い抜く模様。

PHPフレームワークは比較されているので、CakePHPと先祖のRuby on Railsを見てみます。

Google Trends: cakephp,ruby on rails

やはり本家Rails圧倒的ですね。

一方言語で比べるとPHPが圧倒的です。

Google Trends: php,ruby

Railsが使いたくてRubyを触る人が多いのか、PHPではフレームワーク自体が普及していないのか。

なんとも締まらない結論ですが、いい加減PHPでもデファクトと呼ばれるフレームワークが登場して欲しいですね。

CakePHP Screencastまとめ

この記事の所要時間: 236

CakePHPを解説するScreencastをまとめてみました。

フレームワークを理解するのにソースやドキュメントを見て触るのが一番良いのは間違いないですが、動画や音声での解説はイメージを頭に作るのにとても役立ちます。

私も今はソースやファイル構成が(ざっくりですが)頭に入っていますが、Screencastを見るとより理解が深まるように感じます。

1. Admin Routing
Admin Routingの使用法です。(/adminでadminアクションを呼び出す方法)
bakeでMVCを生成して、adminアクションに対応させていきます。

2. Episode 1: Using Debug Messages
URLに対応するMVCが無い場合に表示されるエラーメッセージに従ってアプリケーションを構築していきます。
序盤はMVCをbake&エディッタで書いていきますが、途中からscaffoldを使用します。
phpnutによる音声解説付きです。

3. The Blog Tutorial
簡単なblog(というか単純なCRUD)をbake&scaffoldなしで構築していきます。
scaffoldで表示される画面をscaffoldを使わずに書いていくイメージです。

4. Using TortoiseSVN to Sync CakePHP applications
CakePHPの解説というよりsubversionの解説ですね。
開発用と本番用でブランチを切り、開発用の変更を本番用にマージしていくという内容です。
phpnutによる音声解説付きです。

5. Building the Bakery
bakeの解説です。
バージョンがかなり古い(1.1.2.2802)ので表示や生成される内容が現在と異なっています。(操作はほぼ同じなので問題は無いかと。)
複数テーブルの連携方法は参考になるかと思います。

6. cakephp basics screencast su Kuht.it Stage X
CakePHPのダウンロードから始まり、bake&scaffold無しでMVCを書いていきます。
CSSファイル・レイアウトファイルの作成、ビューヘルパの小技など画面デザインにフォーカスした内容です。
CRUDのうち、Rのみで、CUDについての解説はありません。

7. 10分で作るCakePHPアプリ for Windows – p4life
言わずと知れたp4lifeさんのScreencastです。
CakePHP+XAMPPのインストールから、scaffoldを使ったアプリケーション構築まで解説されています。

見る順番ですが、初心者の方はまず7.でざっくり雰囲気を見て、3./2./5.と進んでいけば良いと思います。(もちろんソースをダウンロードして、実際にソースを触りながら見るのがベターです。)

今後はさらにディープな内容のScreencastも出てくるのでしょうか。楽しみです。

CakePHP1.1.12.4205&1.2.0.4206_devリリース

この記事の所要時間: 038

CakePHP1.1.12.4205&1.2.0.4206_devがリリースされています。

CakeForge: CakePHP: Project Filelist

1.1.12.4205はバグフィックスリリースのようです。

注目はやはり1.2系初リリースの1.2.0.4206_devですね。開発版ながら今後のCakePHPの方向性を見る上でも楽しみなリリースです。

A gift for all to enjoy | The Bakery, Everything CakePHP : Articlesに新機能の概要が紹介されています。

# フォーラム – CakePHP Users in Japanで和訳が紹介されています。

ホーム > PHP > CakePHP

検索
フィード
メタ情報

Return to page top