Heim >PHP-Framework >Laravel >Implementierung einer einfachen Laravel-Fassade mithilfe von PHP-Funktionsmerkmalen

Implementierung einer einfachen Laravel-Fassade mithilfe von PHP-Funktionsmerkmalen

藏色散人
藏色散人nach vorne
2022-01-27 16:33:012129Durchsuche

Die folgende Tutorial-Kolumne von Laravel zeigt Ihnen, wie Sie PHP-Eigenschaften verwenden, um eine einfache Fassade zu implementieren. Ich hoffe, dass sie für alle hilfreich ist!

Kurze Beschreibung

Facade kann mir effektiv dabei helfen, die Statik von Methoden zu realisieren. Laravel Die meisten Erweiterungspakete verwenden Facade. [Empfohlen: Laravel-Video-TutorialFacade 可以有效帮我实现方法的静态化。Laravel 大部分的扩展包都使用了 Facade。【推荐:laravel视频教程
下面的简易 Facade 主要是利用 PHP 的特性 trait,魔术方法 __callStatic,反射类 ReflectionClass

使用场景

后台系统大部分都会有类似这样的操作:

<?php
$user = User::find($id);if (!$user) {
    throw new \Expection("资源不存在");}

这样似乎没有什么问题,但是还会存在下面这样的:

$article = Article::find($id);if (!$article) {
    throw new \Expection("资源不存在");}$article->delete();

这样写法十分不优雅。

上代码

1、首先我们应该要有一个 Service

<?phpnamespace App\Services;use App\Traits\ModeServiceTrait;class ModelService extends BaseService{
    use ModeServiceTrait;}

2、新建一个 Trait

trait 为了多继承而存在的,可以去 PHP官网 看文档。

<?php
namespace App\Traits;
use \ReflectionClass;
use \Exception;use \ReflectionException;
use Illuminate\Database\Eloquent\Model;
use App\Exceptions\ResourceException;
/**
 * @method static Model find(string $className, int $id, callable $callback = null)
 *
 * @see Model
 * @package App\Services
 */trait ModeServiceTrait{
    /**
     * 回调方法
     *
     * @param Model|null $model
     * @param string $method
     * @return Model
     * @throws ResourceException
     */
    public static function callback(Model|null $model, string $method): Model    {
        switch ($method)
        {
            case &#39;first&#39;:
            case &#39;find&#39;:
                if (!$model) {
                    throw new ResourceException("资源不存在");
                }
                break;

            default:

                break;
        }

        return $model;
    }

    /**
     * 调用不存在的方法时触发
     *
     * @param $method
     * @param $args
     * @return false|mixed
     * @throws ReflectionException
     * @throws ResourceException
     * @throws Exception
     */
    public static function __callStatic($method, $args)
    {
        $className = $args[0];
        $arg = $args[1];

        // 判断模型类是否存在
        if (!class_exists($className)) {
            throw new Exception("The class {$className} could not be found. from:" . __CLASS__);
        }

        // 利用反射实例化其类
        $reflection = new ReflectionClass($className);
        $instance = $reflection->newInstanceArgs();

        // 调用该不存在的方法
        $model = call_user_func_array([$instance, $method], [$arg]);

        // 如果存在复杂操作交给 callback
        return isset($args[2]) ? $args[2]($model) : self::callback($model, $method);
    }}

首先我们关注 __callStatic 这个魔术方法。 当调用不存在的静态方法时会触发该方法。和他相似的魔术方法是 __call。这是使用 __callStatic 是为了达到 Facade 的效果。

__callStatic 有两个回调参数 $method被调用的且不存在的方法$args$method 方法中所传递的参数(数组形式)。

这样一个简易的 trait 就完成了。

使用

我们新建一个 command

$ php artisan make:command TestCommand

写入下面的内容

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Services\ModelService;
use App\Models\Article\Article;
class TestCommand extends Command{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = &#39;test:test&#39;;

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = &#39;a test&#39;;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $article = ModelService::find(Article::class, 1);

        $article = ModelService::find(Article::class, 1, function ($model) {
            return $model->load('author');
        });
    }}

其中的 Article 模型需要自己去创建。
接下来就可以看看效果了:

$ php artisan test:test

结语

这样我们就抛弃了使用 abstract 抽象类,来达到了跟 Facade]
Die folgende einfache Fassade Main Es verwendet die PHP-Funktionen trait, die magische Methode __callStatic und die Reflexionsklasse ReflectionClass.

Nutzungsszenarien🎜🎜🎜Die meisten Hintergrundsysteme haben ähnliche Vorgänge wie diesen: 🎜rrreee🎜Damit scheint es kein Problem zu geben, aber es wird auch Folgendes geben: 🎜rrreee🎜Diese Schreibweise ist sehr unelegant . 🎜🎜🎜🎜🎜Laden Sie den Code hoch🎜🎜🎜🎜🎜🎜1. Zuerst sollten wir einen Service🎜🎜rrreee🎜🎜🎜🎜2 erstellen Offizielle Website, um das Dokument anzusehen. 🎜rrreee🎜Zuerst konzentrieren wir uns auf die magische Methode __callStatic. Diese Methode wird ausgelöst, wenn eine nicht vorhandene statische Methode aufgerufen wird. Eine ähnliche magische Methode ist __call. Dabei wird __callStatic verwendet, um den Effekt von Facade zu erzielen. 🎜🎜__callStatic hat zwei Rückrufparameter $method, eine aufgerufene Methode, die nicht existiert, $args Es ist der Parameter (in Array-Form), der in der Methode $method übergeben wird. 🎜🎜So ein einfaches Merkmal ist vollständig. 🎜🎜🎜🎜🎜Mit🎜🎜🎜Wir erstellen einen neuen Befehl🎜rrreee🎜Schreiben Sie den folgenden Inhalt🎜rrreee🎜Das Artikel-Modell muss von Ihnen selbst erstellt werden. 🎜Jetzt können Sie den Effekt sehen:🎜rrreee🎜🎜🎜🎜Fazit🎜🎜🎜Auf diese Weise verzichten wir auf die Verwendung der abstrakten Klasse abstract und erzielen den gleichen Effekt wie Facade Wirkung. Gleichzeitig wird auch die Wiederverwendung von Code erreicht. 🎜Die Verwendung des Programms auf diese Weise erfordert viel mehr Schritte, aber im Vergleich zur Eleganz spielt die Leistung keine Rolle. 🎜🎜Der Ausdruck ist nicht sehr klar, man muss ihn genau verstehen. 🎜                                                                                                            

Das obige ist der detaillierte Inhalt vonImplementierung einer einfachen Laravel-Fassade mithilfe von PHP-Funktionsmerkmalen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen