>PHP 프레임워크 >Laravel >laravel의 Contracts, ServiceContainer, ServiceProvider 및 Facades 간의 관계에 대한 자세한 설명

laravel의 Contracts, ServiceContainer, ServiceProvider 및 Facades 간의 관계에 대한 자세한 설명

藏色散人
藏色散人앞으로
2020-04-16 11:42:283117검색

계약, ServiceContainer, ServiceProvider, Facades Contracts, ServiceContainer, ServiceProvider, Facades 

1.Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方法;

2.ServiceContainer,实现Contracts,具体的逻辑实现;

3.ServiceProviderserviceContainer的服务提供者,返回ServiceContainer的实例化,供其他地方使用,可以把它加入到app/configprovider中,会被自动注册到容器中;

4.Facades, 简化ServiceProvider的调用方式,而且可以静态调用ServiceContainer中的方法;

 

实现

Contracts接口可以写或不写,这里就不定义了;

定义一个ServiceContainer,实现具体的功能     

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

 

 

定义一个ServiceProvider供其他地方使用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();
        });
    }
}

 

 

app/config.php中的providers数组中加入ServiceProvider,让系统自动注册

AppProvidersMyFooServiceProvider::class,

 

这时候就可以使用了,假设在控制器中使用

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

 

这样太麻烦,还需要用make来获取对象,为了简便,就可以使用门面功能,定义门面MyFooFacade

1.계약 계약, 계약, 즉 인터페이스는 몇 가지 규칙을 정의하며, 이 인터페이스를 구현하는 모든 사람은

2. ServiceContainer, 특정 로직인 계약을 구현해야 합니다. 구현 ;

3. serviceContainer의 서비스 공급자인 ServiceProvider는 다른 곳에서 사용할 수 있도록 ServiceContainer의 인스턴스화를 반환합니다. app/config의 code>provider는 컨테이너에 자동으로 등록됩니다.

4. FacadesServiceProvider 호출 방법을 단순화합니다. , ServiceContainer의 메소드는 정적으로 호출될 수 있습니다.

구현

계약 인터페이스는 작성되거나 작성되지 않을 수 있습니다.

특정 기능을 구현하려면 ServiceContainer를 정의하세요. 🎜
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class MyFooFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        //这里返回的是ServiceProvider中注册时,定义的字符串
        return &#39;myfoo&#39;;
    }
}
🎜 🎜🎜 🎜🎜다른 곳에서 사용할 수 있도록 ServiceProvider를 정의하세요.
use App\Facades\MyFooFacade;
public function two($id=null)
{
    //从系统容器中获取实例化对象
    $myfoo = App::make("myfoo");
    echo $myfoo->add(1,2);
    //使用门面
    echo MyFooFacade::add(4,5);
}
🎜 🎜🎜 🎜🎜 app/config.phpproviders 배열에 ServiceProvider를 추가하면 시스템이 자동으로 🎜🎜 를 등록할 수 있습니다. 이때 AppProvidersMyFooServiceProvider::class,🎜🎜 🎜🎜를 사용할 수 있습니다. 컨트롤러에서 🎜rrreee🎜 🎜🎜을 사용하면 너무 번거로워서 make를 사용해야 합니다. 객체를 얻으려면 단순화를 위해 Facade 함수를 사용하고 MyFooFacade🎜rrreee🎜 🎜🎜컨트롤러에서 직접 호출할 수 있습니다🎜rrreee🎜 🎜🎜 🎜🎜일반적으로 사용자 정의 클래스를 생성한 후에는 서비스 제공자와 Facade를 사용하여 다른 곳에서 쉽게 사용할 수 있습니다. 🎜🎜추천: "🎜laravel 튜토리얼🎜"🎜

위 내용은 laravel의 Contracts, ServiceContainer, ServiceProvider 및 Facades 간의 관계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제