Laravelのコントローラからクラスを抜き出したい!から始まったLaravelとPHPのいろいろ①
「Laravelコントローラから処理を抜き出した方が良い」
どうやって抜き出したやつを取り出したら良いのか?どこに書くのか?
①依存性の注入(DI)について
https://qiita.com/harunbu/items/079ea728d2c9cf4f44d5
https://laraweb.net/surrounding/2001/
https://qiita.com/kd9951/items/951ab700f28d1d49c9c9 →わかりやすい!!
外でインスタンス化済みインスタンスを、あるクラスに渡す(注入)すること。
クラスの中でnewしない。(別クラスのインスタンス化をしない。)
クラスが別のクラスに依存し、単体テストができなくなるから。
ルートに紐づいたコントローラのメソッドに対して、クラス名をタイプヒントした引数を指定すると、そのクラスのインスタンスを生成し、引数として渡してくれ
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(クラス名またはあだ名, インスタンスを返すクロージャ)
②タイプヒントとは?
関数及びメソッドが受け取る引数がどのオブジェクトなのか(もしくはなんのインターフェースを備えるか)、配列なのか、コールバックなのかなどを指定することが出来る機能
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/
キーからインスタンスを生成する動作を、依存関係を解決すると言ったりします。