Laravelのコアとは何ですか

WBOY
リリース: 2022-03-11 16:34:00
オリジナル
2393 人が閲覧しました

laravel の中核はサービス コンテナ、つまり IOC コンテナです。コンテナーは、依存関係の注入や制御の反転など、フレームワーク全体で必要な一連のサービスを提供します。制御の反転は、コンピューター コード間の結合を減らすために使用できるオブジェクト指向プログラミングの設計原則です。

Laravelのコアとは何ですか

#この記事の動作環境: Windows 10 システム、Laravel バージョン 6、Dell G3 コンピューター。

laravel のコアとは

IOC コンテナとも呼ばれるサービス コンテナには、実際には依存関係注入 (DI) と制御反転 (IOC) の 2 つの部分が含まれています。 Laravelのコア。 Route (ルーティング)、Eloquent ORM (データベース ORM コンポーネント)、Request and Response (リクエストとレスポンス) など、その他のさまざまな機能モジュールは、実際にはコアとは関係のないクラス モジュールによって提供され、これらのクラスが登録されます。 from インスタンス化から最終的な使用まで、laravel のサービスコンテナが実際に責任を負います。サービス コンテナの概念は明確に説明するのが難しく、サービス コンテナの歴史から段階的に説明するしかありません。

このコンテナはフレームワーク全体で必要な一連のサービスを提供します。

IoC コンテナ誕生の物語 - 石器時代 (オリジナル モード)

私たちは「スーパーマン」を 1 つのクラスとして捉えます。

class Superman {}

スーパーマンは生まれたときに少なくとも 1 つのスーパーパワーを持っているはずだと想像できます。このスーパーパワーはオブジェクトに抽象化することもできます。スーパーマンを説明するためにこのオブジェクトのクラスを定義しましょう。超大国には複数の属性と(操作)方法が必要です。これについては自由に想像できますが、ここでは属性だけを持つ「超大国」を大まかに定義します。何ができるかについては、後で詳しく説明します。

class Power {
    /**
     * 能力值
     */
    protected $ability;
    /**
     * 能力范围或距离
     */
    protected $range;
    public function __construct($ability, $range)
    {
        $this->ability = $ability;
        $this->range = $range;
    }
}
ログイン後にコピー

この時点で、「スーパーマン」の作成時にスーパーパワーが与えられるように、前の「スーパーマン」クラスに戻って変更します。

class Superman
{
    protected $power;
    public function __construct()
    {
        $this->power = new Power(999, 100);
    }
}
ログイン後にコピー

この場合、「 「スーパーマン」インスタンスを作成し、「スーパーパワー」のインスタンスも作成しました。ただし、「スーパーマン」と「スーパーパワー」の間には避けられない依存関係があることがわかりました。

いわゆる「依存」とは、「あなたに頼ったら、あなたなしでは私は存在しない」という意味です。

オブジェクト指向プログラミングを実装するプロジェクトでは、このような依存関係が随所に見られます。少量の依存は直感的な影響を与えませんが、この例を徐々に明らかにしていくにつれて、依存が一定のレベルに達すると、それが悪夢のような経験になることが徐々にわかってきます。もちろん、問題の解決方法も当然説明します。

前の例では、スーパーパワー クラスはインスタンス化後の特定のスーパーパワーですが、スーパーマンのスーパーパワーは多様であり、それぞれのスーパーパワーには独自のメソッドと属性があり、その違いを 1 つのタイプで完全に説明することはできません。ここで修正を加えてみましょう。スーパーマンが次のスーパーパワーを持っていると仮定しましょう:

飛行、属性: 飛行速度、飛行時間

ブルート フォース、属性: 強度値

エネルギー爆弾の属性には、ダメージ値、射撃距離、同時射撃数が含まれます。

次のカテゴリを作成しました:

class Flight
{
    protected $speed;
    protected $holdtime;
    public function __construct($speed, $holdtime) {}
}
class Force
{
    protected $force;
    public function __construct($force) {}
}
class Shot
{
    protected $atk;
    protected $range;
    protected $limit;
    public function __construct($atk, $range, $limit) {}
}
ログイン後にコピー

さて、スーパーマンは少し「忙しい」です。スーパーマンが初期化されるとき、必要に応じて彼が持つスーパーパワーをインスタンス化しますか? それはおおよそ次のとおりです:

