php 노트:AOP 의 응용

5898 단어 phpAOP
소개 하 다. 너 는 이전에 AOP(Aspect Oriented Programming)를 들 어 본 적 이 있 니?php 에 서 는 많이 사용 되 지 않 은 것 같 지만 기업 급 개발 에 서 는 AOP 가 널리 사용 되 고 있다.이 글 을 통 해 PHP 쪽 AOP 를 소개 하 겠 습 니 다.이 글 은 주로 AOP 의 개념 을 해석한다. AOP 가 뭐야? 응용 개발 에서 우 리 는 많은 기능 이 필요 하 다 는 것 을 자주 발견 한다.이런 기능 들 은 코드 의 여러 점 에 자주 분산 되 어야 하지만 이런 점 들 은 사실상 실제 업무 와 아무런 관련 이 없다.예 를 들 어 일부 특수 임 무 를 수행 하기 전에 사용자 가 로그 인 상태 에 있 는 지 확인 해 야 합 니 다.우 리 는 이러한 특수 인물 을'cross-cutting concerns'라 고 부 릅 니 다.우 리 는 위 키 백과 를 통 해'cross-cutting concerns'(가로 관계)의 정 의 를 알 아 보 겠 습 니 다.컴퓨터 과학 에서'cross-cutting concerns'는'절단면(또는 방향)프로 그래 밍'을 말한다.이러한 관 계 는 다른 시스템(프레임 워 크 디자인 또는 일부 실현)에서 잘 분해 되 지 못 해서 코드 가 중복 되 고 시스템 에 의미 있 는 의존 관계 가 존재 하거나 둘 다 가진다. 지금 당신 은'가로 관계'에 대해 기본 적 인 인식 을 가 져 야 합 니 다.그들 이 코드 에서 어떤 지 보 여 주 시 겠 습 니까?한 장면 을 가정 하면 당신 은 블 로그 사이트 의 편집자 입 니 다.사이트 에 로그 인 한 후에 댓 글 을 만 들 고 댓 글 을 검증 하 며 댓 글 을 편집 해 야 합 니 다.만약 당신 이 로그 인하 지 않 았 다 면,당신 은 직접 로그 인 인터페이스 로 가 야 합 니 다.이러한 행위 가 안전 하 다 는 것 을 확보 하기 위해 이상 의 모든 조작 은 효과 적 인 검증 을 해 야 한다.코드 는 다음 과 같다.

<?php
class BlogPost extends CI_Controller
{
    public function createPost() {
        if (!Authentication::checkAuthentication()) {
            // redirect to login
        }
        else {
            // proceed
            Messages::notifyAdmin();
        }
    }

    public function approvePost() {
        if (!Authentication::checkAuthentication()) {
            // redirect to login
        }
        else {
            // proceed
        }
    }

    public function editPost() {
        if (!Authentication::checkAuthentication()) {
            // redirect to login
        }
        else {
            // proceed
        }
    }

    public function viewPost() {
        // ...
    }
}

 위의 코드 를 보면 모든 방법 전에 checkAuthentication()을 호출 한 것 을 발견 할 수 있 습 니 다.사용자 가 로그 인 한 후에 야 할 수 있 기 때 문 입 니 다.그리고 notifyAdmin()은 관리자 계 정 인지 아 닌 지 를 판별 하여 새 게시 물 을 만 들 수 있 도록 합 니 다.보이 시 나 요?'중복 코드'가 많 고 블 로그 포스트 류 는 게시 물 관리 만 해 야 합 니 다.신분 검증 과 판별 은 분리 되 어야 한다.우 리 는 단일 직책 원칙 을 위반 했다.
