>PHP 프레임워크 >Laravel >PHP 기능 특성을 사용하여 간단한 Laravel Facade 구현하기

PHP 기능 특성을 사용하여 간단한 Laravel Facade 구현하기

藏色散人
藏色散人앞으로
2022-01-27 16:33:012129검색

다음 튜토리얼 칼럼인 Laravel에서는 PHP 특성을 사용하여 간단한 Facade를 구현하는 방법을 소개합니다. 모두에게 도움이 되기를 바랍니다.

간단한 설명

Facade는 메서드의 정적화를 구현하는 데 효과적으로 도움이 될 수 있습니다. Laravel 대부분의 확장 패키지는 Facade를 사용합니다. [추천: laravel 비디오 튜토리얼Facade 可以有效帮我实现方法的静态化。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]
다음과 같은 간단한 Facade 메인 이는 PHP의 기능 trait, 매직 메소드 __callStatic 및 리플렉션 클래스 ReflectionClass를 사용합니다.

사용 시나리오🎜🎜🎜대부분의 백그라운드 시스템은 다음과 유사한 작업을 수행합니다. 🎜rrreee🎜이에는 문제가 없어 보이지만 다음도 있을 수 있습니다. 🎜rrreee🎜이러한 작성 방식은 매우 우아하지 않습니다. . 🎜🎜🎜🎜🎜코드를 업로드하세요🎜🎜🎜🎜🎜🎜1. 먼저 Service🎜🎜rrreee🎜🎜🎜🎜2를 만들어야 합니다. 다중 상속을 위한 특성이 존재합니다. PHP로 이동할 수 있습니다. 문서를 보려면 공식 웹사이트를 방문하세요. 🎜rrreee🎜먼저 마법 메서드 __callStatic에 중점을 둡니다. 이 메서드는 존재하지 않는 정적 메서드가 호출될 때 트리거됩니다. 유사한 매직 메서드는 __call입니다. 이는 Facade의 효과를 얻기 위해 __callStatic을 사용하는 것입니다. 🎜🎜__callStatic에는 존재하지 않는 호출된 메서드$method, $args라는 두 개의 콜백 매개변수가 있습니다. $method 메소드에 전달된 매개변수(배열 형식)입니다. 🎜🎜이렇게 간단한 특성이 완성되었습니다. 🎜🎜🎜🎜🎜사용🎜🎜🎜새 명령어를 만듭니다🎜rrreee🎜다음 내용을 작성하세요🎜rrreee🎜Article 모델은 직접 만들어야 합니다. 🎜이제 효과를 볼 수 있습니다:🎜rrreee🎜🎜🎜🎜결론🎜🎜🎜이런 식으로 abstract 추상 클래스 사용을 포기하고 Facade와 동일한 효과를 얻습니다. > 효과. 동시에 코드 재사용도 달성됩니다. 🎜이런 방식으로 프로그램을 사용하면 훨씬 더 많은 단계가 필요하지만 우아함에 비하면 성능은 중요하지 않습니다. 🎜🎜표현이 명확하지 않으니 깊이 이해하셔야 합니다. ㅋㅋㅋ

위 내용은 PHP 기능 특성을 사용하여 간단한 Laravel Facade 구현하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제