이벤트
CodeIgniter의 이벤트 기능은 코어 파일을 수정하지 않고도 프레임워크의 내부 동작에 접근하고 수정할 수 있는 수단을 제공합니다. CodeIgniter가 실행될 때 특정 실행 과정을 따릅니다. 그러나 실행 과정의 특정 단계에서 어떤 동작이 이루어지기를 원할 때가 있을 수 있습니다. 예를 들어, 컨트롤러가 로드되기 직전이나 직후에 스크립트를 실행하거나, 다른 위치에서 자신만의 스크립트를 트리거하고 싶을 수 있습니다.
이벤트는 발행/구독 패턴으로 동작하며, 스크립트 실행 중 특정 시점에 이벤트가 트리거됩니다. 다른 스크립트는 해당 이벤트가 트리거될 때 어떤 동작을 수행하고 싶다는 것을 알리기 위해 Events 클래스에 등록함으로써 이벤트에 “구독”할 수 있습니다.
이벤트 활성화
이벤트는 항상 활성화되어 있으며, 전역적으로 사용 가능합니다.
이벤트 정의
대부분의 이벤트는 app/Config/Events.php 파일에 정의됩니다. Events 클래스의 on() 메서드를 사용하여 이벤트에 동작을 구독할 수 있습니다. 첫 번째 매개변수는 구독할 이벤트의 이름입니다. 두 번째 매개변수는 해당 이벤트가 트리거될 때 실행될 callable입니다:
<?php
use CodeIgniter\Events\Events;
Events::on('pre_system', ['MyClass', 'myFunction']);
이 예시에서 pre_system 이벤트가 실행될 때마다 MyClass의 인스턴스가 생성되고 myFunction() 메서드가 실행됩니다. 두 번째 매개변수는 PHP가 인식하는 모든 형태의 callable이 될 수 있습니다:
<?php
use CodeIgniter\Events\Events;
// Call a standalone function
Events::on('pre_system', 'some_function');
// Call on an instance method
$user = new \App\Libraries\User();
Events::on('pre_system', [$user, 'someMethod']);
// Call on a static method
Events::on('pre_system', 'SomeClass::someMethod');
// Use a Closure
Events::on('pre_system', static function (...$params) {
// ...
});
우선순위 설정
단일 이벤트에 여러 메서드를 구독할 수 있으므로, 해당 메서드들이 호출되는 순서를 정의하는 방법이 필요합니다. on() 메서드의 세 번째 매개변수로 우선순위 값을 전달하여 이를 설정할 수 있습니다. 낮은 값이 먼저 실행되며, 값 1이 가장 높은 우선순위를 가지고, 낮은 값의 하한은 없습니다:
<?php
use CodeIgniter\Events\Events;
Events::on('post_controller_constructor', 'some_function', 25);
동일한 우선순위를 가진 구독자는 정의된 순서대로 실행됩니다.
v4.2.0부터 값에 유용한 범위를 설정하는 세 가지 클래스 상수가 정의되어 있습니다. 반드시 사용할 필요는 없지만 가독성을 높이는 데 도움이 될 수 있습니다:
<?php
use CodeIgniter\Events\Events;
Events::PRIORITY_LOW; // 200
Events::PRIORITY_NORMAL; // 100
Events::PRIORITY_HIGH; // 10
중요
상수 EVENT_PRIORITY_LOW, EVENT_PRIORITY_NORMAL, EVENT_PRIORITY_HIGH는 v4.6.0에서 제거되었습니다.
정렬이 완료되면 모든 구독자가 순서대로 실행됩니다. 구독자 중 하나라도 부울 false 값을 반환하면 구독자 실행이 중단됩니다.
직접 이벤트 발행
Events 라이브러리는 직접 코드에서 이벤트를 만드는 것도 간단하게 해줍니다. 이 기능을 사용하려면 이벤트 이름과 함께 Events 클래스의 trigger() 메서드를 호출하기만 하면 됩니다:
<?php
\CodeIgniter\Events\Events::trigger('some_event');
추가 매개변수로 추가하여 구독자에게 임의 수의 인수를 전달할 수 있습니다. 구독자는 정의된 순서와 동일한 순서로 인수를 받습니다:
<?php
use CodeIgniter\Events\Events;
Events::trigger('some_event', $foo, $bar, $baz);
Events::on('some_event', static function ($foo, $bar, $baz) {
// ...
});
이벤트 시뮬레이션
테스트 중에는 하루에 수백 통의 이메일을 발송하는 것이 느리고 역효과를 낼 수 있으므로 이벤트가 실제로 실행되지 않기를 원할 수 있습니다. simulate() 메서드를 사용하여 Events 클래스가 이벤트 실행을 시뮬레이션만 하도록 지시할 수 있습니다. true일 때 모든 이벤트는 trigger 메서드 실행 중에 건너뜁니다. 그러나 그 외의 모든 것은 정상적으로 작동합니다.
<?php
use CodeIgniter\Events\Events;
Events::simulate(true);
false를 전달하여 시뮬레이션을 중단할 수 있습니다:
<?php
use CodeIgniter\Events\Events;
Events::simulate(false);
이벤트 포인트
웹 앱용
다음은 public/index.php에 의해 호출되는 웹 애플리케이션의 사용 가능한 이벤트 포인트 목록입니다:
pre_system 시스템 실행 초기에 호출됩니다. URI, Request, Response는 인스턴스화되었지만 페이지 캐시 확인, 라우팅, “before” 컨트롤러 필터 실행은 아직 이루어지지 않은 상태입니다.
post_controller_constructor 컨트롤러가 인스턴스화된 직후, 메서드 호출이 발생하기 전에 호출됩니다.
post_system 시스템 실행 종료 시, “after” 컨트롤러 필터 실행 후, 최종 렌더링된 페이지가 브라우저로 전송되기 직전에 호출됩니다.
CLI 앱용
다음은 Spark 명령의 사용 가능한 이벤트 포인트 목록입니다:
pre_command 명령 코드 실행 직전에 호출됩니다.
post_command 명령 코드 실행 직후에 호출됩니다.
기타
다음은 각 라이브러리에서 사용 가능한 이벤트 포인트 목록입니다:
email
CodeIgniter\Email\Email에서 이메일이 성공적으로 전송된 후 호출됩니다.Email클래스의 속성 배열을 매개변수로 받습니다.DBQuery 성공 여부와 관계없이 데이터베이스 쿼리 후 호출됩니다.
Query객체를 받습니다.migrate
latest()또는regress()에 대한 마이그레이션 호출이 성공한 후 호출됩니다.MigrationRunner의 현재 속성과 메서드 이름을 받습니다.