백엔드 개발 PHP 튜토리얼 YII2는 관점 지향 프로그래밍을 구현합니다.

YII2는 관점 지향 프로그래밍을 구현합니다.

Jul 18, 2018 pm 04:49 PM

이 글에서는 YII2의 측면 지향 프로그래밍 구현을 소개합니다. 도움이 필요한 친구들이 참고할 수 있습니다

소개:
소프트웨어 개발의 목표는 세상의 일부 요소나 정보 흐름을 모델링하는 것입니다. 소프트웨어 시스템을 엔지니어링하려면 시스템을 생성 및 관리할 수 있는 모듈로 분해해야 합니다. 그 결과 시스템 모듈성을 갖춘 객체지향 프로그래밍 기술이 등장했다. 모듈식 객체 지향 프로그래밍은 소프트웨어 시스템의 가독성, 재사용성 및 확장성을 크게 향상시킵니다. 객체 지향 접근 방식의 초점은 객체를 모듈의 기본 단위로 선택하고 객체를 시스템의 모든 동작에 연결하는 것입니다. 객체는 문제 영역과 계산 프로세스의 주요 요소가 됩니다. 그러나 객체지향 기술은 소프트웨어 시스템의 재사용성을 본질적으로 해결하지 못합니다. 소프트웨어 시스템을 만들 때 보안 검사, 로깅, 성능 모니터링, 예외 처리 등과 같은 실제 문제에 대한 교차 문제가 많이 있습니다. 해당 구현 코드는 다른 비즈니스 로직 코드와 혼합되어 시스템의 여러 부분에 분산되어 있습니다. 소프트웨어에 이러한 작업을 처리하기 위한 코드를 직접 추가하면 OOP의 "단일 책임" 원칙이 무너지고 모듈의 재사용성이 크게 줄어들어 소프트웨어 시스템의 유지 관리성과 재사용성이 떨어집니다. 매우 제한적입니다. 이때 전통적인 OOP 설계에서 흔히 채택하는 전략은 시스템의 기능적 요구 사항을 완성하기 위해 해당 프록시 레이어를 추가하는 것입니다. 그러나 이러한 처리는 분명히 전체 시스템에 분할 수준을 추가하고 복잡성도 증가합니다. 너무 무겁다는 느낌을 줍니다. 이는 AOP(Aspect 지향 프로그래밍) 기술을 탄생시켰습니다. 이 프로그래밍 모델은 소프트웨어 시스템 전반에 흩어져 있는 교차 관심 코드를 추출하여 모듈화하고 함께 구성함으로써 소프트웨어의 유지 관리성, 재사용성, 확장성을 더욱 향상시킵니다.

AOP 소개:
AOP: 관점 지향 프로그래밍.
 관점 지향 프로그래밍(관점 지향이라고도 함): AOP(관점 지향 프로그래밍)는 현재 소프트웨어 개발에서 핫스팟입니다. AOP를 사용하면 비즈니스 로직의 다양한 부분을 분리하여 비즈니스 로직의 다양한 부분 간의 결합을 줄이고 프로그램의 재사용성을 향상시키며 개발 효율성을 높일 수 있습니다.
 AOP는 OOP의 연속으로 Aspect Oriented 프로그래밍(Aspect Oriented 프로그래밍)의 약자로 관점 지향 프로그래밍을 의미합니다.
 주요 기능은 로깅, 성능 통계, 보안 제어, 트랜잭션 처리, 예외 처리 등입니다.
 주요 의도는 로깅, 성능 통계, 보안 제어, 트랜잭션 처리, 예외 처리 및 기타 코드를 비즈니스 로직 코드에서 분리하는 것입니다. 이러한 동작을 비안내 비즈니스 로직에 독립적으로 만들고자 합니다. 그런 다음 비즈니스 논리 코드에 영향을 주지 않고 이러한 동작을 변경합니다.
 프리컴파일 및 런타임 동적 프록시를 통해 소스 코드를 수정하지 않고도 프로그램에 기능을 동적으로 균일하게 추가할 수 있는 기술입니다. AOP는 실제로 GoF 디자인 패턴의 연속입니다. 호출자와 수신자 간의 디커플링을 끊임없이 추구하는 디자인 패턴이 바로 이러한 목표의 실현이라고 할 수 있습니다.
애플리케이션을 3차원 구조로 생각한다면 OOP의 날카로운 모서리는 시스템을 수직으로 자르고 시스템을 여러 모듈(예: 사용자 모듈, 기사 모듈 등)로 나누는 것입니다. AOP의 핵심은 시스템을 수평으로 잘라서 각 모듈을 추출하는 것입니다. 모듈은 반복적인 작업(예: 권한 확인, 로깅 등)을 수행해야 할 수도 있습니다. AOP는 OOP의 효과적인 보완책임을 알 수 있다.
참고: AOP는 기술이 아니라 실제로 프로그래밍 아이디어입니다. AOP 사고를 따르는 모든 기술은 AOP의 구현으로 간주될 수 있습니다.