단일 직책 원칙 은 각 유형 이 단일 한 책임(임무)만 있어 야 하고 전체 책임 을 한 유형 에 포장 해 야 한 다 는 것 을 말한다.모든 서 비 스 는 직책 에 따라 엄밀 하고 균형 있 게 분포 해 야 한다.
 지금까지 우 리 는 AOP 가 표현 한 뜻 을 이해 할 수 있 었 다.가로 절단면 관 계 는 한 종류 에 조합 되 어 있 는데 우 리 는 이런 종 류 를'절단면'이 라 고 부른다.우리 의 핵심 코드 에서 가로 절단면 관 계 를 분리 하 는 과정 을 Aspect Oriented Programming 이 라 고 합 니 다.AOP 전문 용 어 는 AOP 의 특성 을 설명 하 는 데 전문 적 으로 사용 되 는 조건 이 많다.이 조건 들 을 이해 하 는 것 은 AOP 를 프로젝트 에 통합 하 는 데 성공 하 는 열쇠 가 될 것 이다.Aspect Advice Joinpoint Pointcut 우 리 는 절단면(Aspect)이 무엇 인지 배 웠 습 니 다!이제 다른 세 가지 조건 이 무엇 을 의미 하 는 지 알 아 볼 까요?Advice(알림)Advice 는 Aspect(절단면)를 호출 하 는 데 사 용 됩 니 다.이름 이 암시 하 는 바 와 같이 Advice 는 특정한 상황 에서 무엇 을 하고 언제 이 일 을 하 는 지 정의 하 는 데 사 용 됩 니 다.이전 예 에서 checkAuthentication(무엇 을 하 는 지)은 advice(알림)입 니 다.지정 한 방법 에서 코드 를 실행 하기 전에(언제)호출 되 어야 합 니까?  Joinpoint(접속 점)Joinpoint 는 우리 가 Advice 응용 프로그램 을 만 드 는 위치 입 니 다.이전의 코드 를 다시 뒤 져 보면,너 는 내 가 업무 논리 와 직접적인 관련 이 없 는 몇 가지 기능 을 호출 한 것 을 발견 할 수 있 을 것 이다.createPost()에서 예 를 들 어 cross-cutting concerns 는 검증 논 리 를 실행 하기 전에 관리자 에 게 메 시 지 를 보 낸 후에 발생 해 야 합 니 다.이것들 은 모두 접속 점 일 수 있다.응용 코드 에서 접속 점 은 모든 위치 에 놓 을 수 있 습 니 다.그러나 Advice 는 어떤 점 에서 만 배치 할 수 있 습 니 다.이것 은 당신 의 AOP 프레임 워 크 에 따라 나중에 토론 하 겠 습 니 다.포인트 컷(점 절단) 점 절단 은 통 지 를 일부 접속 점 에 일치 시 키 는 방식 을 정의 했다.비록 우리 의 예 에서 한 쌍 의 접속 점 만 있 지만,당신 의 응용 에서 수천 개의 접속 점 을 설치 할 수 있 습 니 다.당신 도 모든 접속 점 에 알림 을 적용 할 필요 가 없습니다.너 는 네가 필요 하 다 고 생각 하 는 접속 점 을 통지 에 연결 할 수 있다.만약 에 우리 가 createPost(),approvePost()와 editPost()를 알 리 고 싶 지만 지금 은 view Post()가 없습니다.우 리 는 어떤 방법 을 사용 하여 이 세 가지 방법 을 통지 에 귀속 시 켰 다.그 후에 우 리 는 절단면 디 테 일 을 포함 하 는 XML 파일 을 만 들 었 습 니 다.이 디 테 일 은 접속 점 과 일치 하 는 정규 표현 식 을 포함 합 니 다.요약:가로 절 입 관계 가 우리 의 응용 에 존재 할 때 우 리 는 절 면 을 만 들 수 있 습 니 다.이 절 면 은 점 절 개 를 선택 한 접속 점 에서 알림 기능 을 사용 할 수 있 습 니 다. AOP 알림 유형 알림 코드 는 우리 가 여러 가지 방식 으로 표현 할 수 있다.제 가 전에 말씀 드 렸 듯 이 이 알림 코드 는 당신 이 사용 하 는 프레임 워 크 에 의존 하지만 익숙 한 유형 이 있 습 니 다.아래 를 보 세 요.앞의 알림 이 돌아 온 후에 알림 을 던 진 후에 주변 알림 에 알 리 기 전에 알림 을 사용 하 세 요.정상 적 인 것 은 하나의 방법 을 사용 하 는 것 입 니 다.지금까지 개념 을 간소화 하고 코드 를 더 빨리 이해 할 수 있 도록 방법 에 통 지 를 자주 썼 습 니 다.그러나 실제 환경 에서 통 지 는 방법 에 쓰 이지 않 는 경우 가 많다.모든 방법 이 이 컨트롤 러 안에 있 고 모든 방법 이 AOP 의 기능 을 감 싸 고 있 는 독립 된 컨트롤 러 가 있어 야 한다.이 전역 컨트롤 러 는 전체 시스템 에서 실행 되 고 우리 에 게 는 보이 지 않 습 니 다.4567913)여기 서 이런 유형 이 있다 고 가정 하면 주로 이런 유형 이 실제로 무슨 일이 일 어 났 는 지 보 여 주 는 데 쓰 인 다.만약 에 그 controlPaths 방법 이 응용 에서 전역 적 인 접근 점 이 라 고 가정 하면 응용 에 접근 하 는 모든 방법 은 이 방법 을 통 해 방문 해 야 합 니 다.위의 방법 에서 모든 방법 을 실행 하기 전에 우 리 는 checkAuthentication()을 호출 했다.이것 이 바로 전 통지 다.
반환 후 이 알림 은 지정 한 기능 이 실 행 된 후에 한 번 만 실행 하고 그 방문 점 으로 돌아 가라 고 알려 줍 니 다.다음 코드 를 고려 하 십시오:

<?php
class PathController
{
    function controlPaths($className, $funcName) {
        Authentication::checkAuthentication();
        $classObj = new $className();
        $classObj->$funcName();
    }
}
Ctrl+C 를 누 르 면 여 기 를 주의 하 십시오.방법 이 완 료 된 후에 우 리 는 데이터베이스 자원 을 정리 하 였 습 니 다.통 지 를 되 돌려 준 후에 우 리 는 이 통 지 를 호출 했다.
던 진 후 알림 을 실행 하 는 동안 함수 가 이상 을 던 지면 이상 을 던 진 후에 알림 을 적용 합 니 다.이상 을 던 지면 알림 이 잘못된 알림 이 됩 니 다.

<?php
class PathController
{
    function controlPaths($className, $funcName) {
        $classObj = new $className();
        $classObj->$funcName();
        Database::closeConnection();
    }
}
 
주변 알림 의 네 번 째 통 지 는 주변 알림 입 니 다.그 는 이전 알림 과 복귀 후 알림 의 합병 체 입 니 다.

<?php
class PathController
{
    function controlPaths($className, $funcName) {
        try {
            $classObj = new $className();
            $classObj->$funcName();
        }
        catch (Exception $e) {
            Error::reportError();
        }
    }
}

좋은 웹페이지 즐겨찾기