アプリケーションルール

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


公式:データの検証

【環境】
CakePHP: 3.5.11
php: 7.1.5
基本
CakePHP 3.x | 2018-04-11 (水) 20:56:48 |

バリデーションルール

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


公式:データの検証

【環境】
CakePHP: 3.5.11
php: 7.1.5
デフォルト

Bake コマンドによる Model 生成時に
Table クラスに下記のようなデフォルトバリデーションルールが自動生成される。


/**
 * Default validation rules.
 *
 * @param \Cake\Validation\Validator $validator Validator instance.
 * @return \Cake\Validation\Validator
 */
public function validationDefault(Validator $validator)
{
    $validator
        ->integer('id')
        ->allowEmpty('id', 'create');

    $validator
        ->email('email')
        ->allowEmpty('email');

    $validator
        ->scalar('password')
        ->maxLength('password', 255)
        ->requirePresence('password', 'create')
        ->notEmpty('password');

    $validator
        ->scalar('role')
        ->maxLength('role', 255)
        ->allowEmpty('role');

    return $validator;
}
追加

バリデーションルールを追加したい場合は
Model のカスタマイズで書いたように
拡張 Table クラスに下記のように記述すればよい?
未試行。


public function validationDefault(Validator $validator)
{
    $validator = parent::validationDefault($validator);

    // 追加したい処理

    return $validator;
}
変更1

公式:データの検証 異なるバリデーションセットの使用
に書かれている手法は

  1. Table クラス内に validationXxxx() というメソッドを新設
  2. newEntity() 時に指定
新設

class ArticlesTable extends Table
{
    public function validationUpdate($validator)
    {
        $validator
            ->add('title', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('タイトルを設定してください'),
            ])
            ->add('body', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('本文は必須です')
            ]);
        return $validator;
    }
}
指定

Xxxx 部分を xxxx にて指定。


$article = $articles->newEntity(
    $this->request->getData(),
    ['validate' => 'update']
);
変更2

以前調べて参考サイトからいただいてきたと思われる手法。
結局は1と同じことをしているけど、名前指定ではなく、バリデータ自体を渡している感じ?

  1. Table クラス内に validationXxxx() というメソッドを新設
  2. バリデータを取得
  3. newEntity() 時に指定
新設

1と同様。

取得

$validator = $this->Articles->validationUpdate(new Validator());
指定

$entity = $this->Articles->patchEntity($entity, $this->request->getData(), ['validate' => $validator]);
CakePHP 3.x | 2018-04-11 (水) 20:55:47 |

phpDocumentor

Posted by muchag | PHP | 2018-04-11 (水) 15:52:58

個人で開発をしていると、こういうチームワーク的な手法に手が回らない。
実感が湧かないからね。。。

公式?:phpDocumentor

アノテーション
@property

公式?:@property
メンバ変数の型宣言をできる。

php では、メンバ変数を宣言する際に、型宣言を伴わない。
そのせいで phpStrom では、警告が出るらしい。

User.php

class User
{
    private $name;

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }
}

この User クラスをメンバ変数 $leader へ代入すると
$leader が何者か不明なために、User クラス内メソッドを利用する際に警告となるらしい。

そこで、下記のように @property アノテーションで定義してやることで
理解してもらえるそうな。

ちなみに、複数管理するメンバ変数には、User[] という他言語タイプで伝えるとよいらしい。


/**
 * Class Group
 *
 * @property User $leader
 * @property User[] $leaders <- array ではなく User[]
 */
class Group
{
    private $leader;
    private $leaders = [];
}
@method

公式?:@method
findX のようなマジックメソッド利用時に用いる。
※マジックメソッドは、そんなメソッドは存在しないんだけど
メソッド名からフレームワーク側が解析して、処理してくれるメソッド?


/**
 * Class SampleModel
 *
 * @method array findById($id, $fields = null)
 */
class SampleModel extends AppModel
{

このように明記してやることができる。

@uses, @used-by

メソッド名を動的に生成する場合に用いる。
要は、当該メソッドがどこからも呼ばれていないと思われるのを避ける。

公式?:@uses & @used-by


class Hoge
{
    /**
     * @uses addUser(), addAdmin()
     */
    public function addMember($user, $user_type)
    {
        $method = sprintf('add%s', $user_type);
        $this->{$method}($user); // $user_type に合ったメソッドを呼ぶ
    }

    /**
     * @used-by addMember
     */
    private function addUser($user)
    {
    }

