Laravel・PHP入門

未経験Ruby->PHPer初心者

【PHP/Laravel】エンジニア歴1ヶ月の入門まとめ

Webエンジニアという職種について約1ヶ月がたちました。
本記事では1ヶ月たった自分が1週目の自分に教えられれば
より早い学習ができたのではないかと思う内容を復習がてら記載します。

この記事は正しいことが目的ではなく、
初心者が他の入門者により早く、考えてwebアプリを動かすための一助を
提供することを目的としています。
学術的、より正しく学びたい方は本や学校をご利用ください。

念のためおすすめの読者は下記です。

★ main: 独学でググってコピペして動かせる人
      ドットインストールや参考書などで何か作ったことがある人

▼ min:  PHPもしくはRubyの環境構築はググればできる人

 

目次 

 

MVCの使い方と基本的なwebアプリケーションの流れ

エンジニアになって最もご指導いただいたのがMVCの使い分け。Laravel5.5環境。

入門者:MVCそれぞれの役割を知っている。Contorollerにメソッド全部書く。太る。
初心者:MとCをDBに関連するか否かで書き分ける。←私は今ここ
それ以上:レベルの高いパターンなど考えるらしい(ごめんなさい知らない)
入門者についてはドットインストールや参考書が多くあるので初心者版を記載します。

▼ 簡易版はよくあるので、ちょっと詳しく図解。

f:id:fresh_engineer:20171129022519p:plain

大事なのは、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 ;

class PostController extends BaseController{

  private $post_model;

  public function __construct(PostModel $post_model)
  {
    $this->post_model = $post_model;
  }

  public function show($id)
  {
    $post = $this->post_model->getPost($id);
     return view('post/show', ['post' => $post]);
  } 

}

 

 >> app/Models/Post.php

public function getPost($id){
  return $this->find($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記事がおすすめです。

PHPオブジェクト指向入門(前半) - Qiita

プログラミング勉強中の人にオブジェクト指向とは何なのかを何となく伝えたい話 - かまずにまるのみ。

 

図解ではわかりやすくするために分けましたが、
一時的な変数に入れているだけなので、こんな風に省略もできます。 

public function show($id){
return view('post/show' ,
['post' => $this->post_model->getPost($id)]); 
 }

 これは後のリーダブルコードで詳しく書きます。

 

長々と書きましたが、とりあえずPost-tableからデータ入れたり出したり更新したり削除(いわゆるCRUD)したいときは、Controllerに直接書かずにModelに書こうね!!
ControllerからModelを呼び出せるようにした方がMVCフレームワークだよね!!

ということが言いたかったわけです。
演算子の意味がわからない人はこれを読みましょう。

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

 

 

 

名前空間・クラス・メソッド・コントローラ・モデルの書き方

最低限のwebアプリケーションを作るのに必要ですが
情報がバラバラでわかりづらかったこの辺りをまとめます。

まずはソースコードと一緒にざっくり説明入れます。

<?php
namespace
App\Http\Controllers\Admin;
//名前空間。このファイルがどこにあるか示す。
書き方はディレクトリ\バックスラッシュ(macならoption+¥);

use App\Http\Controllers\BaseController;
use
Illuminate\Http\Request;
use App\Models\Post as PostModel ;
//別ファイルのメソッドなど何かを使用するとき必ず記載する。
ex.ModelやValidationなど。asは呼び方。


class PostController extends BaseController{
//PostControllerという名前のクラスです、
BaseControllerというControllerを継承してます
(継承:private以外のメソッドが使えますが、
継承を使わない間は決まり文句として記載してください)
★★早速先ほどuseに記載したBaseControllerが書いてますね!


private
$post_model;
//privateはこのPostControllerクラスからしか呼び出せません。

public function __construct(PostModel $post_model)

{

  $this->post_model = $post_model;
  //このPostControllerクラスのpost_modelインスタンス
  PostModelの$post_modelというオブジェクトを代入する。日本語怪しい。

}

//publicは他のクラスなどどこからでも参照できるメソッド。
__constructは本Controllerクラスが呼び出されるたびに必ず実施されます。
Controllerの、Routeから呼び出すメソッドは基本的にpublicですね。
同クラス内でしか呼び出さないメソッドはprivateにしましょう。


public function show($id)

//メソッドの作り方:
アクセス修飾子 + function + メソッド名 (引数)

{
  $post = $this->post_model->getPost($id);
   // $ 変数名
     = (代入演算子、右辺を左辺に代入する)
     -> 左辺から右辺を呼び出す
     ()メソッド書くときは引数なくても()書く
     ; この行終わりの印

   return view('post/show', ['post' => $post]);

   // return 返り値 呼び出した奴にそのまま返り値が届きます。
     この場合はviewというresponseが返ります。
    view('接続先のビューへのパス', [配列])
    postという名前で$postという配列が入った変数が返ります。

}

 

リーダブルコード(命名規則/コメント/リーダブルコード)

命名規則は命です

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

{ 〜

 参考:

phpDocumentorの書き方 - Qiita

【PhpDoc】コメントの書き方のまとめ – 小俣泰明(タイメイ)blog

 

⑶リーダブルコード

まずこれを読みましょう。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

 

 そして書き方の規約を学び、合わせて書きましょう。

PSR-2 コーディングガイド(日本語)|北海道札幌市のシステム開発会社インフィニットループ

 

命名規則を守る
・コーディングガイドに則る
・(DRY)何度も書く定数・変数は定義する。
  − 保守の時に変更が生じた場合に極力書き直すコストが減るように!
・何度も書くメソッドは切り分けで親コントローラーに書いて継承
・メソッドは一機能が原則、複数になる場合はprivateで切り分ける
・インデントを揃える
・空白も揃える (私はよくif文の空白を間違えます)
・一時変数を消す

 

コードは自分で書くものではなく、人が読むもの

保守性の高いコードを書きましょう(数回目)

 

とりあえず、これで初心者から入門者に近づけるといいな

リーダブルコードとか書いてる割に記事が冗長になってしまったので
今度Qiitaで書き直すことにします。