> 백엔드 개발 > PHP 튜토리얼 > 새로운 Drupal Hook 속성

새로운 Drupal Hook 속성

Linda Hamilton
풀어 주다: 2024-12-30 01:01:10
원래의
175명이 탐색했습니다.

New Drupal Hook attribute

새 버전 발표에서 눈에 띄는 것이 있었습니다. 제목에서 알 수 있듯이 이는 Hook 속성입니다.
php 속성에 대해 잘 모르시는 분들을 위해 제가 얼마전에 포스팅을 한 적이 있습니다.

Drupal 8이 코드 구조화에 있어서 객체 지향 방식으로 전환했기 때문에 후크를 추가하는 방식이 저에게는 눈에 띄지 않았습니다.
모듈 이름을 사용하여 함수 앞에 접두사를 붙이고 .module 파일을 사용하여 모든 함수를 추가하는 것은 매우 스파게티 코드 느낌이었습니다.

이제는 거의 고쳤습니다. 아직 절차적인 후크가 많기 때문입니다. 계획은 Drupal 12에서 절차적 후크를 제거하는 것이므로 다음 마이너 Drupal 버전에서는 해당 후크가 사라지는 것을 볼 수 있습니다.

이점은 무엇입니까?

.module 파일에 함수를 추가하는 대신 후크는 모듈의 src 디렉터리에 있습니다.
더 쉽게 식별하려면 Hooks 하위 디렉터리를 사용하는 것이 좋습니다. 또는 클래스 이름에 Hooks 접미사를 추가하세요.

같은 메소드에 여러 Hook을 묶어줄 수 있는 속성이기 때문입니다.

// module.module

function module_comment_insert(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_update(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_manipulation(CommentInterface $comment) {
  // do something
}

// with Hook attribute 
class CommentHooks {

  #[Hook('comment_insert')]
  #[Hook('comment_update')]
  public function commentInsertOrUpdate(CommentInterface $comment) {
    // do something
  }
}
로그인 후 복사
로그인 후 복사

11.1 이전 Drupal 버전의 모듈을 유지 관리하는 사람들을 위해 LegacyHook라는 추가 속성이 있습니다. 이를 통해 후크 코드를 후크 속성이 있는 클래스로 이동할 수 있습니다. 그리고 이전 버전의 Drupal은 .module 파일에 있는 함수를 실행하지만 최신 버전은 클래스 메서드만 실행합니다.

// module.module
#[LegacyHook]
function module_comment_insert(CommentInterface $comment) {
   new CommentHooks()->commentInsertOrUpdate($comment);
}

#[LegacyHook]
function module_comment_update(CommentInterface $comment) {
   new CommentHooks()->commentInsertOrUpdate($comment);
}
로그인 후 복사

Hook 속성을 사용하는 방법

이전 코드 예제에서 볼 수 있듯이 속성이 메서드에 추가됩니다.

하지만 클래스에 메소드를 추가할 수도 있습니다.

#[Hook('comment_insert')]
#[Hook('comment_update')]
class CommentManipulationHook {
  public function __invoke(CommentInterface $comment) {
    // do something
  }
}
로그인 후 복사

예제에서 볼 수 있듯이 클래스 이름을 더 설명적으로 만드는 것이 좋습니다. 그리고 Hooks 대신 접미사 Hook을 사용하세요.

클래스에 Hook 속성을 추가하고 메서드를 두 번째 매개변수로 추가할 수 있습니다. 추천하지는 않습니다. 그런 경우에는 메소드에 속성을 추가하는 것이 더 깔끔합니다.

세 번째 Hook 매개변수인 모듈이 있습니다. 이를 통해 다른 모듈에서 후크 클래스를 실행할 수 있습니다. 예를 들면 #hook('comment_insert', 'commentInsert', 'my_comment_module')입니다.
이에 대한 사용 사례를 생각해 보았으나 찾을 수 없었습니다.
혹시 아시는 분 계시면 알려주세요.

결론

저는 Drupal 코드가 올바른 방향으로 움직이는 모습을 보는 것을 좋아합니다.

저를 괴롭히는 한 가지 사실은 후크가 마법 상수라는 것입니다. 그러나 계획은 Hook 속성을 기본 클래스로 사용하여 모든 Hooks 속성을 대상으로 하는 것입니다. 따라서 #[Hook('comment_insert')] 대신 #[CommentInsert]가 됩니다.
이를 수행할 수 있는 또 다른 방법은 모듈별로 그룹화된 열거형을 사용하는 것입니다.

// module.module

function module_comment_insert(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_update(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_manipulation(CommentInterface $comment) {
  // do something
}

// with Hook attribute 
class CommentHooks {

  #[Hook('comment_insert')]
  #[Hook('comment_update')]
  public function commentInsertOrUpdate(CommentInterface $comment) {
    // do something
  }
}
로그인 후 복사
로그인 후 복사

이 게시물의 정보는 문서와 구현에 대해 간략하게 살펴본 내용을 기반으로 합니다. 기능을 테스트하면 게시할 업데이트나 추가 게시물이 있을 것입니다.

위 내용은 새로운 Drupal Hook 속성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