Bake の拡張
公式:Bake の拡張
CakePHP: 3.5.11
php: 7.1.5
プラグイン内に拡張 Bake コマンドを配置したい場合は
を配置。
Task.php の template メソッド内の文字列を任意に指定。
/**
* {@inheritDoc}
*/
public function template()
{
return 'View/my_cell';
}
公式:Bake の拡張
プラグイン内に拡張 Bake コマンドを配置したい場合は
を配置。
Task.php の template メソッド内の文字列を任意に指定。
/**
* {@inheritDoc}
*/
public function template()
{
return 'View/my_cell';
}
公式:ビューセル
コントローラと同じ感覚でいればよいみたい。
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()
{
}
}
公式:ビューセル セルのオプション
らしいけど。。。下記公式の例を見ても、どこで利用しているのか分からず
利用方法がわからない。
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.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 のテンプレートを読んでくれた。
キャッシュの問題かしらね。
保存前にゴニョゴニョしたい場合は
Table クラスに save メソッドを追加して
そこに処理を記述する。
/**
* Save method
*
* @see \Cake\ORM\Table
*/
public function save(EntityInterface $entity, $options = [])
{
$entity->total = $entity->kokugo + $entity->sansu;
return parent::save($entity);
}
関係 | アソシエーション種別 | 例 |
---|---|---|
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 オブジェクトのコンストラクタが呼ばれる。
public function __construct($alias, array $options = [])
第1引数:エイリアス名。contain オプションに指定する名称
第2引数:オプション
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 | 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。 |
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 | 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。 |
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 | 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。 |
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 | 関連付けられたレコードを読み込む時に使われるファインダーメソッドです。 |
公式:セッション
公式:セッション セッションオブジェクトへのアクセス
こちらに下記リストが書いてあるけど、これで使いたい場所は全部カバーされているのかしらね。
$this->Session = $this->request->getSession(); // CakePHP 3.5~
$this->Session = $this->request->session(); // CakePHP ~3.4
入れ子にすることが可能。
$session->write([
'Config.theme' => 'blue',
'Config.language' => 'en',
]);
CakePHP3 Tips:CakePHP3 セッション(session)使い方(2018-03-22)
公式:キャッシュ
public function cache($key, $config = 'default')
↓ が呼ばれる。
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');
公式:キャッシュ
public function cache($since, $time = '+1 day')
非推奨。
public function cache(callable $block, array $options = [])
公式:データの保存
public function patchEntity(EntityInterface $entity, array $data, array $options = [])
public function patchEntities($entities, array $data, array $options = [])
公式:データの保存
のような使い分けがあるみたいだけど
いまだピンと来ず。
Controller にもあるように
Bake コマンドによる Controller 生成時に自動生成される add メソッド内で
newEntity() 後に patchEntity() をしているから。
ん~、どう理解したら良いのかしらね~。
公式:データの検証
Qiita:CakePHP3のバリデーションは2度動く!(2015-12-11)
→バリデーションルールとアプリケーションルールの違いがわかりやすかった