RESTful API
RESTful API là một tiêu chuẩn dùng trong việc thiết kế API cho các ứng dụng web (thiết kế Web services) để tiện cho việc quản lý các resource. Nó chú trọng vào tài nguyên hệ thống (tệp văn bản, ảnh, âm thanh, video … ), bao gồm các trạng thái tài nguyên được định dạng và được truyền tải qua HTTP.
Xây dựng một project REST API
ban đầu ta tạo một project với cấu trúc thư mục như sau:
1 2 3 4 5 | * name-project * src - composer.json - .env |
thêm đoạn mã sau vào file composer.json, rồi run : composer install
1 2 3 4 5 6 7 8 9 10 11 | <span class="token punctuation">{</span> <span class="token property">"require"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"vlucas/phpdotenv"</span><span class="token operator">:</span> <span class="token string">"^2.4"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token property">"autoload"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"psr-4"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"Src\"</span><span class="token operator">:</span> <span class="token string">"src/"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
sau khi ta chạy lệnh composer install trong thư mục project sẽ tạo ra một thư mục có tên /vendor
khi này thư viện DotEnv đã được cài đặt thành công
tiếp theo nếu chúng ta muốn cài đặt git cho project thì trong .gitignore thêm tên file .env và thư mục vendor để không đẩy các file .env và vendor lên git tránh mất thông tin và thuận tiện cho làm việc theo nhóm.
1 2 3 | vendor/ .env |
Tạo thêm file .env.example chứa nội dung như sau:
1 2 3 4 5 6 | OKTAAUDIENCE=api://default OKTAISSUER= SCOPE= OKTACLIENTID= OKTASECRET= |
Tạo thêm file bootstrap.php để tả các biến môi trường touch bootstrap.php
có nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">require</span> <span class="token single-quoted-string string">'vendor/autoload.php'</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Dotenv<span class="token punctuation"></span>Dotenv</span><span class="token punctuation">;</span> <span class="token variable">$dotenv</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DotEnv</span><span class="token punctuation">(</span><span class="token constant">__DIR__</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$dotenv</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">load</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// test code, should output:</span> <span class="token comment">// api://default</span> <span class="token comment">// when you run $ php bootstrap.php</span> <span class="token keyword">echo</span> <span class="token function">getenv</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'OKTAAUDIENCE'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </span> |
Tiếp theo chúng ta tạo database để lưu và thao tác với dữ liệu, trong bài viết này sẽ dùng MySql.
- tạo database có tên là api_example
1 2 3 4 | <span class="token keyword">CREATE</span> <span class="token keyword">DATABASE</span> api_example <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_unicode_ci<span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">USER</span> <span class="token string">'api_user'</span>@'localhost<span class="token string">' identified by '</span>api_password<span class="token string">'; GRANT ALL on api_example.* to '</span>api_user<span class="token string">'@'</span>localhost'<span class="token punctuation">;</span> |
- tạo table có tên person
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> person <span class="token punctuation">(</span> id <span class="token keyword">INT</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">AUTO_INCREMENT</span><span class="token punctuation">,</span> firstname <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> lastname <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> firstparent_id <span class="token keyword">INT</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> secondparent_id <span class="token keyword">INT</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span> <span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">FOREIGN</span> <span class="token keyword">KEY</span> <span class="token punctuation">(</span>firstparent_id<span class="token punctuation">)</span> <span class="token keyword">REFERENCES</span> person<span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token keyword">ON</span> <span class="token keyword">DELETE</span> <span class="token keyword">SET</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token keyword">FOREIGN</span> <span class="token keyword">KEY</span> <span class="token punctuation">(</span>secondparent_id<span class="token punctuation">)</span> <span class="token keyword">REFERENCES</span> person<span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token keyword">ON</span> <span class="token keyword">DELETE</span> <span class="token keyword">SET</span> <span class="token boolean">NULL</span> <span class="token punctuation">)</span> <span class="token keyword">ENGINE</span><span class="token operator">=</span><span class="token keyword">INNODB</span><span class="token punctuation">;</span> |
khi này đã có database việc tiếp theo là config trong file .env và .env.example
1 2 3 4 5 6 | DB_HOST=localhost DB_PORT=3306 DB_DATABASE= DB_USERNAME= DB_PASSWORD= |
1 2 3 4 5 6 | DB_HOST=localhost DB_PORT=3306 DB_DATABASE=api_example DB_USERNAME=api_user DB_PASSWORD=api_password |
Bước tiếp theo chúng ta sẽ tạo 1 class để thực hiện kết nối đến cơ sở dữ liệu và khỏi tạo kết nối trong file bootstrap.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">Src<span class="token punctuation"></span>System</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">DatabaseConnector</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$dbConnection</span> <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$host</span> <span class="token operator">=</span> <span class="token function">getenv</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_HOST'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$port</span> <span class="token operator">=</span> <span class="token function">getenv</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_PORT'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$db</span> <span class="token operator">=</span> <span class="token function">getenv</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_DATABASE'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$user</span> <span class="token operator">=</span> <span class="token function">getenv</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_USERNAME'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$pass</span> <span class="token operator">=</span> <span class="token function">getenv</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'DB_PASSWORD'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">dbConnection</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name"><span class="token punctuation"></span>PDO</span><span class="token punctuation">(</span> <span class="token double-quoted-string string">"mysql:host=<span class="token interpolation"><span class="token variable">$host</span></span>;port=<span class="token interpolation"><span class="token variable">$port</span></span>;charset=utf8mb4;dbname=<span class="token interpolation"><span class="token variable">$db</span></span>"</span><span class="token punctuation">,</span> <span class="token variable">$user</span><span class="token punctuation">,</span> <span class="token variable">$pass</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token punctuation"></span>PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">dbConnection</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
update file
1 2 3 4 5 6 7 8 9 10 11 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">require</span> <span class="token single-quoted-string string">'vendor/autoload.php'</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Dotenv<span class="token punctuation"></span>Dotenv</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Src<span class="token punctuation"></span>System<span class="token punctuation"></span>DatabaseConnector</span><span class="token punctuation">;</span> <span class="token variable">$dotenv</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DotEnv</span><span class="token punctuation">(</span><span class="token constant">__DIR__</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$dotenv</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">load</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$dbConnection</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DatabaseConnector</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </span> |
khi này việc kết nối database đã xong, chúng ta sẽ tạo một số bản ghi trong bảng person vừa tạo ở trên bằng việc tạo một file dbseed.php
có nội dung như sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">require</span> <span class="token single-quoted-string string">'bootstrap.php'</span><span class="token punctuation">;</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token heredoc-string string"><span class="token delimiter symbol"><span class="token punctuation"><<<</span>EOS</span> CREATE TABLE IF NOT EXISTS person ( id INT NOT NULL AUTO_INCREMENT, firstname VARCHAR(100) NOT NULL, lastname VARCHAR(100) NOT NULL, firstparent_id INT DEFAULT NULL, secondparent_id INT DEFAULT NULL, PRIMARY KEY (id), FOREIGN KEY (firstparent_id) REFERENCES person(id) ON DELETE SET NULL, FOREIGN KEY (secondparent_id) REFERENCES person(id) ON DELETE SET NULL ) ENGINE=INNODB; INSERT INTO person (id, firstname, lastname, firstparent_id, secondparent_id) VALUES (1, 'Krasimir', 'Hristozov', null, null), (2, 'Maria', 'Hristozova', null, null), (3, 'Masha', 'Hristozova', 1, 2), (4, 'Jane', 'Smith', null, null), (5, 'John', 'Smith', null, null), (6, 'Richard', 'Smith', 4, 5), (7, 'Donna', 'Smith', 4, 5), (8, 'Josh', 'Harrelson', null, null), (9, 'Anna', 'Harrelson', 7, 8); <span class="token delimiter symbol">EOS<span class="token punctuation">;</span></span></span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$createTable</span> <span class="token operator">=</span> <span class="token variable">$dbConnection</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token variable">$statement</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Success!n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token punctuation"></span>PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span> |
Ở phạm vi bài viết này để thao tác với cơ sở dữ liệu thì chúng ta sẽ ko thông qua hệ thống ORM như Eloquent hay Doctrine mà ở sẽ viết câu lệnh truy vấn trực tiếp trong class PersonGateway
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">Src<span class="token punctuation"></span>TableGateways</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">PersonGateway</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$db</span> <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token variable">$db</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">db</span> <span class="token operator">=</span> <span class="token variable">$db</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token double-quoted-string string">" SELECT id, firstname, lastname, firstparent_id, secondparent_id FROM person; "</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">db</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token variable">$statement</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$statement</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">fetchAll</span><span class="token punctuation">(</span><span class="token package">PDO</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">FETCH_ASSOC</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$result</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token punctuation"></span>PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">find</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token double-quoted-string string">" SELECT id, firstname, lastname, firstparent_id, secondparent_id FROM person WHERE id = ?; "</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">db</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token variable">$statement</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$statement</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$statement</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">fetchAll</span><span class="token punctuation">(</span><span class="token package">PDO</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">FETCH_ASSOC</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$result</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token punctuation"></span>PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">insert</span><span class="token punctuation">(</span><span class="token keyword">Array</span> <span class="token variable">$input</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token double-quoted-string string">" INSERT INTO person (firstname, lastname, firstparent_id, secondparent_id) VALUES (:firstname, :lastname, :firstparent_id, :secondparent_id); "</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">db</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token variable">$statement</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$statement</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token single-quoted-string string">'firstname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'firstname'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'lastname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'lastname'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'firstparent_id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'firstparent_id'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'secondparent_id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'secondparent_id'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$statement</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">rowCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token punctuation"></span>PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">update</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">,</span> <span class="token keyword">Array</span> <span class="token variable">$input</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token double-quoted-string string">" UPDATE person SET firstname = :firstname, lastname = :lastname, firstparent_id = :firstparent_id, secondparent_id = :secondparent_id WHERE id = :id; "</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">db</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token variable">$statement</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$statement</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token single-quoted-string string">'id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">(</span>int<span class="token punctuation">)</span> <span class="token variable">$id</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'firstname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'firstname'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'lastname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'lastname'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'firstparent_id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'firstparent_id'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'secondparent_id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'secondparent_id'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$statement</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">rowCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token punctuation"></span>PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">delete</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token double-quoted-string string">" DELETE FROM person WHERE id = :id; "</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">db</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token variable">$statement</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$statement</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$id</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$statement</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">rowCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token punctuation"></span>PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
để thao tác với dữ liệu thì chúng ta chỉ cần khai báo và gọi đến các hàm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token variable">$personGateway</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PersonGateway</span><span class="token punctuation">(</span><span class="token variable">$dbConnection</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// return all records</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// return the record with id = 1</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// insert a new record</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token single-quoted-string string">'firstname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Doug'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'lastname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Ellis'</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// update the record with id = 10</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">update</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'firstname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Doug'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'lastname'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Ellis'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'secondparent_id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// delete the record with id = 10</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Implement the PHP REST API
Để tiếp nhận những yêu cầu và xử lý thì chúng ta sẽ tạo file /public/index.php và src/Controller/PersonController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">require</span> <span class="token double-quoted-string string">"../bootstrap.php"</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Src<span class="token punctuation"></span>Controller<span class="token punctuation"></span>PersonController</span><span class="token punctuation">;</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Access-Control-Allow-Origin: *"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Content-Type: application/json; charset=UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Access-Control-Allow-Methods: OPTIONS,GET,POST,PUT,DELETE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Access-Control-Max-Age: 3600"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$uri</span> <span class="token operator">=</span> <span class="token function">parse_url</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'REQUEST_URI'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token constant">PHP_URL_PATH</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$uri</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span> <span class="token single-quoted-string string">'/'</span><span class="token punctuation">,</span> <span class="token variable">$uri</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// all of our endpoints start with /person</span> <span class="token comment">// everything else results in a 404 Not Found</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$uri</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">!==</span> <span class="token single-quoted-string string">'person'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"HTTP/1.1 404 Not Found"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// the user id is, of course, optional and must be a number:</span> <span class="token variable">$userId</span> <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$uri</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$userId</span> <span class="token operator">=</span> <span class="token punctuation">(</span>int<span class="token punctuation">)</span> <span class="token variable">$uri</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$requestMethod</span> <span class="token operator">=</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token double-quoted-string string">"REQUEST_METHOD"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// pass the request method and user ID to the PersonController and process the HTTP request:</span> <span class="token variable">$controller</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PersonController</span><span class="token punctuation">(</span><span class="token variable">$dbConnection</span><span class="token punctuation">,</span> <span class="token variable">$requestMethod</span><span class="token punctuation">,</span> <span class="token variable">$userId</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$controller</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">processRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">Src<span class="token punctuation"></span>Controller</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Src<span class="token punctuation"></span>TableGateways<span class="token punctuation"></span>PersonGateway</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">PersonController</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$db</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$requestMethod</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$userId</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$personGateway</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token variable">$db</span><span class="token punctuation">,</span> <span class="token variable">$requestMethod</span><span class="token punctuation">,</span> <span class="token variable">$userId</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">db</span> <span class="token operator">=</span> <span class="token variable">$db</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">requestMethod</span> <span class="token operator">=</span> <span class="token variable">$requestMethod</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">userId</span> <span class="token operator">=</span> <span class="token variable">$userId</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">personGateway</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PersonGateway</span><span class="token punctuation">(</span><span class="token variable">$db</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">processRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">requestMethod</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token single-quoted-string string">'GET'</span><span class="token punctuation">:</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">userId</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getUser</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">userId</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getAllUsers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token single-quoted-string string">'POST'</span><span class="token punctuation">:</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">createUserFromRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token single-quoted-string string">'PUT'</span><span class="token punctuation">:</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">updateUserFromRequest</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">userId</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token single-quoted-string string">'DELETE'</span><span class="token punctuation">:</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">deleteUser</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">userId</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notFoundResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'status_code_header'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'body'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'body'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function">getAllUsers</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'status_code_header'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'HTTP/1.1 200 OK'</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'body'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">json_encode</span><span class="token punctuation">(</span><span class="token variable">$result</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$response</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function">getUser</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">find</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token variable">$result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notFoundResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'status_code_header'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'HTTP/1.1 200 OK'</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'body'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">json_encode</span><span class="token punctuation">(</span><span class="token variable">$result</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$response</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function">createUserFromRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$input</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">)</span> <span class="token function">json_decode</span><span class="token punctuation">(</span><span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'php://input'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">TRUE</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">validatePerson</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">unprocessableEntityResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'status_code_header'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'HTTP/1.1 201 Created'</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'body'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$response</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function">updateUserFromRequest</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">find</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token variable">$result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notFoundResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$input</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">)</span> <span class="token function">json_decode</span><span class="token punctuation">(</span><span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'php://input'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">TRUE</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">validatePerson</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">unprocessableEntityResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">update</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">,</span> <span class="token variable">$input</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'status_code_header'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'HTTP/1.1 200 OK'</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'body'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$response</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function">deleteUser</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">find</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token variable">$result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notFoundResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">personGateway</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'status_code_header'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'HTTP/1.1 200 OK'</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'body'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$response</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function">validatePerson</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'firstname'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'lastname'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function">unprocessableEntityResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'status_code_header'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'HTTP/1.1 422 Unprocessable Entity'</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'body'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">json_encode</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token single-quoted-string string">'error'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Invalid input'</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$response</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function">notFoundResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'status_code_header'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'HTTP/1.1 404 Not Found'</span><span class="token punctuation">;</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'body'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$response</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
Để test các api mà chúng ta vừa xây dựng ở trên thì cần đến một công cụ như Postman nhưng trước tiên phải khỏi động bằng câu lệnh
php -S 127.0.0.1:8000 -t public
sau đó connect đến 127.0.0.1:8000 và thực hiện test 5 API sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token comment">// return all records</span> <span class="token constant">GET</span> <span class="token operator">/</span>person <span class="token comment">// return a specific record</span> <span class="token constant">GET</span> <span class="token operator">/</span>person<span class="token operator">/</span><span class="token punctuation">{</span>id<span class="token punctuation">}</span> <span class="token comment">// create a new record</span> <span class="token constant">POST</span> <span class="token operator">/</span>person <span class="token comment">// update an existing record</span> <span class="token constant">PUT</span> <span class="token operator">/</span>person<span class="token operator">/</span><span class="token punctuation">{</span>id<span class="token punctuation">}</span> <span class="token comment">// delete an existing record</span> <span class="token constant">DELETE</span> <span class="token operator">/</span>person<span class="token operator">/</span><span class="token punctuation">{</span>id<span class="token punctuation">}</span> |
Qua bài viết này chúng ta đã phần nào hiểu rõ hơn các bước xây dựng một API REST với ngôn ngữ PHP.