ログ日記

作業ログと日記とメモ

PHP

EC-CUBEをフルスクラッチでリニューアルした話

PHP

もう数年前の話なんだけれど、メモを残していなかったのでここに書き留めておく。 今から数年前、当時はPHP5でEC-CUBE2を使っていた。 そして、OSの更新期限が迫ってきていて、OS更新と共にPHP7にバージョンアップする必要があった。EC-CUBE 2 は PEAR を使…

PHP7とPHPStanで網羅性をチェックしたい

Feature Request は出ている。github.com github.comそれから、PHP8のmatch式なら既にチェックされる。github.comでもすぐにはPHP8に上げられないし、PHP7の switch で網羅性をチェックしたい。 2年前のissueなので、実装される可能性は薄いか…。

PHPStanとPsalmを混ぜた機能が欲しい

PHPStanはテンプレート+callableのネストに対応していた。

TCPDFで円とベジェ曲線で図形を描く

PHP

TCPDFでちょっとした図形を入れたい場合、画像を使わずに直接PDFに出力してしまう方法がある。 TCPDFのソースとマニュアルを見ていたらベジエ曲線が簡単に描けるようなのでやってみた。 (ベジェ曲線?どっち?昔聞いたときはベジエ曲線と発音されていたよう…

PHPでDDDのようなClean Architectureのような単純なLayeredとIoC

PHP

最近PHPコードをリファクタリングしている。DDDやクリーンアーキテクチャの記事や 5年間 Laravel を使って辿り着いた,全然頑張らない「なんちゃってクリーンアーキテクチャ」という落としどころ この辺の記事を読んだりして、自分なりの最適解を探している…

PHPの静的解析 Phan/Psalm/PHPStan の違い

PHP

エラーチェックのためにPHPで静的解析ツールをする場合、Phan, Psalm, PHPStan を使えば良いということは検索ですぐ出てくるのだが、どれを使えばいいのか。 それぞれのツールで検知できるものが微妙に異なっているので、全部使うのが安全ではある。それでも…

テンプレートエンジンを使うのをやめたい

PHP

BladeOneをアップデートしたら、include時の変数割り当てのフローが変わったのか、既存変数が上書きされてエラーが出るようになってしまった。 本家Bladeではこういったことは起きない? 仕方がないのでバージョン固定した。ソースを追っても何となく不毛な…

PHPStanのextensionでnamespace・class名の依存関係チェックする

前に書いた記事 DDDのさわりをやろうとした - ログ日記 ここで作ろうと思っていた拡張を作った。 github.comサンプル。 https://github.com/nishimura/phpstan-namespace-dependency-sample 実際に作ってみると、各レイヤーごとの依存関係の認識が曖昧なこと…

PHPの開発環境とライブラリと振り返りと近況

昔のコードを触る機会があった。 PHPの自作フレームワーク現状まとめ - ログ日記 この辺のやつ。 もう7年も前か…。当時はテンプレートエンジンに変数を渡す場合、アクションコントローラーでメソッドを呼び出すのが流行っていた。 set('foo', 1); } } や foo…

プログラムの分け方とディレクトリ構造

最近、プログラムのディレクトリレイアウトというかファイルを置く場所を変えようと試みている。 旧来のMVC的な構造だと、ControllerやModelのディレクトリを分ける、レイヤーごとにまとめる、という感じになると思う。 商品情報表示画面、その管理画面、CSV…

PHPStan バージョン0.12.24から PDOStatementが Traversable でなくなってしまった件

ジェネリクスの実装が @implements Traversable<array<int|string, mixed>>で固定されるようになった。FETCH_CLASSとジェネリクスを組み合わせていい感じにマッピングする方法が使えなくなって、ちょっとめんどくなってしまった。 都度 @var が必要になる。一応報告しておいたけど。 h</array<int|string,>…

DDDのさわりをやろうとした

PHP

ちょっと一部だけ複雑なプログラムがあったので、PHPでDDDっぽいオブジェクト指向をやろうとした。 なかなか大変だった。 まず静的解析による型チェックは必須。 型が自動でチェックされないDDDは、適当に書き捨てたプログラムより分かりにくくなると思った…

PHPStan が早い

PHPStanのデフォルトのルールを変更したくて、どうすれば良いか分からなかった。 デフォルトの config.neon を変更する方法を教えてってissueに書いたら10分後に返信来た。 scopeClassを変更すればgetType()で何でもできるよ、でも全体で一つの拡張しか使え…

フラッシュセッションにハマる

PHP

前にも同じ問題でハマったのに忘れていて再びハマったメモ。 リダイレクト前にセッションに値を保存して、リダイレクト後のページで取り出して、削除するような一度だけ使うセッション変数にはフラッシュセッションを使う。 セッション系ライブラリには大抵 …

スタートアップがPHPを使っていると聞いた話

PHP

この前、外国のスタートアップをやっている人にサービスを見せてもらった。 Qiitaによく書かれているような新しめのフロントエンドの技術盛り沢山で、クラウドや聞いたことのないようなサービスからTrelloのような知っているサービスなど色々使いつつ、なん…