    /**
     * @used-by addMember
     */
    private function addAdmin($user)
    {
    }
}
@uses

@uses の呼び出し元に設定する。

@used-by

@uses の呼び出し先に設定する。

参考サイト

バシャログ。:PhpStorm の静的解析機能をさらに活用するための3つのアノテーション(2015-12-07)
→@property, @method, @uses について非常にわかりやすかった

PHP | 2018-04-11 (水) 15:52:58 |

Fatal error: Cannot declare class /path/to/old/HogeController, because the name is already in use in /path/to/new/HogeController.php

Posted by muchag | CakePHP 3.x | 2018-04-03 (火) 13:56:41


公式:プラグイン

【環境】
CakePHP: 3.5.11
php: 7.1.5
経緯

prefix を変更しようとして
旧 prefix ディレクトリから新 prefix ディレクトリへ
コントローラファイルをコピペしてからページを表示しようとした。

そりゃ、何かを書き換えなければいけないと思った上でやったけど
下記のような Cannot declare class というエラーが出ることは想定していなかったので
よい勉強になった。

エラー
Fatal error: Cannot declare class /path/to/old/HogeController, because the name is already in use in /path/to/new/HogeController.php on line 76

このエラーを読んで
同じ名前のコントローラを複数配置できないのかと思い
他ではできているのにな~と思った。

原因

名前空間を書き換えていなかった。

解決

名前空間を書き換えて解決。


namespace Plugin\Controller\Old

namespace Plugin\Controller\New
CakePHP 3.x | 2018-04-03 (火) 13:56:41 |

SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘database.table_name’ doesn’t exist

Posted by muchag | CakePHP 3.x | 2018-03-20 (火) 22:50:21

【環境】
CakePHP: 3.5.11
php: 7.1.5
エラー
SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘database.table_name’ doesn’t exist
原因

Model の Bake 忘れ。

解決

当該 Model を Bake して解決!

CakePHP 3.x | 2018-03-20 (火) 22:50:21 |

FormHelper

Posted by muchag | CakePHP 3.x | 2018-03-20 (火) 16:11:14

Html ラグ生成ヘルパー。
公式:Form

【環境】
CakePHP: 3.5.11
php: 7.1.5
開始

/vendor/cakephp/cakephp/src/View/Helper/FormHelper.php

public function create($context = null, array $options = [])
オプション

公式:Form フォーム作成のためのオプション

終了

control
/vendor/cakephp/cakephp/src/View/Helper/FormHelper.php

public function control($fieldName, array $options = [])
自動認識

$fieldName と同じ名前の変数を渡すだけで
options > options を設定したと自動認識され
ドロップダウン形式になる。


// コントローラ側
$userTypes = array(
    0 => 'Guest',
    0 => 'Member',
);
$this->set(compact('userTypes'));

// テンプレート側
echo $this->Form->control('user_type',   ['label' => 'ユーザ種別']);
options

$options += [
    'type' => null,
    'label' => null,
    'error' => null,
    'required' => null,
    'options' => null,
    'templates' => [],
    'templateVars' => [],
    'labelOptions' => true
];
options

ややこしいけど、options の中の options へ選択肢配列を設定する。

こちらを設定すると、type を指定しなくても
自動的にドロップダウンリスト形式になる。

type
  • radio
  • select

これらについては、
‘type’ => ‘radio’ とすることで、
$this->Form->radio と同様の機能を実現できる。

が、ちょっと差があって

