Drupal은 클래스 자동로드를 어떻게 처리합니까?


10

Drupal은 모듈을 통한 클래스 자동로드를 어떻게 처리합니까? 예를 들어, Events 모듈이 있고 Event라는 클래스를 선언 한 다음 .info 파일에 클래스 파일을 포함 시키면 어떻게 등록됩니까?

문제는로드 된 모든 클래스 이름을 포함하는 배열을 동적으로 가져 오려고한다는 것입니다. get_declared_classes () 는이 방식으로 선언 된 모든 클래스의 이름을 반환하지 않으므로 어떻게 든 자동로드된다고 가정합니다. 다른 스택 오버플로 질문의 제안에 따라 spl_autoload_functions ()으로 모든 것을 얻으려고 시도했지만 실패했습니다.

어떤 아이디어?

답변:


13

.info 파일에 나열된 모든 파일은 모듈을 다시 빌드 할 때 구문 분석됩니다 (해당 목록의 변경 / 새 파일 만 성능상의 이유로).

그런 다음 해당 정보는 {registry}{registry_files}테이블에 저장됩니다 . 따라서 지정된 이름 지정 패턴에 따라 모든 클래스 또는 클래스를 가져 오려면 해당 테이블을 쿼리 할 수 ​​있습니다.


7

Drupal은 코드 레지스트리를 유지 관리하고 클래스 오토로더에 사용합니다. 이 레지스트리를 모듈의 클래스로 채우려면 해당 파일을 .info 파일의 files [] 항목에 추가해야합니다.

files[] = includes/Foo.inc
files[] = includes/Bar.inc

PHP의 클래스 자동로드는 부모 클래스 파일도로드되도록합니다.

이 답변에 대한 사용자 pier-buyle에게 감사의 말을 전하십시오 . 동일한 질문에 대해서는 원래 답변을 here 참조하십시오 .

희망이 도움이



3

.info 파일의 files [] 배열에 항목을 추가 한 경우 모듈 관리 섹션으로 이동하여 "저장 구성"을 클릭해야합니다. 이렇게하면 .info 정보가 새로 고쳐지고 새 항목이 등록됩니다.


1

info 파일에 포함 파일을 선언해도 모듈 실행을 시작할 때 인식하지 못하는 것으로 나타났습니다. event.inc 파일에 Event 클래스가있는 경우. 모듈에 물체가 있으면 인식되지 않습니다. 나는 라인을 추가

include_once ('CMatArticleHandler.inc');

$ variable = new event () 이전에; 선. 나는 이것에 새로운 것이기 때문에 이것보다 더 많은 것이있을 수 있지만 지금까지 효과가있었습니다.


1
사람들이 이것을 피할 필요가 없도록하기 위해 무엇을해야하는지 설명하는 대신 단지 사람들이 이것을 공감한다고 유감스럽게 생각합니다. 나는 같은 상황에 처해 있습니다 : Drupal의 오토 로더는 클래스를 얻기 위해 파일을로드 할 필요성을 지속적으로 인식하지 못합니다.
greggles

새 클래스를 추가 할 때 레지스트리를 지워야합니다. drush를 통해 othis를 수행하는 쉬운 방법은 다음 명령을 사용하는 것입니다. drupal.org/project/registry_rebuild
stefgosselin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.