2018年 3月 の投稿一覧

PHP使わない人がcakePHPを勉強して引っかかった部分

参考として、メモを残しておきます。

たぶん、皆引っかかるところは同じだと思います。

 

ちなみにここを見て勉強していた時に思ったことです。

https://www.tuyano.com/index2?id=4536003

 

■まず、PHPという言語がおかしい

perlもだいぶ変で、ちょっと複雑になると非常に使いにくかったので、五十歩百歩といえばそのとおり。
変態なところ
・TRUE==”0.0″だったりする件。勝手に型変換するので、意図しないものが一致と判断されてしまう。型変換無しで比較するには「===」が必要
・配列と連想配列がごっちゃ。混ぜて使うこともできるという、非常に気持ち悪い仕様。
・配列を代入すると、要素まで全部コピーされる。他の言語では配列って参照渡しなのに。

・オブジェクトを作った後に、クラス内のメソッドhogeをコールする時に「hoge()」とするのがだめ。わざわざ「$this->hoge()」と書かないといけない。なにそれ!?

 

■そもそもフレームワークというものに馴染みがない
プログラミング言語で一からガリガリ書いていくスタイルに馴染んでいるので、フレームワークという概念そのものがなかなか受け入れがたい。
ライブラリを使う場合でも、ライブラリは部品として使っているだけでアプリケーション全体は自分で組んでいた。
しかし、フレームワークとなると、アプリケーション全体がお仕着せになって、その中の一部分だけを書くという行為になる。
発想の転換がだいぶ必要。

 

■composerってなに?
PHPをインストールしてcakephpをインストールするのかと思ったら、PHPをインストールした後はcomposerというパッケージ管理ソフトもどきを入れて、composerからcakephpのプロジェクトを作る形にするらしい。
composerはプロジェクトを作成する時にそのプロジェクトに必要なライブラリ群を勝手に集めてプロジェクトの雛形を作ってくれるソフトウェア。
プロジェクトごとにライブラリをかき集めてくるだけなので、環境を汚さないのはすばらしい。

 

■cakePHPは2系統と3系統がある
言語もバージョンで挙動が変わるように、フレームワークもバージョンで挙動が違う。
特に、2系と3系でだいぶ違うらしい。
フォルダ構成なども変わっているようで、勉強する時にどちらで勉強するべきか悩む。

 

■プロジェクトを作ると勝手にファイルがたくさんできる
自分でファイルを一つ作って、その中にプログラムを書いていく……というオールドスタイルに慣れているため、最初からファイルがたくさんできるので焦る。
実用上、全てのファイルのことを完全に理解する必要はないらしい。
しかし、本能的に「プロジェクトの中にあるファイルは理解しないといけない」と思ってしまうので、最初の時点で気が重くなる。
こういう完璧主義がフレームワーク嫌いの原点かもしれない。

 

■MVCモデルについて
データベースへのアクセスを司るModelクラス
データを制御するControllクラス
画面の表示を司るViewクラス

この3つを組み合わせて一つの画面を作る。
そこまではわかる。
しかし、画面の表示用にデータを集計する処理はどこに書くんだろうか。
Controllに書いても良い気がするし、Viewに書いても良い気がするし、データベースから取ってきたところで処理をするということでModelに書いても良い気がする。
そのへんは作成者が自由に選んで良いのか、それともそういったところまで作法があるのか。
そのへんがよくわからない。

 

追記→
Viewはデフォルトのクラスを使うので、プログラムを書くのはModelかControll。
そしてModelはデータベースの定義的なことしか書かないので、実質的に処理は全てコントロールに書く。
整理できた。

 

■mySQLの設定ではまったこと
Windows環境でMySQLをインストールしてる環境。
そこで、App.phpにDBのhostとして「localhost」という名前を登録してもうまく動かなかった。
「127.0.0.1」と書いて初めてアクセスできた。
なぜ、localhostが通らなかったのか……

 

■autoRenderってなに
自分のコントロールクラスを作って、その中からHTMLコードを吐き出すサンプルプログラムの中で、
「$this->autoRender = false」
という設定をしていた。
なにかと思ったら、これをすると自動描画が無効になるらしい。
これを無効にしないと、ViewやModelを使おうとしてエラーになるらしい。
(このサンプルはコントロールクラスだけしか作っていないので)

 

