Fassaden-/Aussehensmodus (Fassade)


Um Entwicklern die Arbeit zu erleichtern, hat das Framework viele der am häufigsten verwendeten Systemmethoden im Voraus durch Fassadentechnologie gekapselt.

Angenommen, wir definieren eine appcommonTest-Klasse, die eine Hallo-Dynamik enthält Methoden.

<?php
namespace app\common;

class Test
{
    public function hello($name)
    {
        return 'hello,' . $name;
    }
}

Der Code zum Aufrufen der Hello-Methode sollte ähnlich sein wie:

$test = new \app\common\Test;
// 输出 hello,thinkphp
echo $test->hello('thinkphp');

Wir definieren eine statische Proxy-Klasse appfacadeTest für diese Klasse (der Klassenname ist willkürlich, aber die Einheitlichkeit erleichtert die Wartung ).

<?php
namespace app\facade;

use think\Facade;

class Test extends Facade
{
    protected static function getFacadeClass()
    {
    	return 'app\common\Test';
    }
}

Solange diese Klassenbibliothek thinkFacade erbt, können Sie die statische Methode verwenden, um die dynamische Methode der dynamischen Klasse appcommonTest aufzurufen. Der obige Code kann beispielsweise geändert werden in:

// 无需进行实例化 直接以静态方法方式调用hello
echo \app\facade\Test::hello('thinkphp');

Kern-Facade-Klassenbibliothek

Das System definiert Facade-Klassenbibliotheken für integrierte, häufig verwendete Klassenbibliotheken, einschließlich:


(动态)类库Facade类
thinkAppthinkfacadeApp
thinkCachethinkfacadeCache
thinkConfigthinkfacadeConfig
thinkCookiethinkfacadeCookie
thinkDbthinkfacadeDb
thinkEnvthinkfacadeEnv
thinkEventthinkfacadeEvent
thinkFilesystemthinkfacadeFilesystem
thinkLangthinkfacadeLang
thinkLogthinkfacadeLog
thinkMiddlewarethinkfacadeMiddleware
thinkRequestthinkfacadeRequest
thinkResponsethinkfacadeResponse
thinkRoutethinkfacadeRoute
thinkSessionthinkfacadeSession
thinkValidatethinkfacadeValidate
thinkViewthinkfacadeView


Also du Methodenaufrufe können problemlos ohne Instanziierung durchgeführt werden, zum Beispiel:

use think\facade\Cache;

Cache::set('name','value');
echo Cache::get('name');

Wenn Sie eine Abhängigkeitsinjektion durchführen, verwenden Sie bitte nicht die Facade-Klasse als Typbeschränkung. Stattdessen wird empfohlen, die ursprüngliche dynamische Klasse zu verwenden ist ein Fehler Verwendung:

<?php
namespace app\index\controller;

use think\facade\App;

class Index
{
    public function index(App $app)
    {
    }
}

sollte wie folgt verwendet werden:

<?php
namespace app\index\controller;

use think\App;

class Index
{
    public function index(App $app)
    {
    }
}

Tatsächlich ist der Effekt der Abhängigkeitsinjektion und der Verwendung des Facade-Proxys in den meisten Fällen derselbe, beide dienen dazu, ein Objekt zu erhalten Instanzen aus dem Container. Beispiel:

<?php
namespace app\index\controller;

use think\Request;

class Index
{
    public function index(Request $request)
    {
        echo $request->controller();
    }
}

hat den gleichen Effekt wie das folgende

<?php
namespace app\index\controller;

use think\facade\Request;

class Index
{
    public function index()
    {
        echo Request::controller();
    }
}

. In der tatsächlichen Entwicklung wird empfohlen, es zuerst zu verwenden: Abhängigkeitsinjektion