RBAC рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде Yii рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ RESTful API

Yii рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ RESTFul рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдмрдХреБрдЫ рдХреЗрд╡рд▓ рдХреБрддреНрддреЛрдВ рдФрд░ рдЙрдирдХреЗ рдорд╛рд▓рд┐рдХреЛрдВ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕реБрдВрджрд░ рджрд┐рдЦрддрд╛ рд╣реИред



рд╢рд╛рдпрдж рд▓реЗрдЦ рдХреА рддреИрдпрд╛рд░реА рдФрд░ рд▓реЗрдЦрди рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдПрдХ YEST2 рдХреА рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдЦреЛ рджрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ RESTful рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд░реЗрдЦрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдЕрднреА рднреА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рдЕрднреА рддрдХ Yii2 рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдпрд╛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг-рд╡рд┐рдХрд╕рд┐рдд рдПрдкреАрдЖрдИ рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреВрдВрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:



  1. рдореИрдВрдиреЗ рдЬрд┐рди рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХреЗ рдирд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ ред рдЗрд╕ рддрд░рд╣ рдХреЗ рддрдВрддреНрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ AuthItems



    рддрд╛рд▓рд┐рдХрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ AuthItems



    рддрдВрддреНрд░ рдореЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдХреЛрдИ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдЕрджреНрднреБрдд рд▓реЗрдЦ рд╣реИ )ред рдЗрд╕рдореЗрдВ рднреВрдорд┐рдХрд╛рдПрдВ, рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдХрд┐ type



    рдЭрдВрдбреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдпреВрдЖрд░рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:

    GET: /api/authitems/?type=0 -





    GET: /api/authitems/?type=1 -





    GET: /api/authitems/?type=2 -





    рд▓реЗрдХрд┐рди рдРрд╕реЗ:

    GET: /api/operations -





    GET: /api/tasks -





    GET: /api/roles -







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

  2. рджреВрд╕рд░рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рд╕рд░ рдПрдХ рдбреЗрдЯрд╛ рдЦреЛрдЬ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рддрдВрддреНрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рд░реНрддреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:

     SELECT * FROM users WHERE (age>25 AND first_name LIKE '%alex%') OR (last_name='shepard');
          
          





  3. рдХрднреА-рдХрднреА рдмрдирд╛рдиреЗ, рдЕрджреНрдпрддрди рдХрд░рдиреЗ, рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдпрд╛рдиреА рдЦреЛрдЬ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА nth рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрджрд▓рдирд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдХрд┐рд╕реА рднреА рд╣рд╛рд▓рдд рдореЗрдВ рдкрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИред

  4. рдПрдХ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдереАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЕрдкрдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрди рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

  5. рдмреЗрд╢рдХ, рдкреНрд░рд╛рдкреНрдд рд░рд┐рдХреЙрд░реНрдб ( limit



    ) рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ, рдЪрдпрди рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ ( offset



    ) рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдХреНрд░рдо рдХреЛ рдХреНрд░рдордмрджреНрдз ( order by



    ) рдХреЗ рдмрд┐рдирд╛ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рд╕рдореВрд╣ ( group by



    ) рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

  6. рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ( checkAccess



    рд╡рд┐рдзрд┐ рдЕрднреА рднреА рдЙрд╕реА checkAccess



    рдореЗрдВ рд╣реИ)ред

  7. рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкреВрд░реЗ рдорд╛рдорд▓реЗ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



"рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ" рдХреА рд▓рдЧрднрдЧ рдРрд╕реА рд╕реВрдЪреА рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕ рдЕрджреНрднреБрдд рд░реВрдкрд░реЗрдЦрд╛ рдкрд░ рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреИрджрд╛ рд╣реБрдЖ рдерд╛!



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, API рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред



рдЖрдЗрдП рдЙрд╕реА RBAC рдШрдЯрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВред



рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рд░рд┐рдХреЙрд░реНрдб


рд╕рдм рдХреБрдЫ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╣реИ:

GET: /roles -





GET: /roles/42 - id=42





рдЦреЛрдЬреЗрдВ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ


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



{"name":"alex", "age":"25"}