  • label 属性を使える
  • required 属性を使える
  • default も value もデフォルト値

required は $this->Form->radio でも使えるかも。未試行。

radio

‘options’ に ‘value’ => ‘caption’ の連想配列を設定することで
ラジオボタン群を生成してくれる。

select
input
/vendor/cakephp/cakephp/src/View/Helper/FormHelper.php

public function input($fieldName, array $options = [])
{
    return $this->control($fieldName, $options);
}

となっていたので、過去のメソッドってことみたい。

select

一通り読んで試してみて
label オプションを設定できないから
input で書くことにしたという
悲しい現実。。。


public function select($fieldName, $options = [], array $attributes = [])
options

ドロップダウンの値と表示文字列の組み合わせ配列。


echo $this->Form->select('hoge', [0 => 'a', 1000 => 'b']);

attributes
デフォルト値

$attributes += [
    'disabled' => null,
    'empty' => false,
    'escape' => true,
    'hiddenField' => true,
    'multiple' => null,
    'secure' => true,
];
multiple

「デフォルトで選択したい値の配列を使うことができます。」

ん?
デフォルトで選択したい値を指定できる、ということかしらね。
でも、true じゃ、指定できないか。。。

empty

「選択してください」とかの初期表示文字列?

default, value

default あるいは value 属性を指定すると、初期状態で当該項目が選択される。
違いがよくわからない。。。

指定するのは値であって、表示文字列ではない。

optgroup

公式:Form 選択ピッカーの作成
参照。

日時周り
メソッド
dateTime

年月日時分それぞれのドロップダウンが自動生成される。

date

年月日それぞれのドロップダウンが自動生成される。

自動生成物

年は、現在を中央に前後5年ずつ。
月は、英語フルスペル。
時は、24時制。

オプション
表示させたくない項目

form->date('birthday', [
    'minYear' => date('Y') - 60,
    'maxYear' => date('Y') - 17,
    'monthNames' => false,
    'empty' => [
        'year' => false,
        'month' => 'Choose month...'
    ],
    'day' => false,
    'year' => [
        'class' => 'cool-years',
        'title' => 'Registration Year'
    ]
]);
?>
年選択肢指定

form->date('birthday', [
    'minYear' => date('Y') - 60,
    'maxYear' => date('Y') - 17,
]);
?>
月選択肢数字

form->date('birthday', [
    'monthNames' => false,
]);
?>
プレースホルダ

form->date('birthday', [
    'empty' => [
        'year' => false,
        'month' => 'Choose month...'
    ],
]);
?>
その他

form->date('birthday', [
    'year' => [
        'class' => 'cool-years',
        'title' => 'Registration Year'
    ]
]);
?>
CakePHP 3.x | 2018-03-20 (火) 16:11:14 |

editorconfig-eclipse

Posted by muchag | CakePHP 3.x,Eclipse,Library & PlugIn & AddIn | 2018-03-07 (水) 16:21:41

.editorconfig に対応するためのプラグイン。

CakePHP3 の コーディング規約 を調べていたら
.editorconfig なるものの存在を知った。

これを Eclipse で利用できるようになるプラグイン。

【環境】
editorconfig-eclipse: 0.3.0.201702161018 Beta
Eclipse:Oxygen (4.7)
EPP Marketplace Client:1.5.1.v20160929-1432
OS:Windows10 Pro 64bit
インストール

[ヘルプ]-[Eclipse マーケットプレース]
検索窓に「editorconfig」
「editorconfig-eclipse 0.x」がヒットするので [インストール]
ライセンスに同意して [完了]

警告:署名なしコンテンツを含むソフトウェアをインストールしています。
このソフトウェアの真正性または妥当性を実証できません。
インストールを続行しますか?

がーん。。。断念。 😥

CakePHP 3.x,Eclipse,Library & PlugIn & AddIn | 2018-03-07 (水) 16:21:41 |

HtmlHelper

Posted by muchag | CakePHP 3.x | 2018-02-26 (月) 15:11:27

Html ラグ生成ヘルパー。
公式:Html

【環境】
CakePHP: 3.5.11
php: 7.1.5
リンク

動画や音声ファイルへのリンクは media メソッドが別にあるみたいなので、
a タグ用メソッドってことかしらね。

公式:Html リンクの作成

/vendor/cakephp/cakephp/src/View/Helper/HtmlHelper.php

public function link($title, $url = null, array $options = [])

第1引数:表示文字列
第2引数:URL。省略可
第3引数:オプション。省略可
上記処理を見ればわかるけど、内部的には UrlHelper::build メソッドを呼んでいる。

URL
書式

上記公式を見る限り、下記のようになっているので、それぞれの書き方が可能っぽい。

