> PHP 프레임워크 > Laravel > Laravel Facade의 상세한 해석

Laravel Facade의 상세한 해석

藏色散人
풀어 주다: 2020-11-09 15:52:46
앞으로
2372명이 탐색했습니다.

다음은 Laravel튜토리얼 칼럼에 나온 Laravel Facade에 대한 자세한 설명입니다. 도움이 필요한 친구들에게 도움이 되었으면 좋겠습니다!

Laravel Facade의 상세한 해석

안녕하세요 여러분, 오늘의 내용은 Laravel의 Facade 메커니즘 구현 원리에 관한 것입니다.

Facade의 간단한 사용

데이터베이스 사용:

$users = DB::connection('foo')->select(...);
로그인 후 복사

IOC 컨테이너

우리 모두 알고 있듯이 IOC 컨테이너는 Laravel 프레임워크에서 가장 중요한 부분입니다. IOC와 컨테이너라는 두 가지 기능을 제공합니다.

  • IOC(Inversion of Control), 제어 반전이라고도 합니다. 직설적으로 말하면, 개발자가 객체가 어떻게 생성되는지는 신경 쓰지 않고 어떻게 사용하는지에만 신경 쓸 수 있도록 객체 생성을 제어하는 ​​것입니다.
  • IOC 메커니즘을 통해 생성된 객체 인스턴스는 컨테이너 기능인 지속적인 사용을 위해 저장 위치가 필요합니다.

이번에는 IOC 컨테이너의 구체적인 구현에 대해서는 설명하지 않겠습니다. 나중에 자세히 설명하는 글이 있을 예정입니다. IOC 컨테이너와 관련하여 독자는 두 가지 사항만 기억하면 됩니다.

  1. 구성에 따라 객체 인스턴스를 생성합니다.
  2. 언제든지 쉽게 액세스할 수 있도록 객체 인스턴스를 저장합니다.

간소화된 Facade 클래스

<?php
namespace facades;

abstract class Facade
{
    protected static $app;

    /** 
     * Set the application instance.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public static function setFacadeApplication($app)
    {   
        static::$app = $app;
    } 

    /** 
     * Get the registered name of the component.
     *
     * @return string
     *
     * @throws \RuntimeException
     */
    protected static function getFacadeAccessor()
    {
        throw new RuntimeException(&#39;Facade does not implement getFacadeAccessor method.&#39;);
    }

    /** 
     * Get the root object behind the facade.
     *
     * @return mixed
     */
    public static function getFacadeRoot()
    {   
        return static::resolveFacadeInstance(static::getFacadeAccessor());
    } 

    /**
     * Resolve the facade root instance from the container.
     *
     * @param  string|object  $name
     * @return mixed
     */
    protected static function resolveFacadeInstance($name)
    {
        return static::$app->instances[$name];
    }

    public static function __callStatic($method, $args)
    {
        $instance = static::getFacadeRoot();

        if (! $instance) {
            throw new RuntimeException(&#39;A facade root has not been set.&#39;);
        }   

        switch (count($args)) {
            case 0:
                return $instance->$method();
            case 1:
                return $instance->$method($args[0]);
            case 2:
                return $instance->$method($args[0], $args[1]);
            case 3:
                return $instance->$method($args[0], $args[1], $args[2]);
            case 4:
                return $instance->$method($args[0], $args[1], $args[2], $args[3]);
            default:
                return call_user_func_array([$instance, $method], $args);
        } 
    }
}
로그인 후 복사

코드 설명:

  1. $app는 프레임워크가 초기화될 때 정적 메소드 setFacadeApplication()을 통해 설정되는 IOC 컨테이너 인스턴스를 저장합니다.
  2. 이것은 __callStatic 매직 메소드를 구현합니다.
  3. getFacadeAccessor() 메소드는 문자열 식별자를 상속하고 반환해야 합니다. . 이 식별자를 통해 IOC 컨테이너는 바인딩된 클래스의 개체를 반환할 수 있습니다(프레임워크 초기화 또는 기타 시간 바인딩)
  4. $instance

를 통해 특정 메서드를 호출하세요. 나만의 Facade 만들기:

TEST1 특정 논리:

<?php
class Test1{
	public function hello()
	{
		print("hello world");
	}}
로그인 후 복사

TEST1 클래스 Facade:

<?php
namespace facades;/**
 * Class Test1
 * @package facades
 *
 * @method static setOverRecommendInfo [设置播放完毕时的回调函数]
 * @method static setHandlerPlayer [明确指定下一首时的执行类]
 */class Test1Facade extends Facade{
    protected static function getFacadeAccessor()
    {   
        return &#39;test1&#39;;
    }   }
로그인 후 복사

Usage:

use facades\Test1Facade;Test1Facade::hello();  // 这是 Facade 调用
로그인 후 복사

Explanation:

  1. facadesTest1Facade 정적 메소드 hello()를 호출할 때 이 메소드는 정의되지 않았기 때문에 __callStatic이 호출됩니다. IOC 컨테이너인
  2. 에서 해당 인스턴스, 즉 test1
  3. return static::$app->instances[$name];。这其中的 $name,即为 facadesTest1$app을 얻어 클래스의 인스턴스화 과정을 처리하는 것입니다.

위 내용은 Laravel Facade의 상세한 해석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