このブログについて

Posted by muchag | 未分類 | 2007-03-01 (木) 2:33:38

このブログは、爺による「備忘録」です。
言葉の使い方をはじめ、間違っていることも多々あるかもしれません。
あくまでも「備忘録」ですので、これのブログを見て「怒っちゃやーよ!」

自己責任にて閲覧してくださいね
未分類 | 2007-03-01 (木) 2:33:38 |

Bake の拡張

Posted by muchag | CakePHP 3.x | 2018-04-17 (火) 23:30:39

いつもの如く、まずはチョイいじりから。

公式:Bake の拡張

【環境】
CakePHP: 3.5.11
php: 7.1.5
配置
ノーマル
/src/Shell/Task/HogeMogeTask.php
/src/Template/Bake/View/hoge_moge.twig
プラグイン内

プラグイン内に拡張 Bake コマンドを配置したい場合は

/plugins/MyVendor/MyPlugin/src/Shell/Task/HogeMogeTask.php
/plugins/MyVendor/MyPlugin/src/Template/Bake/View/hoge_moge.twig

を配置。

テンプレート指定

Task.php の template メソッド内の文字列を任意に指定。


/**
 * {@inheritDoc}
 */
public function template()
{
    return 'View/my_cell';
}
CakePHP 3.x | 2018-04-17 (火) 23:30:39 |

ビューセル

Posted by muchag | CakePHP 3.x | 2018-04-17 (火) 21:52:37

コントローラを伴ったエレメント。

公式:ビューセル

【環境】
CakePHP: 3.5.11
php: 7.1.5
ディレクトリ構成
コントローラ(?)
/plugins/MyVendor/MyPlugin/src/View/Cell/HogeMogeCell.php
テンプレート
/plugins/MyVendor/MyPlugin/src/Template/Cell/HogeMoge/display.ctp
基本

コントローラと同じ感覚でいればよいみたい。

Bake

bin/cake bake cell --plugin MyVendor/MyPlugin --theme MyVendor/MyPlugin hoge_moge

Creating file /myApp/plugins/MyVendor/MyPlugin/src/Template/Cell/HogeMoge/display.ctp
Wrote `/myApp/plugins/MyVendor/MyPlugin/src/Template/Cell/HogeMoge/display.ctp`

Creating file /myApp/plugins/MyVendor/MyPlugin/src/View/Cell/HogeMogeCell.php
Wrote `/myApp/plugins/MyVendor/MyPlugin/src/View/Cell/HogeMogeCell.php`

Baking test case for MyVendor/MyPlugin\View\Cell\HogeMogeCell ...

Creating file /myApp/plugins/MyVendor/MyPlugin/tests/TestCase/View/Cell/HogeMogeCellTest.php
Wrote `/myApp/plugins/MyVendor/MyPlugin/tests/TestCase/View/Cell/HogeMogeCellTest.php`
スケルトン

namespace MyVendor\MyPlugin\View\Cell;

use Cake\View\Cell;

/**
 * PullDown cell
 */
class PullDownCell extends Cell
{

    /**
     * List of valid options that can be passed into this
     * cell's constructor.
     *
     * @var array
     */
    protected $_validCellOptions = [];

    /**
     * Default display method.
     *
     * @return void
     */
    public function display()
    {
    }
}
$_validCellOptions

公式:ビューセル セルのオプション
らしいけど。。。下記公式の例を見ても、どこで利用しているのか分からず
利用方法がわからない。


namespace App\View\Cell;

use Cake\View\Cell;
use Cake\Datasource\Paginator;

class FavoritesCell extends Cell
{
    protected $_validCellOptions = ['limit'];

    protected $limit = 3;

    public function display($userId)
    {
        $this->loadModel('Users');
        $result = $this->Users->find('friends', ['for' => $userId]);
        $this->set('favorites', $result);
    }
}

// テンプレート側
$cell = $this->cell('Favorites', [$user->id], ['limit' => 10])

と思ったら、素敵な記事を発見!
Qiita:CakePHP3新機能 Cellメソッドの引数について(2016-12-21)


// テンプレート側
echo $this->cell('Hoge', [], ['xxx' => 1, 'yyy' => 2])->render();

