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

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

Jan 27, 2022 pm 04:33 PM
facade trait

다음 튜토리얼 칼럼인 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 특성 DTO: 데이터 전송 객체 개발 단순화 PHP 특성 DTO: 데이터 전송 객체 개발 단순화 Oct 12, 2023 am 09:04 AM

PHPtraitDTO: 데이터 전송 개체 개발 단순화 소개: 최신 소프트웨어 개발에서 데이터 전송 개체(DataTransferObject, DTO라고 함)는 중요한 역할을 합니다. DTO는 계층 간에 데이터를 전송하는 데 사용되는 순수 데이터 컨테이너입니다. 그러나 개발 과정에서 개발자는 DTO를 정의하고 운영하기 위해 유사한 코드를 대량으로 작성해야 합니다. 이 프로세스를 단순화하기 위해 PHP에 특성 기능이 도입되었습니다. 특성 기능을 사용하면 됩니다.

PHP 특성 DTO의 디자인 패턴 및 사례에 대한 심층적인 이해 PHP 특성 DTO의 디자인 패턴 및 사례에 대한 심층적인 이해 Oct 12, 2023 am 08:48 AM

PHPtraitDTO의 디자인 패턴 및 사례에 대한 심층적인 이해 소개: PHP 개발에서 디자인 패턴은 필수적인 부분입니다. 그 중 DTO(DataTransferObject)는 데이터 전송 개체를 캡슐화하는 데 일반적으로 사용되는 디자인 패턴입니다. DTO를 구현하는 과정에서 특성을 사용하면 코드의 재사용성과 유연성을 효과적으로 향상시킬 수 있습니다. 이 기사에서는 PHP에서 traitDTO의 디자인 패턴과 사례를 탐구합니다.

PHP 특성 DTO: 데이터 전송 프로세스를 최적화하기 위한 핵심 도구 PHP 특성 DTO: 데이터 전송 프로세스를 최적화하기 위한 핵심 도구 Oct 12, 2023 pm 03:10 PM

PHPtraitDTO: 데이터 전송 프로세스를 최적화하기 위한 핵심 도구이며 특정 코드 예제가 필요합니다. 소개: 개발 프로세스 중에 데이터 전송은 매우 일반적인 요구 사항이며, 특히 데이터가 서로 다른 수준 간에 전송될 때 더욱 그렇습니다. 이 데이터를 전송하는 과정에서 다양한 비즈니스 요구 사항을 충족하기 위해 데이터를 처리, 확인 또는 변환해야 하는 경우가 많습니다. 코드의 가독성과 유지 관리성을 향상시키기 위해 PHPtraitDTO(DataTransferObject)를 사용하여 최적화할 수 있습니다.

PHP 특성 DTO: 데이터 전송 객체의 단순성과 유연성 달성 PHP 특성 DTO: 데이터 전송 객체의 단순성과 유연성 달성 Oct 12, 2023 am 10:21 AM

PHPtraitDTO: 데이터 전송 객체의 단순성과 유연성 구현 소개: PHP 개발 프로세스에는 데이터 전송 및 처리가 종종 포함됩니다. DataTransferObject(줄여서 DTO)는 서로 다른 계층 간에 데이터를 전송하는 데 사용되는 디자인 패턴입니다. 전송 프로세스 중에 DTO는 데이터를 캡슐화하고 공개 액세스 방법을 제공하여 데이터 작업을 단순화합니다. 이 기사에서는 PHPtrait을 사용하여 DT를 구현하는 방법을 소개합니다.

PHP 특성 DTO를 사용하여 고도로 사용자 정의 가능한 데이터 전송 프레임워크 구현 PHP 특성 DTO를 사용하여 고도로 사용자 정의 가능한 데이터 전송 프레임워크 구현 Oct 12, 2023 pm 12:46 PM

PHPtraitDTO를 사용하여 고도로 사용자 정의 가능한 데이터 전송 프레임워크 구현 웹 사이트와 애플리케이션이 더욱 복잡해짐에 따라 데이터 전송이 점점 더 중요해지고 있습니다. PHP에서는 DataTransferObject(간단히 DTO)를 사용하여 데이터 전송을 처리하면 코드가 크게 단순화되고 유지 관리성과 확장성이 향상됩니다. 이 기사에서는 PHPtrait 및 DTO를 사용하여 고도로 사용자 정의 가능한 데이터 전송 프레임워크를 구현하는 방법을 소개하고 해당 코드 예제를 제공합니다.

PHP 특성 DTO: 우아한 데이터 전송 객체 패턴 PHP 특성 DTO: 우아한 데이터 전송 객체 패턴 Oct 12, 2023 am 08:34 AM

PHPtraitDTO: 우아한 데이터 전송 개체 패턴 개요: 데이터 전송 개체(줄여서 DTO)는 서로 다른 계층 간에 데이터를 전송하는 데 사용되는 디자인 패턴입니다. 애플리케이션에서는 데이터베이스나 외부 서비스에서 데이터를 가져와 애플리케이션의 여러 계층 간에 전달해야 하는 경우가 많습니다. DTO 모드는 데이터 전송을 더욱 간결하고 명확하게 만들 수 있으며 확장 및 유지 관리도 용이하게 합니다. PHP에서는 특성을 사용하여 DTO를 구현할 수 있습니다.

PHP 특성 DTO: 데이터 전송 프로세스를 최적화하기 위한 핵심 도구 PHP 특성 DTO: 데이터 전송 프로세스를 최적화하기 위한 핵심 도구 Oct 12, 2023 am 09:27 AM

PHPtraitDTO: 데이터 전송 프로세스를 최적화하기 위한 핵심 도구입니다. 개발 프로세스에서 데이터 전송은 매우 중요한 링크입니다. 데이터를 효율적으로 전송하는 방법은 개발자가 해결해야 할 문제 중 하나가 되었습니다. PHP 언어에서는 traitDTO(DataTransferObject)를 사용하면 데이터 전송 프로세스를 최적화하고 데이터 전송 효율성을 향상시킬 수 있습니다. 이 기사에서는 traitDTO가 무엇인지, 이를 사용하여 데이터 전송 흐름을 최적화하는 방법을 소개합니다.

PHP 특성 DTO: 데이터 전송 효율성을 향상시키는 핵심 기술 PHP 특성 DTO: 데이터 전송 효율성을 향상시키는 핵심 기술 Oct 12, 2023 pm 03:01 PM

PHPtraitDTO: 데이터 전송 효율성 향상을 위한 핵심 기술 소개: 현대 소프트웨어 개발에서 데이터 전송은 매우 중요한 연결 고리입니다. 대부분의 애플리케이션에서 데이터는 데이터베이스에서 프런트엔드 페이지로, 프런트엔드 양식에서 백엔드 처리 로직으로 등 한 위치에서 다른 위치로 전송되어야 합니다. 데이터 전송의 효율성은 전체 시스템의 성능과 사용자 경험에 직접적인 영향을 미칩니다. 데이터 전송의 효율성을 높이기 위해 PHP의 traitDTO(DataTransferO)를 사용할 수 있습니다.

See all articles