- рдлреЙрд░реНрдо рдХреА рдПрдХ рдХреНрд╡реЗрд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ: WHERE name='alex' AND age=25





[{"name":"alex"}, {"age":"25"}]



- рдлреЙрд░реНрдо рдХреА рдПрдХ рдХреНрд╡реЗрд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ: WHERE name='alex' OR age=25







рдпрд╛рдиреА рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ AND рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ OR рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреЗ рд╣реИрдВред



AND рдФрд░ OR рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд░реНрддреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореВрд▓реНрдп рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:



рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

GET: /users?filter={"name":"alex"}



- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдирд╛рдо alex





GET: /users?filter={"name":"alex", "age":">25"}



- alex



рдФрд░ 25



рд╡рд░реНрд╖ рд╕реЗ рдЕрдзрд┐рдХ рдЖрдпреБ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛

GET: /users?filter=[{"name":"alex"}, {"name":"dmitry"}]



- рдЬрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдирд╛рдо alex



dmitry





GET: /users?search={"name":"alex"}



- рдЬрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕рдмрд╕реНрдЯреЗрдирд┐рдВрдЧ alex



(alexey, alexander, alex, рдЖрджрд┐)


рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдЖрдк рдЕрдХреНрд╕рд░ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

GET: /roles/42/operations



- id = 42



рд╕рд╛рде рдПрдХ рднреВрдорд┐рдХрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


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



рдПрдХ рд╕реЗ рдХрдИ


рдпрджрд┐ рд╕рдВрдмрдВрдз рдХрдИ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рддреЛ рдЖрдк рдлрд╝рд┐рд▓реНрдЯрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ:

GET: operations?filter={"role_id":"42"}



- id = 42



рд╕рд╛рде рднреВрдорд┐рдХрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ - id = 42





рдмрд╣реБрддреЛрдВ рдХреЛ


рд╕рдВрдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдХреНрд╕рд░ рд╕рдВрдЪрд╛рд░ рддрд╛рд▓рд┐рдХрд╛ child_id



- child_id



рдФрд░ child_id



рд▓рд┐рдП рд╕реАрдорд┐рдд рдирд╣реАрдВ child_id



ред рдЙрддреНрдкрд╛рджреЛрдВ ( products



) рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ ( features



) рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдПрдХ рд╕рдВрдЪрд╛рд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рдлрд╝реАрд▓реНрдб рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП: product_id



рдФрд░ feature_id



ред рд▓реЗрдХрд┐рди, рдпрджрд┐ рдЖрдкрдХреЛ рдЙрддреНрдкрд╛рдж рдХрд╛рд░реНрдб рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдХреНрд░рдо рдХреНрд░рдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ ordering



рдлрд╝реАрд▓реНрдб рдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЙрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдореВрд▓реНрдп value



рдХреЛ рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдкреНрд░рдкрддреНрд░ рдХреЗ url рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

POST: /products/42/feature/1



- рдЙрддреНрдкрд╛рдж рд╡рд┐рд╢реЗрд╖рддрд╛ 1



рд╕рд╛рде рд╕рд╣рдпреЛрдЧреА рдЙрддреНрдкрд╛рдж 42





GET: /products/42/feature/1



- рдЙрддреНрдкрд╛рдж 1



рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ (рдкреНрд░рд╡реЗрд╢ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


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



ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

POST: /productfeatures



- рдЕрдиреБрд░реЛрдз рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ product_id



, feature_id



, ordering



рдФрд░ value



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

GET: /productfeatures?filter={"product_id":"42"}



- рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рдж рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рдорд┐рд▓рддреЗ рд╣реИрдВред рдЬрд╡рд╛рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:

 [ {"id":"12","feature_id":"1","product_id":"42","value":"33"}, {"id":"13","feature_id":"2","product_id":"42","value":"54"} ]
      
      





PUT: /productfeatures/12



- id=12



рд╕рд╛рде рд▓рд┐рдВрдХ рдХреЛ рдмрджрд▓реЗрдВ


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



рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ


GET: /productfeatures/12?with=product,feature



- рдЙрддреНрдкрд╛рдж рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдЙрджрд╛рд╣рд░рдг рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛:

 { "id":"12", "feature_id":"1", "product_id":"42", "value":"33", "feature":{"id":"1","name":"","unit":""}, "product":{"id":"42","name":"", ...}, }
      
      







рдЙрд╕реА рддрд░рд╣, рдЖрдк рдорд╛рд▓ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

GET: /products/42?with=features



- id=42



рдЙрддреНрдкрд╛рдж рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ id=42



рдФрд░ рд╕рд░рдгреА рдореЗрдВ рдЗрд╕рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред рдЙрджрд╛рд╣рд░рдг рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛:

 { "id":"42", "name":"", "features":[{"id":"1","name":"","unit":""}, {"id":"2","name":"","unit":""}], ... }
      
      





рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ with



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



рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдкреНрдд status:0



рдорд╛рди рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдмрддрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрд╛рдж рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рдЙрдирдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ:

 { ..., "status":1, "statuses":{0:"  ", 1:" ", 2:" "}, ..., }
      
      







рдбреЗрдЯрд╛ рдбрд┐рд▓реАрдЯ рдХрд░рдирд╛



DELETE: /role/42 - id=42





DELETE: /role -





рд╣рдЯрд╛рддреЗ рд╕рдордп, рдЖрдк рдЦреЛрдЬ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

DELETE: /role?filter={"name":"admin"} - "admin"







рдбреЗрдЯрд╛ рдирд┐рд░реНрдорд╛рдг


POST: /role -





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

 [ {"name":"admin"}, {"name":"guest"} ]
      
      





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



рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди


рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЕрдиреБрд░реВрдк рд╕рднреА, рдХреЗрд╡рд▓ рдЖрдкрдХреЛ url рдФрд░ рд╡рд┐рдзрд┐ рдореЗрдВ id рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, PUT:

PUT: /role/42 - 42





рдХрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдмрджрд▓реЗрдВ:

PUT: /role





рдЕрдиреБрд░реЛрдз рд╢рд░реАрд░ рдореЗрдВ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИ

 [ {"id":"1","name":"admin"}, {"id":"2","name":"guest"} ]
      
      





рдЖрдИрдбреА 1 рдФрд░ 2 рдХреЗ рд╕рд╛рде рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рдмрджрд▓реА рдЬрд╛рдПрдВрдЧреАред


рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдмрджрд▓реЗрдВ:

PUT: /user?filter={"role":"guest"}' - role=guest









рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕реАрдорд╛, рдСрдлрд╕реЗрдЯ рдФрд░ рдЖрджреЗрд╢


рдЖрдВрд╢рд┐рдХ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп limit



рдФрд░ offset



ред



offset



- рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдСрдлрд╕реЗрдЯ

limit



- рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛

order



- рдХреНрд░рдо рдХреНрд░рдо

GET: /users/?offset=10&limit=10





GET: /users/?order=id DESC





GET: /users/?order=id ASC





рдЖрдк рдЧрдардмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

GET: /users/?order=parent_id ASC,ordering ASC







рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реАрдорд╛ рдФрд░ рдСрдлрд╕реЗрдЯ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢рд░реАрд░ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

 { data:[ {id:1, name:"Alex", role:"admin"}, {id:2, name:"Dmitry", role:"guest"} ], meta:{ total:2, offset:0, limit:10 } }
      
      





рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдл, рдореИрдВрдиреЗ AngularJS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕рдореЗрдВ $resource



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

GET: roles?limit=5





Content-Range:items 0-4/10 - 0 4, 10.





рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╢реАрд░реНрд╖рдХ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ 4 рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдП рдереЗ, рд▓реЗрдХрд┐рди 5 (рд╢реВрдиреНрдп-рдЖрдзрд╛рд░рд┐рдд)ред рдпрд╛рдиреА рд╕рднреА 10 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░, рд╢реАрд░реНрд╖рдХ рдлреЙрд░реНрдо рд▓реЗрдЧрд╛:

Content-Range:items 0-9/10 - 0 9 10.





рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣реЗрдбрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмреЙрдбреА рдЕрдм "рдЕрддрд┐рд░рд┐рдХреНрдд" рдбреЗрдЯрд╛ рд╕реЗ рднрд░рд╛ рдирд╣реАрдВ рд╣реИред



рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред



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



рдЕрдЧрд▓рд╛, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ, url рдФрд░ рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдЪрд┐рдд рд░реВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд┐рдпрдо рдЬреЛрдбрд╝реЗрдВ:



  array('api/<controller>/list', 'pattern'=>'api/<controller:\w+>', 'verb'=>'GET'), array('api/<controller>/view', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'GET'), array('api/<controller>/create', 'pattern'=>'api/<controller:\w+>', 'verb'=>'POST'), array('api/<controller>/update', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'PUT'), array('api/<controller>/update', 'pattern'=>'api/<controller:\w+>', 'verb'=>'PUT'), array('api/<controller>/delete', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'DELETE'), array('api/<controller>/delete', 'pattern'=>'api/<controller:\w+>', 'verb'=>'DELETE'),
      
      





рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд░реВрдкрд░реЗрдЦрд╛ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, ApiController.php



, Controller.php



ApiRelationProvider.php



рдФрд░ ApiRelationProvider.php



рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред



рдПрдкреАрдЖрдИ рдореЙрдбреНрдпреВрд▓ рдирд┐рдпрдВрддреНрд░рдХ



рд╕рднреА API рдореЙрдбреНрдпреВрд▓ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ ApiController



рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд░рд╛рдЙрдЯрд░ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ ( actions



) рдХреЛ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

actionView()



- рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

actionList()



- рд░рд┐рдХреЙрд░реНрдб рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

actionCreate()



- рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдПрдБ

actionUpdate()



- рд░рд┐рдХреЙрд░реНрдб рдкрд░рд┐рд╡рд░реНрддрди

actionDelete()



- рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣рдЯрд╛рдПрдВ


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐рдХрд╛ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, RBAC рдлреНрд░реЗрдорд╡рд░реНрдХ рдореИрдХреЗрдирд┐рдЬрд╝реНрдо рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ (рднреВрдорд┐рдХрд╛рдУрдВ, рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдХрд╛рд░реНрдпреЛрдВ) рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ ( authitem



) рдореЗрдВ authitem



ред рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ type



рдЭрдВрдбреЗ рд╕реЗ рдЗрдХрд╛рдИ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА RolesController



, RolesController



, TasksController



рдХреЛ рдПрдХ рдореЙрдбрд▓ ( AuthItems



) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рджрд╛рдпрд░рд╛ рдХреЗрд╡рд▓ рдЙрди рд░рд┐рдХреЙрд░реНрдбреНрд╕ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЗрд╕реА type



рдореВрд▓реНрдп рд╣реИред



рдирд┐рдпрдВрддреНрд░рдХ рдХреЛрдб:

 class RolesController extends ApiController { public function __construct($id, $module = null) { $this->model = new AuthItem('read'); $this->baseCriteria = new CDbCriteria(); $this->baseCriteria->addCondition('type='.AuthItem::ROLE_TYPE); parent::__construct($id, $module); } public function actionView(){ if(!Yii::app()->user->checkAccess('getRole')){ $this->accessDenied(); } $this->getView(); } public function actionList(){ if(!Yii::app()->user->checkAccess('getRole')){ $this->accessDenied(); } $this->getList(); } public function actionCreate(){ if(!Yii::app()->user->checkAccess('createRole')){ $this->accessDenied(); } $this->model->setScenario('create'); $this->priorityData = array('type'=>AuthItem::ROLE_TYPE); $this->create(); } public function actionUpdate( ){ if(!Yii::app()->user->checkAccess('updateRole')){ $this->accessDenied(); } $this->model->setScenario('update'); $this->priorityData = array('type'=>AuthItem::ROLE_TYPE); $this->update(); } public function actionDelete( ){ if(!Yii::app()->user->checkAccess('deleteRole')){ $this->accessDenied(); } $this->model->setScenario('delete'); $this->delete(); } public function getRelations() { return array( 'roleoperations'=>array( 'relationName'=>'operations', 'columnName'=>'operations', 'return'=>'array' ) ); } }
      
      







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



рд╕рдВрдкрддреНрддрд┐ рдХреЗ model



рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред



baseCriteria



рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд░реНрдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП ( addCondition('type='.AuthItem::ROLE_TYPE)



), рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╢рд░реНрдд рдкреВрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп, рд╕реНрдерд┐рддрд┐ type=2



рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд░рд┐рдХреЙрд░реНрдб type=2



рдФрд░ рднрд▓реЗ рд╣реА рд╡рд╛рдВрдЫрд┐рдд id



рдорд╛рди рд╡рд╛рд▓рд╛ рд░рд┐рдХреЙрд░реНрдб рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ, рд▓реЗрдХрд┐рди baseCriteria



рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ type



рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ baseCriteria



рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ 404 рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред



actionCreate()



рд╡рд┐рдзрд┐ priorityData



рдбреЗрдЯрд╛ рдХреА рдХреАрдордд actionCreate()



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



рд╕рдВрдкрддреНрддрд┐ рдХреЛ 42 рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реЛ, рдлрд┐рд░ рднреА рдЗрд╕реЗ рдорд╛рди рдХреЛ рдкреБрди: рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ AuthItem::ROLE_TYPE



(2) рдФрд░ рднреВрдорд┐рдХрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЗрдХрд╛рдИ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред



рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрд╢рди рдХреЛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП checkAccess()



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



рд╕рднреА рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐рдпрд╛рдБ ( getView()



, getList()



, create()



, update()



, delete()



) рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬреЗрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ false



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



рдЕрдВрддрд┐рдо рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ getRelations()



рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЙрдбрд▓ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХреЛ рд░рд┐рд╢реНрддреЛрдВ рдХреЗ рд╕реЗрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕рд░рдгреА рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, ...?with=roleoperations



url рдореЗрдВ ...?with=roleoperations



рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ ...?with=roleoperations



, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд░реЛрд▓ рдбреЗрдЯрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рд╕рднреА рдСрдкрд░реЗрд╢рди:

 { bizrule: null description: "Administrator" id: "1" name: "admin" operations: [{...}, {...},...] type: "2" }
      
      





getRelations()



рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рд╕рд░рдгреА рдореЗрдВ, рд╕рд░рдгреА рдХреБрдВрдЬреА рдЙрд╕ рд▓рд┐рдВрдХ рдХрд╛ рдирд╛рдо рд╣реИ рдЬреЛ GET рдкреИрд░рд╛рдореАрдЯрд░ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, roleoperations



) рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

рдХрдиреЗрдХреНрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдореВрд▓реНрдп:

relationName





string





рдореЙрдбрд▓ рдореЗрдВ рд▓рд┐рдВрдХ рдХрд╛ рдирд╛рдоред рдпрджрд┐ рдореЙрдбрд▓ рдХрд╛ рд╕рдореНрдорд╛рди рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИред рдврд╛рдВрдЪрд╛ рддрдВрддреНрд░ рдЙрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкрддреНрддрд┐ get



рдХрд░рдиреЗ рдпрд╛ рдЗрд╕реЗ get



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



getPossibleValues()



рдФрд░ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ getPossibleValues()



рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ рдЬреЛ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИред

columnName





string





рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛ рдЧрдпрд╛ рд░рд┐рдХреЙрд░реНрдб рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред

return





string ('array' | 'object')





рдСрдмреНрдЬреЗрдХреНрдЯ (рдореЙрдбрд▓) рдпрд╛ рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реМрдЯреЗрдВред





рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдКрдкрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рджрд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 <?php class TagController extends ApiController { public function __construct($id, $module = null) { $this->model = new Tag('read'); parent::__construct($id, $module); } public function actionView(){ $this->getView(); } public function actionList(){ $this->getList(); } public function actionCreate(){ if(!Yii::app()->user->checkAccess('createTag')){ $this->accessDenied(); } $this->create(); } public function actionUpdate(){ if(!Yii::app()->user->checkAccess('updateTag')){ $this->accessDenied(); } $this->update(); } public function actionDelete(){ if(!Yii::app()->user->checkAccess('deleteTag')){ $this->accessDenied(); } $this->delete(); } }
      
      