// Cell 側
class HogeCell extends Cell
{
     protected $_validCellOptions = ['xxx'];

     public function display()
     {
         echo $this->xxx;
         echo $this->yyy;
     }
}

$_validCellOptions にて定義されたものだけを第3引数で受け取れ、
$this->xxx の形で呼び出せる。

でもいまいち用途がわからない。

公式:Class Cell $_validCellOptions
こんな記述も発見したけど、よくわからない。。。

アクション
display

デフォルトが display アクションらしい。
だから、自動生成されるテンプレートファイルも display.ctp。

独自

新たにアクションを追加できる。


// テンプレート側
echo $this->cell('Hoge::displayHoge')->render();

// Cell 側
class HogeCell extends Cell
{
     protected $_validCellOptions = ['xxx'];

     public function displayHoge()
     {
     }
}

displayHoge を追加した場合、display_hoge.ctp を用意してやれば
自動的に利用される。

テンプレート

コントローラと同じでメソッド(アクション)名と同名の .ctp ファイルが自動で利用される。

指定

公式:ビューセル 別のテンプレートの描画


// テンプレートで指定
$cell->viewBuilder()->setTemplate('messages');

// セルアクションで指定
$this->viewBuilder()->setTemplate('messages');

プラグイン記法は上手くいかなかった。

隣のプラグイン

隣のプラグインのセルを利用したら
テンプレートがないと怒られた。

プラグインA からプラグインB のセルを呼び出したら
A に display.ctp がないぞ!
と怒られた。

B のセルなんだから、B のテンプレートを読んでくれると思っていたのに。。。

意味不明解決

しばらく時間が経ったら怒られなくなり、
ちゃんと B のテンプレートを読んでくれた。

キャッシュの問題かしらね。

CakePHP 3.x | 2018-04-17 (火) 21:52:37 |

Table

Posted by muchag | CakePHP 3.x | 2018-04-17 (火) 0:53:28

【環境】
CakePHP: 3.5.8
php: 7.1.5
save

保存前にゴニョゴニョしたい場合は
Table クラスに save メソッドを追加して
そこに処理を記述する。


/**
 * Save method
 *
 * @see \Cake\ORM\Table
 */
public function save(EntityInterface $entity, $options = [])
{
    $entity->total = $entity->kokugo + $entity->sansu;

    return parent::save($entity);
}
CakePHP 3.x | 2018-04-17 (火) 0:53:28 |

アソシエーション – モデル同士を繋ぐ

Posted by muchag | CakePHP 3.x | 2018-04-16 (月) 19:14:27


公式:アソシエーション – モデル同士を繋ぐ

【環境】
CakePHP: 3.5.11
php: 7.1.5
種別
関係 アソシエーション種別
1 対 1 hasOne ユーザーは1つのプロフィールを持っている。
1 対 多 hasMany ユーザーは複数の記事を持つことができる。
多 対 1 belongsTo 多くの記事がユーザーに属している。
多 対 多 belongsToMany タグは多くの記事に属している。
記述場所

各 Table クラスの initialize 内。


public function initialize(array $config)
{
    $this->hasOne('Addresses')
        ->setName('Addresses')
        ->setConditions(['Addresses.primary' => '1'])
        ->setDependent(true);
}
書式

上記4メソッドとも、最終的には下記 Association オブジェクトのコンストラクタが呼ばれる。

/vendor/cakephp/cakephp/src/ORM/Association.php

public function __construct($alias, array $options = [])

第1引数:エイリアス名。contain オプションに指定する名称
第2引数:オプション

