PHP 기능 특성을 사용하여 간단한 Laravel Facade 구현하기
다음 튜토리얼 칼럼인 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 '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
]
다음과 같은 간단한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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

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

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

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

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

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