>php教程 >PHP开发 >Zend Framework 2.0 이벤트 관리자(EventManager) 시작하기 튜토리얼

Zend Framework 2.0 이벤트 관리자(EventManager) 시작하기 튜토리얼

高洛峰
高洛峰원래의
2017-01-05 10:19:541082검색

개요

EventManger는 다음 사용 사례를 위해 설계된 구성 요소입니다.

간단한 주체/관찰자 패턴 구현
측면 지향 디자인 구현
이벤트 중심 아키텍처 구현

기본 아키텍처를 사용하면 인스턴스 기반 또는 공유 컬렉션에서 특정 이벤트에 대한 리스너를 추가 및 제거하고 리스너 실행을 종료할 수 있습니다.

빠른 시작

일반적으로 클래스 내에 EventManager를 생성합니다.

use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
 
class Foo implements EventManagerAwareInterface
{
    protected $events;
 
    public function setEventManager(EventManagerInterface $events)
    {
        $events->setIdentifiers(array(
            __CLASS__,
            get_called_class(),
        ));
        $this->events = $events;
        return $this;
    }
 
    public function getEventManager()
    {
        if (null === $this->events) {
            $this->setEventManager(new EventManager());
        }
        return $this->events;
    }
}

위 코드를 사용하면 사용자가 EventManager 인스턴스에 액세스할 수 있으며, 존재하지 않는 경우 새 인스턴스로 재설정할 수 있습니다.

EventManager는 일부 이벤트를 트리거했는지 여부에만 관심이 있습니다. 기본 트리거는 일반적으로 현재 함수/메서드 이름인 이벤트 이름, 일반적으로 현재 개체 인스턴스인 컨텍스트 및 일반적으로 현재 함수/메서드에 제공되는 매개 변수라는 세 가지 매개 변수를 허용합니다. .

class Foo
{
    // ... assume events definition from above
 
    public function bar($baz, $bat = null)
    {
        $params = compact('baz', 'bat');
        $this->getEventManager()->trigger(__FUNCTION__, $this, $params);
    }
}

순서대로, 이벤트를 트리거하는 것은 무언가가 이벤트를 수신하고 있는지에만 관심이 있습니다. 특정 이벤트와 알림을 받을 콜백을 지정하는 리스너가 EventManager에 추가됩니다. 콜백은 이벤트 이름, 컨텍스트 및 매개변수를 가져오기 위한 접근자가 있는 Event 개체를 허용합니다. 리스너를 추가하고 이벤트를 시작하겠습니다.

use Zend\Log\Factory as LogFactory;
 
$log = LogFactory($someConfig);
$foo = new Foo();
$foo->getEventManager()->attach('bar', function ($e) use ($log) {
    $event  = $e->getName();
    $target = get_class($e->getTarget());
    $params = json_encode($e->getParams());
 
    $log->info(sprintf(
        '%s called on %s, using params %s',
        $event,
        $target,
        $params
    ));
});
 
// Results in log message:
$foo->bar('baz', 'bat');
// reading: bar called on Foo, using params {"baz" : "baz", "bat" : "bat"}"

attach()의 두 번째 인수는 유효한 콜백입니다. 이 예제에서는 예제를 자체 포함 상태로 유지하는 익명 함수를 보여줍니다. 그러나 유효한 함수 이름, 함수 개체, 정적 메서드를 참조하는 문자열, 특정 정적 메서드나 인스턴스 메서드가 포함된 콜백 배열을 사용할 수도 있습니다. 다시 한 번 모든 PHP 콜백이 유효합니다.

때때로 EventManager 클래스의 객체 인스턴스를 생성하지 않고 리스너를 지정하고 싶을 수도 있습니다. Zend Framework는 SharedEventCollection 개념을 통해 이를 구현합니다. 간단히 말해서 잘 알려진 SharedEventCollection을 사용하여 독립형 EventManager 인스턴스를 삽입할 수 있으며 EventManager 인스턴스는 추가 리스너를 쿼리합니다. SharedEventCollection에 추가된 리스너는 일반 이벤트 관리자와 거의 동일합니다. 연결을 호출하는 것은 EventManager와 완전히 동일하지만 시작 부분에 추가 매개변수(지정된 인스턴스)가 필요합니다. EventManager 인스턴스를 생성할 때 __CLASS__를 어떻게 전달했는지 기억하시나요? SharedEventCollection을 사용하는 경우 해당 값 또는 생성자에 제공하는 배열의 문자열을 사용하여 인스턴스를 식별할 수 있습니다. 예를 들어, EventManager 인스턴스에 주입된 SharedEventManager 인스턴스가 있다고 가정하면(예: 종속성 주입을 통해) 위의 예를 변경하여 공유 컬렉션을 통해 추가할 수 있습니다.