hasOne
options
className 当該のモデルに関連付けられるモデルのクラス名。
『User hasOne Address』 の関係を定義したい場合、 className キーは 『Addresses』 になるはずです。
foreignKey 相手側のテーブル上の外部キーの名前。
これは複数の hasOne の関係を 定義する必要がある場合に特に便利です。
このキーの既定値は当該のモデルの名前を アンダースコアーで区切り、単数形にして 『_id』 を末尾に付けたものです。
上の例では 『user_id』 が既定になります。
bindingKey foreignKey での紐付けに使用される、当該のテーブルのカラム名。
指定されなかった場合、主キー(例えば Users テーブルの id カラム)が使われます。
conditions [‘Addresses.primary’ => true] のような find() 互換の条件の配列です。
joinType SQL クエリーで使われる結合の種別で、既定は LEFT です。
もし hasOne アソシエーションが常にあれば INNER を使うことができます。
dependent dependent キーが true に設定され、そしてエンティティーが削除された場合、 関連付けられたモデルのレコードも削除されます。
この例では User を削除した時に 関連付けられた Address も削除されるようにしたければ true にします。
cascadeCallbacks これと dependent が true の時には、カスケード削除は コールバックが正しく呼ばれるように、エンティティーを読み出して削除します。
false の時には、関連付けられたデータを削除するために deleteAll() が使われ コールバックは呼ばれません。
propertyName 関連付けられたテーブルからソースのテーブルの結果にデータを埋める際の プロパティー名。
既定は、アソシエーションの名前をアンダースコアーで区切り、 単数形にしたもので、よって例では address です。
strategy クエリーで使うためのストラテジーを定義します。
既定は 『join』 です。
他の有効な値は 『select』 で、これは代わりに別のクエリーを使用します。
finder 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。
belongsTo
options
className 当該のモデルに関連付けられるモデルのクラス名。
『Profile belongsTo User』 の関係を定義したい場合、 className キーは 『Users』 になるはずです。
foreignKey 当該のテーブル上の外部キーの名前。これは同一のモデルに対して複数の belongsTo 関係を定義する必要がある場合に特に便利です。このキーの既定値は 相手側のモデルの名前をアンダースコアーで区切り、単数形にして _id を末尾に付けたものです。
bindingKey foreignKey での紐付けで使用される、相手側のテーブルのカラム名。
指定されなかった場合、主キー(例えば Users テーブルの id カラム)が使われます。
conditions [‘Users.active’ => true] のような find() 互換の条件の配列、 または SQL 文字列です。
joinType SQL クエリーで使われる結合の種別で、既定は LEFT であり、これは すべての状況で要求を満たすとは限らず、メインおよび関連付けられたモデル一式を返すか あるいは何も返さないようにしたい場合には INNER が便利です。
propertyName 関連付けられたテーブルからソースのテーブルの結果にデータを埋める際の プロパティー名。既定は、アソシエーションの名前をアンダースコアーで区切り、 単数形にしたもので、よって例では user です。
strategy クエリーで使うためのストラテジーを定義します。既定は 『join』 です。
他の有効な値は 『select』 で、これは代わりに別のクエリーを使用します。
finder 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。
hasMany
options
className 当該のモデルに関連付けられるモデルのクラス名。
『User hasMany Comment』 の関係を定義したい場合、 className キーは 『Comments』 になるはずです。
foreignKey 相手側のテーブル上の外部キーの名前。これは複数の hasMany の関係を 定義する必要がある場合に特に便利です。このキーの既定値は当該のモデルの名前を アンダースコアーで区切り、単数形にして 『_id』 を末尾に付けたものです。
bindingKey foreignKey での紐付けに使用される、当該のテーブルのカラム名。
指定されなかった場合、主キー(例えば Articles テーブルの id カラム)が使われます。
conditions [‘Comments.visible’ => true] のような find() 互換の条件の配列、 または SQL 文字列です。
sort [‘Comments.created’ => ‘ASC’] のような find() 互換の order 句の配列、 または SQL 文字列です。
dependent dependent が true に設定されている場合、再帰的なモデル削除が可能です。
この例では Article レコードを削除した時に Comment レコードが削除されます。
cascadeCallbacks これと dependent が true の時には、カスケード削除は コールバックが正しく呼ばれるように、エンティティーを読み出して削除します。
false の時には、関連付けられたデータを削除するために deleteAll() が使われ コールバックは呼ばれません。
propertyName 関連付けられたテーブルからソースのテーブルの結果にデータを埋める際の プロパティー名。既定は、アソシエーションの名前をアンダースコアーで区切り、 複数形にしたもので、よって例では comments です。
strategy クエリーで使うためのストラテジーを定義します。既定は 『select』 です。
他の有効な値は 『subquery』 で、これは IN のリストを等価のサブクエリーに置き換えます。
saveStrategy 『append』 または 『replace』 のいずれかです。デフォルトは 『append』 です。
『append』 の場合、当該のレコードがデータベース中のレコードに追加されます。
『replace』 の場合、 関連付けられたレコードで当該のセットにないものは削除されます。もし外部キーが null になれるカラムの場合、または dependent が真の場合、レコードは親を持たなくなります。
finder 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。
belongsToMany
options
className 当該のモデルに関連付けられるモデルのクラス名。
『Article belongsToMany Tag』 の関係を定義したい場合、 className キーは 『Tags』 になるはずです。
joinTable このアソシエーションで使われる結合テーブルの名前 (当該のテーブルが belongsToMany 結合テーブルの命名規約に準拠していない場合)。
既定では、結合テーブル用の Table インスタンスを読み出すためにこの名前が使われます。
foreignKey 結合テーブル上の当該のモデルを参照する外部キーの名前、または複合外部キーの場合はリスト。
これは複数の belongsToMany の関係を定義する必要がある場合に特に便利です。
このキーの既定値は当該のモデルの名前をアンダースコアーで区切り、単数形にして 『_id』 を末尾に付けたものです。
bindingKey foreignKey での紐付けに使用される、当該のテーブルのカラム名。
既定ではその主キーです。
targetForeignKey 結合モデル上の対象モデルを参照する外部キーの名前、 または複合外部キーの場合はリスト。
このキーの既定値は当該のモデルの名前をアンダースコアーで区切り、単数形にして 『_id』 を末尾に付けたものです。
conditions find() 互換の条件の配列、または SQL 文字列です。
関連付けられたテーブル上に条件を持つには、 『through』 モデルを使用し、 それに必要な belongsTo アソシエーションを定義してください。
sort find() 互換の order 句の配列。
dependent dependent キーが false に設定され、そしてエンティティーが削除された場合、 結合テーブルのデータは削除されません。
through 結合テーブルで使用する Table インスタンスのエイリアス、またはインスタンス自体の いずれかを指定できます。これにより、結合テーブルのキーのカスタマイズが可能になり、 そして結合テーブルの動作をカスタマイズすることができます。
cascadeCallbacks これが true の時には、カスケード削除は結合テーブル上の コールバックが正しく呼ばれるように、エンティティーを読み出して削除します。
false の時には、関連付けられたデータを削除するために deleteAll() が使われ コールバックは呼ばれません。これはオーバーヘッドの削減を助けるために 既定では false になります。
propertyName 関連付けられたテーブルからソースのテーブルの結果にデータを埋める際の プロパティー名。既定は、アソシエーションの名前をアンダースコアーで区切り、 複数形にしたもので、よって例では tags です。
strategy クエリーで使うためのストラテジーを定義します。既定は 『select』 です。
他の有効な値は 『subquery』 で、これは IN のリストを等価のサブクエリーに置き換えます。
saveStrategy 『append』 または 『replace』 のいずれかです。
既定は 『replace』 です。
関連するエンティティーの保存に使用するモードを示します。前者はリレーションの両側の間に 新しい紐付けを作成するだけで、後者は保存する時に渡されたエンティティーの間に 紐付けを作成するために消去と置換を行います。
finder 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。
CakePHP 3.x | 2018-04-16 (月) 19:14:27 |