■URL名(アクション名)が滅茶苦茶気持ち悪い
「HelloController.php」というControllクラスのファイルを置くと、特に設定ファイルの編集など必要なく、
http://127.0.0.1:8765/Hello」
というアドレスでそのコントローラが呼ばれるようになる。
「Hello」というファイルを置いているわけではなく、「HelloController」というファイルを置いているのに、「Hello」というアドレスでアクセスできる気持ち悪さ。
中身の処理的には「リクエストで「/Hello」と来たら後ろに「Controller」を連結してHelloControllerを呼ぼう」とやっているだけで不思議なことはなにもない。
しかし、なにか気持ち悪い。
Controllerクラスの名前が「Hello.php」とかだったらこんな気持ち悪くなかった。

 

■不思議なURL形状
Controllerクラスの中に複数のアクションを定義できる。
例えば、「HelloController」とクラスの中に、「index」アクションと「hoge」アクションと「moge」アクションを作ったとする。
すると、
http://127.0.0.1:8765/Hello/hoge」
http://127.0.0.1:8765/Hello/moge」
http://127.0.0.1:8765/Hello/index」
※↑「http://127.0.0.1:8765/Hello」と同じ
の3つのURLでアクセスできるようになる。
ここまではいい。
クラスの中にアクションという階層構造になっているので、それをディレクトリ構造にマッピングするのも理解できる。

しかし、パラメータのとり方が不思議すぎる。
CGI時代の考え方だと、例えばメールアドレスをパラメータに入れようとすると、
http://127.0.0.1:8765/Hello/moge?mail=hoge@hoge.jp」
とかになりそうなものだ。
しかし、実際は
http://127.0.0.1:8765/Hello/moge/hoge@hoge.jp」
という不思議なとり方をする。
アクション名の後に、ディレクトリの表記でパラメータを書いていく。
複数のパラメータがあるときは
http://127.0.0.1:8765/Hello/moge/パラメータ1/パラメータ2/」
と更に深いディレクトリの表示になる。
URLの表記上綺麗なのはわかるけど、すごく不思議な感覚を覚える。
※なお、URL最後に「/」を入れても入れなくても同じ挙動をする模様。そこらへんはありがたい。

 

■Viewクラスの意味がわかりにくい件
HelloControllerというのを作ったら、ビューとして「HelloView」というクラスを作らないといけないかと思ったのだが、いらないらしい。
コントロールクラスで「index」とか「moge」とかいうアクションを作ったように、ビュークラスでも「index」や「moge」というアクションを作って、その中で表示に必要なコードを書く必要があるような気がする。
しかし、実際にはそんな必要はないようだ。
ビュークラスはデフォルトのビュークラスをそのまま使うだけでよく、継承してカスタマイズをする必要がないらしい。

そして、コントロールから変数を渡してビューの表示内容を変えたい場合でも、
テンプレートファイルの中に変数名を表示するコードを書いておけばいい。
この辺りはデフォルトのビュークラスがやってくれるので、自前のビュークラスを作る必要がない。

「ビュークラスは自前で作る必要がない」というところがポイント。

 

■データベースとの連携
データベースにテーブルを作るときに、複数形の名前にする必要がある。
なんかこれがすごく気持ち悪いんだけど。
例えば「person」というテーブルを作ってはいけなくて、「persons」というテーブルを作る必要がある。
また、テーブルの中の「id」と「name」という項目は特別扱いされている模様。
※「id」プライマリーキーとして認識される。
※「name」レコードのタイトルとして認識される。

その後に、cakephp側では
「cake bake model persons」
と打つと対応するモデルのクラスファイルを生成してくれる。
データベースの情報を読み取って、勝手に「これはテキスト」「これはNULLは駄目」とかバリデーション用のプログラムを勝手に生成する。すごい。

「Person.php」テーブルのレコードに対応するクラス
「PersonsTable.php」テーブルに対応するクラス

 