ApiController



рд╡рд░реНрдЧ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг:



рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
рд╕рдВрдкрддреНрддрд┐

рдЯрд╛рдЗрдк

рд╡рд┐рд╡рд░рдг

data





рд╕рд░рдгреА

рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рд╕реЗ рдбреЗрдЯрд╛ред Content-Type: x-www-form-urlencoded



рдФрд░ Content-Type: x-www-form-urlencoded



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдбреЗрдЯрд╛ Content-Type: application/json



рд╕рд░рдгреА рдореЗрдВ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛

priorityData





рд╕рд░рдгреА

рдбреЗрдЯрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕рдВрд╢реЛрдзрди рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╕рдордп рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ (рдбреЗрдЯрд╛) рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдпрд╛ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

model





CActiveRecord

рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдЙрджрд╛рд╣рд░рдгред

statusCode





рдкреВрд░реНрдгрд╛рдВрдХ

рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдбред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп 200



ред

criteriaParams





рд╕рд░рдгреА

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрдпрди рдкреИрд░рд╛рдореАрдЯрд░ ( limit



, offset



, order



)ред GET рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдорд╛рди рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВред

рдореВрд▓ рдореВрд▓реНрдп:

 array( 'limit' => 100, 'offset' => 0, 'order' => 'id ASC' )
      
      