use Zend\Log\Factory as LogFactory;
 
// Assume $events is a Zend\EventManager\SharedEventManager instance
 
$log = LogFactory($someConfig);
$events->attach('Foo', 'bar', function ($e) use ($log) {
    $event  = $e->getName();
    $target = get_class($e->getTarget());
    $params = json_encode($e->getParams());
 
    $log->info(sprintf(
        '%s called on %s, using params %s',
        $event,
        $target,
        $params
    ));
});
 
// Later, instantiate Foo:
$foo = new Foo();
$foo->getEventManager()->setSharedEventCollection($events);
 
// And we can still trigger the above event:
$foo->bar('baz', 'bat');
// results in log message:
// bar called on Foo, using params {"baz" : "baz", "bat" : "bat"}"

참고: StaticEventManager

2.0.0beta3에서는 StaticEventManager 싱글톤을 SharedEventCollection으로 사용할 수 있습니다. 이렇게 하면 간단히 StaticEventManager::getInstance()를 호출하여 전역적으로 사용할 수 있는 SharedEventCollection에 액세스하는 위치와 방법에 대해 걱정할 필요가 없습니다.

그러나 프레임워크에서는 더 이상 사용되지 않으며 2.0.0beta4에서는 SharedEventManager 인스턴스를 구성하고 이를 별도의 EventManager 인스턴스에 삽입하여 대체할 예정입니다.

와일드카드 리스너

때로는 특정 인스턴스의 많은 또는 모든 이벤트에 대해 동일한 리스너를 추가하거나 공유 이벤트 컬렉션, 많은 컨텍스트 및 많은 이벤트를 사용할 수도 있습니다. . EventManager 구성 요소가 이를 허용합니다.

한 번에 여러 이벤트 추가

$events = new EventManager();
$events->attach(array('these', 'are', 'event', 'names'), $callback);

와일드카드를 통해 추가

$events = new EventManager();
$events->attach('*', $callback);

우선순위를 지정하면 해당 우선순위가 이 감지에 사용됩니다. 모든 이벤트 청취자에 의해 트리거됩니다.

위의 코드는 트리거가 트리거될 때마다 이 특정 리스너에 대한 알림이 발생하도록 지정합니다.

SharedEventManager를 통해 한 번에 여러 이벤트 추가

$events = new SharedEventManager();
// Attach to many events on the context "foo"
$events->attach('foo', array('these', 'are', 'event', 'names'), $callback);
 
// Attach to many events on the contexts "foo" and "bar"
$events->attach(array('foo', 'bar'), array('these', 'are', 'event', 'names'), $callback);

우선순위를 지정하면 해당 우선순위가 지정된 모든 이벤트에 사용됩니다.

SharedEventManager를 통해 모든 이벤트를 한 번에 추가하세요.

$events = new SharedEventManager();
// Attach to all events on the context "foo"
$events->attach('foo', '*', $callback);
 
// Attach to all events on the contexts "foo" and "bar"
$events->attach(array('foo', 'bar'), '*', $callback);

우선순위를 지정하면 해당 우선순위가 지정된 모든 이벤트에 사용됩니다.

위 코드는 "foo" 및 "bar" 컨텍스트를 지정하며, 이벤트가 트리거되면 지정된 리스너에게 알림이 전달됩니다.

구성 옵션

EventManager 옵션

식별자

주어진 EventManager 인스턴스는 SharedEventManager 시간을 통해 액세스할 때 문자열 또는 문자열 배열에 응답할 수 있습니다.

event_class

리스너에게 전달된 이벤트를 나타내는 데 사용되는 대체 Event 클래스의 이름입니다.

shared_collections

이벤트가 트리거될 때의 SharedEventCollection 인스턴스입니다.

사용 가능한 메서드

__construct

__construct(null|string|int Sidentifier)

제공된 경우 지정된 식별자를 사용하여 새 EventManager 인스턴스를 구성합니다. 컬렉션을 공유하는 목적.

setEventClass

setEventClass(string $class)