セッション

Posted by muchag | CakePHP 3.x | 2018-04-15 (日) 20:38:43


公式:セッション

【環境】
CakePHP: 3.5.11
php: 7.1.5
オブジェクトへのアクセス
場所

公式:セッション セッションオブジェクトへのアクセス
こちらに下記リストが書いてあるけど、これで使いたい場所は全部カバーされているのかしらね。

  • Controllers
  • Views
  • Helpers
  • Cells
  • Components
取得

$this->Session = $this->request->getSession(); // CakePHP 3.5~
$this->Session = $this->request->session();    // CakePHP ~3.4
メソッド
  • read
    • 読み込み
  • write
    • 書き込み
  • delete
    • 削除
  • check
    • 存在チェック
  • destroy
    • ログアウト処理などで利用する破棄
  • renew
    • セッション ID を手動で切り替え
入れ子

入れ子にすることが可能。


$session->write([
  'Config.theme' => 'blue',
  'Config.language' => 'en',
]);
参考サイト

CakePHP3 Tips:CakePHP3 セッション(session)使い方(2018-03-22)

CakePHP 3.x | 2018-04-15 (日) 20:38:43 |

クエリキャッシュ

Posted by muchag | CakePHP 3.x | 2018-04-15 (日) 15:51:04


公式:キャッシュ

