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 'first': case 'find': 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 = 'test:test'; /** * The console command description. * * @var string */ protected $description = 'a test'; /** * 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!