ホームページ > 記事 > PHPフレームワーク > PHP 機能トレイトを使用した単純な Laravel ファサードの実装
Laravel の次のチュートリアル コラムでは、PHP トレイトを使用して単純な Facade を実装する方法を紹介します。
##簡単な説明
Facade は、メソッドの静的化を実現するのに効果的に役立ちます。 Laravel
ほとんどの拡張機能パッケージは Facade
を使用します。 [推奨: laravel ビデオ チュートリアル
]次の簡単な Facade
では、主に PHP の機能 trait
、マジック メソッド __callStatic
、Reflection クラスを使用しています。 リフレクションクラス
。
使用シナリオほとんどのバックグラウンド システムでは次のような操作が行われます:
<?php $user = User::find($id);if (!$user) { throw new \Expection("资源不存在");}
問題はないようですが、しかし、次のようなこともあります。
$article = Article::find($id);if (!$article) { throw new \Expection("资源不存在");}$article->delete();
この書き方は非常に洗練されていません。
コード
1. まずサービスを用意する必要があります
<?phpnamespace App\Services;use App\Traits\ModeServiceTrait;class ModelService extends BaseService{ use ModeServiceTrait;}
2. 新しい特性を作成します
特性は多重継承用に存在します。ドキュメントを読むには、PHP 公式 Web サイトにアクセスしてください。<?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 2 つのコールバック パラメータがあります
$method は存在しない
呼び出されたメソッドです ,
$args それ
$method メソッドで渡されるパラメータ (配列形式) です。
特性が完成しました。
使用
新しいコマンド
$ 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
と同じ効果を実現する抽象クラス。コードの再利用も実現します。 この方法でプログラムを使用するには、さらに多くの手順が必要になりますが、エレガンスに比べれば、パフォーマンスは重要ではありません。
この表現はあまり明確ではないので、深く理解する必要があります。
以上がPHP 機能トレイトを使用した単純な Laravel ファサードの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。