contentRange





рд╕рд░рдгреА

рдЪрдпрдирд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдбреЗрдЯрд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 array( 'total'=>10, 'start'=>6, 'end'=>15 )
      
      





sendToEndUser





рдмреВрд▓рд┐рдпрди

рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ (рд╡реНрдпреВ, рдХреНрд░рд┐рдПрдЯ, рдореЙрдбрд┐рдлрд╛рдИ, рдбрд┐рд▓реАрдЯ рдХрд░реЗрдВ) рдпрд╛ рдРрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдБред

criteria





CDbCriteria

рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП CDbCriteria



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

baseCriteria





CDbCriteria

рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП CDbCriteria



рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЖрдзрд╛рд░ рдЙрджрд╛рд╣рд░рдгред criteria



рд╢рд░реНрддреЛрдВ рдкрд░ рд╡рд╕реНрддреБ рд╕реНрдерд┐рддрд┐ рдкреВрд░реНрд╡рддрд╛ рд▓реЗрддреА рд╣реИред

notFoundErrorResponse





рд╕рд░рдгреА

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдкрд░ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред



рд╡рд┐рдзрд┐:







рдкрд░реАрдХреНрд╖рдг



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



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



рдФрд░ рдЙрд╕рдореЗрдВ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред



рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдерд╛ред рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЖрдзрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдирд┐рд░рдВрддрд░ рдирд┐рдЧрд░рд╛рдиреА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЖрд░рдмреАрдПрд╕реА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдЕрдк-рдЯреВ-рдбреЗрдЯ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЗрдХрд╛рдИ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ {"error":{"access":"You do not have sufficient permissions to access."}}



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



, рдЬреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ (config / test.php) рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдкрд╣реБрдВрдЪ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ:

 ... 'proddb'=>array( 'class'=>'CDbConnection', 'connectionString' => 'mysql:host=localhost;dbname=yiirestmodel', 'emulatePrepare' => true, 'username' => '', 'password' => '', 'charset' => 'utf8', ), //    'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=yiirestmodel-test', ), //    'authManager'=>array( 'connectionID'=>'proddb', //   ), ...
      
      





рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдПрдХрдорд╛рддреНрд░ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЖрдИрдбреА рдореВрд▓реНрдп рджреЛрдиреЛрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдорд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдкрдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реИ id=1



рдФрд░ рдХрд╛рд░реНрдп рдкреНрд░рд╢рд╛рд╕рдХ рдХреА рднреВрдорд┐рдХрд╛ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, id=42



рддреЛ рдШрдЯрдХ рдРрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдирд╣реАрдВ рдорд╛рдиреЗрдВрдЧреЗ!



рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг:

 class UsersControllerTest extends ApiTestCase { public $fixtures = array( 'users'=>'User' ); public function testActionView(){ $user = $this->users('admin'); $response = $this->get('api/users/'.$user->id, array(), array('cookies'=>$this->getAuthCookies())); $this->assertEquals($response['code'], 200); $this->assertNotNull($response['decoded']); $this->assertEquals($response['decoded']['id'], $user->id); $this->assertArrayNotHasKey('password', $response['decoded']); $this->assertArrayNotHasKey('guid', $response['decoded']); } public function testActionList(){ $response = $this->get('api/users', array(), array('cookies'=>$this->getAuthCookies())); $this->assertEquals($response['code'], 200); $this->assertEquals(count($response['decoded']), User::model()->count()); } public function testActionCreate(){ $response = $this->post( 'api/users', array( 'first_name' => 'new_first_name', 'middle_name' => 'new_middle_name', 'last_name' => 'new_last_name', 'password' => 'new_user_psw', 'password_repeat' => 'new_user_psw', 'role' => 'guest', ), array('cookies'=>$this->getAuthCookies()) ); $this->assertEquals($response['code'], 200); $this->assertNotNull($response['decoded']); $this->assertArrayHasKey('id', $response['decoded']); $this->assertArrayNotHasKey('password', $response['decoded']); $this->assertNotNull( User::model()->findByPk($response['decoded']['id']) ); } }
      
      







рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдЬреБрдбрд╝рдирд╛рд░ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ ApiTestCase::get()



(GET рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ) рдЗрд╕рдореЗрдВ url рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреБрдХреАрдЬрд╝ ApiTestCase::getAuthCookies()



ред рдЗрди рдХреБрдХреАрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ $loginUrl



рдФрд░ $loginData



ред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реАрдзреЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рд╣реИ ApiTestCase



рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рди рдХрд┐рдпрд╛ рдЬрд╛рдП:

 public $loginUrl = 'api/login'; public $loginData = array('login'=>'admin', 'password'=>'admin');
      
      





рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ ApiTestCase::getAuthCookies()



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



ред



рд╡рд┐рдзрд┐ ApiTestCase :: get () (рдХреЗ рд░реВрдк рдореЗрдВ ApiTestCase::post()



, ApiTestCase::put()



, ApiTestCase::delete()



) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреНрд╡реЗрд░реА рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ:

body





рддрд╛рд░

рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛

code





рдкреВрд░реНрдгрд╛рдВрдХ

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб

cookies





рд╕рд░рдгреА

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХреБрдХреАрдЬрд╝ рдХреА рд╕рд░рдгреА

headers





рд╕рд░рдгреА

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЗрдбрд░ рдХреА рдПрдХ рд╕рд░рдгреА (рд╣реЗрдбрд░ рдирд╛рдо => рд╣реЗрдбрд░ рдорд╛рди)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 array( 'Date' => "Fri, 23 May 2014 12:10:37 GMT" 'Server' =>"Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.9" ... )
      
      





decoded





рд╕рд░рдгреА

рдбреАрдХреЛрдб (json_decode) рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рд░рдгреА



рдпрд╣ рдбреЗрдЯрд╛ рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред



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



ред



рд▓рдШреБ рд╡рд░реНрдЧ рд╡рд┐рд╡рд░рдг ApiTestCase



:

рдЧреБрдг:

рд╕рдВрдкрддреНрддрд┐

рдЯрд╛рдЗрдк

рд╡рд┐рд╡рд░рдг

authCookies





рд╕рд░рдгреА

рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдХреБрдХреАрдЬрд╝ (рд╡рд┐рдзрд┐ рдХреЙрд▓ ApiTestCase::getAuthCookies()



)

loginUrl





рддрд╛рд░

рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреБрдХреАрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдкрддрд╛ред

loginData





рд╕рд░рдгреА ()

рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЕрдиреБрд░реЛрдз рдХреЗ рдирд┐рдХрд╛рдп рдореЗрдВ рджрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рдгреАред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ:

 array('login'=>'admin', 'password'=>'admin');
      
      







рдореБрдЦреНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ:





рдЬреАрдердм рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред



рдирд┐рд╖реНрдХрд░реНрд╖



рдмреЗрд╢рдХ, рднрд╛рд░реА рднрд╛рд░ рдХреЗ рддрд╣рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ActiveRecord



ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╢рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ Yii рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╣реИ)ред

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

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



рдкреБрдирд╢реНрдЪ



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



All Articles