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()
);
【メモ】ファイルの拡張しを一括変更するコマンド
for name in *.html do mv $name ${name%.html}.php; done
forの使い方
for 変数 in 値リスト do 処理 done
shellの変数展開
${parameter%word} 最短後置パターンの削除
【メモ】phpのクラス一覧、プロパティ一覧
get_class_methods($this); get_class_vars(get_class($this));
cakephp2.4 ACL 試してみた
参考サイト
- Cookbook 2.x
http://book.cakephp.org/2.0/ja/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.html - CakePHP2で簡単にACLを使う方法
http://blog.asial.co.jp/1088 - CakePHP-2.3.8 に Plugin–Acl を導入する
http://iwave-fe.blogspot.jp/2013/07/cakephp-238-pluginacl.html
流れ
Cookbookとは違いGUIのACL(アクセス制御リスト)プラグインを使います。
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) );
$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 コマンドの復習
詳しく調べてないが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');