안녕하세요 ?
컬렉션이나 문자열 도우미에 존재하지 않는 메서드를 얼마나 자주 원하셨나요? 방법을 연결하기 시작했지만 그 중 하나가 누락된 것으로 판명되면 벽에 부딪히게 됩니다. 솔직히 이해할 수 있습니다. 아시다시피 프레임워크는 모든 것에 적용됩니다. 나는 이런 상황에 여러 번 직면했습니다. 매번 프레임워크를 확장하는 방법에 대해 알아보기 전에 내가 확장하려는 것이 매크로 가능한 것인지 확인합니다. 그런데 그게 무슨 뜻인가요? 이것이 바로 우리가 탐구할 내용입니다!
뭐야 매크로야? ?
다음 JWT가 있다고 가정해 보겠습니다.
$jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
그리고 헤더를 추출해야 합니다.
str($jwt) ->before('.') ->fromBase64() ->fromJson(); // does not exist ? // BadMethodCallException Method Illuminate\Support\Stringable::fromJson does not exist.
fromJson()이 존재하지 않나요? 물론 간단하게 다음과 같이 할 수도 있습니다.
json_decode(str($jwt)->before('.')->fromBase64());
그런데 그게 무슨 재미가 있나요? 게다가 내 글이라니?
따라서 Stringable 클래스를 확장할 방법이 필요합니다. 이를 수행하는 방법은 몇 가지가 있지만 Laravel은 개발자가 사용자 정의 메소드를 추가하고 싶어할 수도 있다는 것을 미리 알고 있었기 때문에 클래스를 매크로 가능 또는 확장 가능하게 만들었습니다.
IlluminateSupportStringable 클래스를 살펴보면 Macroable 특성을 사용하는 것을 볼 수 있습니다.
계속해서 수업을 연장해 보겠습니다. AppServiceProvider에서 다음을 추가합니다.
<?php namespace App\Providers; use Illuminate\Support\Stringable; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Stringable::macro('fromJson', function (bool $associative = true) { return json_decode($this->value, $associative); }); } }
이제 코드를 다시 실행해 보겠습니다.
str($jwt) ->before('.') ->fromBase64() ->fromJson(); // ["alg" => "HS256", "typ" => "JWT"]
완벽하게 작동하나요? 하지만 이제 여러분은 이것이 어떻게 작동했는지 궁금할 것입니다. $this->value는 정확히 무엇인가요? 해리포터에서는 무슨 일이 벌어지고 있는 걸까요?
마법을 공개하시나요?
우리는 Stringable 클래스가 매크로() 메소드를 제공하는 Macroable 특성을 사용한다는 것을 알고 있습니다. 그 기능을 자세히 살펴보겠습니다.
// src/Illuminate/Macroable/Traits/Macroable.php /** * Register a custom macro. * * @param string $name * @param object|callable $macro * * @param-closure-this static $macro * * @return void */ public static function macro($name, $macro) { static::$macros[$name] = $macro; }
매우 간단합니다. 콜백을 정적 매크로 배열에 저장하기만 하면 됩니다. 이제 특성을 더 자세히 조사하면 존재하지 않는 메서드가 호출될 때마다 트리거되는 __call 메서드를 찾을 수 있습니다. 우리의 경우에는 fromJson()입니다. 자세히 살펴보겠습니다:
/** * Dynamically handle calls to the class. * * @param string $method * @param array $parameters * @return mixed * * @throws \BadMethodCallException */ public function __call($method, $parameters) { if (! static::hasMacro($method)) { throw new BadMethodCallException(sprintf( 'Method %s::%s does not exist.', static::class, $method )); } $macro = static::$macros[$method]; if ($macro instanceof Closure) { $macro = $macro->bindTo($this, static::class); } return $macro(...$parameters); }
먼저 fromJson()의 경우와 같이 매크로가 등록되었는지 확인한 다음 매크로 배열에서 콜백(또는 개체)을 가져옵니다. 이제 마술 트릭을 위해, 매크로가 클로저(우리의 경우처럼)라면, 이는 기본적으로 $this가 첫 번째 인수로 전달된 모든 것을 참조해야 한다는 것을 클로저에게 알려주는 바인딩To()를 호출합니다. 이 경우 $value 속성을 갖는 Stringable 인스턴스입니다.
// $this here is the stringable // $this inside the closure is now referencing the stringable class $macro->bindTo($this, static::class);
그리고 이것이 바로 우리가 $this->value를 수행할 수 있는 이유입니다.
우리는 더 잘할 수 있습니다: Mixins ?
한 가지 더 보여드리고 싶은 게 있어요! 동일한 클래스를 몇 번 확장하면 서비스 제공자가 매우 빨리 지저분해질 수 있습니다. 모든 사용자 정의 매크로를 Mixin이라는 클래스로 추출할 수 있습니다.
StringableMixin을 만들어 보겠습니다.
$jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
이제 AppServiceProvider에서 다음 믹스인을 등록할 수 있습니다.
str($jwt) ->before('.') ->fromBase64() ->fromJson(); // does not exist ? // BadMethodCallException Method Illuminate\Support\Stringable::fromJson does not exist.
그리고 그게 다입니다! 이제 다음을 수행할 수 있습니다.
json_decode(str($jwt)->before('.')->fromBase64());
기본적으로 동일하지만 조금 더 깔끔합니다.
이것이 어떻게 작동하는지 궁금하다면 Macroable 특성의 mixin() 메서드가 리플렉션 API를 사용합니다. Mixin 클래스에서 모든 공개 메소드를 검색하고 각각이 클로저를 반환할 것으로 예상한 다음 이전에 본 것처럼 클로저를 매크로로 등록합니다.
불쌍한 IDE?
글쎄요, 보시다시피 많은 마법이 일어나고 있으며 IDE는 정의된 매크로에 대해 알지 못합니다. 팀 내에서 작업하는 경우 다른 개발자도 이러한 매크로에 대해 알지 못하므로 좋지 않습니다. 다행히도 이를 도와주는 도구가 있습니다. 무료 오픈 소스 옵션은 Laravel IDE 도우미 패키지입니다.
패키지를 설치하고 _ide_helper.php 파일을 생성하면 됩니다.
그리고 그렇게 끝난다..
우리의 예는 매우 간단하지만 Laravel에서 제공하는 대부분의 일반적인 클래스는 매크로 가능하므로 이보다 훨씬 더 많은 매크로를 푸시할 수 있습니다. 예를 들어, 새로운 apiResponse() 매크로를 추가하거나 앱의 로직에서 매우 일반적이고 필요 이상으로 반복된다고 생각되는 모든 것을 추가할 수 있습니다. 하지만 과용하지 마세요. 매크로는 새로운 복잡성을 추가하며 팀으로 작업할 때 혼란스러울 수 있습니다.
그래서, 프레임워크 자체에는 없지만 애플리케이션에는 뭔가 빠졌다고 느낄 때마다 매크로를 사용하세요.
위 내용은 Laravel Under The Hood - 약간의 매크로의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

