Pages

2018年11月2日金曜日

[CakePHP3] 文字列型のDBカラムに配列を保存する方法

こんな便利な機能があったとは。。
もっと早く気づきたかった。。

CakePHP3 には文字列カラムに配列をJSON形式などに変換して保存し、取り出し時にまた配列に戻してくれる方法がありました。

_initializeSchema( Cake\Database\Schema\TableSchema $schema )
https://api.cakephp.org/3.6/class-Cake.ORM.Table.html#__initializeSchema

使い方

1.保存したいテーブルの Model にメソッドを追加します。

protected function _initializeSchema(\Cake\Database\Schema\TableSchema $schema)
{
    $schema->setColumnType('categories', 'json');
    return $schema;
}

ここでは カラム名:categories にMultiCheckboxなどで配列で得られる値を JSON形式 で保存する事を想定してみました。

使い方は以上です。

簡単ですね。
今まで知らずに自作してた。。

2018年6月11日月曜日

CakePHP3 + PhpStorm + Compass の設定

最新の CakePHP3 では

 composer install

すると

 src/Sass
 config.rb

が作成される様子なので、このに準ずる事とする。

無ければ以下で作成する

composer.json があるプロジェクトディレクトリ内に移動して初期設定のコマンドを実行。

$ compass create --sass-dir "src/Sass" --css-dir "webroot/css" --javascripts-dir "webroot/js" --images-dir "webroot/img"

src/Sass/screen.scss
 src/Sass/print.scss
 src/Sass/ie.scss
 webroot/css/ie.css
 webroot/css/print.css
 webroot/css/screen.css

が作成されるのが嫌って人は --bare オプションを追加して。

$ compass create --bare --sass-dir "src/Sass" --css-dir "webroot/css" --javascripts-dir "webroot/js" --images-dir "webroot/img"

 src/Sass
 config.rb

が作成されるはず。(他は元からあるはず。)

config.rb の中身はテキストなので確認する。

後でやっぱり

 src/Sass/screen.scss
 src/Sass/print.scss
 src/Sass/ie.scss
 webroot/css/ie.css
 webroot/css/print.css
 webroot/css/screen.css

を作成したいって人は。

$ compass init

を実行すればOK。

--bare の場合はまだ作成されないけど、コンパイルが実行されると

.sass-cache

が作成されるはずなのでこれは .gitignore に追加してバージョン管理されないように。


ここかまでが無ければの人の下ごしらえ。
で、ここから phpstorm の設定方法。

1.phpstorm の設定ウィンドウを開く

 File > Settings (Ctrl + Alt + s)


2.Compass の設定画面に移動する。

 Languages & Frameworks > Sytlesheets > Compass

 この設定はコンパイルの自動化だけなら必要無し。
 恐らく何か便利機能のため。
 1つしかできないので管理用画面と会員用画面みたいな複数で config.rb を分けたい時は多分どうしようもない。。


3.Enable Compass support にチェックを入れる。

自動的に Compass executable file: と Config Path: は設定されるはず。

 Compass executable file: compass コマンドのパス
 Config Path: config.rb のパス


4.File Watchers の設定画面に移動する。

 Tools > File Watchers


5.設定を追加する。

 右に緑の十字アイコンの Add(追加)ボタン をクリックして Compass SCSS を選択。


6.以下の内容を設定

デフォルトである程度適切に設定されてるはずだが、 Arguments: だけ変更。

 File type: SCSS Style Sheet
 Scope: Project Files
 Program: compass or compass.bat のパス
 更新 Arguments: compile
 Output paths to refresh: 空
 Working directory: config.rb を置いているディレクトリパス

※ 動作確認したい場合は Show console: Always に変更して確認でもOK。


以上!

2018年5月20日日曜日

Cakephp3 でPOST値をGET値で上書き

POST値を更新するなんて場面そう無いだろうけど、一応メモ。

以前は
$this->request->data = $this->request->params;

みたいな書き方でいけてたはずだけど、今はNGみたい。

マニュアルにも無いし、そんな場面作るなよって意味だろうけど以下ならできた。

$params = $this->getRequest()->getQueryParams();
$request = $this->getRequest()->withParsedBody($params);
$this->setRequest($request);


2018/11/06 追記

https://book.cakephp.org/3.0/ja/core-libraries/form.html
このページに「値はリクエストメソッドが GET の時にのみ定義されるべきで、 さもないと正しくないまたは保存されていない直前の POST データを上書きしてしまいます。」
と記載があるので、

  $this->request->withData('name', 'John Doe');
  
を利用するのが良いのかもしれません。。
今は get*** と修正されていっているので、

  $this->getRequest()->withData('name', 'John Doe');

かな。
Symfonyのコンポーネントだけ使ってメールアドレスが正しいかをチェックする

既存システムの改修を行う際にメールアドレスのチェックを強化したいけど、
フレームワークを使ってなかったので、composer で Symfony のバリデーションだけ入れて対応。

まずはコンポーネントを追加
$ composer require symfony/validator
※ 別要件で、 /vendor/autoload.php は読み込み済み。

後は、

http://symfony.com/doc/current/validation.html

を見ながら下の感じで。

use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Constraints\Email;


$validator = Validation::createValidator();
$violations = $validator->validate($email, array(
    new Email(array(
        'message' => 'The email "{{ value }}" is not a valid email.',
        'strict' => true,
        'checkHost' => true,
    )),
));

// エラー有無のチェック
if (0 !== count($violations)) {
 // 有 の場合
 foreach ($violations as $violation) {
    echo $violation->getMessage();
 }
} else {
 // 無 の場合
}

利用可能なオプション

  • strict
  • message
  • checkMX
  • checkHost
  • payload
今回は strict、message、checkHost だけ利用。

2018年1月15日月曜日

Cakephp3 CallbackStream を利用したCSVダウンロード

CakePHP3 にいつからか(3.0からあったっけ?) CallbackStream ってのがあったのでサンプル作成してみました。

https://book.cakephp.org/3.0/en/controllers/request-response.html

use Cake\Http\CallbackStream;

public function foo()
{
    $items = $this->items->find()->limit(10);

    $this->response->type(['csv' => 'text/csv']);
    $this->response = $this->response->withType('csv');
    $this->response = $this->response->withDownload('foo.txt');

    $stream = new CallbackStream(function () use ($items) {
        foreach ($items as $item) {
            echo $item->id . ',' . $item->name . "\n";
        }
    });
    $this->response = $this->response->withBody($stream);
    return $this->response;
}

メモリー利用方法までは確認できていませんが、そこが問題無ければフレームワークに用意されているのであれば積極的に利用した方がよさそうですね。
ちなみにヘッダー出力は $this->response->withHeader() を利用しなさいって事になってるようです。

Followers