Pages

2018年5月20日日曜日

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() を利用しなさいって事になってるようです。

2017年11月2日木曜日

2017年6月19日月曜日

fgetcsv で取り込めない問題発生

"能","<p>
あ</p>",""

上記のような3列で1行のSJISのCSVがあった場合、 SJISのロケール追加して、

$ locale -a | grep -i ja
ja_JP
ja_JP.SJIS
ja_JP.eucjp
ja_JP.sjis
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
japanese.sjis

という環境であっても、

setlocale(LC_ALL, 'ja_JP.SJIS');

をした後に、fgetcsv() を利用して正常にCSVが取り込むことができない。
別の方法もあった気がしたけど、忘れてしまったのでので今回対応方法をメモ。
考え方としてはiconvコマンドを利用して、SJISファイルをUTF8ファイルに変換してからPHPで取り込むという方法。

exec("iconv -f sjis-win -t utf-8 " . $path . " -o " . $path);
$handle = fopen($path, "r");
$row = fgetcsv($handle, 1024, ',', '"');

2016年11月22日火曜日

Preloaded HSTS を登録する

HSTS に対応してもHTTPで接続してレスポンスで判断はする。
ブラウザ側でできれば最初から判断してほしいって事で Chrome 側で判断してもらうには

HSTS (HTTP Strict Transport Security) の導入

を見ると https://hstspreload.appspot.com/ から登録すれば良いみたいなので早速登録してみました。

確認はChromeブラウザで chrome://net-internals/#hsts の Query Domain でOKみたい。

Followers