tag:crieit.net,2005:https://crieit.net/tags/CakePHP/feed
「CakePHP」の記事 - Crieit
Crieitでタグ「CakePHP」に投稿された最近の記事
2018-11-26T10:22:38+09:00
https://crieit.net/tags/CakePHP/feed
tag:crieit.net,2005:PublicArticle/14609
2018-11-24T22:10:28+09:00
2018-11-26T10:22:38+09:00
https://crieit.net/posts/CakePHP4
CakePHP4が出るらしいので各バージョンの歴史を振り返る
<p>CakePHP4がリリースされる日がもうすぐ近づいているようです。僕は今は使っていませんが、バージョン1の時代から3まで使い続けていたのでせっかくなので今までのバージョンを振り返ってみました。</p>
<h2 id="CakePHP1"><a href="#CakePHP1">CakePHP1</a></h2>
<p>CRUDを簡単に構築できるスクリーンキャストが印象的で、見た瞬間に一気にのめり込んで大好きになったきかっけのフレームワークでした。当時いくつかPHPのフレームワークはありましたが、どれもぱっとせず、満足できるほど使いやすい、というものではありませんでした。CakePHPはその中でようやく使いやすいものがでてきた、という印象がありました。</p>
<p>Ruby on Railsを参考に作った(?)ということだったと思いますが、その甲斐もありかなり便利でその後の色々なフレームワークに影響を与えていたと思います。</p>
<h3 id="コードの自動生成"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90">コードの自動生成</a></h3>
<p>bakeコマンドを使って色々自動生成してくれたため、それを修正して使ったりすることでかなり開発が早かったです。</p>
<h3 id="分かりやすいファイル構成"><a href="#%E5%88%86%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%A7%8B%E6%88%90">分かりやすいファイル構成</a></h3>
<p>MVCのベースとなる各ファイル自体もわかりやすかったですし、他の機能を拡張するためのコンポーネントやヘルパーなどもわかりやすく、簡単にファイル分割ができ開発はしやすかったです。</p>
<h3 id="細かいバージョン"><a href="#%E7%B4%B0%E3%81%8B%E3%81%84%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3">細かいバージョン</a></h3>
<p>たしかCakePHP1は1.1, 1.2, 1.3という細かいバージョンでちょっと大きな機能追加があったりなどした記憶があります。(認証コンポーネントの追加やビヘイビアなど)</p>
<h2 id="CakePHP2"><a href="#CakePHP2">CakePHP2</a></h2>
<p>PHP4の対応を捨てたバージョンです。結構色々とガラッと変わり、CakePHP1のプロジェクトはそのままでは動きませんでした。</p>
<p>今現在もかなり使われているような印象があります。baserCMSなんかもたしかこのバージョンだったと思います。1とどういう違いがあったのかは忘れてしまいましたが、何にしろ色々とちょっとずつ便利になっていたような記憶があります。これぞ、というものがあったわけではなく、1が色々検討しながら開発されたものだと思うので、色々話がまとまってきっちりした、という感じだったような気がします。</p>
<h2 id="CakePHP3"><a href="#CakePHP3">CakePHP3</a></h2>
<p>Composerが導入され、モダンなフレームワークとなりました。ここでもあらゆることがガラッと変わり、CakePHP2のプロジェクトはそのまま使うことはできませんでした。多分現在CakePHP2のプロジェクトが残っているはそのあたりが原因だと思われます。</p>
<p>正直ここでかなり使いやすくなったので、3が使えるようになったら2を使う必要はないと思われます。とはいえ業務上アップグレードできない状況や、Composer導入や色々な仕様変更等の影響で踏み出せない勢の影響でまだまだ残っている様な印象を受けます。可能であれば3を使っていきましょう。</p>
<p>ちなみにこの時知りましたが、一応バージョンアップ対応用のスクリプトみたいなのを公式が作ってるんですよね。でもたいしたことはしてくれないのでほとんど意味がありませんでした。</p>
<h2 id="CakePHP4"><a href="#CakePHP4">CakePHP4</a></h2>
<p>PHP7のみの対応となりました。ただ今回はそのあたりの対応がメインっぽく、それが要因となる破壊的変更以外はあまり行われず3からのアップグレードがわりと容易になるようです。軽いアップグレードが可能なのはここが初ですね。できる人はどんどんやっていった方が良いのではないかと思います。PHP5のサポートも今年で終わりですし。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14223
2018-04-30T06:41:22+09:00
2019-04-17T14:02:30+09:00
https://crieit.net/posts/CakePHP-Laravel-2018
CakePHPとLaravelの比較2018
<h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2>
<p>2016年に下記のようなCakePHPとLaravelの比較記事を書きました。</p>
<p><a href="https://crieit.net/posts/CakePHP-Laravel">CakePHPとLaravelの使い道</a></p>
<p>また、こちらの記事はCakePHPのみの記事ですが完全にLaravelとの比較を意識していました。</p>
<p><a href="https://crieit.net/posts/CakePHP3-5b0d18a432ff5">CakePHP3の優位性を色々</a></p>
<p>この頃は正直CakePHPびいきでしたが、時も流れ色々と状況や考え方も変わってきたので改めて考察してみました。<br />
(人によってはなんで今さらCakeとLaravelの比較なんてやってんだ、と思うかもしれませんが)</p>
<h2 id="情報量"><a href="#%E6%83%85%E5%A0%B1%E9%87%8F">情報量</a></h2>
<blockquote>
<p>検索にしても日本語の情報が非常に少ない気がするので本当に人気があるのかと思ってしまう。</p>
</blockquote>
<p>当時Laravelについては上記のように書いていました。</p>
<p>今はどちらも十分豊富に情報が溢れています。CakePHP3とか、Laravel5のようにバージョン込みで検索すれば紛らわしい情報も減りますし、困ったらドキュメント見れば大体分かります。</p>
<h2 id="ヘルパー"><a href="#%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC">ヘルパー</a></h2>
<blockquote>
<p>LaravelのHtml, Formヘルパーはなんとなく不足している点が多いような気がする。 実際使ってない人もいるようだ。 radioボタン群すらメソッド一つで作れないとは。</p>
</blockquote>
<p>当時上記のように書いていたとおり、FormヘルパーはやっぱCakeの方が楽な気がします。とはいえLaravelも最低限の機能は備えており不便ではないため、そんな細かく気にするところでもないかなという気はします。LaravelはLaravelでバリデーションエラーが出た時の画面遷移等がCakePHPとは違いますが、そこにちゃんと対応できるようにしてくれていますし。</p>
<h2 id="設定"><a href="#%E8%A8%AD%E5%AE%9A">設定</a></h2>
<blockquote>
<p>Laravelは設定量が多い。 パーツを追加する度にCakeだったらこんな設定しなくてもすぐ動かせるのに…。 と思いながら設定をしなければならない。 自由度が高いといえばそうなのかもしれないが、そんな自由度を得てまで時間をかけて開発したいのか、という疑問が湧いてくる。</p>
</blockquote>
<p>これは多分Facadeの事を言ってたような気がします。Facadeを自分で作るのは確かに面倒ですが、これはテストのやりやすさにも繋がるように便利に作られてるものですし、今となってはそんな気にするようなものじゃないと思います。そもそもFacadeにする必要のないライブラリは普通に作ってしまえばいいだけですし。</p>
<p>CakePHPはヘルパーやコンポーネント追加していくだけのため分かりやすく楽ではあります。</p>
<p>あとは</p>
<blockquote>
<p>ルーティングなんて設定しない</p>
</blockquote>
<p>というのも書かれていますが、正直ルーティングを設定するのは他の言語も含めどのフレームワークでもあたりまえの事なのでこれも気にするようなことじゃないと思う。むしろCakePHPが特殊です。</p>
<p>とはいえ設定しなくても動くCakePHPはほんとに楽なのは楽です。ただ、ルーティングを設定することでresourcesの恩恵を受けられコードもシンプルになりますし、そっちはそっちでメリットは大きいです。</p>
<p>CakePHPがまずいのは、bakeの自動生成がresource形式になっていないこと。これがデフォルトでできたらかなり良いと思います。resource形式でないためif文なども増えてしまいますし。</p>
<h2 id="DebugKit"><a href="#DebugKit">DebugKit</a></h2>
<p>これはCakePHPの圧勝に変わりはないです。見やすい。</p>
<p>追記)<br />
最近はLaravel Telescopeというものが出た。まだ使ったことはないが、もしかしたら開発環境はこれで良いかもしれない。(本番では重いかも)</p>
<h2 id="モデル"><a href="#%E3%83%A2%E3%83%87%E3%83%AB">モデル</a></h2>
<p>CakePHPのモデルはほんとに便利です。Laravelでも特に大きな不満はありませんが、Queryがモデルに属しておらずメソッド追加などが出来ないのがちょっと不満です。(一応設定すればできるみたいですが)</p>
<p>ただCakePHPのバリデーションはコードが非常に長いです。これはなんとかならないでしょうか…。</p>
<p>モデルは一長一短な気がします。</p>
<p>追記)<br />
Laravel側にはscope機能が追加されていますので不便なく使えるようになっています。</p>
<h2 id="マイグレーション"><a href="#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">マイグレーション</a></h2>
<p>これも自動生成してくれるCakePHPを褒めちぎっていましたが、マイグレーションを書くのも今や他の言語のフレームワークも含め当たり前の事ですので普通に自分で書いています。特に気にするほどのことではありません。Laravelのマイグレーションは簡単ですぐなんとなくは覚えられますし。</p>
<h2 id="先進性"><a href="#%E5%85%88%E9%80%B2%E6%80%A7">先進性</a></h2>
<p>JavaScriptについてはCakePHPは遅れています。LaravelはデフォルトでVueやBootstrap等が使えるためそれだけでもだいぶ優位です。CakePHPはまだjQueryでいいんじゃない? というような空気を醸し出していて先進的とはいえません。将来どうなるのか心配になります。</p>
<p>他にもLaravelは色々なものと連携できるようにオフィシャルパッケージも続々追加されています。HomesteadやLaradock、簡単に認証できるSocialiteやWebpackを簡単にしたmixなど、周辺の開発環境なども色々と考慮されてきています。Laravel本家と周辺共に、みんなが開発しやすい環境を作り上げていこうという活発な姿勢が見られ非常に好感が持て、将来性が期待できます。ここは完全にCakePHPが敗北しているところです。</p>
<p>というか、ここだけでも今後はLaravelだけでいいかな、という感じすらします。実際、僕はもう既にLaravelしか使っていません。</p>
<h2 id="今年の結論"><a href="#%E4%BB%8A%E5%B9%B4%E3%81%AE%E7%B5%90%E8%AB%96">今年の結論</a></h2>
<p>趣味だったらLaravelを使うと知識や技術も広まりやすいので僕としては絶対的におすすめです。ただ、趣味なのでやはり好きな方を使えばいいと思います。</p>
<p>仕事だったら色んなフレームワーク使えた方が扱える案件や考え方の幅が広がりますので、できれば両方使ったことがあった方が良いと思います。</p>
<p>ただし他言語も含め、composerのようなパッケージ管理は当たり前の様に使われている時代ですので、composerを使っていないようなフレームワークはもう覚える意味はないように思います。(全て個人的な見解です)</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14230
2018-02-14T18:32:46+09:00
2018-10-31T18:29:31+09:00
https://crieit.net/posts/mobage
mobageで運営していたゲームを終了させた
<h3 id="概要"><a href="#%E6%A6%82%E8%A6%81">概要</a></h3>
<p>mobage & Yahoo! mobageで運営していたゲームを終了申請しており、ついに今月終了となった。<br />
プログラムを見ると2014年のものがいくつかあるので恐らく3年弱くらいになるだろう。</p>
<h3 id="環境"><a href="#%E7%92%B0%E5%A2%83">環境</a></h3>
<ul>
<li>PHP (CakePHP2)</li>
<li>MySQL</li>
<li>cocos2d-x(JS)</li>
</ul>
<h3 id="背景"><a href="#%E8%83%8C%E6%99%AF">背景</a></h3>
<p>mobage等、課金システムのあるOpenSocialのプラットホームは法人でなくてはならない。<br />
自分はフリーランスでエンジニアをしていたが、<br />
OpenSocialのアプリで稼ぎたいと思ったので、mixiアプリが出始めた頃に法人化した。<br />
それでmixi、GREE、mobageに登録し、それぞれアプリを出した。</p>
<p>mixiはまだネココさんというアプリが動いていると思う(誰もプレイしてはいないと思うが)。<br />
GREEもネココさんを動かしていたが、サーバー代が厳しいので終了させた。</p>
<p>mobageはエンディングロードというRPGを出した。AndroidとPCブラウザのハイブリッド。<br />
こちらもサーバー代が厳しかったのでさくらの安いVPSに途中で変更してほそぼそと続けていた。</p>
<p><a href="https://crieit.now.sh/upload_images/087ca829383834f282e393bc330b69885b0d1865e497c.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/087ca829383834f282e393bc330b69885b0d1865e497c.jpg?mw=700" alt="" /></a></p>
<p><a href="https://crieit.now.sh/upload_images/68e98640adb4a76b6f5820a18a34cab55b0d18664d3a5.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/68e98640adb4a76b6f5820a18a34cab55b0d18664d3a5.jpg?mw=700" alt="" /></a></p>
<h3 id="終了した理由"><a href="#%E7%B5%82%E4%BA%86%E3%81%97%E3%81%9F%E7%90%86%E7%94%B1">終了した理由</a></h3>
<p>売上はほとんど無かった。<br />
10連ガチャが初回300円なのだが、3000円で引いているユーザーなんて見たことがない。</p>
<p>でも安いVPSに移動して費用的な負担はほとんど無かったので、記念にずっと残しておこうとは思っていた。<br />
ただ、やっぱり色々懸念点が出てきたので終了することを決めた。<br />
具体的な理由としては下記のようなもの。</p>
<h4 id="問い合わせ対応が大変"><a href="#%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E5%AF%BE%E5%BF%9C%E3%81%8C%E5%A4%A7%E5%A4%89">問い合わせ対応が大変</a></h4>
<p>基本的に問い合わせはちゃんと24時間以内に1次対応をしなければならない。<br />
しかし、土日だってあるし仕事だってあるので毎日見てられない。<br />
問い合わせが来たとしてもほとんどAndroid経由の営業スパムだし。</p>
<p>さらに、僕が普段使うPCをLinux Mintにしたことで問い合わせのソフトが使えなくなってしまった。<br />
問い合わせが来たらWindowsに切り替えるかmacを立ちあげなくてはいけない。<br />
正直もうだいぶ負担だった。</p>
<h4 id="SSL化"><a href="#SSL%E5%8C%96">SSL化</a></h4>
<p>いつからかChromeがSSLでない場合に警告を出すようになった。<br />
世の中はSSLが当たり前に変わっていっている。<br />
恐らく、そのうちChromeかmobageがSSL必須化し、SSL対応を迫られる日が来ることが予想された。</p>
<p>現在無料SSLができるのでそれほど技術的に問題はないのだが、<br />
とはいえ既に稼働中のサーバーであれこれ操作するのは怖い。</p>
<p>それよりも一番問題なのが、先程も書いたようにLinux Mintに変えてしまったので、<br />
開発環境をWindows側に残したままだった。<br />
SSL対応のためにいちいちWindows(起動がすごく重い)に切り替えるのは大変。<br />
しかも実装するとなるとまたあれこれ修正してテストもやり直さなければならない。<br />
かなりの重労働で、ただでさえ仕事で忙しいのに厳しい。</p>
<h4 id="責任"><a href="#%E8%B2%AC%E4%BB%BB">責任</a></h4>
<p>上記の問題点を考えているうちにふと思ったのが、<br />
もし明日、明後日急にSSL必須になったらどうしよう、という思い。</p>
<p>もちろんmobageはちゃんとしていてそういうことは猶予をもってお知らせがあるので問題はないのだが、<br />
例え1,2ヶ月であっても今の自分としては辛い。</p>
<p>そんなこんなやっているうちに対応できずSSL必須化になってしまったら、サービスは止まってしまう。<br />
もしかすると正しく運用出来ないことで責任を追求されたりするのでは…等という考えが頭をめぐった。</p>
<p>サービス終了はもはや当然の決断だった。</p>
<h3 id="最後の問い合わせ"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AE%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B">最後の問い合わせ</a></h3>
<p>不具合の問い合わせが来たのであれこれやり取りして修正した。<br />
今回はDB側で修正すればよかったので問題なかったのだが、<br />
プログラム側の修正が必要だったらと思うとゾッとした。<br />
これが引き金になったと思う。</p>
<h3 id="終了した"><a href="#%E7%B5%82%E4%BA%86%E3%81%97%E3%81%9F">終了した</a></h3>
<p>終了申請をし、課金終了の準備をしてお知らせをし、課金終了までに約1ヶ月、そこから終了までに約1ヶ月、無事終了することが出来た。<br />
ちなみにこのあとも問い合わせ対応を行わなければならない。</p>
<h3 id="ソース"><a href="#%E3%82%BD%E3%83%BC%E3%82%B9">ソース</a></h3>
<p>公開したが、古く汚いので、動かなくて困っている、くらいの人でないと役には立たないものと思われる。</p>
<p>cocos側のプログラム。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/dala00/endingroad">GitHub - dala00/endingroad: Ending Road game client</a></p>
<p>READMEにも書いてあるが、フリー素材などは念の為再配布にならないよう全部削除している。</p>
<p>PHPで書かれたサーバー側は、<br />
万が一mobageの漏洩させてはならない情報を削除し忘れて漏らしてはいけないので、<br />
結構勢い良く適当にフォルダ毎がっつり削除した。<br />
(それでもまだ怖いくらい)</p>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/dala00/endingroad-server">GitHub - dala00/endingroad-server: Ending Road (server application)</a></p>
<p>もう不要だしPSR-2すら知らない頃の汚いプログラムなので何の参考にもならないが、<br />
丸々欲しい人がいれば(機密部分は当然省いて)ゆずるので問い合わせして下さい。</p>
<h3 id="一問一答"><a href="#%E4%B8%80%E5%95%8F%E4%B8%80%E7%AD%94">一問一答</a></h3>
<h4 id="どんなゲームだったのか"><a href="#%E3%81%A9%E3%82%93%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">どんなゲームだったのか</a></h4>
<p>当時リリースされたテラバトルを見て、これなら自分の作ったゲームも売れるんじゃないかと勘違いしてリリースした、簡易ストーリー型のステージクリア型RPG。</p>
<h4 id="クソゲーだったか"><a href="#%E3%82%AF%E3%82%BD%E3%82%B2%E3%83%BC%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%8B">クソゲーだったか</a></h4>
<p>プレイする人によるのではないかと思う。<br />
クソゲーだと思う人もいるだろうし。頑張って作ったので割と遊べるのではないかとも思う。<br />
フリー素材のクオリティも全般的に良かった。</p>
<p>経験値量的にすごく大変なはずなのにイベントキャラ全部最大レベルまで上げてくれた人もいた。本当に感謝。<br />
ちなみにイベントキャラは+99するとSSRよりちょっと強い。(だった気がする)</p>
<h4 id="リジェクトされなかったのか"><a href="#%E3%83%AA%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%95%E3%82%8C%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">リジェクトされなかったのか</a></h4>
<p>一人で作ったので一般のアプリよりはしょぼかったと思うが、そういう理由ではとくにリジェクトされなかった。<br />
不備があったりしたところを直していくとちゃんとリリースまで進めた。</p>
<h4 id="エンディングは"><a href="#%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AF">エンディングは</a></h4>
<p>実はエンディングのステージを作らずに終了してしまった。</p>
<p>考えていたものとしては、下記へ続いていくようなストーリー。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://play.google.com/store/apps/details?id=com.alphabrend.formation&hl=ja"></a></p>
<p>つまり偉い人たちが増えすぎた人間を排除するために世界は滅亡するという噂を広めた。<br />
人々は楽園をめざすために冒険して減っていき、楽園に着いてもエルアネットに転送される。<br />
(転送されるのか、偉い人側にいくのかは決めていなかった)</p>
<p>ちなみに舞台は未来の地球という設定。エアルスという名前にしようとしたが、<br />
どうもガンダムで使われているようなのでルシアとかで想像していたと思う。</p>
<h4 id="サーバー解約できて良かったですね"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E8%A7%A3%E7%B4%84%E3%81%A7%E3%81%8D%E3%81%A6%E8%89%AF%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A7%E3%81%99%E3%81%AD">サーバー解約できて良かったですね</a></h4>
<p>上記のアプリが一緒に入っているので解約できなかった…。<br />
誰もプレイしていないみたいだし停止するか記念にGCPに移動してゼロ円運用(移動が面倒)するか検討中。</p>
<h4 id="再公開はするのか"><a href="#%E5%86%8D%E5%85%AC%E9%96%8B%E3%81%AF%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B">再公開はするのか</a></h4>
<p>他に作りたいものがどんどん出てくるしそんなことをする暇はないので可能性は少ないが、<br />
もし気が向いて試して一瞬で可能そうだったらやるかもしれない。<br />
ただし可能性はかなり低い。</p>
<h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3>
<p>一人でもソーシャルアプリは作れる。会社で複数人いるならもちろん。<br />
こういったプラットホームは何もしなくてもインストールしてもらえるのでありがたいが、それだけでは絶対に足りない。</p>
<p>通常のゲームと同様、自分たちでちゃんと宣伝し、課金率も上げていかないと運営は成功しない。<br />
やるならきちんとやらなければならない。<br />
ゲームを作ってリリースして運用するのはとても楽しい。</p>
<p>技術的な話はQiitaで。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/dala00/items/8417077b99b66692ab60">mobageで運営していたゲームのソースを公開</a></p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14232
2018-01-16T18:27:06+09:00
2018-10-31T16:26:58+09:00
https://crieit.net/posts/Docker-PHP5-5-LAMP
DockerでPHP5.5のLAMP環境を作成
<p>DockerでPHP5.5のLAMP環境を作成しました。</p>
<p>(PHP7.2のDocker環境サンプルは下記にあります)<br />
<a href="https://crieit.net/posts/PHP5-3-PHP7-2">PHP5.3のプロジェクトを7.2にした時の流れ</a></p>
<p>元々ローカル環境のまま、だましだまし動かしていましたが、シェルだとCake2のObjectクラスがコンフリクトしてついに動かなくなってしまったのでやむなく作成しました。</p>
<h3 id="Dockerfile"><a href="#Dockerfile">Dockerfile</a></h3>
<pre><code class="sh">FROM nyanpass/php5.5:5.5-apache
RUN echo 'date.timezone = "Asia/Tokyo"' > /usr/local/etc/php/conf.d/timezone.ini
RUN a2enmod rewrite
RUN docker-php-ext-install pdo_mysql mysqli mbstring
</code></pre>
<p>docker-composer.yml</p>
<pre><code class="yaml">version: '2'
volumes:
mysql_data:
driver: 'local'
services:
mysql:
image: mysql:5.5
volumes:
- mysql_data:/var/lib/mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=
ports:
- 8100:80
zenkokutenkai:
image: Dockerfileでビルドしたイメージ名
volumes:
- .:/var/www/html
ports:
- "8050:80"
tty: true
stdin_open: true
</code></pre>
<p>こんな古いLAMPプロジェクトのためにDocker環境なんて作りたくない…とは思うのですがこういう状況だからこそDockerが役立つんですよね…。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14261
2017-03-10T08:49:58+09:00
2018-09-12T17:47:10+09:00
https://crieit.net/posts/CakePHP3
一人もくもく会をCakePHP3のみに変更
<p>Angular + CakePHP3 で作成していた</p>
<p><a target="_blank" rel="nofollow noopener" href="https://mokumoku.alphabrend.com/">一人もくもく会</a></p>
<p>だが、Angularを捨ててCakePHPのみに修正した。</p>
<p>お客さんのために作成したサイトでも何でもないのでSEO対策とかどうでも良かったのでAngularを入れて試したのだが、<br />
そもそもGoogleボットがレンダリングした状態を認識すらしてくれなかった。</p>
<p>インデックスもされないし、コンテンツも取得されない。<br />
流石にそれはサイトとして存在させるメリットすらないのでAngularを使うのをやめた。</p>
<h3 id="Fetch as Google"><a href="#Fetch+as+Google">Fetch as Google</a></h3>
<p>Search ConsoleにFetch as Googleという機能があり、<br />
クローラに実際にどのようにサイトが見えているかを確認できるのだが、<br />
それを実行したところ「Loading...」のみが表示されていた。</p>
<h3 id="原因"><a href="#%E5%8E%9F%E5%9B%A0">原因</a></h3>
<p>原因は不明。<br />
ただ、公開直後はFetch as Googleでちゃんとレンダリングされていた。<br />
途中でAngularのバージョンをあげたのでそのあたりが原因かもしれない。</p>
<h3 id="原因の特定"><a href="#%E5%8E%9F%E5%9B%A0%E3%81%AE%E7%89%B9%E5%AE%9A">原因の特定</a></h3>
<p>今回は面倒だったので特定せずにCakePHPのみにした。</p>
<p>JavaScriptを使い、tryでエラーをcatchできるので、それで試してみると良い、とどこかに書かれていた。<br />
結局クローラアクセスの場合だけ出るエラーなどがJavaScript上にある場合、こうなってしまうのかもしれない。<br />
JavaScriptフレームワークでサイトを構築するときに気をつけなければならない点のようだ。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14262
2017-02-26T05:54:54+09:00
2017-02-26T05:54:54+09:00
https://crieit.net/posts/wercker-CakePHP3
werckerでCakePHP3のカバレッジ
<p>CakePHP3でwerckerのCIを設定している。<br />
カバレッジも表示したいのだが、BitBucketのプライベートリポジトリは無料でカバレッジを表示できるサービスが多分無い。</p>
<p>そのため別途解決策として、<br />
出力したカバレッジhtmlを他の適当にレンタルしているサーバーなどにscpで転送することでいつでも見られるようにしてみた。</p>
<p>先日作成したDockerイメージを少し改良してカバレッジと転送したものを作成した。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/r/dala00/wercker-cakephp3-coverage/">https://hub.docker.com/r/dala00/wercker-cakephp3-coverage/</a></p>
<p>scpで転送するのでssh鍵をwerckerの環境変数に設定する必要がある。<br />
また、pipelineの設定もする必要があるがそれらは下記のページが詳しい。</p>
<p><a target="_blank" rel="nofollow noopener" href="http://blog.funxion.jp/162/">werckerを使ってBitbucketからさくらのVPSに自動デプロイ - funxion</a></p>
<p>これでビルドが実行するとサーバー上にhtmlがアップされている状態となり、<br />
ブックマークしておけばいつでも見られる状態となる。<br />
(単なるhtmlなので自分の場合IP制限をかけている)</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14264
2017-02-23T06:04:09+09:00
2017-02-23T06:04:09+09:00
https://crieit.net/posts/CakePHP3-wercker-CI
CakePHP3プロジェクトをwerckerで無料CI
<p>werckerにて、CakePHP3プロジェクトの無料CI設定をしたログ。</p>
<p>良いDockerイメージがなくwercker-laravel5を参考に作成したので、<br />
基本的には下記に書いてあることそのままで設定可能。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/r/dala00/wercker-cakephp3/">https://hub.docker.com/r/dala00/wercker-cakephp3/</a></p>
<p>DBのホスト名とポートが環境変数で渡されるのでapp.phpのDBのtest設定を下記のように変更。</p>
<pre><code class="php">'host' => env('MYSQL_PORT_3306_TCP_ADDR', 'localhost'),
'port' => env('MYSQL_PORT_3306_TCP_PORT', 3306),
</code></pre>
<p>そしてwerkcer.yml</p>
<pre><code class="yaml">box: dala00/wercker-cakephp3
services:
- id: mysql
env:
MYSQL_ROOT_PASSWORD: rootpasswd
MYSQL_USER: testuser
MYSQL_PASSWORD: testpasswd
MYSQL_DATABASE: testdb
build:
steps:
- script:
name: Install dependencies
code: |
composer install
- script:
name: Run phpunit
code: |-
vendor/bin/phpunit
</code></pre>
<p>MySQLは設定がデフォルトなので、not nullカラムを無指定で保存しようとするとエラーになる。<br />
ローカルで設定を変えていたりするとそのへんでテストの差異が出るので、<br />
ローカルも設定を合わせたりコンテナを使って開発したりなどの注意が必要。</p>
<p>カバレッジが必要な場合はこちら</p>
<p><a target="_blank" rel="nofollow noopener" href="http://alphabrend.hatenablog.com/entry/2017/02/25/205454">werckerでCakePHP3のカバレッジ - アルファブレンド プログラミングチップス</a></p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14271
2017-02-12T05:53:12+09:00
2018-10-25T12:50:27+09:00
https://crieit.net/posts/Angular2-CakePHP3
Angular2とCakePHP3を共存させる
<p>AngularとCakePHPを共存、つまり同じホスト名で動作させたい場合。<br />
例えば下記のように隣同士で並んでいるとする。<br />
Angularはビルドしたdistフォルダのみの公開でその他のソースはアップなどはしない場合。</p>
<ul>
<li>app</li>
<li>dist</li>
</ul>
<p>公開フォルダはAngular側のdistフォルダにするが、<br />
AngularもCakePHPもルーティングが必要になるので、distフォルダ内の.htaccessで両方動作するように設定を行う。</p>
<p>CakePHP側は、全てapiというprefix内にプログラムを入れることで振り分けが容易となる。</p>
<pre><code class="bash">RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/api/
RewriteRule ^ index.php [L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</code></pre>
<p>index.phpはCakePHPのwebrootのもののパス部分の記述だけを修正。下記の2箇所。</p>
<pre><code class="php">require dirname(__DIR__) . '/app/vendor/autoload.php';
</code></pre>
<pre><code class="php">$server = new Server(new Application(dirname(__DIR__) . '/app/config'));
</code></pre>
<p>index.phpと.htaccessはAngularの開発時のsrcフォルダに入れておき、<br />
angular-cli.jsonのapps.assetsの設定に含めておけば良い。</p>
<p>こういった方法であればホスト名も同じにできるので、SSLを2つ分とったり、などという手間をかける必要がなくなる。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14272
2017-02-11T01:22:31+09:00
2018-10-18T01:18:48+09:00
https://crieit.net/posts/f740e34f70d01a0feec3c4c60a66392f
一人もくもく会というサービスを作成
<p>一人もくもく会というサービスを作成して公開した。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://mokumoku.alphabrend.com/">一人もくもく会</a></p>
<h3 id="概要"><a href="#%E6%A6%82%E8%A6%81">概要</a></h3>
<p>世の中誰でも夜暇な時に適当にプログラミングをあれこれ試す時があると思うが、<br />
そういった時のログを投稿できるサービス。</p>
<p>Qiitaやブログのようにきっちりプログラムや記事を完成させなくても、<br />
適当にどんどんその日毎のログを残すためのもの。</p>
<h3 id="フレームワーク"><a href="#%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF">フレームワーク</a></h3>
<ul>
<li>Angular</li>
<li>CakePHP3</li>
</ul>
<p>デザインはとりあえずAngular MaterialやMaterial Design Liteをごちゃごちゃに使っている。<br />
できればAngular Materialのみでやりたかったが、こちらは現在betaで開発中のため色々足りない。<br />
他のあちらこちらから色々使えるパーツを探してきて使う必要がある。</p>
<h3 id="現状"><a href="#%E7%8F%BE%E7%8A%B6">現状</a></h3>
<p>とりあえず必要最低限以下の機能を作成しただけなので、αバージョン。<br />
誰でもすぐGithubアカウントかTwitterアカウントでログインできるので、<br />
気が向いた方は使っていただける状態。<br />
0円でSSLもつけているので。</p>
<h3 id="今後"><a href="#%E4%BB%8A%E5%BE%8C">今後</a></h3>
<p>作成は進めていくが、せっかくなのでその開発ログも実際にサービス上に残していく予定。<br />
誰にも利用されなくてもデータが増えていくというのは一石二鳥だ。</p>
<h3 id="その他補足色々"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96%E8%A3%9C%E8%B6%B3%E8%89%B2%E3%80%85">その他補足色々</a></h3>
<h4 id="マークダウン"><a href="#%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3">マークダウン</a></h4>
<p>投稿はmarkdownで可能。<br />
Github色のシンタックスハイライトも入れてある。</p>
<h4 id="SPA"><a href="#SPA">SPA</a></h4>
<p>Angularを使っているのでSPAとなっている。<br />
面倒なのでサーバーサイドレンダリングはしていない。<br />
とりあえずGoogleのクローラに全部お任せ。<br />
きっとそのうちAngular自体がデフォルトでUniversal対応してくれるだろう。</p>
<h4 id="Google Analytics"><a href="#Google+Analytics">Google Analytics</a></h4>
<p>SPA用にAutotrackというのがあるのでそれを使った。動いているかは不明。</p>
<h4 id="ソーシャルシェア、ブックマーク"><a href="#%E3%82%BD%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%82%B7%E3%82%A7%E3%82%A2%E3%80%81%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF">ソーシャルシェア、ブックマーク</a></h4>
<p>投稿データにシェア、ブックマークボタンをいくつか入れてみた。<br />
SPA用に調整してあるので多分動くと思うがまだ記事が0なので本番では未確認。<br />
うまく動かなかったら投稿しつつ修正していく。</p>
<h4 id="タグ"><a href="#%E3%82%BF%E3%82%B0">タグ</a></h4>
<p>タグ機能があり自由にタグを追加できるので、<br />
イベントタグを作ってみんなで参加、ということも可能。<br />
これでオフラインもくもく会を流行らせたい。</p>
<h4 id="ソース管理"><a href="#%E3%82%BD%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86">ソース管理</a></h4>
<p>非公開なのでBitBucket。CakePHP3のCIはCodeship。<br />
Angularは元々テストでエラーが出まくってしまうのでエラーを取り切ってから対応予定。</p>
<h4 id="不具合"><a href="#%E4%B8%8D%E5%85%B7%E5%90%88">不具合</a></h4>
<p>いくつかある。早めに必要な機能などもある。掲載しつつ修正していく。</p>
<h4 id="デプロイ"><a href="#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4">デプロイ</a></h4>
<p>distフォルダ毎サーバーにアップすれば良いのだが、<br />
それだけでも毎回面倒なのでデプロイ用のプログラムを作る必要がある。</p>
<p>ただ、各ファイルのハッシュ値はソースを変更しなければ毎回同じっぽいので、<br />
dist毎pushしてしまえばサーバー側はpullだけでもいいかもしれない。</p>
<p>ちなみに、distディレクトリにCakePHP用のindex.phpが入っていて、.htaccessでCakePHP側とAngular側を振り分けている。<br />
またこの詳細は別記事に書く。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14275
2017-01-31T01:43:46+09:00
2017-01-31T01:43:46+09:00
https://crieit.net/posts/Codeship-BitBucket-CakePHP3-CI
CodeshipでBitBucketのCakePHP3のCI
<p>BitBucketのCakePHP3プロジェクトのリポジトリをCodeshipで無料CIを試した。</p>
<p>werckerを使おうと思ったのだが適したDockerイメージが無いとダメで、<br />
適当に設定してみようと思ったがうまくいかなかったりして時間の無駄な気がしたので、<br />
試しにCodeshipを使ってみたらすぐ動いた。</p>
<p>月間特定の数のビルド、等であれば無料で使える。</p>
<p>設定方法だが、基本的には言われるがまま設定すればできる。<br />
php選択肢が途中であるのでそれを使えば良い。<br />
phpunitはうまくいかなければ直接vendor/bin/phpunitに変更。</p>
<p>プログラム側だが、環境変数が渡されるのでDB接続情報にそれを使えば良い。</p>
<pre><code class="php">'username' => env('MYSQL_USER', 'test'),
'password' => env('MYSQL_PASSWORD', 'test'),
'database' => env('TEST_ENV_NUMBER') ? ('test' . env('TEST_ENV_NUMBER')) : 'test',
</code></pre>
<p>あとはpushしたりretryすれば普通に動いて完了する。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14282
2016-12-22T05:55:55+09:00
2018-08-15T11:34:35+09:00
https://crieit.net/posts/cakephp-migrations
cakephp/migrationsにプルリクエストを送った
<h3 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h3>
<p><a target="_blank" rel="nofollow noopener" href="http://qiita.com/advent-calendar/2016/cakephp3">CakePHP3 Advent Calendar 2016 - Qiita</a></p>
<p>20日目が空いていたので。</p>
<h3 id="内容"><a href="#%E5%86%85%E5%AE%B9">内容</a></h3>
<p>CakePHP3のマイグレーションにはmigration_diffという機能があり、<br />
差分から自動的にマイグレーションファイルを作ってくれる超便利な機能がある。</p>
<p>ただ1点、<br />
afterオプションだけ自動的につけてくれない、<br />
という仕様だったのがずっと気になっていた。</p>
<p>気になってソースを調べてみると、<br />
なんとなく可能なんじゃないか、という感じに見えた。<br />
でも付けられていないということは何か理由でもあるのだろうか?</p>
<p>と思いつつ対応してみたら簡単にafterをつけることができた。<br />
せっかくなのでテストも作成し、issueでPRしていいか聞いてみたところOKが出たのでPR。<br />
Milestoneにも入ったので問題なければ恐らくマージされるのではないかと思う。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/cakephp/migrations/pull/281">Add 'after' attribute to migration_diff by dala00 · Pull Request #281 · cakephp/migrations · GitHub</a></p>
<p>ちなみにafterが無いのは特に理由はなくまだだれも対応していなかっただけだった。</p>
<h3 id="テスト方法"><a href="#%E3%83%86%E3%82%B9%E3%83%88%E6%96%B9%E6%B3%95">テスト方法</a></h3>
<p>migration_diffのテストは、実行後git statusしてみるとだいたい分かるが、<br />
マイグレーションファイルが作成され、それを想定される出力結果ファイルと比較する、というもの。<br />
MySQLやPostgresでファイルが分かれているのでそれぞれテストして出力結果ファイルを修正する。</p>
<p>そのあたりをきちっとやったら後は環境依存のエラーやよくわからないものが出るので、<br />
forkしたリポジトリをTravis CIでチェックして本家と同じ感じになればOKだと思われる。<br />
PRした時も同様のチェックが自動的に行われる。</p>
<h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3>
<p>せっかくのオープンソースなので気になったり不足を感じる点があったら是非PRしてみた方が良い。<br />
あとはマージされることを祈るばかり。</p>
<p>ちなみに仕事場ではもう勝手に修正をあてている。<br />
もしマージされなかったら永久に自分で修正し続けるしかない。</p>
<p>追記)マージされました。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14286
2016-12-01T09:01:42+09:00
2019-04-07T22:47:47+09:00
https://crieit.net/posts/CakePHP3-5b0d18a432ff5
CakePHP3の優位性を色々
<h3 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h3>
<p>この記事は下記の1日目としての投稿。</p>
<p><a target="_blank" rel="nofollow noopener" href="http://qiita.com/advent-calendar/2016/cakephp3">CakePHP3 Advent Calendar 2016 - Qiita</a></p>
<p>昨今は様々なphpフレームワークがある。Laravelとかは最近流行ったりしていて色々触ってみるが、<br />
自分はやっぱりCakePHP3に帰ってきてしまう。それだけ便利で楽だからだ。</p>
<p>他のフレームワークには慣れているけど、CakePHPはなんか古臭くて触ってない、という人も是非一度使って見てほしい。<br />
離れられなくなるはず。<br />
CakePHP2以前しか使ったことがない人も一度触ってみてほしい。</p>
<p>では何が一体そんなにいいのか、色々と述べてみる。</p>
<h3 id="ルーティングなんて設定しない"><a href="#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AA%E3%82%93%E3%81%A6%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%84">ルーティングなんて設定しない</a></h3>
<p>設定しない。するとしてもprefixルーティングくらい。<br />
コントローラとテンプレートがあれば設定しなくてもアクセスできる。</p>
<p>もちろん、他に変えたければできる。</p>
<pre><code class="php"><?php
Router::connect(
'/articles/:id',
['controller' => 'Articles', 'action' => 'view'],
['id' => '\d+', 'pass' => ['id']]
);
</code></pre>
<p>しかもテンプレート上で普通にヘルパーでリンクを作ると、勝手に設定したURLに置き換えてくれる。<br />
変更後等もわざわざテンプレート側の調整等するのは古い時代のフレームワーク群の話。</p>
<pre><code class="html"><?= $this->Html->link(
'閲覧する',
['controller' => 'Articles', 'action' => 'view', $acticle->id]
) ?>
出力: <a href="/acticles/5">閲覧する</a>
</code></pre>
<h3 id="高性能なDebugKit"><a href="#%E9%AB%98%E6%80%A7%E8%83%BD%E3%81%AADebugKit">高性能なDebugKit</a></h3>
<p>こんな便利なデバッグバーは他にはない。デザインも秀逸で見やすく扱いやすい。</p>
<p><a href="https://crieit.now.sh/upload_images/7eff0e3ddbb0f81392b3f3dc1be178565b0d18a6067b0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7eff0e3ddbb0f81392b3f3dc1be178565b0d18a6067b0.png?mw=700" alt="" /></a></p>
<p>一番下にバーがあり、各タブをクリックすると全画面でデータが表示される。これが一番ベストだと気づいた。<br />
CakePHP2のデバッグキットや他のフレームワークのもの等は、<br />
下などに中途半端なサイズでドッキングしていてなんとかウィンドウにカーソルを合わせてサイズ調整したり、<br />
両方狭い状態で操作したりするのはストレスになるだけで完全に時間の無駄だった。</p>
<p>テンプレートにsetされた変数はここで見られる。非常に見やすい。<br />
<a href="https://crieit.now.sh/upload_images/76da504d59cd23f47562acdedafbb42e5b0d18a6c87f6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/76da504d59cd23f47562acdedafbb42e5b0d18a6c87f6.png?mw=700" alt="" /></a></p>
<p>SQL。</p>
<p><a href="https://crieit.now.sh/upload_images/b0e1b116fac539b7d0a3c9a41774dda55b0d18a8ddb66.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b0e1b116fac539b7d0a3c9a41774dda55b0d18a8ddb66.png?mw=700" alt="" /></a></p>
<p>時間やメモリ使用の流れも見られる。</p>
<p><a href="https://crieit.now.sh/upload_images/210e1a42c829848b4c3be0d2746144125b0d18a9e1d86.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/210e1a42c829848b4c3be0d2746144125b0d18a9e1d86.png?mw=700" alt="" /></a></p>
<p>その他定数定義やrequestオブジェクトの中身、セッション等も見られる。<br />
一度慣れたら他のフレームワークで開発する気にはなれない。</p>
<h3 id="ORMがすごい"><a href="#ORM%E3%81%8C%E3%81%99%E3%81%94%E3%81%84">ORMがすごい</a></h3>
<pre><code class="php"><?php
// シンプルな例。別にすごくはない。
$articles = $this->Articles->find()
foreach ($articles as $article) {
$article->title;
}
// 実は$articlesはQuery。配列じゃない。なので使いまわせる。
$allCount = $articles->count();
$articles->where(['category_id' => $categoryId]);
$countInCategory = $articles->count();
// ResultSetに変換
$this->set("articles{$categoryId}", $articles->all());
// 配列に変換
$this->set("array{$categoryId}", $articles->toArray());
</code></pre>
<p>echoするとクエリになるのでそのままサブクエリで使える。</p>
<pre><code class="php"><?php
$sub = $this->Articles->Comments->find()
->where([〜〜〜〜]);
$articles = $this->Articles->find()
->where(["($sub) > 5"]);
</code></pre>
<p>それぞれのデータはEntityなので例えば下記のようなメソッドを追加すると</p>
<pre><code class="php"><?php
protected function _getDisplayName()
{
if ($this->private) {
return '非公開';
} elseif ($this->company) {
return $this->company;
} elseif ($this->name) {
return $this->name;
}
return '未登録';
}
</code></pre>
<p>テンプレートは下記だけでいい。今の時代フレームワークを使ってるのに同じif文を複数のテンプレートに大量に書くなんてことはまさかしないだろう。</p>
<pre><code class="html"><?= $article->user->display_name ?>
</code></pre>
<h3 id="bakeでコード生成"><a href="#bake%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90">bakeでコード生成</a></h3>
<p>昔はコントローラもモデルも自分で一から書いてもさほど変わらない、というところがあったが、<br />
今は設定なども増えて便利になっているので、bakeするのがかなり効率的。というかコントローラとモデルはすべてbakeで作るべき。<br />
テストの雛形も作ってくれるし、そもそも記憶を頼りに適当に作ると変な設定を書いてエラーになってしまったりする。</p>
<h4 id="モデル"><a href="#%E3%83%A2%E3%83%87%E3%83%AB">モデル</a></h4>
<p>TableとEntityが作られる。</p>
<p>Tableでは基本的な設定、コンポーネントのロード、DBを元にしたカラムやリレーションの設定、<br />
バリデーション、データチェックの設定などが自動で作成される。<br />
NULLでないカラムは必須項目に設定されたり等する。</p>
<p>Entityは特にたいした設定は行われないが、<br />
passwordカラムがあったりするとjson_encodeした際に含まれないような設定を追加してくれていたりする。</p>
<h4 id="コントローラ"><a href="#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9">コントローラ</a></h4>
<p>特に設定しなければCRUDアクションが勝手に作られる。<br />
特に拘り不要の管理画面などであればbakeだけで作れるし、<br />
そうでなくてもベースに使えるのでかなり楽。</p>
<h4 id="テンプレート"><a href="#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88">テンプレート</a></h4>
<p>こちらもbakeで作成したコントローラそのままで使ったりするのであればそのまま使える。<br />
Bootstrapのプラグインもあるのでそちらを使うことも可能。<br />
まあテンプレートは必要であれば使う、と言ったところか。</p>
<h4 id="その他"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96">その他</a></h4>
<p>なんでもかんでもbakeで雛形を作ってくれる。<br />
コマンドオプションも色々見てみると楽しい。</p>
<h3 id="APIとしてjsonを使いたい時"><a href="#API%E3%81%A8%E3%81%97%E3%81%A6json%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84%E6%99%82">APIとしてjsonを使いたい時</a></h3>
<p>デフォルトでは特に何もする必要はない。普通にindexとかviewのアクションにAcceptヘッダーとしてapplication/jsonを送ればhtmlでなくjsonが返ってくる。</p>
<p>URLを変えたり状況によってjson用のresponseをreturnしたりするコードを書くのは昔の時代のフレームワークの話。もちろんそういったこともできる。</p>
<p>(実際にはそういった設定があるのだが、初期化時点でその設定のコードが入っている)</p>
<h3 id="マイグレーションの便利な機能"><a href="#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BE%BF%E5%88%A9%E3%81%AA%E6%A9%9F%E8%83%BD">マイグレーションの便利な機能</a></h3>
<p>phpMyAdminで適当にテーブルを構築しておけば、コマンド一発でマイグレーションファイルを作ってくれる。すごく楽。<br />
稼働中のプロジェクトにマイグレーションを途中から導入することも問題ない。</p>
<p>自分で書いて、抜けが見つかったらrollback&migrateでテスト中のデータとか一旦空になったりとか、面倒じゃないんだろうか?</p>
<p>初期化。</p>
<pre><code class="sh">bin/cake bake migration_snapshot Initial
</code></pre>
<p>差分のマイグレーション作成</p>
<pre><code class="sh">bin/cake bake migration_diff NameOfTheMigrations
</code></pre>
<p>マイグレーションファイルが増え過ぎたらマイグレーション関連データとファイルを削除してまたsnapshotすれば1ファイルにまとまる。</p>
<h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3>
<p>他にもアソシエーション関連機能は便利だし、優位性関係なく非常に便利な機能が揃っている。</p>
<p>やっぱり仕事を早く効率的に終わらせたいなら、phpフレームワークの中ではCakePHP3が一番いいのではないかと思う。(個人的意見)</p>
<p>追記)<br />
そして2018年にこういうのを書きました<br />
<a href="https://crieit.net/posts/CakePHP-Laravel-2018">CakePHPとLaravelの比較2018</a></p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14292
2016-10-15T00:52:18+09:00
2018-10-24T18:19:13+09:00
https://crieit.net/posts/CakePHP3-Laravel5
CakePHP3とLaravel5のマイグレーション比較
<p>phpのフレームワークには大体マイグレーション機能がついている。<br />
業務でアプリケーション開発を行う時は各開発者のローカルの開発環境、サーバー上の開発環境、ステージング環境、本番環境などと分かれていたりするため、<br />
そういった場合はマイグレーションを使用すると本当に楽。</p>
<p>なので使うのは使うのだが、正直あまり好きではない。<br />
rollbackして再度migrateしたら一度データは消えてしまうし、<br />
本当はRidgepoleのように完成形だけ保存して勝手にその形に合わせて欲しいというのが本音。</p>
<p>ただ、必ずしもそうできるというわけではないので、それでも使うのであればなるべく楽したい、<br />
ということでCakePHP3のマイグレーションの便利さをLaravel5と比較してみる。</p>
<h3 id="Laravel5のマイグレーション"><a href="#Laravel5%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">Laravel5のマイグレーション</a></h3>
<p>Laravelのマイグレーションは必要なものは揃っていて、基本という感じ。<br />
seedもあるのでデータの初期化もできる。</p>
<h4 id="雛形作成"><a href="#%E9%9B%9B%E5%BD%A2%E4%BD%9C%E6%88%90">雛形作成</a></h4>
<pre><code class="sh">php artisan make:migration add_votes_to_users_table --table=users
php artisan make:migration create_users_table --create=users
</code></pre>
<h4 id="実際の処理書き込み"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AE%E5%87%A6%E7%90%86%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF">実際の処理書き込み</a></h4>
<pre><code class="php">$table->string('name')->nullabel()->after('id');
</code></pre>
<h4 id="実行"><a href="#%E5%AE%9F%E8%A1%8C">実行</a></h4>
<pre><code class="sh">php artisan migrate
</code></pre>
<p>特に迷うこともなく簡単。<br />
その他にもいくつか機能はある。</p>
<h3 id="CakePHP3のマイグレーション"><a href="#CakePHP3%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">CakePHP3のマイグレーション</a></h3>
<p>基本的なところは大して変わらない。<br />
だが、いくつか便利なものがある。</p>
<h4 id="差分から勝手にマイグレーションファイル作成"><a href="#%E5%B7%AE%E5%88%86%E3%81%8B%E3%82%89%E5%8B%9D%E6%89%8B%E3%81%AB%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BD%9C%E6%88%90">差分から勝手にマイグレーションファイル作成</a></h4>
<p>なんと、最後のマイグレーションと現在の構成を比較し、<br />
勝手にマイグレーションファイルを作成してくれる。<br />
phpMyAdminで適当にカラム追加したり調整したりして<br />
最後に実行すればいいだけ。すごく楽。</p>
<pre><code class="php">bin/cake bake migration_diff AddFlagToTable
</code></pre>
<p>afterだけ自動ではないので自分であとで付ける。</p>
<p>これも間違いがあった場合はrollbackで戻せる。</p>
<p>またこの機能のため、現在の構成をダンプデータとして保存しておいたり、<br />
マイグレーション済みとしてマーキングしたりすることも可能なので<br />
適宜その時の状態に応じて調整できる。</p>
<p>マイグレーション無しで進めてしまったアプリケーションも後付でマイグレーション方式に変更できる。</p>
<p>コード書く量を減らして早く仕事を終わらせよう。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14294
2016-09-22T07:20:53+09:00
2018-10-31T20:46:33+09:00
https://crieit.net/posts/CakePHP3-5b0d18ac931f7
CakePHP3でアソシエーションが保存されない
<p>CakePHP3は単なるエンティティの保存もアソシエーションを含む保存も全てsaveメソッドで行う。<br />
しかしなぜかこの関連データが保存されない場合があった。</p>
<p>原因を探ってみるとdirtyが無かったため。<br />
Users hasMany Itemsの場合であれば</p>
<pre><code class="php">$user->dirty('items');
</code></pre>
<p>とすればuserに変更が無くてもitemsが保存される。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14295
2016-09-07T06:23:21+09:00
2018-08-30T15:51:33+09:00
https://crieit.net/posts/CakePHP3-Email-from-DB
CakePHP3でEmailのfromの共通設定をDBで指定する
<p>CakePHP3はapp.phpにてメール送信のfromのデフォルトを簡単に設定できる。</p>
<p>固定ならそれで問題ないのだが、問題はDBの設定でfromを指定したい場合。</p>
<p>bootstrap.phpを見てみると、app.phpの設定はConfigure::consumeで削り取られており、<br />
あとでConfigure::writeをしてもfromを動的に反映させることができない。<br />
Emailのクラスを見ても設定できる方法はない。</p>
<p>しかしよく見ると、EmailにはStaticConfigTraitが使用されている。<br />
これを利用することでfromのデフォルトを動的に指定することができる。<br />
下記のようなコードをアプリケーションの共通処理で行っておけば良い。</p>
<pre><code class="php">$keys = Email::configured();
foreach ($keys as $key) {
$emailConfig = Email::config($key);
$emailConfig['from'] = $config->from_setting;
Email::drop($key);
Email::config($key, $emailConfig);
}
</code></pre>
<p>設定は変更できないので、丸々入れ替える形。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14305
2016-07-15T23:21:07+09:00
2018-10-30T17:40:22+09:00
https://crieit.net/posts/CakePHP3-prefix
CakePHP3のテーブルにprefixを使う方法
<p>CakePHP2まではDB設定でprefixが使用できたのだが、<br />
何故か3になってから設定がなくなっている。<br />
テーブルクラスにそれぞれ設定していくのが普通だが、</p>
<p>bootstrap.phpのuseをたくさんしている箇所に</p>
<pre><code class="php">use Cake\Event\EventManager;
</code></pre>
<p>末尾に</p>
<pre><code class="php">EventManager::instance()->on('Model.initialize', function ($event) {
$instance = $event->subject();
if (strpos(get_class($instance), 'DebugKit') === false) {
$instance->table('myapp_' . $instance->table());
}
});
</code></pre>
<p>でもできる。</p>
<p>ただし何かのライブラリ等でModel.initialize前に処理をしている場合にはエラーになるので、<br />
テーブル毎に設定するのがかたそう。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14306
2016-06-30T05:56:03+09:00
2018-10-25T15:43:38+09:00
https://crieit.net/posts/CakePHP3-head-SEO-link
CakePHP3ページネーション時にhead内にSEO対策のlinkタグを挿入する
<p>ページ分けをする際、それらのページは一連の同じページであることを示すために<br />
headタグ内に下記のようなタグを挿入する。<br />
下記のような感じ。</p>
<pre><code class="html"><link rel="prev" href="http://www.example.com/article?story=abc&page=1" />
<link rel="next" href="http://www.example.com/article?story=abc&page=3" />
</code></pre>
<p>CakePHP2のころからあったようでそちらのマニュアルには書かれているのだが、<br />
下記をheadタグ内に入れておくだけで可能。<br />
defaultレイアウトに入れておけば良い。</p>
<pre><code class="php"><?= $this->Paginator->meta() ?>
</code></pre>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14308
2016-06-21T06:24:35+09:00
2018-10-31T11:29:52+09:00
https://crieit.net/posts/Hierselect
Hierselectプラグインの作成
<p>HierselectのjQueryプラグインを作成した。<br />
Hierselectというのは、例えばプルダウンで大、中、小カテゴリを選択する際に、<br />
大カテゴリの選択によって中カテゴリプルダウンの中身を属するもののみに更新し、<br />
さらに中カテゴリの選択によって小カテゴリのプルダウンの中身を更新、<br />
のような機能。</p>
<p>他にも同様のプラグインがあったのだが、<br />
phpで作成したselectタグではちょっと使いにくい部分があったので作成した。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/dala00/jquery-hierselect">GitHub - dala00/jquery-hierselect: Simple jquery hierSelect plugin</a></p>
<p>上記のスクリプトさえ読み込んでおけば、<br />
javascriptで設定する必要は無くHTMLだけで動作させることができる。<br />
サンプルは下記。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://dala00.github.io/jquery-hierselect/">https://dala00.github.io/jquery-hierselect/</a></p>
<p>下記のような感じでdata属性を追加するだけで良い。</p>
<pre><code class="html"><!-- parent -->
<select id="parent" data-hier-target="#child" data-hier-name="parent-id">
<option value="1">Fruit</option>
<option value="2">Animal</option>
</select>
<!-- child -->
<select id="child">
<option></option><!-- you can use empty option -->
<option value="1" data-parent-id="1">Apple</option>
<option value="2" data-parent-id"=1">Orange</option>
<option value="3" data-parent-id="2">Dog</option>
<option value="4" data-parent-id="2">Cat</option>
</select>
</code></pre>
<h3 id="CakePHPで利用"><a href="#CakePHP%E3%81%A7%E5%88%A9%E7%94%A8">CakePHPで利用</a></h3>
<p>本題として、CakePHPで簡単に動作させたかったというのがある。<br />
CakePHPでは通常のリスト配列でなく、<br />
['text' => '....', 'value' => '...', 'data-category-id' => ***]<br />
の配列を渡せば良い。</p>
<p>この2つを組み合わせることで簡単に(?)Hierselectを動作させることができるようになる。<br />
プロジェクトごとに何度も書くのが面倒なのでプラグイン公開してみただけ。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14311
2016-05-11T06:34:18+09:00
2018-10-30T15:48:25+09:00
https://crieit.net/posts/CakePHP-Laravel
CakePHPとLaravelの使い道
<p>2018年版も書きました。<br />
<a href="https://crieit.net/posts/CakePHP-Laravel-2018">CakePHPとLaravelの比較2018</a></p>
<p>ずっとCakePHPを好んで使ってきたが、Laravelがすごく人気が高いとのことなので使用してみて色々と比較。</p>
<h4 id="情報量"><a href="#%E6%83%85%E5%A0%B1%E9%87%8F">情報量</a></h4>
<p>Laravelはドキュメントのどのページを見ても何か説明が足りない気がする。<br />
人のパッケージのソースを見たり検索で情報を探したりしなければならない。<br />
情報が見つかったあとドキュメントを見てみたらやはり書かれていなかったりする。</p>
<p>検索にしても日本語の情報が非常に少ない気がするので本当に人気があるのかと思ってしまう。</p>
<h4 id="ヘルパー"><a href="#%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC">ヘルパー</a></h4>
<p>LaravelのHtml, Formヘルパーはなんとなく不足している点が多いような気がする。<br />
実際使ってない人もいるようだ。<br />
radioボタン群すらメソッド一つで作れないとは。<br />
そのため比較するとCakePHPのヘルパーはかなり充実しているのだと実感した。</p>
<h4 id="設定"><a href="#%E8%A8%AD%E5%AE%9A">設定</a></h4>
<p>Laravelは設定量が多い。<br />
パーツを追加する度にCakeだったらこんな設定しなくてもすぐ動かせるのに…。<br />
と思いながら設定をしなければならない。<br />
自由度が高いといえばそうなのかもしれないが、そんな自由度を得てまで時間をかけて開発したいのか、という疑問が湧いてくる。</p>
<h4 id="用途"><a href="#%E7%94%A8%E9%80%94">用途</a></h4>
<p>上記から、まずCakePHPとLaravelは開発するアプリケーションの用途が異なると思う。<br />
DBテーブル量の多い昔ながらのFormベースの大きな基幹システム開発を行うのであればCakePHP3一択かと思う。</p>
<p>逆に、スマホアプリ用のサーバーアプリケーション開発や<br />
ReactやAngular等のコンポーネントベースライブラリを使った開発などであれば<br />
テンプレートはほとんど必要なくAPI開発に重点を置くことになってくるので<br />
この場合はLaravelが非常に適していると思う。</p>
<h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3>
<p>ちなみにさくらのレンタルサーバー等はそのままではCakePHP3が使えないのだが、Laravel5.0は使用できる。<br />
しかしそれでも基幹システムはCakePHP2を使った方がまだましのように思えた。</p>
<p>Laravelしか使ったことない人、CakePHP2しか使ったことない人、<br />
フレームワーク自体未経験の人は是非下記も見てほしい。</p>
<p><a href="https://crieit.net/posts/CakePHP3-5b0d18a432ff5">CakePHP3の優位性を色々</a></p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14314
2016-04-16T01:49:59+09:00
2018-09-29T22:23:39+09:00
https://crieit.net/posts/CakePHP3-Behavior
CakePHP3のテスト時にBehaviorによるエラー
<p>CakePHP3でテストをする際、突然大量のエラーが発生することがあった。<br />
その直前にやったことといえばBehavior関連のテストの作り込み。</p>
<p>関連するテストが2箇所あるのだが、その両方を実行するとエラーになり、どちらかだけコメントアウトするとエラーが出ない。<br />
両方が相互に絡み合ってエラーになっているらしい。</p>
<p>調べてみると、そのテストはファイル関連のbehaviorを使ったテストだったため、<br />
behavior側にファイル操作関連の設定をできるようにしてテストを用意にしていた。<br />
通常は呼ばれないのだがテスト用にだけ必要なメソッドを使っていた。</p>
<p>どうもテストが変わってもその設定が保持されてしまっているらしく、2回めに呼ばれたテストがエラーになってしまっていたらしい。<br />
もちろんtearDownでモデルはunsetしている。それにもかかわらず。</p>
<p>どうもBehaviorはTable内に直接保存されているわけではないのでunsetだけでは他のテストに影響する状況が残ってしまうらしい。<br />
テスト終了時に設定を元に戻す処理を実行するとエラーが出なくなった。</p>
<p>ちなみに、BehaviorはBehaviorRegistryに登録されており、<br />
これはTableRegistryと同様ObjectRegistryを継承しているのでresetメソッドを使うことでも対応できそうな気がする。<br />
(試してはいない)</p>
だら@Crieit開発者