рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдпрд╛ EventObject рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рд╕рд╛рд░рд╛рдВрд╢


рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдШрдЯрдирд╛ рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИред

рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдореБрдЦ php рдЪреМрдЦрдЯреЗ рдПрдХ EventObject рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдШрдЯрдирд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ ред

рдпрд╣ php рдореЗрдВ рдорд╛рдирдХ рдмрди рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдкреБрд╖реНрдЯрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ psr / event-dispatcher рдорд╛рдирдХ рдХреЛ рдЕрдкрдирд╛рдиреЗ рд╕реЗ рд╣реБрдИ рд╣реИред

рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдШрдЯрдирд╛ рд╡рд╕реНрддреБ рдХрд╛ рд╡рд░реНрдгрди рд╢реНрд░реЛрддрд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдорджрдж рдХрд░рддрд╛ рд╣реИред рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдПред


рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ


рдЖрдЗрдП рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рднреВрдорд┐рдХрд╛рдУрдВ рдФрд░ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ EventObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


  1. рдПрдХ рдбреЗрд╡рд▓рдкрд░ (рдП) рдЬреЛ рдПрдХ рдШрдЯрдирд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдХреЗ рдЕрдкрдиреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрддрд╛ рд╣реИред


    рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ EventObject рдпрд╛ рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред


    EventObject рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рд▓рдХреНрд╖реНрдп рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдирд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЦреНрдп рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рддрдВрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИред


  2. рдбреЗрд╡рд▓рдкрд░ (рдмреА) рдЬреЛ "рд╢реНрд░реЛрддрд╛" рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред


    рдбреЗрд╡рд▓рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╢реНрд░реЛрддрд╛ рд╡рд┐рд╡рд░рдг рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


    рдЙрд╕реА рд╕рдордп, рдбреЗрд╡рд▓рдкрд░ рд╢реНрд░реЛрддрд╛ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдпрд╛ рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдордХрд░рдг рдореЗрдВ рд╢рд░реНрдореАрд▓реА рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдХрдиреНрд╡реЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ EventObject рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред



рдЬрдм psr / event-dispatcher рдХреЛ рд╡рд░реНрдХрд┐рдВрдЧ рдЧреНрд░реБрдк рджреНрд╡рд╛рд░рд╛ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ , рддреЛ рдЗрд╡реЗрдВрдЯ рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрд╢рди рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


Psr рдорд╛рдирдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ:


  1. рдПрдХ рддрд░рдлрд╝рд╛ рд╕реВрдЪрдирд╛ - "рдЕрдЧрд░ рдЖрдкрдиреЗ рд░реБрдЪрд┐ рд▓реА рддреЛ рдореИрдВрдиреЗ рдХреБрдЫ рдХрд┐рдпрд╛"
  2. рд╡рд╕реНрддреБ рд╕реБрдзрд╛рд░ - "рдпрд╣рд╛рдБ рдПрдХ рдмрд╛рдд рд╣реИ, рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░реВрдБ"
  3. рд╕рдВрдЧреНрд░рд╣ - "рдореБрдЭреЗ рдЕрдкрдиреА рд╕рднреА рдЪреАрдЬреЗрдВ рджреЗрдВ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░ рд╕рдХреВрдВ"
  4. рд╡реИрдХрд▓реНрдкрд┐рдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ - "рдпрд╣рд╛рдБ рдмрд╛рдд рд╣реИ, рдЖрдк рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдХрд░реЗрдВ, рдлрд┐рд░ рд░реБрдХреЗрдВ"

рдЙрд╕реА рд╕рдордп, рдХрд╛рд░реНрдп рд╕рдореВрд╣ рдиреЗ рдЗрд╡реЗрдВрдЯ рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрд╢рди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рд╢реНрди рдЙрдард╛рдП, рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЛрдВ рдореЗрдВ "рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛" рд╣реИ рдЬреЛ рдбрд┐рд╕реНрдкреИрдЪрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред


рдбреЗрд╡рд▓рдкрд░ (рдмреА) рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рднреВрдорд┐рдХрд╛рдУрдВ рдореЗрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рдХреЛрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдкрдардиреАрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рд╕рд┐рд╕реНрдЯрдо (рдП) рджреНрд╡рд╛рд░рд╛ рдИрд╡реЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреЗ рдЧрдП рдереЗред рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╣рдореЗрд╢рд╛ EventObject рдХреЗ рди рдХреЗрд╡рд▓ рд╡рд┐рд╡рд░рдг рдХреЛрдб рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ , рдмрд▓реНрдХрд┐ рдЙрд╕ рдХреЛрдб рдореЗрдВ рднреА рдЬрд╣рд╛рдВ рдпрд╣ рдШрдЯрдирд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред


рдирддреАрдЬрддрди, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдИрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ, рдЬреЛ рдбреЗрд╡рд▓рдкрд░ (рдмреА) рдХреЗ рдХрд╛рдо рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХрд╛рдо рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдПрдХ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд╕реНрддреБ рдХреА рдЙрдЪрд┐рдд рдЙрдкрд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред


namespace MyApp\Customer\Events; use MyApp\Customer\CustomerNameInterface; use MyFramevork\Event\SomeEventInterface; class CustomerNameChangedEvent implements SomeEventInterface { /** *     * @return int */ public function getCustomerId(): int; /** *    */ public function getCustomerName(): CustomerNameInterface; } 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, System рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА CustomerNameInterface рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдпрд╣ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╢реБрд░реВрдЖрдд рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬрдм рд╣рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдирд╛рдо рдкрд░рд┐рд╡рд░реНрддрди рд▓реЙрдЧ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣рдо рд╡рд┐рдзрд┐ рддрд░реНрдХреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдлреЙрд░реНрдо рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдирдХ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:


  function writeToLogCustomerNameChange( int $customerId, CustomerNameInterface $customerName ) { // ... } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:


  1. рдмреБрд░рд╛ рд╢реНрд░реЛрддрд╛ рдХреЛрдб рд╣рд╕реНрддрд╛рдХреНрд╖рд░
  2. рдбрд┐рд╕реНрдкреИрдЪрд░ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛
  3. рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛
  4. рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рдЬреИрд╕реЗ рдХрд┐ SomeEventObject

рдЖрдЗрдП рдЗрд╕реЗ рдЕрд▓рдЧ рдирдЬрд░рд┐рдП рд╕реЗ рджреЗрдЦреЗрдВ


рдпрджрд┐ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╢реНрд░реЛрддрд╛ рдХрд╛ рдЦрд░рд╛рдм рд╡рд┐рд╡рд░рдг рд╣реИ, рддреЛ рдЖрдЗрдП рдШрдЯрдирд╛ рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдШрдЯрдирд╛ рд╡рд╕реНрддреБ рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╢реНрд░реЛрддрд╛ рдХреЗ рд╡рд░реНрдгрди рд╕реЗ рджреЗрдЦреЗрдВред


рдбреЗрд╡рд▓рдкрд░ (рдП) рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╢реНрд░реЛрддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


  namespace MyApp\Customer\Events; interface CustomerNameChangedListener { public function onCustomerNameChange( int $customerId, CustomerNameInterface $customerName ); } 

рдЙрддреНрдХреГрд╖реНрдЯ рдбреЗрд╡рд▓рдкрд░ (рдП) рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЛрддрд╛ рдФрд░ рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред


рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдбреЗрд╡рд▓рдкрд░ (рдмреА) рдХреЗ рдЧреНрд░рд╛рд╣рдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ IDE рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╢реНрд░реЛрддрд╛ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдб рдкреВрд░рд╛ рд╣реЛрдирд╛ рд╢рд╛рдирджрд╛рд░ рд╣реИред


рдЖрдЗрдП рдирдП рд╢реНрд░реЛрддрд╛ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛ рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ: "рдПрдХ рддрд░рдлрд╝рд╛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ред"


рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рддрд╛рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдореЗрдВ рдЖрдПред рдЕрдиреБрдкрд▓рдмреНрдз рд░рд┐рдЯрд░реНрди рдорд╛рди; рдореБрдЦреНрдп рд╕реВрддреНрд░ рд╕реЗ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВред


рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЖрдЗрдП рдШрдЯрдирд╛ рд╢реНрд░реЛрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВред




  namespace MyApp\Customer\Events; interface CustomerNameChangedListener { public function onCustomerNameChange( int $customerId, CustomerNameInterface $customerName ): CustomerNameInterface; } 

рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╢реНрд░реЛрддрд╛ рдПрдХ рдЕрд▓рдЧ рдорд╛рди рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ) рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: "рд╡рд╕реНрддреБ рд╕реБрдзрд╛рд░"ред




  namespace MyApp\Customer\Events; interface CustomerNameChangedListener { /** * @return ItemInterface[] */ public function onCustomerNameChange( int $customerId, CustomerNameInterface $customerName ): array; } 

рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реИред рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: "рд╕рдВрдЧреНрд░рд╣"ред




  namespace MyApp\Customer\Events; interface CustomerNameChangedListener { public function onCustomerNameChange( int $customerId, CustomerNameInterface $customerName ): VoteInterface; } 

рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: "рд╡реИрдХрд▓реНрдкрд┐рдХ рд╢реНрд░реГрдВрдЦрд▓рд╛, рдорддрджрд╛рдиред"




  namespace MyFramework\Events; interface EventControllInterface { public function stopPropagation(); } 

  namespace MyApp\Customer\Events; interface CustomerNameChangedListener { public function onCustomerNameChange( int $customerId, CustomerNameInterface $customerName, EventControllInterface &$eventControll ); } 

рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд┐рдирд╛, рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреНрд░рдЪрд╛рд░ рдХреЛ рд░реЛрдХрдирд╛ рдЕрдЪреНрдЫрд╛ рдпрд╛ рдмреБрд░рд╛ рд╣реИред


рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЦреНрдп рд╕реВрддреНрд░ рд╢реНрд░реЛрддрд╛ рдХреЛ рдШрдЯрдирд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд╢реНрд░реЛрддрд╛ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╢реНрд░реЛрддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмреЗрд╣рддрд░ рдкрдардиреАрдп рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред


рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореБрдЦреНрдп рд╕реВрддреНрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ:


  1. рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕реНрд╡реАрдХрд╛рд░реНрдпрддрд╛
  2. рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░
  3. рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреЗ рдкреНрд░рд╕рд╛рд░ рдХреЛ рд░реЛрдХрдирд╛ рд╣реИ

рдЗрд╡реЗрдВрдЯ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ


рд╡рд┐рдХрд▓реНрдк рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рдЗрд╕ рддрдереНрдп рд╕реЗ рдиреАрдЪреЗ рдЖрддреА рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд▓рд┐рд╕реНрдЯреЗрдирдкреНрд░реЛрд╡рд┐рдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╡рд╣ рд╡рд╕реНрддреБ рдЬреЛ рдШрдЯрдирд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ), рдЬреЛ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред


рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдЯрд╛-рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:


  1. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  2. рд╢реНрд░реЛрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  3. рдЖрдк рдШрдЯрдирд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╢реНрд░реЛрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ



рд╕рджрд╕реНрдпрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг


  namespace MyFramework\Events; class ListenerProvider { private $handlerAssociation = []; public function addHandlerAssociation( string $handlerInterfaceName, string $handlerMethodName, string $eventName ) { $this->handlerAssociation[$handlerInterfaceName] = [ 'methodName' => $handlerMethodName, 'eventName' => $eventName ]; } public function addHandler(object $handler) { $hasAssociation = false; foreach( $this->handlerAssociation as $handlerInterfaceName => $handlerMetaData ) { if ( $handler interfaceof $handlerInterfaceName ) { $methodName = $handlerMetaData['methodName']; $eventName = $handlerMetaData['eventName']; $this->addListener($eventName, [$handler, $methodName]); $hasAssociation = true; } } if ( !$hasAssociation ) { throw new \Exception('Unknown handler object'); } } } 

рд╣рдо рд╕рджрд╕реНрдпрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЛрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдзрд┐ рдФрд░ рдШрдЯрдирд╛ рдХрд╛ рдирд╛рдоред


рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд╕рдордп, рд╣рдо рдкрд╛рд╕ рдХрд┐рдП рдЧрдП $ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд╕реНрддреБ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред


рдпрджрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрдХ $ рд╣реИрдВрдбрд▓рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдИ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реА рдЬрд╛рдПрдЧреАред рдпрд╣ рдХрдИ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рдХреА рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП SubscriberInterface рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ addSubscriber(SubscriberInterface $subscriber) рд░реВрдк рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ addSubscriber(SubscriberInterface $subscriber) рдпрд╣ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ред


рдбрд┐рд╕реНрдкреИрдЪрд░


рдХрд╛рд╢, рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг psr / event-dispatcher рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдЙрдВрдЯрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ


рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рдВ, рдЖрдк рдЪреАрдиреА рдЬреИрд╕реА рд╡рд╕реНрддреБ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


  class Event { public function __construct(string $eventName, ...$arguments) { // ... } public function getEventName(): string { // ... } public function getArguments(): array { // ... } } 

рдФрд░ psr рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдПрдХ рдИрд╡реЗрдВрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╛рджрд╛ рдмрджрд╕реВрд░рдд рд╣реИред


рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдбрд┐рд╕реНрдкреИрдЪрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рддрд░рд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛:


  interface EventDispatcherInterface { public function dispatch(string $eventName, ...$arguments); public function dispatchStopabled(string $eventName, ...$arguments); } 

рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рдХреНрдпреЛрдВ? рд╕рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдПрдХ рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдбрд┐рд╕реНрдкреИрдЪрд░ рдиреЗ рд╢реНрд░реЛрддрд╛рдУрдВ рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛, рдЗрд╕рдХреА рд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рд╣реИред


рд╡рд╣ рд╕рдм рд╣реИред рдЗрд╕ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред

Source: https://habr.com/ru/post/hi463313/


All Articles