アプリケーションルール

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 |

NullReferenceException

Posted by muchag | C#,Library & PlugIn & AddIn | 2018-03-22 (木) 21:29:17

【環境】
NPOI: 2.3.0
Visual C#: 15.5.4(2017)
.NETFramework,Version: v4.6.1
経緯

ある日突然例外がスローされた。

System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。

見てみると、どうやら GetRow で失敗しているんだけど
何故か、22行目で突然失敗。

原因

CreateRow や CreateCell をしておらず
その行やセルが見つからない、ってことだったみたい。
stack overflow:NullReferenceException accessing Workbook Cells with NPOI(2016-10-23)

これが、一から作成してる Excel ファイルではなく
テンプレートファイルを用意していたので
ちょっと混乱した。

7行目から先は全て空白行なので
21行目も22行目もどちらも空白行なのに
22行目で突然エラー。

解決(邪道)

どうやら、21行目までは見た目空白行であっても
書式設定か何かがされていて、NPOI 側で既存と認識できていたみたい。

なので、100行目までフォント色を「自動」にしたら
例外にならなくなった。

本当は CreateRow や CreateCell をするのが正しい解決方法だと思うけど
今晩は時間がないので暫定で対応。

C#,Library & PlugIn & AddIn | 2018-03-22 (木) 21:29:17 |

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 |

R Index

Posted by muchag | R | 2018-03-11 (日) 13:23:49

丸っきりの書きかけ項目は Not found になる。

一般
  1. 設定(Preferences)
    1. eclipse.ini

 

パッケージ

 

がい~ん!(はまったこと)
  1. 解決済み(たぶん)
  2. 未解決

 

参考

公式:The Comprehensive R Archive Network

Wikipedia:R言語

RStudio
→R言語IDE

Qiita:プログラマーのためのR言語入門(2017-12-26)
Qiita:プログラマーのためのR言語入門 その2 ~分析・表示編~(2017-02-27)

Qiita:Rのパッケージまとめ~これだけはインストールしておくと便利というものを厳選(2016-12-20)

R | 2018-03-11 (日) 13:23:49 |

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 |
« 前ページへ次ページへ »