aphpdectionenceindectioncontainerisatoolthatmanagesclassdependencies, 향상 Codemodularity, testability 및 maintainability.itactAsacentralHubForCreatingAndingDinjectingDingingDingingdecting.

대규모 응용 프로그램의 경우 SELLENCIONINGESS (DI)를 선택하십시오. ServicElocator는 소규모 프로젝트 또는 프로토 타입에 적합합니다. 1) DI는 생성자 주입을 통한 코드의 테스트 가능성과 모듈성을 향상시킵니다. 2) Servicelocator는 센터 등록을 통해 서비스를 얻습니다. 이는 편리하지만 코드 커플 링이 증가 할 수 있습니다.

phPapplicationSCanBeoptimizedForsPeedandefficiencyby : 1) ENABLEOPCACHEINPHP.INI, 2) PREPAREDSTATEMENTSWITHPDOFORDATABASEQUERIES 사용

phpeMailValidationInvoLvestHreesteps : 1) formatValidationUsingRegularexpressionsTochemailformat; 2) dnsValidationToErethedomainHasaValidMxRecord; 3) smtpvalidation, theSTHOROUGHMETHOD, theCheckSiftheCefTHECCECKSOCCONNECTERTETETETETETETWERTETWERTETWER

TomakePhPapplicationSfaster, followthesesteps : 1) useopCodeCaching likeOpcachetOrpectipiledScriptBecode.2) MinimizedAtabaseQueriesByUsingQueryCachingandEfficientIndexing.3) leveragephp7 assistorBetterCodeeficiession.4) 구현 전략적 지시

toImprovePhPapplicationSpeed, followthesesteps : 1) enableOpCodeCachingWithApcuTeCeScripteXecutionTime.2) 구현 구현

의존성 주입 (DI)은 명시 적으로 전이적 종속성에 의해 PHP 코드의 테스트 가능성을 크게 향상시킵니다. 1) DI 디퍼 커플 링 클래스 및 특정 구현은 테스트 및 유지 보수를보다 유연하게 만듭니다. 2) 세 가지 유형 중에서, 생성자는 상태를 일관성있게 유지하기 위해 명시 적 표현 의존성을 주입합니다. 3) DI 컨테이너를 사용하여 복잡한 종속성을 관리하여 코드 품질 및 개발 효율성을 향상시킵니다.

DatabaseQuesyOptimizationInphPinVolvesVesstoigiestoInsperferferferferformance.1) SelectOnlyNecessaryColumnstoredAtatatransfer.2) useinDexingTeSpeedUpdatarretieval.3) ubstractOrerEresultSoffRequeries.4) UtilizePreDstatements Offeffi


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

Dreamweaver Mac版
시각적 웹 개발 도구

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

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