рдЗрдВрдЯрд░реЗрдХреНрдЯрд░, рдСрдкрд░реЗрд╢рди рдкреИрдЯрд░реНрди

рдпрд╣ рдкрд╛рда рд▓рд╛рд░рд╡реЗрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╣рдирдореА рдлреНрд░реЗрдорд╡рд░реНрдХ рдореИрдиреБрдЕрд▓ рдХреЗ рдПрдХ рднрд╛рдЧ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд░реБрдЪрд┐ рдХрд┐рд╕ рдХрд╛рд░рдг рд╣реБрдИ? рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдФрд░ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕реА рд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


  • рдЗрдВрдЯрд░реЗрдХреНрдЯрд░реНрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
  • TDD \ BDD рдХрд╛ рдкреНрд░рджрд░реНрд╢рдиред

рдпрд╣ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпреЗ рди рдХреЗрд╡рд▓ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛рдУрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдУрдЖрд░рдПрдо рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ) рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реВрдкрд░реЗрдЦрд╛рдПрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рднреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХреГрддрд┐ рд╣реИ рдФрд░ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░рдгреЛрдВ рд╕реЗ "рдмреЗрд╕реНрдЯрд┐рдХреНрд╕ рдкреНрд░реИрдХреНрдЯрд┐рдХреНрд╕" рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕рдмрд╕реЗ рд╕рдлрд▓ рд╕рдорд╛рдзрд╛рди рдЙрдзрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореВрд▓рднреВрдд рдЪреАрдЬреЗрдВ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдкреАрдПрд▓ рдХреЛ рд╢реБрд░реВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдФрд░ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЗрд╕рд▓рд┐рдП, рд╢реБрд░реВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдирдореА (рдорд╛рдгрд┐рдХ) рдврд╛рдВрдЪрд╛ рд╣реИ - рдПрдХ рдХрд╛рдлреА рдирдпрд╛ рдврд╛рдВрдЪрд╛ рдЬреЛ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд┐рдореНрдлрдиреА рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдУрдЖрд░рдПрдо "рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░"ред рдФрд░ рд╕рдХреНрд░рд┐рдп рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рд▓рдХреНрд╖реНрдп рд▓рд╛рд░рд╡реЗрд▓ \ рд▓реБрдореЗрди (php) рдврд╛рдВрдЪрд╛ред


рдЕрдиреБрдХреВрд▓рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╕рдмрд╕реЗ рддреАрд╡реНрд░ рдХреЛрдг рдХрд╛рдЯ рджрд┐рдП рдЧрдП рдереЗ:


  • рдЧрд╛рдЗрдб рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг, рдврд╛рдВрдЪреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
  • ORM рдПрд▓реЛрдХреЗрдВрдЯ рдХреЛ рдЧреНрд▓реЛрдм рдкрд░ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рднрдВрдбрд╛рд░ рдХрд╛ рдХрд╛рдо рднреА рдХрд░рддрд╛ рд╣реИред
  • рдИрдореЗрд▓ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдгред

рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдФрд░ рдЗрд╕ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЧрдпрд╛:


  • рдЗрдВрдЯрд░реЗрдХреНрдЯрд░реНрд╕ - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдиреНрдпреВрдирддрдо рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
  • рдЯреЗрд╕реНрдЯ, рдЯреАрдбреАрдбреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрджрдо-рджрд░-рдЪрд░рдг рд╡рд┐рдХрд╛рд╕ред

рдореВрд▓ рд╣рдирдореА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ, рдЬрд┐рд╕реЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкрд╛рда рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдореВрд▓ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд╛рда
рдкрд╛рда рдХреЗ рдЕрдВрдд рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд php рдХреЛрдб рдХреЗ рд╕рд╛рде рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред


interactor


рдирдИ рд╕реБрд╡рд┐рдзрд╛: рдИрдореЗрд▓ рд╕реВрдЪрдирд╛рдПрдВ


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


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


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


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


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


рд╡реЗ рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдмрд╛рдж рдЧреИрд░-рддреБрдЪреНрдЫ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдп, рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд▓реЙрдЬрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЗрдВрдЯрд░реЗрдХреНрдЯрд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ; рд╡реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЗрдпрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред


рдХреЙрд▓рдмреИрдХ? рд╣рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!


рдИрдореЗрд▓ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХреЙрд▓рдмреИрдХ рдЬреЛрдбрд╝рдирд╛ рд╣реИред


рдпрд╣реА рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдирдИ рдкреБрд╕реНрддрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдИрдореЗрд▓ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ, рд╣рдирдореА рдЗрд╕ рддрд░рд╣ рдХрд╛ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдореЙрдбрд▓ рдХреЙрд▓рдмреИрдХ рдХреЛ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рдорд╛рдирддреЗ рд╣реИрдВред рд╡реЗ рдПрдХрдорд╛рддреНрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реЗ рдИрдореЗрд▓ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рдкрд░рдд рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВред


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


рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдирд┐рд╣рд┐рдд рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯ рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред


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


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


рд╡рд┐рдЪрд╛рд░


рдЗрдВрдЯрд░реЗрдХреНрдЯрд░реНрд╕ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдПрдХ рдирдП рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред


рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рджреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЗ рд▓рд┐рдЦрдиреЗ рдЪрд╛рд╣рд┐рдП: __construct рдФрд░ call ред
__invoke рдХреЗ php рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХреЙрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рдВрд╢реЛрдзрдХ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ __invoke рдорд╛рдзреНрдпрдо рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЙрдкрд▓рдмреНрдз рддрд░реАрдХрд╛ рд╣реИред


рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рднреА рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рди рдХреЗрд╡рд▓ рдЫрд┐рдкреА рд╣реБрдИ рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред


рдЯреНрд░реЗрдирд┐рдВрдЧ


рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛ " рдмреБрдХрд╢реЗрд▓реНрдлрд╝ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рдФрд░ рд╣рдо "рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХ рдХреЗ рд▓рд┐рдП рдИрдореЗрд▓ рдЕрдзрд┐рд╕реВрдЪрдирд╛" рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд▓рд┐рдЦрдирд╛


рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ рдФрд░ рдЙрдирдХреЗ рдЯреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ:


 $ mkdir lib/bookshelf/interactors $ mkdir tests/bookshelf/interactors 

рд╣рдо рдЙрдиреНрд╣реЗрдВ lib/bookshelf рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рдмрд╛рдж рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреЛрд░реНрдЯрд▓, рдПрдкреАрдЖрдИ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рддрд╛рдмреЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


AddBook рдЗрдВрдЯрд░рдПрдХреНрдЯрд░ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг tests/bookshelf/interactors/AddBookTest.php рд▓рд┐рдЦреЗрдВ tests/bookshelf/interactors/AddBookTest.php :


 # tests/bookshelf/interactors/AddBookTest.php <?php use Lib\Bookshelf\Interactors\AddBook; class AddBookTest extends TestCase { private function interactor() { return $this->app->make(AddBook::class); } private function bookAttributes() { return [ "author" => "James Baldwin", 'title' => "The Fire Next Time", ]; } private function subjectCall() { return $this->interactor()($this->bookAttributes()); } public function testSucceeds() { $result = $this->subjectCall(); $this->assertTrue($result->successful()); } } 

рдЯреЗрд╕реНрдЯ рд╕реВрдЯ рдЪрд▓рд╛рдиреЗ рд╕реЗ Class does not exist рдПрд░рд░ Class does not exist рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ AddBook рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдлрд╝рд╛рдЗрд▓ lib/bookshelf/interactors/AddBook.php :


 <?php namespace Lib\Bookshelf\Interactors; use Lib\Interactor\Interactor; class AddBook { use Interactor; public function __construct() { } protected function call() { } } 

рдЗрд╕ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: __construct рдбреЗрдЯрд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП call рдХрд░рдирд╛ред


рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ call , рдХреЛ рдирд┐рдЬреА рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВред


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


рдЪрд▓реЛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ:


 $ phpunit 

рд╕рднреА рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ!


рдЕрдм, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ AddBook рдЗрдВрдЯрд░рдПрдХреНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ!


рдкреБрд╕реНрддрдХ рдирд┐рд░реНрдорд╛рдг


tests/bookshelf/interactors/AddBookTest.php :


  public function testCreateBook() { $result = $this->subjectCall(); $this->assertEquals("The Fire Next Time", $result->book->title); $this->assertEquals("James Baldwin", $result->book->author); } 

рдпрджрд┐ рдЖрдк phpunit рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:


 Exception: Undefined property Lib\Interactor\InteractorResult::$book 

рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛ рдХреЛ рднрд░реЗрдВ, рдлрд┐рд░ рд╕рдордЭрд╛рдПрдВ рдХрд┐ рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛:


 <?php namespace Lib\Bookshelf\Interactors; use Lib\Interactor\Interactor; use Lib\Bookshelf\Book; class AddBook { use Interactor; protected static $expose = ["book"]; private $book = null; public function __construct() { } protected function call($bookAttributes) { $this->book = new Book($bookAttributes); } } 

рдпрд╣рд╛рдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рддреЗрдВ:


рд╕реНрдЯреНрд░рд┐рдВрдЧ protected static $expose = ["book"]; book рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрд░рд┐рдгрд╛рдо рд╡рд╕реНрддреБ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


call рд╡рд┐рдзрд┐ Book рдореЙрдбрд▓ рдХреЛ book рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддреА рд╣реИ, рдЬреЛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред


рдЕрдм рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред


рд╣рдордиреЗ Book рдореЙрдбрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИред


рд╕реЗрд╡рд┐рдВрдЧ рдмреБрдХ


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирдИ рдкреБрд╕реНрддрдХ рд╣реИ, рдЬрд┐рд╕реЗ рд╢реАрд░реНрд╖рдХ рдФрд░ рд▓реЗрдЦрдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд╣реАрдВ рд╣реИред


рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА BookRepository - BookRepository рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 // tests/bookshelf/interactors/AddBookTest.php public function testPersistsBook() { $result = $this->subjectCall(); $this->assertNotNull($result->book->id); } 

рдпрджрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА Failed asserting that null is not null ред


рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдкреБрд╕реНрддрдХ рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдЬрдм рдЗрд╕реЗ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред


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


lib/bookshelf/interactors/AddBook.php рдореЗрдВ call рд╡рд┐рдзрд┐ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:


 protected function call($bookAttributes) { $this->book = Book::create($bookAttributes); } 

new Book рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо Book::create рдкреБрд╕реНрддрдХ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде Book::create ред


рд╡рд┐рдзрд┐ рдЕрднреА рднреА рдкреБрд╕реНрддрдХ рд▓реМрдЯрд╛рддреА рд╣реИ, рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рднреА рд╕рд╣реЗрдЬрддреА рд╣реИред


рдпрджрд┐ рдЖрдк рдЕрдм рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЧрдП рд╣реИрдВред


рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди


рдЖрдЗрдП рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдЯреЗрд╕реНрдЯ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ (рд╕рдлрд▓ рдмрдЪрдд рдХреЗ рдмрд╛рдж рдЖрдИрдбреА рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ)ред рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИ рдХрд┐ рд╕рдВрд░рдХреНрд╖рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдпреВрдпреВрдЖрдИрдбреА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдИрдбреА рдХреЙрд▓рдо рднрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмрдЪрдд рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╕рдлрд▓ рд░рд╣реА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред


рд╣рдо рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЗрд╕рдХреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдХрд╛ рдЯреВрдЯрдирд╛ рдХрдо рд╣реЛрдЧрд╛ред


рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 // lib/bookshelf/interactors/AddBook.php public function __construct(Book $repository) { $this->repository = $repository; } protected function call($bookAttributes) { $this->book = $this->repository->create($bookAttributes); } 

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рд╣реА рд╣реИ, рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдХреЛрдб рдХреЗ рд╕рд╛рде, рдПрдХ repository рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред


рдЕрднреА, рдкрд░реАрдХреНрд╖рдг рдпрд╣ create рддрд░реАрдХреЗ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЗрд╕рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ $this->assertNotNull($result->book->id) рд╕реЗ рднрд░рд╛ рд╣реБрдЖ $this->assertNotNull($result->book->id) ред


рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИред


рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ create рд╡рд┐рдзрд┐ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдХреЙрд▓ рдХреА рдЧрдИ рдереА, рдФрд░ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ (рдЪреВрдВрдХрд┐ рдпрд╣ рдЗрд╕рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ)ред


рдЖрдЗрдП testPersistsBook рдкрд░реАрдХреНрд╖рдг рдмрджрд▓реЗрдВ:


 // tests/bookshelf/interactors/AddBookTest.php public function testPersistsBook() { $repository = Mockery::mock(Book::class); $this->app->instance(Book::class, $repository); $attributes = [ "author" => "James Baldwin", 'title' => "The Fire Next Time", ]; $repository->expects()->create($attributes); $this->subjectCall($attributes); } 

рдЕрдм рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдЗрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рд╣рдордиреЗ рдЬреЛ рднреА рдХрд┐рдпрд╛ рд╡рд╣ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛ред


рдИрдореЗрд▓ рдЕрдзрд┐рд╕реВрдЪрдирд╛


рдЪрд▓реЛ рдПрдХ рдИрдореЗрд▓ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдЬреЛрдбрд╝реЗрдВ!


рдЖрдк рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд╕рдПрдордПрд╕ рднреЗрдЬреЗрдВ, рдЪреИрдЯ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ рдпрд╛ рд╡реЗрдм рд╣реБрдХ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВред


рд╣рдо рд╕рдВрджреЗрд╢ рдмреЙрдбреА рдХреЛ рдЦрд╛рд▓реА рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣рдо "рдмреБрдХ рдПрдб!" рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗред


рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкрд░реАрдХреНрд╖рдг tests/bookshelf/mail/BookAddedNotificationTest.php :


 <?php use Lib\Bookshelf\Mail\BookAddedNotification; use Illuminate\Support\Facades\Mail; class BookAddedNotificationTest extends TestCase { public function setUp() { parent::setUp(); Mail::fake(); $this->mail = new BookAddedNotification(); } public function testCorrectAttributes() { $this->mail->build(); $this->assertEquals('no-reply@example.com', $this->mail->from[0]['address']); $this->assertEquals('admin@example.com', $this->mail->to[0]['address']); $this->assertEquals('Book added!', $this->mail->subject); } } 

рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╡рд░реНрдЧ lib/Bookshelf/Mail/BookAddedNotification.php рдЬреЛрдбрд╝реЗрдВред


 <?php namespace Lib\Bookshelf\Mail; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class BookAddedNotification extends Mailable { use SerializesModels; public function build() { $this->from('no-reply@example.com') ->to('admin@example.com') ->subject('Book added!'); return $this->view('emails.book_added_notification'); } } 

рдЕрдм рд╣рдорд╛рд░реЗ рд╕рд╛рд░реЗ рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рд╣реЛ рдЧрдП!


рд▓реЗрдХрд┐рди рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдЕрднреА рддрдХ рдирд╣реАрдВ рднреЗрдЬреА рдЧрдИ рд╣реИред рд╣рдореЗрдВ рдЕрдкрдиреЗ AddBook рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд╕реЗ AddBook рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


AddBook рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП AddBook рдкрд░реАрдХреНрд╖рдг AddBook рдХрд┐ рдореЗрд▓рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:


 public function testSendMail() { Mail::fake(); $this->subjectCall(); Mail::assertSent(BookAddedNotification::class, 1); } 

рдпрджрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ: The expected [Lib\Bookshelf\Mail\BookAddedNotification] mailable was sent 0 times instead of 1 times. ред


рдЕрдм рд╣рдо рдЗрдВрдЯрд░рдПрдХреНрдЯрд░ рдореЗрдВ рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред


 public function __construct(Book $repository, BookAddedNotification $mail) { $this->repository = $repository; $this->mail = $mail; } protected function call($bookAttributes) { $this->book = $this->repository->create($bookAttributes); Mail::send($this->mail); } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдИрдореЗрд▓ рдореЗрдВ рдкреБрд╕реНрддрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реВрдЪрдирд╛ рднреЗрдЬреЗрдЧрд╛ред


рдирд┐рдпрдВрддреНрд░рдХ рдПрдХреАрдХрд░рдг


рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЗрдВрдЯрд░реИрдХреНрд╢рдирд░ рдХреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдПрдХреНрд╢рди рдлрд╝рд╛рдЗрд▓ app/Http/Controllers/BooksCreateController.php рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:


 <?php namespace App\Http\Controllers; use Lib\Bookshelf\Interactors\AddBook; use Illuminate\Http\Request; use Illuminate\Http\Response; class BooksCreateController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct(AddBook $addBook) { $this->addBook = $addBook; } public function call(Request $request) { $input = $request->all(); ($this->addBook)($input); return (new Response(null, 201)); } } 

рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИред


рд╣рдо рдкреБрд╕реНрддрдХ рдирд┐рд░реНрдорд╛рдг рдХреЛрдб рдХрд╛ рджреЛ рдмрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред


рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд░реНрд╕ рдХреЗ рдПрдХ рдЕрдиреНрдп рд▓рд╛рдн рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реБрдП рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдо рдкрд░реАрдХреНрд╖рдг рдореЗрдВ BookRepository рдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХреЛ рд╣рдЯрд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ AddBook рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдореЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


 <?php use Lib\Bookshelf\Interactors\AddBook; class BooksCreateControllerTest extends TestCase { public function testCallsInteractor() { $attributes = ['title' => '1984', 'author' => 'George Orwell']; $addBook = Mockery::mock(AddBook::class); $this->app->instance(AddBook::class, $addBook); $addBook->expects()->__invoke($attributes); $response = $this->call('POST', '/books', $attributes); } } 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЧрдП рд╣реИрдВ рдФрд░ рд╡реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИрдВ!


рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЗрдирдкреБрдЯ (http рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ) рд▓реЗрддреА рд╣реИ рдФрд░ рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдХреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рддреА рд╣реИред рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдПрдХрдорд╛рддреНрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред рдФрд░ рдЗрдВрдЯрд░рдПрдХреНрдЯрд░ рд╣рдорд╛рд░реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рдпрд╣ рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред


рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╕реЗ рдЫреВрдЯ рджреА рдЧрдИ рд╣реИред


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


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ, рдЖрдк рд╕рдВрднрд╡рддрдГ рдЙрдкрд░реЛрдХреНрдд рддрд░реНрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рдлрд▓ рд╣реИред рдФрд░ рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдлрд▓рддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдЗрдВрдЯрд░реИрдХреНрдЯрд░ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред


рдХреЛрдб рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░

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


All Articles