AOP의 기본 개념:
객체 지향 프로그래밍에서는 클래스, 객체, 캡슐화, 상속, 다형성 및 기타 개념이 객체 지향 사고를 설명하는 주요 용어입니다. 마찬가지로 측면 지향 프로그래밍에는 몇 가지 기본 개념도 있습니다.   JointPoint: 공동 프로그램 실행의 특정 지점입니다. 일반적인 연결 지점에는 메서드 호출, 클래스 개체 초기화 등이 포함됩니다. 연결점은 AOP의 핵심 개념 중 하나이며, 프로그램에서 AOP를 통해 새 논리가 추가되는 위치를 정의하는 데 사용됩니다.
포인트컷: 포인트컷은 알림이 실행되어야 하는 시기를 정의하는 데 사용되는 연결 지점 집합입니다. 포인트컷을 정의함으로써 프로그램의 어떤 구성 요소가 어떤 알림을 받을지 정확하게 제어할 수 있습니다. 위에서 일반적인 연결 지점은 메서드 호출이고 일반적인 진입점은 특정 클래스에 대한 메서드 호출 모음이라고 언급했습니다. 일반적으로 우리는 복잡한 진입점을 형성하여 알림이 실행되는 시기를 제어합니다. I 조언: 특정 연결 지점에서 실행되는 코드를 "알림"이라고 합니다. Advice에는 연결점 이전에 실행되는 Before Advice(Before Advice)와 연결점 이후에 실행되는 Post Advice(After Advice) 등 다양한 유형이 있습니다.
       方面(Aspect) :通知和切入点的组合叫做方面,所以,方面定义了一段程序中应该包括的逻辑,以及何时应该执行该逻辑。
       织入(Weaving) :织入是将方面真正加入程序代码的过程。对于静态 AOP 方案而言,织入是在编译时完成的,通常是在编译过程中增加一个步骤。类似的,动态 AOP 方案则是在程序运行是动态织入的。
       目标(Target) :如果一个对象的执行过程受到某一个 AOP 的修改,那么它就叫一个目标对象。目标对象通常也称为被通知对象。
       引入(Introduction) :   通过引入,可以在一个对象中加入新的方法或属性,以改变它的结构,这样即使该对象的类没有实现某一个接口,也可以修改它,使之成为该接口的一个实现。   

       静态和动态:静态 AOP 和动态 AOP 两者之间的区别主要在于什么时间织入,以及如何织入。最早的 AOP 实现大多都是静态的。在静态 AOP 中,织入是编译过程的一个步骤。用Java 的术语说,静态 AOP 通过直接对字节码进行操作,包括修改代码和扩展类,来完成织入过程。显然,这种办法生成的程序性能很好,因为最后的结果就是普通的 Java 字节码,在运行时不再需要特别的技巧来确定什么时候应该执行通知。这种方法的缺点是,如果想对方面做什么修改,即使只是加入一个新的联结点,都必须重新编译整个程序。AspectJ 是静态 AOP 的一个典型例子。与静态 AOP 不同,动态 AOP 中织入是在运行时动态完成的。织入具体是如何完成的,各个实现有所不同。Spring AOP 采取的方法是建立代理,然后代理在适当的时候执行通知。动态 AOP 的一个弱点就在于,其性能一般不如静态 AOP。而动态AOP 的主要优点在于可以随时修改程序的所有方面,而不需重新编译目标。

AOP实践:

YII2框架本身拥有一个功能,叫做行为.它可以动态的为当前的类附加额外的功能,但这种功能在代码层级结构是静态的,有侵入性的。

下面以YII2框架集成go!aop库为例,介绍在YII2中如何实现AOP编程.(go!aop简介,可以参考go!aop的官网.)

由于YII框架拥有自己的类加载器,所在集成go!aop的时候,不能正常的工作,所以要将其禁用掉,使用composer提供的类加载器。

如下代码所示(这里使用YII2高级应用模板):

1、找到  spl_autoload_register(['Yii', 'autoload'], true, true);  (PROJECT_PATH/vendor/yiisoft/yii2/Yii.php) 将其禁用掉.

2、执行  composer require goaop/framework

3、修改composer.json文件,加入如下代码段:

 "autoload": {
        "psr-4": {
          "backend\\": "backend//",
          "frontend\\": "frontend//",
          "common\\": "common//"
        }
  }
로그인 후 복사

4、 在frontend 目录下创建一个components是目录,并新建一个类AopAspectKernel,例如:

namespace frontend\components;
use frontend\aspects\MonitorAspect;
use Go\Core\AspectContainer;
use Go\Core\AspectKernel;
class AopAspectKernel extends AspectKernel
{
        protected function configureAop(AspectContainer $container)
        {
            $container->registerAspect(new MonitorAspect());
        }
}
로그인 후 복사

5、在forntend目录下在新建一个类InitAopComponent,并使其实现BootstrapInterface,使其可以在YII2框架引导时被自动引导

namespace frontend\components;
use yii\base\BootstrapInterface;
class InitAopComponent implements BootstrapInterface
{
        public function bootstrap($app)
        {
            print_r(\Yii::$app->params['aop']);
            $applicationAspectKernel = AopAspectKernel::getInstance();
            $applicationAspectKernel->init(\Yii::$app->params['aop']);
        }
}
로그인 후 복사