■フォーム関係
フォーム系は自分で書くのではなく、勝手にフォームのHTMLコードを吐いてくれるメソッドを使う。
何も指定しないとフォームをSUBMITすると現在のURLに再度飛ぶかたちになるし、指定すれば別のURLに飛ぶことも可能。
なお、ページに「直接アクセスした場合」と「フォーム経由でアクセスした場合」の判断は「GET」か「POST」で区別する。
また、ただ単にフォームを作ると、(当たり前だが)各項目が空白である。
フォームを作る際にデータベースから読んだ連想配列を指定すると、各項目にその値が入っているフォームを作れる。
その場合、「_method」というフィールドに「PUT」という文字が代入される。
これにより、Controller側で初期値が空白のフォームから飛んできたか初期値が入ったフォームから飛んできたか判断できる。

 

■データベース関係
personsというテーブルがあるとすると、そのコントロールクラスから
「$a = $this->Persons->find()」
で検索できる。
さらに、条件を数珠つなぎで指定できる。
「$ra = $this->Persons->find()->where([“name like “=>’%hoge%’])->limit(3)」
この形を見ると、find()がデータベースを全部取得して連想配列を返し、その後にフィルターで絞り込んでいるように見えるけど、そうではないらしい。
じつはこの$aの状態ではまだクエリーを作っているだけ。

だから、こんな指定の仕方ができる。

この$raに対して、foreachしたりすると、初めてSQLが発行されてデータベースにアクセスされる模様。

隠蔽されていて優雅と言えば優雅かもしれないが、なんというか非常にわかりにくい。

明示的にSQLアクセスしていないので、理解していないと嵌りそう。

なお、データベースの項目に合わせてメソッドが勝手に作られるといういたれりつくせりな仕様。
例えば、「mail」というフィールドがあると、「findByMail」というメソッドが作られて、それでその項目を文字列一致で検索できる。
ここはすごいよな~

 

■最終的にbake最強
bakeというコマンドがあって、上の方でモデルを生成させているが、実はもっとすごい。
まず、データベースでテーブルを定義しておいて、
「cake bake all テーブル名」
と打つだけで、そのテーブルのCRUD操作(作成・表示・更新・削除)ができる用に
・Controller
・テンプレートファイル(.ctp)
・Model
を作ってくれる。
データベースの設計さえしておけば、そのデータベースを読み書きするためのものが全部出来てしまう。
ここからレイアウトとかいじっていけばいいということなので、物凄く楽。
これはすごいわー。

 

■結論

cakePHPは理解すればなかなか効率がいいフレームワークっぽい。

とくにbake最強すぎる。

データベースの設計さえしてしまえばとりあえず動く物が作れるというのはいい。

ただ、PHPという言語そのものは微妙だよね、という点は変わらず。

 

■メモ

リンクを張った勉強サイトには書いてなかった(or読み飛ばした)けど大事なことについて。

◯データベース

・主キーは「id」である必要がある

・他のテーブルから参照するキーは「~_id」である必要がある。

 

◯名前の対応

※めっちゃややこしい。

・Controller

UserNamesController

・Model

Table:UserNamesTable

Entity:UserName

・データベースのテーブル名

user_names

ビジネスアイディア6

3/17第二百五十一案

家電一式を有料で選んであげるサービス。

家電量販店の販売員を信用出来ないという人向けにー

さすがに単価低くてあれかなぁ・・・

 

3/18第二百五十二案

すごく離れたところでちょっとした作業をしたい。ということがある。

写真取るとか、ボタンを押して表示を確認するとか。

そのためだけに遠くまで移動することが仕事でよくあるが、よく考えれば無駄。

そこで、そういう作業をやってくれる現地の人をさがすというサービス。

特に田舎なら人件費安いし、そういう需要あるんじゃないかなー。

 

3/19第二百五十三案

プログラムで「お題」や「プロット」を自動生成して、それに対するシナリオを投稿するサイトを運営する。

毎日お題を出すのが大変なので自動化するのがポイント。

boketeのシナリオ版。

ただ、自分に情熱がないからちょっとあれかなぁ・・・

 

3/20第二百五十四案

小さい会社や個人は看板がないので営業が苦労する。

ということで、ある程度のサイズの会社が「看板を貸す」ということはできないだろうか。

外部の組織だけどその会社の一部みたいな名刺を作って配れば、営業活動はしやすくなる。

看板を貸すのは結構良いアイディアだと思う。

看板を欲しい人はたくさんいる。

 

3/21第二百五十五案

仕事を他人に任せやすいように整えるだけのサービス。

人に任せるのも大変なので、そこの面倒をみると慣れば需要ありそう

 

3/22第二百五十六案

