PHP рдореЗрдВ "рдПрдкреАрдЖрдИ-рд╕реЗрдВрдЯреНрд░рд┐рдХ" рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг

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

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

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



рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдХрд░, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдПрдХ рд╕рд░рд▓ TODO рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд╛рд░реНрдЯ рдмрдирд╛рдПрдВрдЧреЗред рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░реЛ!

рдЪрд░рдг 1. рдпреЛрдЬрдирд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛
рдЯреВрдбреЛ рдЖрд╡реЗрджрди рдореЗрдВ рдЬреЛ рд╣рдо рдЕрдм рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдХреНрд░реВрдб рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рддреНрдпреЗрдХ TODO рдЖрдЗрдЯрдо рдореЗрдВ рд╣реЛрдЧрд╛:

рдПрдХ рдЪреЗрдХ рдорд╛рд░реНрдХ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ TODO рдЖрдЗрдЯрдо рдкреВрд░реНрдг рд╣реИ
рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдмрдирд╛рдПрдВ



рдЪрд░рдг 2. рд╕рд░реНрд╡рд░ рдПрдкреАрдЖрдИ рдмрдирд╛рдирд╛

рдЖрдЗрдП 2 рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ: рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ (рдмреИрдХ рдПрдВрдб) рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд╛рд░реНрдЯ (рдлреНрд░рдВрдЯ рдПрдВрдб)
рдПрдХ simpletodo_api рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ index.php рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рдпрд╣ рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ (рдлреНрд░рдВрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░) рдХрд╛ рдореБрдЦреНрдп рдирд┐рдпрдВрддреНрд░рдХ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдз рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕реЗ рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ:
<?php // Define path to data folder define('DATA_PATH', realpath(dirname(__FILE__).'/data')); //include our models include_once 'models/TodoItem.php'; //wrap the whole thing in a try-catch block to catch any wayward exceptions! try { //get all of the parameters in the POST/GET request $params = $_REQUEST; //get the controller and format it correctly so the first //letter is always capitalized $controller = ucfirst(strtolower($params['controller'])); //get the action and format it correctly so all the //letters are not capitalized, and append 'Action' $action = strtolower($params['action']).'Action'; //check if the controller exists. if not, throw an exception if( file_exists("controllers/{$controller}.php") ) { include_once "controllers/{$controller}.php"; } else { throw new Exception('Controller is invalid.'); } //create a new instance of the controller, and pass //it the parameters from the request $controller = new $controller($params); //check if the action exists in the controller. if not, throw an exception. if( method_exists($controller, $action) === false ) { throw new Exception('Action is invalid.'); } //execute the action $result['data'] = $controller->$action(); $result['success'] = true; } catch( Exception $e ) { //catch any exceptions and report the problem $result = array(); $result['success'] = false; $result['errormsg'] = $e->getMessage(); } //echo the result of the API call echo json_encode($result); exit(); 

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