  • ‘/pages/home’,
  • “recipes/view/6”,
  • [‘controller’ => ‘Recipes’, ‘action’ => ‘delete’, 6],
パラメータ

['controller' => 'Recipes', 'action' => 'delete', 6],

この書式を用いたときの 6 がパラメータ。
これで、/recipes/view/6 となる。


['controller' => 'Recipes', 'action' => 'delete', 'id' => 6],

このような書き方もあるみたいだけど、これだとリンク文字列は


となり


public function view($id = null)

としているコントローラ側では、$id = null となってしまう。

ちと不思議。。。


echo $this->Url->build([
    "controller" => "Posts",
    "action" => "search",
    "?" => ["foo" => "bar"],
    "#" => "first",
]);

こうすると


こうなるらしい。

名前付きルート

なんていうのも載っていたけど、これはほぼルーティングの話なので
今回はパス!

絶対 URL

['controller' => 'Dashboards', 'action' => 'index', '_full' => true]

このように _full を指定してやることで、絶対 URL になるとのこと。


‘_full’ => は、省略可能?。

拡張子つき

echo $this->Url->build([
    "controller" => "Posts",
    "action" => "list",
    "_ext" => "rss",
]);

オプション
  • class
  • confirm
    • JavaScript の confirm() ダイアログを表示
  • escape
    • $title の HTML 特殊文字は HTML エンティティーに変換
    • リンクの属性のエスケープも無効
    • デフォルトは true
  • escapeTitle
    • 属性ではなくタイトルのエスケープだけを無効
  • fullBase
    • デフォルトは false
  • target
  • title
  • その他不明
CakePHP 3.x | 2018-02-26 (月) 15:11:27 |

プラグイン開発 -> Template

Posted by muchag | CakePHP 3.x | 2018-02-25 (日) 21:45:15


公式:ビュー ビューテンプレート

【環境】
CakePHP: 3.5.11
php: 7.1.5
概要

View クラスから利用される実際の HTML 部、という理解で合っているのかしらね~。

また定義はよくわかっていないけど、要はフロント部分を格納する場所。

種類
  • テンプレート: テンプレートは実行中のアクション固有のページの一部分です。 アプリケーションの応答の中心となります。
  • エレメント: 小さな、再利用可能なちょっとしたコードです。エレメントは通常、 ビューの中で描画されます。
  • レイアウト: アプリケーションの多くのインターフェイスをくるむ表示コードを入れる テンプレートファイルです。ほとんどのビューはレイアウトの中に描画されます。
  • ヘルパー: これらのクラスはビューレイヤーの様々な場所で必要とされるロジックを カプセル化します。とりわけ、CakePHP のヘルパーはフォームの構築や AJAX 機能の構築、 モデルデータのページ切替、RSS フィードの提供などの手助けをしてくれます。
  • cells: これらのクラスは、自己完結型のUI部品を作成する 小さなコントローラー風の機能を提供します。 より詳しい情報は ビューセル を参照してください。

公式には、これだけの情報が載っているけど
プラス Bake で吐き出されるファイルのテンプレートも存在する。

ファイル配置

コントローラ名と同一のディレクトリ内に
アクション名の .ctp ファイルを配置することで
自動的に読み込んでくれる。


src
 ┣ Controller
 ┃  ┣ AdminController
 ┃  ┗ FrontController
 ┗ Template
   ┣ Admin
   ┃  ┣ index.ctp
   ┃  ┗ view.ctp
   ┗ Front
     ┣ index.ctp
     ┗ view.ctp

カスタマイズ

Controller 参照。

変数の受け渡し

Controller 参照。

継承

公式:ビュー ビューの継承
公式では「ビューの継承」となっている。

これもいいね~♪

CakePHP 3.x | 2018-02-25 (日) 21:45:15 |

値の取得

Posted by muchag | CakePHP 3.x | 2018-02-25 (日) 19:22:39

Synfony のときにも作ったけど
こちらでも、各値の取得方法一覧。

【環境】
CakePHP: 3.5.11
php: 7.1.5
定数
コア定義定数

公式:定数および関数 コア定義定数

APP アプリケーションディレクトリーへの絶対パス。末尾にスラッシュが付きます。
APP_DIR あなたのアプリケーションのディレクトリー名。app かも知れません。
CACHE キャッシュファイルディレクトリーへのパス。 複数サーバーをセットアップした際のホスト間で共有できます。
CAKE cake ディレクトリーへのパス。
CAKE_CORE_INCLUDE_PATH ルートの lib ディレクトリーへのパス。
CONFIG config ディレクトリーへのパス。
CORE_PATH ルートディレクトリーへの、末尾にディレクトリースラッシュを付加したパス。
DS PHP の DIRECTORY_SEPARATOR (Linux の場合は / Windows の場合は \) のショートカット。
LOGS ログディレクトリーへのパス。
ROOT ルートディレクトリーへのパス。
TESTS テストディレクトリーへのパス。
TMP 一時ファイルディレクトリーへのパス。
WWW_ROOT ウェブルートへのフルパス。
時間定義定数

公式:定数および関数 時間定義定数

TIME_START アプリケーションが開始された時点の、浮動小数点マイクロ秒での UNIX タイムスタンプ。
SECOND 1 と等しい
MINUTE 60 と等しい
HOUR 3600 と等しい
DAY 86400 と等しい
WEEK 604800 と等しい
MONTH 2592000 と等しい
YEAR 31536000 と等しい
名称

// プラグイン名
// Controller:OK
$this->plugin

// クラス名
$this->name
$request->params

リクエストパラメータに情報が含まれているので
そこから取り出せる。


debug($this->request->params);

[
	'controller' => 'Users',
	'pass' => [],
	'action' => 'index',
	'plugin' => 'MyPlugin',
	'prefix' => 'admin',
	'_matchedRoute' => '/admin/:controller',
	'_ext' => null,
	'isAjax' => false
]
取得

$this->request->getParam('controller');

// または
$this->request->params['controller'];

// または
$this->request->controller;
リファラ(アクセス元 URL)

未試行。


$this->referer()
CakePHP 3.x | 2018-02-25 (日) 19:22:39 |
« 前ページへ次ページへ »