php-modeとyasnippetを更新した

最近の無名関数が綺麗にインデントされるようにemacsのphp-modeを更新した。 https://github.com/ejmr/php-mode.git これをcloneして使っていたのでpullしただけ。 Emacs23だとうまくいかなかったのでEmacs24に更新。 apt-get install -t wheezy-backports e…

Composerの検索をローカルにする

PHP

いつも忘れるのでメモ。 あらかじめ外部ライブラリはローカルにgit cloneしておく。 composer.json "repositories": [ {"type": "vcs", "url": "/home/user/repo/my-framework"}, {"type": "vcs", "url": "/home/user/repo/my-lib"}, {"type": "vcs", "url":…

今更PHPでモナド的なものを書く

PHP

http://blog.dakatsuka.jp/2013/09/03/php-maybe-monad.html この辺とか http://d.hatena.ne.jp/kazu-yamamoto/20110413/1302683869 この辺とか見てたらちょっとやってみたくなったので。 ○○言語でMonad実装って結構あるけど、MonadPlus使えないとあまり意味…

ぼんやり振り返り

顧客は本当に欲しいものは知らない、と言うけれど同じような症状だ。 かゆいところに手が届かない。 自作フレームワークがつぎはぎになってきたのでカッとなって作ったやつ。 PHPの小規模用テンプレートエンジンを作った - より良い環境を求めて なんかアノ…

流れるようなインターフェースをtraitで

PHP

ぼんやり思ったことのメモ。 たとえばDB接続なら from('item') ->join('category') ->on()->over(['category.status' => 'item.status']) ->like(['name' => 'my item']) ->order('code') ->offset(100) ->limit(10) ->get(); とかやりたい。 今までさくっと…

Debian wheezyにphpenvでPHP複数バージョンの共存

かなりハマったのでメモ。 基本は http://qiita.com/uchiko/items/5f1843d3d848de619fdf こちらを参考に、一般ユーザー権限で操作する。 git clone https://github.com/CHH/phpenv.git phpenv/bin/phpenv-install.sh mkdir ~/.phpenv/plugins cd ~/.phpenv/p…

PHPの自作フレームワーク現状まとめ

https://github.com/nishimura/laiz2 基本方針 DB設計最優先 HTML構造優先 コード量を少なく 大抵の処理はPage(Action)クラスに書く。いわゆるAction肥大化。もし「この二つのテーブルは大抵joinして取得している」という状況になったらModelを作っても良い…

テンプレートエンジンにフォーム値の設定機能を付けた

PHP

https://github.com/nishimura/laiz-templateこれでデザイナーから大量のinput type="checkbox"が入ったHTMLを渡されても、正規表現置換で一瞬で対応できる。 簡単なマニュアル書いた。 if文 hasError変数がtrueの時(if ($hasError))だけタグ内を表示します…

Zend\Di の依存関係ループを解消する

勘違いしていたので追記SessionManager は 複数扱えないので、セッションを複数持つ場合は以下のようにして名前空間だけ分ける。 storage = $storage; } } class SessionManager{ public function __construct(SessionAdapter $adapter){ $this->adapt…

'Invalid instantiator of type "NULL" for "Zend\\ServiceManager\\ServiceLocatorInterface".

Zend\ValidatorPluginManager や Zend\Filter\FilterPluginManager などの PluginManager系をDIで取ろうとするとエラーになる。 同じ問題をやっている方が居た。 http://d.hatena.ne.jp/noopable/20130304 ここを詳しく読む前にやったので、全然別の方向から…

Zend\Di でコンストラクタインジェクションをチェーンするのは面倒くさい

一般ユーザー用画面と管理者画面があるとする。この二つで別々のセッション管理をしたい。 その場合、ここにあるようにaliasを設定すれば一応できる。 addAlias('dbadapter-readonly', 'MyLibrary\DbAdapter', array( 'username' => $config->db->readAdapte…

PHPのフレームワークを作った

ソースはここ: https://github.com/nishimura/laiz2composerの使い方を見るのも兼ねてサンプルアプリを置いたのですぐにインストールできるはず。 https://github.com/nishimura/laiz-sample-task composer.phar create-project laiz/laiz-sample-task laiz-…

yasnippet の php-mode を更新した

https://github.com/nishimura/minimal-yasnippet-php-mode今更ながらPHP5.3 の namespace に対応した。

Zend Framework の一部を使おうとしてハマった

PHP

症状は、composer.phar で zendframework/zend-validator を入れようとすると zendframework全体がインストールされる。 原因は、zendframeworkのcomposer.jsonが良くないっぽい。 依存関係を追っていくと、どうもzendframework/zend-i18nを入れようとすると…

PHPのフレームワーク再考

PHPのフレームワークを考えている。 2006年からLaizを作り始めたわけだけれど、普通に利用する機能と実験的機能がごちゃ混ぜでフレームワークが肥大化している。 特に、PHP5.3用に変更したときにPHP4のコードをそのまま持ってきたり新しい仕組みを取り入れた…