【PHP/Laravel】エンジニア歴1ヶ月の入門まとめ
Webエンジニアという職種について約1ヶ月がたちました。
本記事では1ヶ月たった自分が1週目の自分に教えられれば
より早い学習ができたのではないかと思う内容を復習がてら記載します。
この記事は正しいことが目的ではなく、
初心者が他の入門者により早く、考えてwebアプリを動かすための一助を
提供することを目的としています。
学術的、より正しく学びたい方は本や学校をご利用ください。
念のためおすすめの読者は下記です。
★ main: 独学でググってコピペして動かせる人
ドットインストールや参考書などで何か作ったことがある人
▼ min: PHPもしくはRubyの環境構築はググればできる人
目次
①MVCの使い方と基本的なwebアプリケーションの流れ
エンジニアになって最もご指導いただいたのがMVCの使い分け。Laravel5.5環境。
入門者:MVCそれぞれの役割を知っている。Contorollerにメソッド全部書く。太る。
初心者:MとCをDBに関連するか否かで書き分ける。←私は今ここ
それ以上:レベルの高いパターンなど考えるらしい(ごめんなさい知らない)
入門者についてはドットインストールや参考書が多くあるので初心者版を記載します。
▼ 簡易版はよくあるので、ちょっと詳しく図解。
大事なのは、find($id)をModelが実施していることです。
DBからそのidを持ったPostデータを取って来るというDBに関わる作業を
Controllerから切り離しています。
リクエストはブラウザのURLの部分だと考えてください。
post/show/26というリクエストが送られます。
route/web.phpの同リクエスト部分にヒットします。
>> route/web.php
Route::get('/post/show/{id}', 'PostController@show'); |
ここで、Routeはapp/Http/Controllers/PostControllerのshowメソッドへ
アクセスします。そして、そのshowメソッドが
app/Model/PostModelのgetPostメソッドを呼び出します。
関係する部分のみ抜粋してソースを書きます。
>> app/Http/Controllers/PostController.php
use App\Models\Post as PostModel ; } |
>> app/Models/Post.php
public function getPost($id){ |
はじめ、え、contorollerの中にpost_model??は???って思いました。
ですが、一度納得すると、こちらの方がMVCってこういうことか!と
わかりやすく感じるようになりました。
DBに関するものは、Modelを使用すると記載しましたが
具体化すると、
ー ー ー ー ー ー 前提と準備 ー ー ー ー ー ー ー
・Postというtableに入っているものはPostModelで操作します。
・Contorollerからリクエストに応じてPostのデータを取得するため、
PostModelの然るべきアクションを呼び出します。
・Modelのアクションを呼び出すため、
PostModelのクラスをPostController内でインスタンス化します。※
ー ー ー ー ー ー 実践 ー ー ー ー ー ー ー
・$this->post_model->getPost($id);
このPostControllerクラス($this)から、post_modelというインスタンスの
getPostというメソッドを呼び出します。(引数としてidを渡します。)
・PostModelのgetPostメソッドが、
$idに入った26というidを用いてDBのposts tableから id=26の
postデータを丸ごと配列として取り出します。
今回はその取り出した配列をそのままreturnしているので、
呼び出した$postに代入されます。(=は右辺の結果を左辺に代入する演算子)
・代入された$postを用いて、post/showというviewをresponseします。
・ユーザーはブラウザで、resouse/view/post/show.htmlが表示されます。
※ オブジェクト志向の話が入ると長くなるので下の2記事がおすすめです。
プログラミング勉強中の人にオブジェクト指向とは何なのかを何となく伝えたい話 - かまずにまるのみ。
図解ではわかりやすくするために分けましたが、
一時的な変数に入れているだけなので、こんな風に省略もできます。
public function show($id){ |
これは後のリーダブルコードで詳しく書きます。
長々と書きましたが、とりあえずPost-tableからデータ入れたり出したり更新したり削除(いわゆるCRUD)したいときは、Controllerに直接書かずにModelに書こうね!!
ControllerからModelを呼び出せるようにした方がMVCフレームワークだよね!!
ということが言いたかったわけです。
演算子の意味がわからない人はこれを読みましょう。
- 作者: 小川雄大,柄沢聡太郎,橋口誠
- 出版社/メーカー: 技術評論社
- 発売日: 2010/11/12
- メディア: 大型本
- 購入: 32人 クリック: 1,065回
- この商品を含むブログ (59件) を見る
②名前空間・クラス・メソッド・コントローラ・モデルの書き方
最低限のwebアプリケーションを作るのに必要ですが
情報がバラバラでわかりづらかったこの辺りをまとめます。
まずはソースコードと一緒にざっくり説明入れます。
<?php use App\Http\Controllers\BaseController;
public function __construct(PostModel $post_model) { $this->post_model = $post_model; } //publicは他のクラスなどどこからでも参照できるメソッド。 public function show($id) //メソッドの作り方: { return view('post/show', ['post' => $post]); // return 返り値 呼び出した奴にそのまま返り値が届きます。 } } |
③リーダブルコード(命名規則/コメント/リーダブルコード)
⑴命名規則は命です
ControllerやModelを作ろうとして、どんな名前にしようか分からなかった経験はありませんか?
今回は設定より規約という概念に則り記載します。詳しくは下記
簡単にいうとpostsテーブルにひもづくのは
PostモデルだとLaravelは知っています。
Modelでこのテーブルからデータを取ってくる、
と定義しなくてもid=26のデータですよと勝手にpostsテーブルを覗いてくれます。
具体的に見ると下記。
Model:Post.php、MsCountry.php 単数形・キャメルケース。
Table:posts、ms_countries 複数形・小文字・スネークケース。
Controller:PostController.php (複数形が主流との噂ですが単数も可)キャメルケース。
Class:BaseController キャメルケース。
Method:publlic function saveAndGetId(ココ) はじめが小文字のキャメルケース。
変数:$search_word 小文字のスネークケース。
とにかくコードやコメントを読む必要のないような
ものすごくわかりやすい名前をつけましょう。必要ならば名前が冗長でも構いません。
PGがコードを書くのと、それを読むのとでは後者の方が回数が多いので
保守性のあるコードを書きましょう!!!(口すっぱくご指導いただきました)
(2)コメントをかこう:
初心者のうちは毎行書いても良いくらいだと言われました。
人が読むソースコードを書くため、必ずコメントを書きましょう。
特に、メソッドの前には必ず記載します。書き方の一例を記載します。
/** // はじまり
* 特定単語によりPostデータを検索し結果を返す //1行目:メソッドの説明文
* //2行目:空行
* @params varchar $search_word //3行目:@params 種類 引数
* @return array $seach_result //4行目:@return 種類 返り値
* @access public //5行目:@access アクセス権限
*/ // おわり
public function create{ 〜
参考:
【PhpDoc】コメントの書き方のまとめ – 小俣泰明(タイメイ)blog
⑶リーダブルコード
まずこれを読みましょう。
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
- 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/06/23
- メディア: 単行本(ソフトカバー)
- 購入: 68人 クリック: 1,802回
- この商品を含むブログ (138件) を見る
そして書き方の規約を学び、合わせて書きましょう。
PSR-2 コーディングガイド(日本語)|北海道札幌市のシステム開発会社インフィニットループ
・命名規則を守る
・コーディングガイドに則る
・(DRY)何度も書く定数・変数は定義する。
− 保守の時に変更が生じた場合に極力書き直すコストが減るように!
・何度も書くメソッドは切り分けで親コントローラーに書いて継承
・メソッドは一機能が原則、複数になる場合はprivateで切り分ける
・インデントを揃える
・空白も揃える (私はよくif文の空白を間違えます)
・一時変数を消す
コードは自分で書くものではなく、人が読むもの
保守性の高いコードを書きましょう(数回目)
とりあえず、これで初心者から入門者に近づけるといいな
リーダブルコードとか書いてる割に記事が冗長になってしまったので
今度Qiitaで書き直すことにします。