大企業営業から未経験ITエンジニアを目指すブログ

アラサー大企業営業から未経験ITエンジニアを目指すブログ。日々学んだことを忘備録的に記します。

Laravelのコントローラからクラスを抜き出したい!から始まったLaravelとPHPのいろいろ①

「Laravelコントローラから処理を抜き出した方が良い」

どうやって抜き出したやつを取り出したら良いのか?どこに書くのか?

 

①依存性の注入(DI)について

https://qiita.com/harunbu/items/079ea728d2c9cf4f44d5

https://laraweb.net/surrounding/2001/

https://qiita.com/kd9951/items/951ab700f28d1d49c9c9 →わかりやすい!!

外でインスタンス化済みインスタンスを、あるクラスに渡す(注入)すること。

クラスの中でnewしない。(別クラスのインスタンス化をしない。)

クラスが別のクラスに依存し、単体テストができなくなるから。

 ルートに紐づいたコントローラのメソッドに対して、クラス名をタイプヒントした引数を指定すると、そのクラスのインスタンスを生成し、引数として渡してくれ

https://qiita.com/harunbu/items/079ea728d2c9cf4f44d5

DIのやり方は3つ。

1)メソッド・インジェクション
2)セッタ・インジェクション
3)コンストラクタ・インジェクション

  

\App\Providers\AppServiceProvider ←デフォルトでできるファイル

構成は下記。

public function boot()
{
  //
}
public function register()
{

//ここに登録するクラスを書き連ねる。「~クラスが呼ばれたら~をインスタンス化して返す」=結合の設定

}

 ※結合設定を書き連ねすぎて多くなりすぎたら、

  \App\Providers\下に新たなServiceProviderを作成すると良い。

 

書き方は2種類。

(1)インジェクションする度に別のインスタンスを生成させる(シンプルな結合)

 $this->app->bind(クラス名またはあだ名, インスタンスを返すクロージャ)

 

(2)最初に呼ばれたときにインスタンスを生成、以降はそれが使いまわされる

 (シングルストン結合)

 $this->app->singleton(クラス名またはあだ名, インスタンスを返すクロージャ)

 

②タイプヒントとは?

関数及びメソッドが受け取る引数がどのオブジェクトなのか(もしくはなんのインターフェースを備えるか)、配列なのか、コールバックなのかなどを指定することが出来る機能

https://dekokun.github.io/posts/2013-12-14.html

 arrayかクラスかコールバックか

 public function (タイプヒント $a) {

 }

 期待していない引数が渡るエラーを防ぐことができる。

 

スカラー値とは?

・論理値 (boolean)

・整数 (integer)

浮動小数点数 (float, double も同じ)

・文字列 (string)

の4種類の値。

 

④コールバックとは?

 コールバック関数のこと。関数に引数として渡される関数。

 渡された先の関数で使われる。

 

⑤インターフェースとは?

クラス的なもの。

普通のクラスとの違いは、

・抽象メソッドだけで構成される。

・アクセス制限はpublicにしかできない

インターフェイスで定義されているメソッドは全て実装しないといけない。

・引数の名前も完全に一致させないといけない。

  <使い方>

 ・インターフェイス

  interface Character //classの代わりにinterfaceとする

  {

    public function attack(): string; //メソッドにabstractをつける必要なし

  }

  ・実装クラス ※「継承」ではなく「実装」と呼ぶ

  class Hero implements Character

  {

    public function attack() {

    ・・・・・・

    }

  }

  ※インターフェイスを作ってしまったけど実装クラスで実装したくない場合

   public function attack(): void {}

  https://laraweb.net/surrounding/1985/

  https://www.atmarkit.co.jp/ait/articles/1805/30/news009_2.html#02

 

⑥抽象メソッドとは?

処理内容が書かれていないメソッドのこと。

共通の似たような処理を子クラス全てに持たせたいけど、親クラスの段階では処理内容が決められないときに使う。

abstract public function store(); //これだけ。

・関数名の後の{}が無い。

・メソッド定義(=メソッドシグネチャ)(=メソッド名と引数の有無、戻り値の型)

 だけ。

・普通の関数の書き方の先頭に「abstract」とつける。

※抽象メソッドを一つでも含むクラスは抽象クラスと呼ばれる。

 例)abstract class AbstractCharacter

 ・クラス宣言の前に「abstract」をつける。

 ・クラス名の頭にも「AbstractXxxxxx」とつける。

 

→抽象メソッドは必ず子クラスで実装が必要。

 一つでも子クラスで実装していないものがあると、エラーになる。

 抽象クラスは別のクラスで継承することしかできない。(普通の継承と同じ方法)

 子クラスのクラスやメソッドにはabstractとか何も書かない。

 newでインスタンス化はできない。

https://www.atmarkit.co.jp/ait/articles/1805/30/news009.html

 

⑦関数の後のコロンは何なのか?

public function call():void {}

https://www.atmarkit.co.jp/ait/articles/1805/30/news009.html

→「戻り値の型宣言」らしい。

関数が戻す値がどの型になるかを宣言する機能。

https://www.php.net/manual/ja/migration70.new-features.php

 

⑧定数とは?

変数と違い、一度定義すると後から変えることのできないもの。

・定義の仕方は下記。

 define("HOURS", 24);

・全部、大文字

・呼び出すときは$が要らない。

 echo HOURS;

https://qiita.com/konojunya/items/492e8114e6bd55344731

 

⑨マジカル定数

PHPにはあらかじめ定義されている定数、「マジカル定数」がある。

https://www.php.net/manual/ja/language.constants.predefined.php

 

 

⑩DIコンテナとは?

 サービスコンテナのこと。DI機能を提供する。

 

⑪セッタとは?

メンバ変数に値を設定するメソッド。

手順(1)メンバ変数をクラスの外から変更できないようにする

 (代入したり取得したりできないようにする)

 private int age;とか

手順(2)メソッドで、引数として取得した値をメンバ変数に代入するメソッドを置く。

https://wa3.i-3-i.info/word15855.html

 

⑫メンバ変数とは?

 クラスの中に用意する変数。

https://wa3.i-3-i.info/word13563.html

 

⑬スケルトンとは

各機能の雛形ファイル。

php artisan make:Model Cardとかでできるもの

https://coinbaby8.com/laravel-php-dekirukoto.html

 

⑭結合とは?

 App\Providers\AppServiceProviderとかその他のServiceProviderで、

register()メソッドに、

「クラス名またはあだ名⇔インスタンス化する関数」の紐づけを書いて登録すること。

 

⑮バインドとは?

サービスコンテナへインスタンス生成方法を登録すること。

以下ケースで活躍します。

・インターフェースと具象クラスを紐付けたいとき
・実行プロセス上で1つのインスタンスを使いまわしたい(singleton)とき
インターフェースに複数の具象クラスが紐づく時、Aクラスのときには、具象クラスAを利用、Bクラスのときには、具象クラスBを利用といった使い方もできます。

インターフェースに依存してないクラスは、リフレクションで解決するのでバインドの必要はありません。

https://www.wakuwakubank.com/posts/456-laravel-container-provider/

bind() はオブジェクトのインスタンス化方法を登録する関数。

https://laraweb.net/practice/1960/

 

⑯解決とは?

サービスコンテナに要求して、インスタンスを取得することを解決と言います。
「Applicationクラスのmakeメソッド」 「resolveヘルパー」などで解決できます。

https://www.wakuwakubank.com/posts/456-laravel-container-provider/

 キーからインスタンスを生成する動作を、依存関係を解決すると言ったりします。

https://qiita.com/harunbu/items/079ea728d2c9cf4f44d5