【環境】
CakePHP: 3.5.11
php: 7.1.5
定義
/vendor/cakephp/cakephp/src/ORM/Query.php

public function cache($key, $config = 'default')

↓ が呼ばれる。

/vendor/cakephp/cakephp/src/Datasource/QueryTrait.php

public function cache($key, $config = 'default')
利用

公式:クエリービルダー ロードされた結果をキャッシュする


$query->cache('recent_articles');

// 文字列で Config 名
$query->cache('recent_articles', 'dbResults');

// CacheEngine のインスタンス
$query->cache('recent_articles', $memcache);

// クエリーの where 句の単純なチェックサムに基づくキーを生成します
$query->cache(function ($q) {
    return 'articles-' . md5(serialize($q->clause('where')));
});

つまり、find や get をする際に cache 設定をしておけば
次回からはキャッシュが存在すれば、そちらから取得してくれる
と理解してみた。。。

書式

公式:データの取り出しと結果セット 主キーで単一のエンティティーを取得する


// オプション指定
$article = $articles->get($id, [
    'cache' => 'custom',
]);

あちこち見た感じでは、チェーン指定も可能な気がしたけど
気のせいだった。。。

// チェーン指定
$article = $articles->get($id)
->cache('custom');

Call to undefined method Akportal\Model\Entity\Hoge::cache()
CakePHP 3.x | 2018-04-15 (日) 15:51:04 |

キャッシュ

Posted by muchag | CakePHP 3.x | 2018-04-15 (日) 15:35:23


公式:キャッシュ

【環境】
CakePHP: 3.5.11
php: 7.1.5
/vendor/cakephp/cakephp/src/Http/Response.php

public function cache($since, $time = '+1 day')

非推奨。

/vendor/cakephp/cakephp/src/View/View.php

public function cache(callable $block, array $options = [])

クエリ

クエリキャッシュ

CakePHP 3.x | 2018-04-15 (日) 15:35:23 |

更新

Posted by muchag | CakePHP 3.x | 2018-04-11 (水) 21:21:31


公式:データの保存

【環境】
CakePHP: 3.5.11
php: 7.1.5
書式
/vendor/cakephp/cakephp/src/ORM/Table.php

public function patchEntity(EntityInterface $entity, array $data, array $options = [])
バルクアップデート
/vendor/cakephp/cakephp/src/ORM/Table.php

public function patchEntities($entities, array $data, array $options = [])
CakePHP 3.x | 2018-04-11 (水) 21:21:31 |

データの保存

Posted by muchag | CakePHP 3.x | 2018-04-11 (水) 21:06:13


公式:データの保存

【環境】
CakePHP: 3.5.11
php: 7.1.5
種別

のような使い分けがあるみたいだけど
いまだピンと来ず。

なぜか

Controller にもあるように
Bake コマンドによる Controller 生成時に自動生成される add メソッド内で
newEntity() 後に patchEntity() をしているから。

ん~、どう理解したら良いのかしらね~。

CakePHP 3.x | 2018-04-11 (水) 21:06:13 |

データの検証

Posted by muchag | CakePHP 3.x | 2018-04-11 (水) 20:57:56


公式:データの検証

【環境】
CakePHP: 3.5.11
php: 7.1.5
2つのルール
  1. バリデーションルール
    • リクエストデータがエンティティーにコンバートされる前、 データ型や書式まわりのバリデーションルールが適用されます。
  2. アプリケーションルール(ドメインルール)
    • データが保存される前、ドメインまたはアプリケーションルールが適用されます。 これらのルールはアプリケーションのデータの一貫性の保証に役立ちます。
参考サイト

Qiita:CakePHP3のバリデーションは2度動く!(2015-12-11)
→バリデーションルールとアプリケーションルールの違いがわかりやすかった

CakePHP 3.x | 2018-04-11 (水) 20:57:56 |
次ページへ »