cakephp2.x で外部phpからライブラリのようにcakephpを使う方法

※要検証
参考URL)
http://web.mt-systems.jp/archives/783

webroot/index.phpを読み込む方法

$_SERVER['PATH_INFO'] = '/posts/index/';
require_once('../cakephp/app/webroot/index.php');

CakeRequest::__url() を見てるとpath_info->request_uriの順でURLを確認してるよう。 参考URLのようにfavicon.icoを読み込んでっていう方法はうまくいかなかった。。

bootstrap.phpを読み込む方法

こちらはカスタマイズしやすいけどコードが長くなる。

define('DS', DIRECTORY_SEPARATOR);
define('ROOT', '/var/www/html/');
define('APP_DIR', 'app');
define('WWW_ROOT', '/var/www/html/');
require_once('../cakephp/lib/Cake/bootstrap.php');

App::uses('Dispatcher', 'Routing');
$Dispatcher = new Dispatcher();

$Dispatcher->dispatch(
    new CakeRequest('/post/index'),
    new CakeResponse()
);

cakephp2.4 ACL 試してみた

参考サイト

流れ

Cookbookとは違いGUIACL(アクセス制御リスト)プラグインを使います。

  • 1) DBの用意
  • 2) プラグインの準備
  • 3) BAKE ALL
  • 4) M/V/C修正
  • 5) グループ作成、ユーザー作成
  • 6) bootstrap.phpの修正

1) DBの用意

CREATE TABLE users (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    password CHAR(40) NOT NULL,
    group_id INT(11) NOT NULL,
    created DATETIME,
    modified DATETIME
);


CREATE TABLE groups (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    created DATETIME,
    modified DATETIME
);


CREATE TABLE posts (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id INT(11) NOT NULL,
    title VARCHAR(255) NOT NULL,
    body TEXT,
    created DATETIME,
    modified DATETIME
);

CREATE TABLE widgets (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    part_no VARCHAR(12),
    quantity INT(11)
);
  • aros ARO:Access Request Object
  • acos ACOAccess Control Object
  • aros_acos
    のテーブルを作ってくれるシェル
$app/Console/cake.php schema create DbAcl

2) プラグインの準備

http://www.alaxos.net/blaxos/pages/view/download_plugin_acl_2.0
Download ACL Plugin 2.2.0
古いみたいだけど一応動いた
解凍後 app/Plugin/Acl/

3) BAKE ALL

$app/Console/cake bake all

4) M/V/C修正

モデル

User.php

public $actsAs = array('Acl' => array('type' => 'requester'));

    public function parentNode() {
        if (!$this->id && empty($this->data)) {
            return null;
        }
        if (isset($this->data['User']['group_id'])) {
            $groupId = $this->data['User']['group_id'];
        } else {
            $groupId = $this->field('group_id');
        }
        if (!$groupId) {
            return null;
        } else {
            return array('Group' => array('id' => $groupId));
        }
    }

    public function beforeSave($options = array()) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
        return true;
    }

    public function bindNode($user) {
        return array('model' => 'Group', 'foreign_key' => $user['User']['group_id']);
    }

Group.php

public $actsAs = array('Acl' => array('type' => 'requester'));

    public function parentNode() {
        return null;
    }

コントローラー

AppController.php

  public $components = array(
        'Acl',
        'Auth' => array(
            'authorize' => array(
                'Actions' => array('actionPath' => 'controllers')
            )
        ),
        'Session',
        'DebugKit.Toolbar'
    );

    public $helpers = array('Html', 'Form', 'Session');

    public function beforeFilter() {
        //Configure AuthComponent
        $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
        $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
        $this->Auth->loginRedirect = array('controller' => 'topics', 'action' => 'add');
    }

UsersController.php

public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow();
    }

    public function login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                $this->Session->setFlash('You are logged in!');
                $this->redirect($this->Auth->redirect());
            } else {
                $this->Session->setFlash('Your username or password was incorrect.');
            }
        }
    }

    public function logout() {
        //Leave empty for now.
    }

GroupsController.php
/Plugin/Acl/Controller/AclController.php
/Plugin/Acl/Controller/AcosController.php
/Plugin/Acl/Controller/ArosController.php

public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow(); 
    }

ビュー

Users/login.ctp

<?php
echo $this->Form->create('User', array('action' => 'login'));
echo $this->Form->inputs(array(
    'legend' => __('Login'),
    'username',
    'password'
));
echo $this->Form->end('Login');

5) グループ作成、ユーザー作成

/users/group にアクセスしグループ追加
administrators, managers, users
/users/add にアクセスしユーザー追加

6) bootstrap.phpの修正

/admin/acl/にアクセスするとエラーがでる。
プラグインの方のbootstrap.phpを使うと反映されない
Config/bootstrap.php

#14 Groupに変更
Configure :: write('acl.aro.role.model', 'Group');
#21 id を 追記
Configure :: write('acl.aro.role.primary_key', 'id');
#40 id を 追記
Configure :: write('acl.aro.user.primary_key', 'id');

php syntax チェック

php syntax チェック

php5.3からphp5.4にアップデートしたおかげで下記エラーが出るようになった
Fatal error: Call-time pass-by-reference has been removed
関数呼び出し時の参照渡し(呼び出し元)がダメになったとのこと http://php.net/manual/ja/language.references.pass.php

コマンドでシンタックスチェック

phpのコマンドにlオプションを付けるとシンタックスチェック
xargsのn1は引数を一つずつ実行する

$find ./ -name "*.php" -print | xargs -n1 php -l

xargsのオプションで-P8とかすると並列処理とかもできるらしい。

php yum アップデート

#yum update php  

をしようと思ったら下記表示が

Packages(s) php available, but not installed.

いろいろやったがどうしたらいいか分からなくなって削除->再インストールの流れで

#削除
yum remove php -y
yum remove php-cli -y
yum remove php-*** #その他php関連全て削除

#インストール
yum install php php-mbstring php-mysql php-gd php-mcrypt php-pear php-pecl-xdebug php-pgsql

yum コマンドの復習

  • yum install xxx # インストール
  • yum update xxx # アップデート
  • yum remove xxx # 削除
  • yum list installed #インストール済み一覧
  • yum info xxx # 情報

rpm コマンドの復習

  • rpm -ivh # インストール
  • rpm -Uvh # アップデート
  • rpm -e # 削除
  • rpm -qa #インストール済み一覧
  • rpm -qi # 情報

詳しく調べてないがYUMコマンドはRPMコマンドを呼んでるらしい。
YUMコマンドは関連するパッケージもインストールしてくれるので楽(php-cliとかかな) ただバージョンを指定してインストールしたい場合などはRPMを使う必要あり。

cakephp2.x HABTMでカウンターキャッシュを使う

counterCacheについて

Cookbook 2.x
http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html#countercache-count

belongsToのアソシエーション対応で
hasAndBelognsToManyに対応してないみたい。

構成・準備

モデル
・Blog
・BlogsTag
・Tag
Tagにカウンターキャッシュ用のフィールド(int)blog_countを追加

プラグインで対応

CakePHP-HABTM-Counter-Cache-Plugin
https://github.com/neilcrookes/CakePHP-HABTM-Counter-Cache-Plugin

プラグインの設定

1)プラグインのダウンロード PluginフォルダにHabtmCounterCacheをダウンロード

2)Blogモデルに設定

public $actsAs = array('HabtmCounterCache.HabtmCounterCache');