ホームページ  >  記事  >  PHPフレームワーク  >  PHP 機能トレイトを使用した単純な Laravel ファサードの実装

PHP 機能トレイトを使用した単純な Laravel ファサードの実装

藏色散人
藏色散人転載
2022-01-27 16:33:012069ブラウズ

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 &#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 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 = &#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 と同じ効果を実現する抽象クラス。コードの再利用も実現します。 この方法でプログラムを使用するには、さらに多くの手順が必要になりますが、エレガンスに比べれば、パフォーマンスは重要ではありません。
この表現はあまり明確ではないので、深く理解する必要があります。

以上がPHP 機能トレイトを使用した単純な Laravel ファサードの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。