ソフトウェア開発で、似たような案件をかき集めて、同じ工数でたくさんの会社向けにリリースする。

するとお安くできる、というビジネスモデル。

 

3/23第二百五十七案

なにかの商売を始めようとしている人に、経験者を紹介して話を聞く機会を作るサービス。

 

3/24第二百五十八案

ワインのラベルみたいに、貼り替え可能なものにいろんなバージョンを作って売る機会を増やす。

例えば「新築祝い用ワイン」とか「結婚一周年記念ワイン」とか。

紙を作るだけで販売機会を増やせるというのはいいと思う。

 

3/25第二百五十九案

車を選ぶ時に全メーカから車種をピックアップして教えてくれるサービス。

本当に疎い人には需要あると思われ。

 

3/26第二百六十案

車のデッドニングとか静音化を専門にやる業者。

なにげに需要ありそうなんだよな~

ただちょっと大変かも。

もともと自動車関係やっている人と組んでやれば、それほど難しくないかもしれない。

 

3/27第二百六十一案

エンジニアと会社の間を取り持つエージェント業。

大規模にやらずに小さい規模で特定の業界に特化すればそこそこいけるかも。

 

3/28第二百六十二案

ダンベルとか買おうと思ったけど、置き場所に困る。

そういう人が結構いるんではないかと。

そういう筋トレグッズとかをコンパクトに収納できる形で、収納グッズと一緒に用意すれば売れるかもしれない。

ネットに並べるだけではイマイチかもしれないが、ジムとかそういうところと提携して「自宅でコンパクト」をアピールすればいける気がする。

 

3/29第二百六十三案

ゲームをかわりにプレイしてレベル上げしてあげるサービス。

ゲーム好きとお客さんをつなげられれば商売になるかも。

 

3/30第二百六十四案

知り合いがたくさんいるだけで仕事をつないだりいろいろ企画できる。

ということで、知り合いを増やしていくだけでもビジネスチャンスの可能性が増える!

 

3/31第二百六十五案

ハンモックピローというのに興味があるんだけど、約3万円と高い。

無料体験がついていれば試すのに・・・

ということで、高いけど「使えばわかる」的な商品に無料体験をつけて販促する。

 

4/1第二百六十六案

久しぶりにアニメを一気観したら結構楽しい。

いつもは困るけど、たまにはこんな日もあっていい。

ということでアニメとか楽しんでいると、同じものを見ている人と親近感が湧く。

それを発展させて、地域でマッチングして、同じ作品を見ている同士でコメントしつつ近場の人とコミュニケーションできるとかどうだろうか。

今の出会い系はプロフィールを書くだけでイマイチ「薄い」

もっと普段親しんでいるものとかで自然とマッチングできたら可能性広がりそう。

 

4/2第二百六十七案

町中を歩いている時にGPSで勝手に近くにいる人とマッチングしちゃうサービスとか。

東京の駅みたいにあまりに密度高いとあまり機能しないけど、郊外のそこそこ隙間がある地域ならおもしろいかも。

 

4/3第二百六十八案

暇だ。よろしくない。

暇を使ってなにかをするべき。

ということで、暇な時間を切り売りできるサービス。

登録して仕事を探す……とかそういう形ではなく、もっとゆるく地域密着・直接知り合ってる中で時間発注するとか。

そういう感じのサービスを運営できないだろうか。

 

4/4第二百六十九案

退屈である。

なにかイベントとかチャレンジが必要だ。

そう感じている人は他にもいると思う。

そこで、チャレンジを用意する企画サイト。

賞品とかはない(あっても粗品)で、純粋にチャレンジを楽しむサイト。

 

4/5第二百七十案

退屈は本当に困るので、なにかをしたい。

しかし、退屈すぎるとやる気も出ない。

こういうときはなにか声をかけてもらうのが一番いい。

ということで、退屈度を共有できるサービスとかあったら良い気がする。

スマホやPCの活動状況を読み取って、忙しさ・退屈度をSNSみたいに共有する。

そして、友達が退屈そうな人に声を掛ける。良い気がする。

 

4/6第二百七十一案

さいとうひとりさんの話を聞いていると、最初はうさんくさいと思ったけどやっぱり良いことを言っている。

ああいうふうに語ってもらえると生き方が少し変われるかも。

ということで、ああいう系の話をするセミナーとかやれば、宗教臭くなるけどそれなりに人来るかも。

あやしくやらないでやるには工夫が必要そうだけど。

 

4/7第二百七十二案

車もあるときは軽、あるときは普通車、あるときはワゴン車、と使い分けたい。

そんなわけで複数台持っている人は多い。

なので、そんな人向けに複数台を自由に使いわけられるリース契約とか作ったらどうだろうか。

 

4/8第二百七十三案

ポイントカードにポイントだけでなくレベルを作る。

例えば、使う度に3択を選ぶ(簡単な問題でもいいしランダムでもいい)。そして正解するとレベルが上がる。

ポイントを貯めるだけでなくレベルをあげるという喜びも出るので、もっと使いたいと思うかも。

 

4/9第二百七十四案

新幹線の座席の形が体に合わない!

ということで、どんな椅子も体にあった形にできるグッズとか(形を自由に変えられるもの?)を商品家できないだろうか。

俺が欲しい。

 

4/10第二百七十五案

自動車を自分でメンテしたいけど、よくわからん。という人向けに、メンテを教えてくれるサービス。

WEBでみればなんとなくわかるけど、なんとなくだからなー。

実際に横についてくれて、一通り見てくれるとかあったら良いと思う。

 

4/11第二百七十六案

格安SIMだと混雑時に遅くなってしまう。

この辺を改善して、一時的に課金してもキャリアと同じ速度をだせるようにしたら需要あるかも。

 

4/12第二百七十七案

「◯◯が今すぐ欲しい!」という時に、店に行って買ってすぐに持ってきてくれるサービス。

宅配とかと違って明日ではなくその日のうちに持ってきてくれる。

物凄く高いから、対個人向けには厳しいかな・・・

 

4/13第二百七十八案

ダイエットのために夜は軽く~とか思っても、食べ物を買って食べきろうとすると多くなってしまうことがある。

原理的には捨てれば良いのだが、実際には捨てるのも気持ち的に辛い。

ということで、一人分の料理を3/1ずつに区切って、残りを明日に回せるとかいうパッケージをつくれば需要あるかもしれない。

 

4/14第二百七十九案

死んでいる商店街を「コワーキングの場」などにテーマを決めて整備して宣伝して人に来てもらう。

すでに建物はあるのでかなり安くできる街興しだと思う。

 

4/15第二百八十案

世の中、おもしろいフリーゲームがたくさんある。

そういうゲームって投げ銭したくなる。

なので、RPGツクールとかのゲーム内に投げ銭システムを組み込めるようにすれば手数料で稼げるかも……?

 

4/16第二百八十一案

RPGツクールMVはHTML5に対応してWEB公開できるようにした。

これによりプレイできる人数が格段に増えた。

こういう風にいままで「DL&展開&ランタイムインストール」とか手間がかかったものを手軽にするのは非常に有効そう。

ということで、業務のなかでひと手間かかっていたものをWEBに移植して新サービスを作るとか。

この流れは物凄く普通のことだけど、個人的にはRPGツクールがWEBブラウザで動くというのは衝撃だった。

こういう風に、ブラウザで動くことが衝撃&すごく影響が大きいことはまだまだあると思う。

開発環境を構築する必要がなく、アプリ開発がWEBブラウザにアクセスするだけ、とかね。

 

4/17第二百八十二案

タイヤをヤフオクで落札したら、大きい荷物の場合個人宅に配達できないことがあるとかなんとか。

これは困る。

大きい荷物をちゃんと個人宅に配達するサービスをやるだけでニーズあるのじゃないだろうか。

 

4/18第二百八十三案

車の中でタイヤはすごく大事。

しかし、タイヤのレビューはほとんど見当たらない。

タイヤ同士の比較が全然できない!

ということで、同じ車でタイヤだけ履き替えてレビューするサイトを作ればかなり濃いアクセスがあって商機に繋がるのでは。

 

4/19第二百八十四案

回路の静電気対策って結構難しいので、静電気対策専門コンサルティングとかどうでしょう。

需要は絶対にある。

 

4/20第二百八十五案

タイヤを変えたけどタイヤって寿命が尽きるまで簡単に変えられないのがネック。

もっといろいろ試したい。

ということで、月額を払えばタイヤ履き替え放題とかいうサービスどうだろうか。