6、在frontend/config/params.php中新增如下代码:

 'aop' => [
        'debug' => true,
        'appDir' => dirname(__DIR__),
        'cacheDir' => dirname(__DIR__) . '/runtime/aop',
        'includePaths' => [
            dirname(__DIR__)
        ]
    ]
로그인 후 복사

7、在frontend下面新建aspects目录,并新建类MonitorAspect,代码如下:

namespace frontend\aspects;

use Go\Aop\Aspect;
use Go\Aop\Intercept\MethodInvocation;
use Go\Lang\Annotation\Before;
class MonitorAspect implements Aspect
{
        /**
         * Method that will be called before real method
         *
         * @param MethodInvocation $invocation Invocation
         * @Before("execution(public frontend\components\AopTestComponent->*(*))")
         */
        public function beforeMethodExecution(MethodInvocation $invocation)
        {
            $obj = $invocation->getThis();
            echo 'Calling Before Interceptor for method: ',
            is_object($obj) ? get_class($obj) : $obj,
            $invocation->getMethod()->isStatic() ? '::' : '->',
            $invocation->getMethod()->getName(),
            '()',
            ' with arguments: ',
            json_encode($invocation->getArguments()),
            "<br>\n";
        }
}
로그인 후 복사

9、修改frontend/config/main.php文件,并在components数组下新增一个key,代码如下:

 &#39;components&#39;=>[
        &#39;aop&#39; => [
            &#39;class&#39; => &#39;frontend\components\InitAopComponent&#39;
        ]
    ]
로그인 후 복사


10、修改frontend/config/main.php文件,并在bootstrap数组下新增aop值,代码如下:

&#39;bootstrap&#39;=>[&#39;log&#39;,&#39;aop&#39;]
로그인 후 복사

至此,YII2整合go!aop完成...

相关推荐:

关于IIS下PHP快三平台源码的架设环境的配置过程

如何在yii2框架的di容器源码中了解反射的作用

위 내용은 YII2는 관점 지향 프로그래밍을 구현합니다.의 상세 내용입니다. 자세한 내용은 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 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. Apr 05, 2025 am 12:04 AM

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

확실한 원칙과 PHP 개발에 적용되는 방법을 설명하십시오. 확실한 원칙과 PHP 개발에 적용되는 방법을 설명하십시오. Apr 03, 2025 am 12:04 AM

PHP 개발에서 견고한 원칙의 적용에는 다음이 포함됩니다. 1. 단일 책임 원칙 (SRP) : 각 클래스는 하나의 기능 만 담당합니다. 2. Open and Close Principle (OCP) : 변경은 수정보다는 확장을 통해 달성됩니다. 3. Lisch의 대체 원칙 (LSP) : 서브 클래스는 프로그램 정확도에 영향을 미치지 않고 기본 클래스를 대체 할 수 있습니다. 4. 인터페이스 격리 원리 (ISP) : 의존성 및 사용되지 않은 방법을 피하기 위해 세밀한 인터페이스를 사용하십시오. 5. 의존성 반전 원리 (DIP) : 높고 낮은 수준의 모듈은 추상화에 의존하며 종속성 주입을 통해 구현됩니다.

PHP에서 늦은 정적 결합의 개념을 설명하십시오. PHP에서 늦은 정적 결합의 개념을 설명하십시오. Mar 21, 2025 pm 01:33 PM

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

PHP의 CURL 라이브러리를 사용하여 JSON 데이터가 포함 된 게시물 요청을 보내는 방법은 무엇입니까? PHP의 CURL 라이브러리를 사용하여 JSON 데이터가 포함 된 게시물 요청을 보내는 방법은 무엇입니까? Apr 01, 2025 pm 03:12 PM

PHP 개발에서 PHP의 CURL 라이브러리를 사용하여 JSON 데이터를 보내면 종종 외부 API와 상호 작용해야합니다. 일반적인 방법 중 하나는 컬 라이브러리를 사용하여 게시물을 보내는 것입니다 ...

프레임 워크 보안 기능 : 취약점 보호. 프레임 워크 보안 기능 : 취약점 보호. Mar 28, 2025 pm 05:11 PM

기사는 입력 유효성 검사, 인증 및 정기 업데이트를 포함한 취약점을 방지하기 위해 프레임 워크의 필수 보안 기능을 논의합니다.

시스템 재시작 후 UnixSocket의 권한을 자동으로 설정하는 방법은 무엇입니까? 시스템 재시작 후 UnixSocket의 권한을 자동으로 설정하는 방법은 무엇입니까? Mar 31, 2025 pm 11:54 PM

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.

프레임 워크 사용자 정의/확장 : 사용자 정의 기능을 추가하는 방법. 프레임 워크 사용자 정의/확장 : 사용자 정의 기능을 추가하는 방법. Mar 28, 2025 pm 05:12 PM

이 기사에서는 프레임 워크에 사용자 정의 기능 추가, 아키텍처 이해, 확장 지점 식별 및 통합 및 디버깅을위한 모범 사례에 중점을 둡니다.

See all articles