CakePHP4のメモ
![]() |
13 |
742 views
Postsテーブルにstatusというプロパティ変数があり、文字列には次のどちらかが入力されることを期待しているとする。
それ以外の文字列は受け付けないこととする。
その場合、/src/Model/Entity/Post.phpに次の2行を追加する。
const STATUS_NEW = '新規追加';
const STATUS_DRAFT = '下書き';
次に、Postエンティティに'status'プロパティに許可された文字列のみを受け入れるカスタムセッターを追加する。
public function _setStatus($status)
{
$allowedStatuses = [self::STATUS_NEW, self::STATUS_DRAFT];
if (in_array($status, $allowedStatuses)) {
return $status;
}
throw new InvalidArgumentException("Invalid status value. Allowed values are '新規追加' and '下書き'.");
}
これで、Postエンティティのstatusプロパティに対して、許可された文字列だけが登録されるようになる。
最後にフォームでセレクタを作成し、許可された文字列を選択できるようにする。
例えば/usr/Template/Post/add.phpというビューファイルがある場合、次のようにセレクタを作成する。
<?php
use App\Model\Entity\Post;
echo $this->Form->create($article);
// 他のフォーム要素
echo $this->Form->control('status', [
'type' => 'select',
'options' => [
Article::STATUS_NEW => '新規追加',
Article::STATUS_DRAFT => '下書き'
],
'empty' => '選択してください'
]);
// 他のフォーム要素
echo $this->Form->button(__('Submit'));
echo $this->Form->end();
これで、statusプロパティに対して「新規追加」または「下書き」のいずれかの文字列を選択するセレクタが作成される。
このセレクタを使って、ユーザーが許可された文字列のみを選択できるようになる。
まとめると以下となる。
<?php
namespace App\Model\Entity;
use Cake\ORM\Entity;
use InvalidArgumentException;
class Post extends Entity
{
const STATUS_NEW = '新規追加';
const STATUS_DRAFT = '下書き';
protected $_accessible = [
'status' => true,
// 他のプロパティに対するアクセス制御を追加
// ...
];
public function _setStatus($status)
{
$allowedStatuses = [self::STATUS_NEW, self::STATUS_DRAFT];
if (in_array($status, $allowedStatuses)) {
return $status;
}
throw new InvalidArgumentException("Invalid status value. Allowed value are '新規追加' and '下書き'.");
CakePHPでは、_set<PropertyName>という形式のメソッドをエンティティ内に定義することで、プロパティの値がセットされる際にカスタムの処理を実行できる。
これらのメソッドは、"mutator"または"setter"メソッドと呼ばれる。
_setStatus()メソッドは、statusプロパティの値がセットされる際に自動的に呼び出されるmutatorである。
CakePHPのエンティティは、マジックメソッドを利用して、このようなメソッドを自動的に呼び出す。
setStatus()が勝手に呼ばれる理由は、CakePHPのエンティティクラスがset()マジックメソッドを実装しているからである。
これにより、プロパティに値をセットする際に、対応するset<PropertyName>メソッドが存在すれば、そのメソッドが自動的に呼び出される。
Page 14 of 34.
1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/