рдлрд╝реЛрд▓реНрдбрд░ рдирд┐рдпрдВрддреНрд░рдХ, рдореЙрдбрд▓ рдФрд░ рдбреЗрдЯрд╛ рднреА рдмрдирд╛рдПрдВред
рдирд┐рдпрдВрддреНрд░рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ API рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рд╣реЛрдВрдЧреЗред рд╣рдо рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЛ рд╕рд╛рдл рдФрд░ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП mvc рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред
рдореЙрдбрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА рдПрдк рд╕рд░реНрд╡рд░ рдХреЗ рдореЙрдбрд▓ рд╣реЛрдВрдЧреЗ
рдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдЧрд╛
рдЪрд▓реЛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ todo.php рдмрдирд╛рдПрдВ
рдпрд╣ рдЕрдиреНрдп TODO рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рдХ рд╣реЛрдЧрд╛ред рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд░рд┐рдХреНрдд рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ:
 <?php class Todo { private $_params; public function __construct($params) { $this->_params = $params; } public function createAction() { //create a new todo item } public function readAction() { //read all the todo items } public function updateAction() { //update a todo item } public function deleteAction() { //delete a todo item } } 

рдЕрдм рдПрдХреНрд╢рди рдПрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВред рд╣рдо createAction рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдЕрдЪреНрдЫреЗ рдореВрдб рдореЗрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред
 public function createAction() { //create a new todo item $todo = new TodoItem(); $todo->title = $this->_params['title']; $todo->description = $this->_params['description']; $todo->due_date = $this->_params['due_date']; $todo->is_done = 'false'; //pass the user's username and password to authenticate the user $todo->save($this->_params['username'], $this->_params['userpass']); //return the todo item in array format return $todo->toArray(); } 

рд╣рдо рдореЙрдбрд▓ рдореЗрдВ todoItem.php рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо "рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдмрдирд╛рдирд╛" рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗрдВред рд╡реИрд╕реЗ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ - рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмрд┐рдирд╛ (рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░)ред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред
 <?php class TodoItem { public $todo_id; public $title; public $description; public $due_date; public $is_done; public function save($username, $userpass) { //get the username/password hash $userhash = sha1("{$username}_{$userpass}"); if( is_dir(DATA_PATH."/{$userhash}") === false ) { mkdir(DATA_PATH."/{$userhash}"); } //if the $todo_id isn't set yet, it means we need to create a new todo item if( is_null($this->todo_id) || !is_numeric($this->todo_id) ) { //the todo id is the current time $this->todo_id = time(); } //get the array version of this todo item $todo_item_array = $this->toArray(); //save the serialized array version into a file $success = file_put_contents(DATA_PATH."/{$userhash}/{$this->todo_id}.txt", serialize($todo_item_array)); //if saving was not successful, throw an exception if( $success === false ) { throw new Exception('Failed to save todo item'); } //return the array version return $todo_item_array; } public function toArray() { //return an array version of the todo item return array( 'todo_id' => $this->todo_id, 'title' => $this->title, 'description' => $this->description, 'due_date' => $this->due_date, 'is_done' => $this->is_done ); } } 

CreateAction рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ 2 рдлрд╝рдВрдХреНрд╢рдВрд╕ todoItem рдореЙрдбрд▓:

рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ / simpletodo_api /? рдирд┐рдпрдВрддреНрд░рдХ = todo рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ = рдмрдирд╛рдПрдБ рдФрд░ рд╢реАрд░реНрд╖рдХ = рдкрд░реАрдХреНрд╖рдг% 20title рдФрд░ рд╡рд┐рд╡рд░рдг = рдкрд░реАрдХреНрд╖рдг% 20description рдФрд░ рджреЗрдп_date = 12/08/2011 рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо = nikko рдФрд░ userpass = = 1234 рдпрджрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕ рдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рдкрд╛рда рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реЛрдЧрд╛ред


рдмрдзрд╛рдИ! рд╣рдордиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдПрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд┐рдпрд╛ рд╣реИред

рд╕реНрдЯреЗрдк 3. рдРрдк рдЖрдИрдбреА рдФрд░ рдРрдк рд╕реАрдХреНрд░реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦреЗрдВред
рдЕрдм рд╣рдорд╛рд░рд╛ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧреНрд░рд╛рд╣рдХ рд╣реА рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдЖрдк рдПрдХ рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рдлреЗрд╕рдмреБрдХ рдФрд░ рдЯреНрд╡реНрдЯрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдорд╛рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдИрдбреА-рдХреА рдЬреЛрдбрд╝реА рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдбреЗрдореЛ рд╣реИ, рд╣рдо рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ 32 рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред APP ID рдХреЗ рд▓рд┐рдП, рд╣рдо 'app001' рдХрд╣рддреЗ рд╣реИрдВред
Index.php рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдмрджрд▓реЗрдВ:
 <?php // Define path to data folder define('DATA_PATH', realpath(dirname(__FILE__).'/data')); //Define our id-key pairs $applications = array( 'APP001' => '28e336ac6c9423d946ba02d19c6a2632', //randomly generated app key ); //include our models include_once 'models/TodoItem.php'; //wrap the whole thing in a try-catch block to catch any wayward exceptions! try { //*UPDATED* //get the encrypted request $enc_request = $_REQUEST['enc_request']; //get the provided app id $app_id = $_REQUEST['app_id']; //check first if the app id exists in the list of applications if( !isset($applications[$app_id]) ) { throw new Exception('Application does not exist!'); } //decrypt the request $params = json_decode(trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $applications[$app_id], base64_decode($enc_request), MCRYPT_MODE_ECB))); //check if the request is valid by checking if it's an array and looking for the controller and action if( $params == false || isset($params->controller) == false || isset($params->action) == false ) { throw new Exception('Request is not valid'); } //cast it into an array $params = (array) $params; ... ... ... 

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


рдЪрд░рдг 4. рд╕рд╛рдордиреЗ рдХреЗ рдЫреЛрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг
рдЪрд▓реЛ рдПрдХ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ simpletodo_client_browser рдмрдирд╛рддреЗ рд╣реИрдВред
рдФрд░ index.php:
 <!DOCTYPE html> <html> <head> <title>SimpleTODO</title> <link rel="stylesheet" href="css/reset.css" type="text/css" /> <link rel="stylesheet" href="css/bootstrap.min.css" type="text/css" /> <script src="js/jquery.min.js"></script> <script src="js/jquery-ui-1.8.16.custom.min.js"></script> <style> body { padding-top: 40px; } #main { margin-top: 80px; text-align: center; } </style> </head> <body> <div class="topbar"> <div class="fill"> <div class="container"> <a class="brand" href="index.php">SimpleTODO</a> </div> </div> </div> <div id="main" class="container"> <form class="form-stacked" method="POST" action="login.php"> <div class="row"> <div class="span5 offset5"> <label for="login_username">Username:</label> <input type="text" id="login_username" name="login_username" placeholder="username" /> <label for="login_password">Password:</label> <input type="password" id="login_password" name="login_password" placeholder="password" /> </div> </div> <div class="actions"> <button type="submit" name="login_submit" class="btn primary large">Login or Register</button> </div> </form> </div> </body> </html> 

рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рд╡реИрд╕реЗ, рд╣рдордиреЗ 2 рдЬреЗрдПрд╕ рдФрд░ 1 рд╕реАрдПрд╕рдПрд╕ рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рдХреАрдВ

рдЕрдЧрд▓рд╛, рд╕рддреНрд░ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП login.php рдмрдирд╛рдПрдВ:
 <?php //get the form values $username = $_POST['login_username']; $userpass = $_POST['login_password']; session_start(); $_SESSION['username'] = $username; $_SESSION['userpass'] = $userpass; header('Location: todo.php'); exit(); 

рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рджрд░реНрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдХреНрд░рд┐рдпрд╛ рдПрдХ рд╕рд░рд▓ рдХреБрдВрдЬреА рд╕рдВрдпреЛрдЬрди рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рд╕рдВрдЧреНрд░рд╣реАрдд TODO рд╕реВрдЪрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП todo.php рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВред Todo.php рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкрд╣рд▓реЗ ApiCaller рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрд░реЛрдз рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
Apicaller.php рдмрдирд╛рдПрдВ:
 <?php class ApiCaller { //some variables for the object private $_app_id; private $_app_key; private $_api_url; //construct an ApiCaller object, taking an //APP ID, APP KEY and API URL parameter public function __construct($app_id, $app_key, $api_url) { $this->_app_id = $app_id; $this->_app_key = $app_key; $this->_api_url = $api_url; } //send the request to the API server //also encrypts the request, then checks //if the results are valid public function sendRequest($request_params) { //encrypt the request parameters $enc_request = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->_app_key, json_encode($request_params), MCRYPT_MODE_ECB)); //create the params array, which will //be the POST parameters $params = array(); $params['enc_request'] = $enc_request; $params['app_id'] = $this->_app_id; //initialize and setup the curl handler $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->_api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, count($params)); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); //execute the request $result = curl_exec($ch); //json_decode the result $result = @json_decode($result); //check if we're able to json_decode the result correctly if( $result == false || isset($result['success']) == false ) { throw new Exception('Request was not correct'); } //if there was an error in the request, throw an exception if( $result['success'] == false ) { throw new Exception($result['errormsg']); } //if everything went great, return the data return $result['data']; } } 

рд╣рдо рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП ApiCaller рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, CURL рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реЛрдВрдЧреЗ, рдФрд░ рдХреЛрдб рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рднреА рдирд╣реАрдВ рд╣реЛрдЧреАред
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ 3 рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ:

рдФрд░ SendRequest () рдлрд╝рдВрдХреНрд╢рди:

рдЕрдм, todo.php рдмрдирд╛рддреЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рд╣рдо рдПрдХ рдХреЛрдб рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдПрдВрдЯрди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб habr_hello рдХреЗ рд▓рд┐рдП рдЯреВрдбреВ рдЖрдЗрдЯрдо рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рдПрдЧрд╛ред
 <?php session_start(); include_once 'apicaller.php'; $apicaller = new ApiCaller('APP001', '28e336ac6c9423d946ba02d19c6a2632', 'http://localhost/simpletodo_api/'); $todo_items = $apicaller->sendRequest(array( 'controller' => 'todo', 'action' => 'read', 'username' => $_SESSION['username'], 'userpass' => $_SESSION['userpass'] )); echo ''; var_dump($todo_items); 

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


рдЖрдЗрдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╣рдорд╛рд░реЗ рдкреГрд╖реНрда рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
рд╡реИрд╕реЗ, var рдбрдВрдк ^ _ ^ рдХреЛ рд╣рдЯрд╛рдирд╛ рди рднреВрд▓реЗрдВред
 <!DOCTYPE html> <html> <head> <title>SimpleTODO</title> <link rel="stylesheet" href="css/reset.css" type="text/css" /> <link rel="stylesheet" href="css/bootstrap.min.css" type="text/css" /> <link rel="stylesheet" href="css/flick/jquery-ui-1.8.16.custom.css" type="text/css" /> <script src="js/jquery.min.js"></script> <script src="js/jquery-ui-1.8.16.custom.min.js"></script> <style> body { padding-top: 40px; } #main { margin-top: 80px; } .textalignright { text-align: right; } .marginbottom10 { margin-bottom: 10px; } #newtodo_window { text-align: left; display: none; } </style> <script> $(document).ready(function() { $("#todolist").accordion({ collapsible: true }); $(".datepicker").datepicker(); $('#newtodo_window').dialog({ autoOpen: false, height: 'auto', width: 'auto', modal: true }); $('#newtodo').click(function() { $('#newtodo_window').dialog('open'); }); }); </script> </head> <body> <div class="topbar"> <div class="fill"> <div class="container"> <a class="brand" href="index.php">SimpleTODO</a> </div> </div> </div> <div id="main" class="container"> <div class="textalignright marginbottom10"> <span id="newtodo" class="btn info">Create a new TODO item</span> <div id="newtodo_window" title="Create a new TODO item"> <form method="POST" action="new_todo.php"> <p>Title:<br /><input type="text" class="title" name="title" placeholder="TODO title" /></p> <p>Date Due:<br /><input type="text" class="datepicker" name="due_date" placeholder="MM/DD/YYYY" /></p> <p>Description:<br /><textarea class="description" name="description"></textarea></p> <div class="actions"> <input type="submit" value="Create" name="new_submit" class="btn primary" /> </div> </form> </div> </div> <div id="todolist"> <?php foreach($todo_items as $todo): ?> <h3><a href="#"><?php echo $todo->title; ?></a></h3> <div> <form method="POST" action="update_todo.php"> <div class="textalignright"> <a href="delete_todo.php?todo_id=<?php echo $todo->todo_id; ?>">Delete</a> </div> <div> <p>Date Due:<br /><input type="text" id="datepicker_<?php echo $todo->todo_id; ?>" class="datepicker" name="due_date" value="12/09/2011" /></p> <p>Description:<br /><textarea class="span8" id="description_<?php echo $todo->todo_id; ?>" class="description" name="description"><?php echo $todo->description; ?></textarea></p> </div> <div class="textalignright"> <?php if( $todo->is_done == 'false' ): ?> <input type="hidden" value="false" name="is_done" /> <input type="submit" class="btn" value="Mark as Done?" name="markasdone_button" /> <?php else: ?> <input type="hidden" value="true" name="is_done" /> <input type="button" class="btn success" value="Done!" name="done_button" /> <?php endif; ?> <input type="hidden" value="<?php echo $todo->todo_id; ?>" name="todo_id" /> <input type="hidden" value="<?php echo $todo->title; ?>" name="title" /> <input type="submit" class="btn primary" value="Save Changes" name="update_button" /> </div> </form> </div> <?php endforeach; ?> </div> </div> </body> </html> 

рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд╣реИ рдирд╛? рдЕрдм рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВ, new_todo.php
рдЬрд┐рд╕рдореЗрдВ рдПрдХ TODO / рдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдирдпрд╛ TODO рдЖрдЗрдЯрдо рддрддреНрд╡ рдмрдирддрд╛ рд╣реИред рдЕрдиреНрдп рдкреГрд╖реНрда рдмрдирд╛рдирд╛: (update_todo.php рдФрд░ delete_todo.php) рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
New_todo.php рдЦреЛрд▓реЗрдВ:
 <?php session_start(); include_once 'apicaller.php'; $apicaller = new ApiCaller('APP001', '28e336ac6c9423d946ba02d19c6a2632', 'http://localhost/simpletodo_api/'); $new_item = $apicaller->sendRequest(array( 'controller' => 'todo', 'action' => 'create', 'title' => $_POST['title'], 'due_date' => $_POST['due_date'], 'description' => $_POST['description'], 'username' => $_SESSION['username'], 'userpass' => $_SESSION['userpass'] )); header('Location: todo.php'); exit(); ?> 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, new_todo.php ApiCaller рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░реНрд╡рд░ рдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рдЯреВрдбреВ / рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред

рдмрдзрд╛рдИ! рд╣рдордиреЗ API-рдХреЗрдВрджреНрд░рд┐рдд рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдпрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖:
рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк SimpleTODO рдХрд╛ рдПрдХ Android рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА API рд╕рд░реНрд╡рд░ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╕ рдПрдХ Android рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛! рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдкреБрдирд░реНрдЧрдарди рдпрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ - рдмрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╕рдорд╛рди рд╣реИред рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

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

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


All Articles