рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдврд╛рдВрдЪрд╛ Yii рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ iOS / Android рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рдерд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдмрд╕ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдкрд░ рд╕рд╣рдордд рд╣реБрдП, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдбреЗрд╡рд▓рдкрд░ рдЕрдЪрд╛рдирдХ рдмрджрд▓ рдЧрдпрд╛, рддреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢реБрд░реВ рд╣реЛ рдЧрдИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХреА рдореЗрдВ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде, рд╡рд┐рдХреА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреЛрдб рдФрд░ рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдереАред
рд╣рдордиреЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╕рдорд╕реНрдпрд╛ рдиреАрдЪреЗ рд╣реИред
рд╡реЗрдм рд╕реЗрд╡рд╛ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдХрд╛рд╕
рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдореЛрдмрд╛рдЗрд▓ рд╕реЗрд╡рд╛ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЙрдбреНрдпреВрд▓ рд╣реИред рд╣рдордиреЗ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдореЙрдбреНрдпреВрд▓ рдФрд░ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдпрд╛ред
рдкреНрд░рдореБрдЦ рдмрд╛рддреЗрдВ рдиреАрдЪреЗ рд╣реИрдВред
class VMJsonServiceController extends CController { public $documentationMode = false; protected $request = null; ... public function init() { if ($this->documentationMode) { return; } if (Yii::app()->request->isPostRequest) { $json = CJSON::decode(file_get_contents("php://input"), false); if (isset($json->request)) { $this->request = $json->request; } else { $this->respondWithError(VMServiceResponseCode::SERVICE_ERROR, 'There is no request node'); } } else { ... } } ... public function checkInputParameters($params = array()) { if ($this->documentationMode) { $exception = new VMDocumentationException(); $exception->parameters = VMObjectUtils::fromArray($params); throw $exception; } $this->checkObjectParameter($params, $this->request); } ... }
рд╕рдмрд╕реЗ "рдирдордХ"
$documentationMode
рдореЗрдВ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХред
рдЕрдм рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдирд╣реАрдВред
class UsersController extends VMJsonServiceController { ... public function actionSignUp() { $this->checkInputParameters(array( 'user' => array( 'email' => 'test@test.com', 'password' => '12345', 'phone' => array('optional', 'value' => '+7 999 998 76 54'), 'photos' => array('array', 'value' => array( 'file' => base64_encode('Image'), ) ) )); $email = $this->request->user->email; ... } ... }
CheckInputParameters рд╡рд┐рдзрд┐ рдкреБрд╖реНрдЯрд┐ рдХрд░рддреА рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрдпрд╛ рдерд╛ (рдИрдореЗрд▓ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдлреЛрди рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдФрд░ рдлрд╝реЛрдЯреЛ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╣реИрдВ рдФрд░ рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА - рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, checkInputPrameters рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рд░рдгреА рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рдкреНрд░рд▓реЗрдЦрди рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓рдЧрд╛рддрд╛рд░ рд╣реИрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд▓рдВрдмрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдкрдиреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред
1. рдПрдХ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдирд╛
Metadata
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡рд┐рдзрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╕реЗрд╡рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдЧрдП
checkInputParameters
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
checkInputParameters
class VMDocumentationController extends CController { ... // , // "" private function getDefinition($class, $method) { try { $class->{$method}(); } catch (VMDocumentationException $e) { return (object) array( 'parameters' => $e->parameters ); } } ... }
2. рд╣рдо рдЖрдзрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХреЛрдб рдХреЛ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ
class VMJsonServiceModule extends CWebModule { public function init() { ... $this->controllerMap = array( 'documentation' => array( 'class' => 'VMDocumentationController' ) ); } }
рдпрд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ? рдФрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдпреВрдЖрд░рдПрд▓ рдкрд░ iOS / Android рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд╣реИ, рдХреЗрд╡рд▓ рдЖрдзрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрдиред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?
рдиреАрдЪреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреА рдПрдХ рдЬреЛрдбрд╝реАред
рдКрдкрд░реА рдирд╛рд╡рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдмрд╛рдИрдВ рдУрд░ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрдиреБрд░реЛрдз рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЙрд▓ рдмрдЯрди рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдЧрд╛ рдФрд░ рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдпрд╣реА рд╣реИ, рдЖрдк рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдЗрдирдкреБрдЯ рдкрд░ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдЕрдВрдд рдореЗрдВ - рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХреЛрдб рднрдпрд╛рдирдХ рд╣реИ, рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╣реА рднрдпрд╛рдирдХ рд╣реИ, рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдореЛрдмрд╛рдЗрд▓ рд╕реЗрд╡рд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ - рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХреА рднреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рднреА рдЪреАрдЬрд╝ рдкреЗрд╢ рдХрд░рдиреА рд╣реИ, рддреЛ рдкреБрд▓-рдЕрдиреБрд░реЛрдз рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред