PHPカンファレンス2011で発表しました

notoです。

PHPカンファレンス2011 フレームワークアップデートのCakePHP2.0でLTさせてもらいました。 今回はLTで話したこと+話せなかったことを書いていきます。

ということで、早速CakePHP2.0についてです。

動作環境

  • php5.2.6以上
  • PHP4系のサポートはしない。

ファイル名・フォルダ名 命名規則

クラスを含むファイル名

クラスを含むファイル名は、アンダースコア区切りからアッパーキャメルケースへと変更。 そもそもなんでクラス名とファイル名が違うんだと小一時間。

1
2
3
CakePHP1系 : users_controllers.php
CakePHP2.0 : UsersController.php

コンポーネント

suffixとして「Component」が追加。

1
2
3
CakePHP1系 : component/session.php
CakePHP2.0 : Component/SessionComponent.php

ヘルパー

suffixとして「Helper」が追加。

1
2
3
CakePHP1系 : helper/form.php
CakePHP2.0 : Helper/FormHelper.php

クラスを含むフォルダ名

クラスを含むフォルダ名は、lowercaseからアッパーキャメルケースへと変更。 「webroot」等のクラスを含まないフォルダ名は、lowercaseのまま。

1
2
3
CakePHP1系 : controller
CakePHP2.0 : Controller

アクセス修飾子

PHP5系に移行したことで、すべてのメソッド名・プロパティにアクセス修飾子がつけられた。

AuthComponent

認証方式

CakePHP2.0では3つの認証方式が存在する。

  • FormAuthenticate 従来のポスト型
  • BasicAuthenticate ベーシック認証を利用した認証方式
  • DigestAuthenticate ダイジェスト認証を利用した認証方式

デフォルトはFormAuthenticate

設定方法

beforeFilterもしくは$componentsの配列内で設定。 以下はbeforeFilterでの例:

1
Auth->authenticate = array('Form');

認証方式の複数指定

複数の認証方式を利用したい時は以下のように設定する。

1
2
3
4
Auth->authenticate = array(
    'Form'  => array('userModel' => 'Users.User'),
    'Basic' => array('userModel' => 'Users.User')
);

ログインメソッドのマニュアル化

上の例だとuserModelを2度宣言している。 DRYなコードも書ける。

1
2
3
4
5
Auth->authenticate = array(
    AuthComponent::ALL => array('userModel' => 'Users.User'),
    'Form',
    'Basic'
);

カスタム認証オブジェクトを作成する

BaseAuthenticateを継承してauthenticateメソッドをオーバーライドする。

app/Controller/Component/Auth/OpenidAuthenticate.php
1
2
3
4
5
6
7
8
<?php
App::uses('BaseAuthenticate', 'Controller/Component/Auth');

class OpenidAuthenticate extends BaseAuthenticate {
    public function authenticate(CakeRequest $request, CakeResponse $response) {
        // 認証処理を書く
    }
}

カスタム認証オブジェクトを利用する

authenticateプロパティにセットするだけ。

1
2
<?php
    $this->Auth->authenticate = array('Openid');

ログインメソッドのマニュアル化

CakePHP1系では、空のログインメソッドを用意してあげれば、AuthComponentが必要な機能を自動的に提供してくれた。 CakePHP2.0では、手動で呼び出す必要がある。

1
2
3
4
5
6
7
8
9
public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            return $this->redirect($this->Auth->redirect());
        } else {
            $this->Session->setFlash(__('Username or password is incorrect'), 'default', array(), 'auth');
        }
    }
}

パスワードのハッシュ化

CakePHP2.0からパスワードは自動的にハッシュ化されない。 レコードを保存する前にハッシュ化をする必要がある。

1
2
3
4
5
6
7
<?php
class User extends AppModel {
    public function beforeSave($options = array()) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
        return true;
    }
}

ダイジェスト認証の場合は、パスワードのハッシュ化の方法が違うので注意。

SecurityComponent

従来はセキュリティコンポーネントは使い捨てトークンのみ。 CakePHP2.0では、繰り返し利用可能なセッショントークンも利用することが可能。

セッショントークンの設定例:

1
2
3
4
5
6
7
<?php

var $components = array(
    'Security' => array(
        'csrfUseOnce' => false
    )
);

FormHelper

すべてのHTML5のtype属性をサポート。 postLink() postButton()メソッド追加。POSTメソッドでリクエストを送信するリンクやボタンを生成することができる。

UnitTestTool

PHPUnitへと移行。 テスト駆動開発入門買ったけど、読んでない。。。

1
2
3
CakePHP1系 : SimpleTest

CakePHP2.0 : PHPUnit

Request Responce

リクエストとレスポンスがオブジェクト化。

Router

FULL URLを返すことができるようになった。

HTMLHelper

getCrumbsList()追加

要素でラップされたパンくずリストを生成することができる。

とりあえずこんな感じで。 LT初めてだったので緊張して軽くテンパってましたが、無事終わってよかったです。。。 カンファレンスでブログのことを軽く宣伝したので、今日はアクセス20は堅いな!!

Comments