class Superman
{
    protected $power;
    public function __construct()
    {
        $this->power = new Fight(9, 100);
        // $this->power = new Force(45);
        // $this->power = new Shot(99, 50, 2);
        /*
        $this->power = array(
            new Force(45),
            new Shot(99, 50, 2)
        );
        */
    }
}
ログイン後にコピー

コンストラクター (または他のメソッド) クラスで一連のニーズを手動でインスタンス化する必要がありますが、これはそうではありません良い。ニーズが変化した場合(さまざまなモンスターが地球上で蔓延している場合)、よりターゲットを絞った新しい超能力が必要な場合、または超能力の方法を変更する必要がある場合は、スーパーマンを再発明する必要があると考えられます。つまり、自分の超能力を変えながら、新たな超人を生み出さなければならないのです。効率が悪すぎます!新しいスーパーマンが誕生する前に、世界はすでに滅んでいた。

この時、アイデアを思いついた人はこう考えました。スーパーマンの能力は、チップやその他のデバイスを追加または更新するだけでいつでも変更できます(アイアンマンが思い浮かびます)。この場合、最初からやり直す必要はありません。

IoC コンテナ誕生の物語 - 青銅器時代 (ファクトリー モード)

彼の「スーパーパワー」の初期化動作を「スーパーマン」クラス内で手動で固定化するのではなく、その代わりに外部のは、外部からスーパーパワーのモジュール、デバイス、またはチップ (以降、これらを「モジュール」と呼びます) を作成し、それらをスーパーマンの体内の特定のインターフェイスに埋め込む責任があります。このインターフェイスは、これが存在する限り、与えられたものです。」このインターフェースのデバイスは、スーパーマンがスーパーマンの特定の能力を強化および増加させるために使用できます。外部の世界にその依存関係要件の責任を負わせるこの動作は、「制御の反転 (IoC)」と呼ぶことができます。

ファクトリ モードは、その名前が示すように、クラスが依存する外部のもののすべてのインスタンスを 1 つ以上の「ファクトリ」、つまり「ファクトリ モード」によって作成できる開発モ​​ードです。

スーパーマンのスーパーパワー モジュールを作成するために、1 つの方法だけでさまざまなモジュールを作成できる工場を作成しました:

class SuperModuleFactory
{
    public function makeModule($moduleName, $options)
    {
        switch ($moduleName) {
            case 'Fight':     return new Fight($options[0], $options[1]);
            case 'Force':     return new Force($options[0]);
            case 'Shot':     return new Shot($options[0], $options[1], $options[2]);
        }
    }
}
ログイン後にコピー

这时候,超人 创建之初就可以使用这个工厂!

class Superman
{
    protected $power;
    public function __construct()
    {
        // 初始化工厂
        $factory = new SuperModuleFactory;
        // 通过工厂提供的方法制造需要的模块
        $this->power = $factory->makeModule('Fight', [9, 100]);
        // $this->power = $factory->makeModule('Force', [45]);
        // $this->power = $factory->makeModule('Shot', [99, 50, 2]);
        /*
        $this->power = array(
            $factory->makeModule('Force', [45]),
            $factory->makeModule('Shot', [99, 50, 2])
        );
        */
    }
}
ログイン後にコピー

可以看得出,我们不再需要在超人初始化之初,去初始化许多第三方类,只需初始化一个工厂类,即可满足需求。但这样似乎和以前区别不大,只是没有那么多 new 关键字。其实我们稍微改造一下这个类,你就明白,工厂类的真正意义和价值了。

class Superman
{
    protected $power;
    public function __construct(array $modules)
    {
        // 初始化工厂
        $factory = new SuperModuleFactory;
        // 通过工厂提供的方法制造需要的模块
        foreach ($modules as $moduleName => $moduleOptions) {
            $this->power[] = $factory->makeModule($moduleName, $moduleOptions);
        }
    }
}
// 创建超人
$superman = new Superman([
    'Fight' => [9, 100],
    'Shot' => [99, 50, 2]
    ]);
ログイン後にコピー

现在修改的结果令人满意。现在,“超人” 的创建不再依赖任何一个 “超能力” 的类,我们如若修改了或者增加了新的超能力,只需要针对修改 SuperModuleFactory 即可。

【相关推荐:laravel视频教程

以上がLaravelのコアとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!