(ただし、みんなで使い回すので新品じゃない)

一部に需要ありそう。

 

4/21第二百八十六案

バイクや車で日本一周とか楽しそう。

しかし、泊まる場所を確保するのが大変。

かといって車中泊を連続でやるのもきつい。

ということで、「車・バイクで日本一周する人のための宿泊プラン」とかどうだろうか。

無理なく回れる間隔で宿を勝手に手配してくれるツアー。

需要あると思うんだよなー

 

4/22第二百八十七案

ポケモンGO!みたいに、「ある場所に行くとアイテムが手に入るゲーム」とコラボして観光地を盛り上げるとかどうだろう。

店を盛り上げるのでも良い。

ポケモンGOみたいなものでなく、もっと年齢層上の人でもやれるゲームで実際の場所や店とコラボすればいろいろ広がると思うんだよなぁ。

子供呼ぶのもいいけど、もっと色んな人呼びたいよね。

 

4/23第二百八十八案

海外から輸入して国内で売る。

シンプルだけど、まったく頭になかった。

ここにないものを外から持ってくるという視点は大事。

 

4/24第二百八十九案

逆に日本国内のものを海外で売る。

これもあり。

日本のほうが安いものもたくさんある。

 

4/25第二百九十案

「海外から日本の複数の宛先に大量の荷物を発送したいが、1つあたりの送料が高い!」という人向けに、でかい箱で一気に日本に送り、日本国内の拠点から個別に発送するというサービス。

類似サービスはすでにあるだろうが、需要絶対あるなぁ。

 

4/26第二百九十一案

国際郵便とか調べたところ、相当に高い。

こうなると細かいものは個別に発送するより、まとめて送って日本国内でばらして再発送するほうが良い。

ということで、小口の荷物をまとめて輸送することで送料を安くするサービス。

大規模ではなく、数キロレベルの小さなニーズに対応。

 

4/27第二百九十二案

人気のノーブランド品を買ってきて、花をつけるとかちょっとだけ手を加えて別の品物として販売する。

ブランド品は手を加えると偽物になっちゃうけど、ノーブランドなら手を加えても問題ない。

そして、他で売っていない特別なものになる。

 

4/28第二百九十三案

日本の百円ショップの品揃えは異常。

ということで、100円ショップで仕入れて海外に売る。

できるんじゃないだろうか。

 

4/29第二百九十四案

どうせ営業活動するなら、複数の商品を持ったほうが楽。

ということで、ベンチャー専門の営業とかどうだろうか。

複数のベンチャーの製品を束ねて営業することで、成約率が上がる。

 

4/30第二百九十五案

エンジンオイルの世界も深い。

純正品もそこまでグレードが高いわけじゃないらしい。

エンジンの状態・求めるものによって適切なものが違う。

ということで、エンジンオイル専門のアドバイザーとかどうだろう。

少しなら金払うぜ。

 

5/1第二百九十六案

退屈をするとなんか想像力が豊かになる気がする。

ということで、想像力を豊かにするためのつまらない作品を無理やり鑑賞する会とか。

逆に疲れて駄目か?

でも、面白い以外のコンセプトのイベントは有りな気がする。

 

5/2第二百九十七案

トークスキルがあってゲーム実況とかやりたい人向けに、無料で機材一式をセットアップ&貸し出すサービス。

そのかわりに、収益があった際に割合でキャッシュバックしてもらう。

収益が弱いから難しいかなぁ・・・

 

5/3第二百九十八案

カーテンとか絨毯とか、大物になると面倒・・・

というときに、家中のカーテン・絨毯などを全部はずして一気にクリーニングしてくれるサービス。

お客さんがクリーニングに持っていくのではなく、業者の方が家の中に回収にやってきてくれるところがポイント。

他の業者より便利。

 

5/4第二百九十九案

PS4などのゲームをラインナップしておいて、1時間いくらで自由に好きなタイトルをプレイできるサービス。

本数が必要な割に収入が少ないかな?

というか、法律的にだめな可能性もある。

 

5/5第三百案

風呂で滑って怪我をした。痛い。

風呂のタイルは大人でも転ぶぐらい激しく滑る時があって、非常に危険だと感じた。

だから、お風呂を滑りにくいタイルに施工するとかすれば需要あると思われる。