트리거된 리스너에 전달되는 이벤트를 생성할 때 사용할 대체 Event 클래스 이름을 제공합니다.

setSharedCollections

setSharedCollections(SharedEventCollection $collections=null)

이벤트가 트리거될 때 사용되는 SharedEventCollection 인스턴스입니다.

getSharedCollections

getSharedCollections()

현재 추가된 SharedEventCollection 인스턴스를 반환합니다. 컬렉션이 추가되지 않은 경우 비어 있거나 SharedEventCollection 인스턴스를 반환합니다.

trigger

trigger(string $event, Mixed $target, Mixed $argv, callback $callback)

지정된 이벤트에 대한 모든 리스너를 트리거합니다. $event에 대해 현재 함수/메서드 이름을 사용하고 필요한 경우 ".pre", ".post" 등을 사용하는 것이 좋습니다. $context는 현재 개체의 인스턴스이거나 개체를 사용하여 트리거되지 않은 경우 함수의 이름이어야 합니다. $params는 일반적으로 연관 배열 또는 ArrayAccess 인스턴스여야 합니다. 함수/메서드에 전달된 매개변수를 사용하는 것이 좋습니다(여기서는 compact()가 유용할 때가 많습니다). 이 메서드는 콜백을 허용할 수도 있으며 TriggerUntil()과 동일하게 동작합니다.

메서드는 다양한 리스너가 반환한 값을 검사하고 단락 테스트 등을 수행하는 데 사용할 수 있는 ResponseCollection의 인스턴스를 반환합니다.

triggerUntil

triggerUntil(string $event, Mixed $context, Mixed $argv, callback $callback)

trigger( )와 마찬가지로 지정된 이벤트에 대해 모든 리스너를 트리거합니다. , 또한 각 리스너의 반환 값을 $callback에 전달합니다. $callback이 부울 참 값을 반환하면 리스너의 실행이 종료됩니다. $result->stopped()를 사용하여 이를 테스트할 수 있습니다.

attach

attach(string $event, callback $callback, int $priority)

EventManager 인스턴스에 $callback을 추가하고 $event 이벤트를 수신합니다. $priority가 제공되면 해당 우선 순위를 사용하여 리스너가 내부 리스너 스택에 삽입되고 더 높은 값이 먼저 실행됩니다. (기본 우선순위는 "1"이며 음수 값으로 실행됩니다.)

메서드는 ZendStdlibCallbackHandler의 인스턴스를 반환하며, 필요한 경우 나중에 이 값을 detach()에 전달할 수 있습니다.

attachAggregate

attachAggregate(string|ListenerAggregate $aggregate)

문자열이 $aggregate로 전달되면 해당 클래스를 인스턴스화합니다. 그런 다음 $aggregate가 EventManager 인스턴스의 attachment() 메서드에 전달되어 리스너를 등록할 수 있습니다.

ListenerAggregate 인스턴스를 반환합니다.

detach

detach(CallbackHandler $listener)

모든 리스너를 스캔하고 $listener와 일치하는 모든 리스너를 분리하여 더 이상 트리거되지 않도록 합니다.

리스너가 할당되고 구독 취소된 경우 참 부울을 반환하고, 그렇지 않으면 거짓 부울을 반환합니다.

detachAggregate

detachAggregate(ListenerAggregate $aggregate)

모든 이벤트를 반복하여 모든 일치 항목에 대해 컬렉션이 나타내는 리스너를 결정합니다. 리스너는 Remove입니다.

리스너가 식별되어 구독 취소된 경우 참 부울을 반환하고, 그렇지 않으면 거짓 부울을 반환합니다.

getEvents

getEvent()

리스너가 첨부한 모든 이벤트 이름이 포함된 배열을 반환합니다.

getListeners

getListeners(string $event)

$event

clearListeners

clearListeners에 추가된 모든 리스너에 대해 ZendStdlibPriorityQueue 인스턴스를 반환합니다. (문자열 $event)

$event에 추가된 모든 리스너를 제거합니다.

prepareArgs

prepareArgs(array $args)

제공된 $args에서 ArrayObject를 생성합니다. 이는 나중에 리스너나 트리거된 메서드가 이러한 변경 사항을 볼 수 있도록 리스너가 매개 변수를 변경할 수 있도록 하려는 경우에 유용합니다.

Zend Framework 2.0 Event Manager(The EventManager) 입문 튜토리얼과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.