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

Laravel Facade의 상세한 해석

藏色散人
藏色散人앞으로
2020-11-09 15:26:032371검색

다음은 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으로 문의하시기 바랍니다. 삭제