Maison  >  Article  >  cadre php  >  Explication détaillée de la relation entre les contrats, ServiceContainer, ServiceProvider et Facades dans Laravel

Explication détaillée de la relation entre les contrats, ServiceContainer, ServiceProvider et Facades dans Laravel

藏色散人
藏色散人avant
2020-04-16 11:42:283009parcourir

Contracts, ServiceContainer, ServiceProvider, Facades 

1.Contracts Le contrat, le contrat, c'est-à-dire l'interface, définit certaines règles, et tous ceux qui implémentent cette interface doivent implémenter it Méthodes à l'intérieur ;

2.ServiceContainer, implémente Contracts, implémentation logique spécifique

3.ServiceProvider, le fournisseur de services de serviceContainer, renvoie ServiceContainer Instanciation ; pour une utilisation ailleurs, vous pouvez l'ajouter à app/config de provider, et il sera automatiquement enregistré dans le conteneur

4.Facades, simplifiez la méthode d'appel de ServiceProvider et le les méthodes dans ServiceContainer peuvent être appelées de manière statique ;

implémente l'interface

Contracts qui peut être écrite ou non, mais pas ici. Défini ;

définit un ServiceContainer pour implémenter des fonctions spécifiques

namespace App\Helper;
class MyFoo
{
    public function add($a, $b)
    {
        return $a+$b;
    }
}

définit un ServiceProvider pour une utilisation ailleurs ServiceContain

<?php
namespace App\Providers;
use App\Helper\MyFoo; //要服务的Container
use Illuminate\Support\ServiceProvider;
use App;
class MyFooServiceProvider extends ServiceProvider
{
    public function boot(){}
    //注册到容器中
    public function register()
    {
        //可以这么绑定,这需要use App;
        App::bind("myfoo",function(){
            return new MyFoo();
        });
        //也可以这么绑定
        $this->app->bind("myfoo", function(){
            return new MyFoo();
        });
    }
}

Ajoutez app/config.php au tableau providers dans ServiceProvider pour permettre au système d'enregistrer automatiquement

AppProvidersMyFooServiceProvider::class,

peut être utilisé à ce moment. Supposons que vous utilisiez

public function two($id=null)
{
    //从系统容器中获取实例化对象
    $myfoo = App::make("myfoo");
    echo $myfoo->add(1,2);
}

dans le contrôleur, c'est trop gênant et vous devez utiliser make. pour récupérer l'objet. , pour plus de simplicité, vous pouvez utiliser la fonction façade, définir la façade MyFooFacade

namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class MyFooFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        //这里返回的是ServiceProvider中注册时,定义的字符串
        return &#39;myfoo&#39;;
    }
}

et l'appeler directement dans le contrôleur

use App\Facades\MyFooFacade;
public function two($id=null)
{
    //从系统容器中获取实例化对象
    $myfoo = App::make("myfoo");
    echo $myfoo->add(1,2);
    //使用门面
    echo MyFooFacade::add(4,5);
}

De manière générale, après avoir personnalisé une classe, afin de faciliter son utilisation ailleurs, vous pouvez faire appel à des prestataires et des façades.

Recommandé : "tutoriel Laravel"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer