Создайте REST API с помощью CakePHP 2.x за 3 минуты
CakePHP — это PHP-фреймворк, который упрощает и ускоряет создание веб-приложений. Он обладает мощной системой поддержки, которая сокращает время разработки при построении простых или сложных систем.
CakePHP появился примерно в 2005 году и был разработан Ларри Мастерсом. В настоящее время в репозитории Github у него более 7000 звезд.
Поскольку это руководство не посвящено началу работы с CakePHP, я предполагаю, что вы знакомы с настройкой приложения CakePHP 2.x. Давайте начнем.
Требования
- CakePHP 2.x, желательно версии 2.8
- База данных MySQL
- Почтальон. Для тестирования нашего API.
Мы собираемся научиться создавать базовый REST API в формате JSON. Типичный формат JSON выглядит так:
{
"field":"value"
}
Мы будем создавать API для создания, чтения, обновления и удаления продуктов. Как вы, возможно, знаете, соглашения об именах таблиц базы данных CakePHP имеют множественное число. В этом уроке мы будем считать нашу таблицу «продуктами». Идите вперед и создайте таблицу продуктов в MySQL, используя приведенный ниже синтаксис:
CREATE TABLE `products` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
В каталоге вашего проекта перейдите в app/Controllers. Создайте новый файл с именем ProductsController.php. Откройте файл и вставьте код ниже:
<?php
App::uses('AppController','Controller');
class ProductsController extends AppController{
}
?>
Здесь мы просто указали, что наш ProductsController наследует основной AppController. Теперь давайте вставим наш первый API, который будет API создания или добавления нового продукта.
API для создания новой записи
public function add(){
$this->layout = false;
$response = array('status'=>'failed', 'message'=>'HTTP method not allowed');
if($this->request->is('post')){
//get data from request object
$data = $this->request->input('json_decode', true);
if(empty($data)){
$data = $this->request->data;
}
//response if post data or form data was not passed
$response = array('status'=>'failed', 'message'=>'Please provide form data');
if(!empty($data)){
//call the model's save function
if($this->Product->save($data)){
//return success
$response = array('status'=>'success','message'=>'Product successfully created');
} else{
$response = array('status'=>'failed', 'message'=>'Failed to save data');
}
}
}
$this->response->type('application/json');
$this->response->body(json_encode($response));
return $this->response->send();
}
Объясняя приведенный выше код, мы сначала сообщили CakePHP, что не нужно использовать макет для этой функции. Мы сделали это, чтобы получить только наш ответ в формате JSON. Затем мы устанавливаем статус ответа по умолчанию как неудавшийся. Затем мы проверили, является ли заголовок запроса POST. Поскольку мы имеем дело с данными JSON, метод получения данных JSON в CakePHP заключается в использовании $this->request->input('json_decode', true)
.
По умолчанию ваша кодировка типа контента должна быть application/json
. Если это не так, нам нужно справиться с таким сценарием. Для этого проверяем, есть ли данные в $this->request->input('json_decode', true)
пустой. Если это так, мы извлекаем данные сообщения, вызывая $this->request->data
.
Наконец, мы вызываем функцию сохранения для модели продукта. Делаем проверку, успешно ли были сохранены данные или нет. Вот и все. Вы создали API для создания записи в базе данных MySQL.
Перейти к app/View
и создайте папку «Продукты». Внутри этой папки создайте пустой файл add.ctp. Если вы этого не сделаете, ваш ответ вернет ошибку отсутствия представления.
Откройте приложение Почтальон. На новой вкладке вставьте URL своего домена. Если вы работаете с локального хоста, убедитесь, что ваш сервер открыт, и скопируйте путь к вашему проекту. В моем случае это http://localhost/apitest
. Нам нужно убедиться, что наш путь связан с функцией добавления в контроллере продуктов. Для этого просто добавьте /продукты/добавить на URL вашего домена выше. Используя мой тест выше, мой полный путь будет . Вставьте это в раздел URL на вашем почтальоне. Измените заголовок запроса на POST. Перейдите на вкладку body, а затем в раздел «raw». Щелкните раскрывающийся список и выберите JSON (приложение/json). Вставьте код ниже:
{
"name":"Sample test product",
"description":"Sample description for sample test product"
}
Вы должны получить ответ об успехе. См. изображение ниже:
API для чтения записи
Следующее действие — прочитать запись и вывести ее в формате JSON. Для этого см. код ниже:
public function view($id = null){
$this->layout = false;
//set default response
$response = array('status'=>'failed', 'message'=>'Failed to process request');
//check if ID was passed
if(!empty($id)){
//find data by ID
$result = $this->Product->findById($id);
if(!empty($result)){
$response = array('status'=>'success','data'=>$result);
} else {
$response['message'] = 'Found no matching data';
}
} else {
$response['message'] = "Please provide ID";
}
$this->response->type('application/json');
$this->response->body(json_encode($response));
return $this->response->send();
}
Создать файл вид.ctp в папка app/View/Products. URL-адрес требует передачи параметра ID. В этом случае мы передадим идентификатор последнего продукта, который мы добавили в URL-адрес. В данном случае мы не обрабатывали тип запроса. Мы только проверяем, установлен ли идентификатор, если да, то ищем его в базе данных и возвращаем результат в формате JSON.
Используя приведенный выше тестовый URL-адрес, наш URL-адрес должен выглядеть следующим образом: http://localhost/apitest/products/view/1, где 1 – идентификатор продукта. Теперь запустите это в вашем Postman. См. результат ниже:
API для обновления записи
Создайте файл с именем update.ctp в папке продуктов. Вставьте приведенный ниже код в контроллер продуктов.
public function update(){
//set layout as false to unset default CakePHP layout. This is to prevent our JSON response from mixing with HTML
$this->layout = false;
//set default response
$response = array('status'=>'failed', 'message'=>'HTTP method not allowed');
//check if HTTP method is PUT
if($this->request->is('put')){
//get data from request object
$data = $this->request->input('json_decode', true);
if(empty($data)){
$data = $this->request->data;
}
//check if product ID was provided
if(!empty($data['id'])){
//set the product ID to update
$this->Product->id = $data['id'];
if($this->Product->save($data)){
$response = array('status'=>'success','message'=>'Product successfully updated');
} else {
$response['message'] = "Failed to update product";
}
} else {
$response['message'] = 'Please provide product ID';
}
}
$this->response->type('application/json');
$this->response->body(json_encode($response));
return $this->response->send();
}
API для удаления записи
public function ajax_delete(){
$this->layout = false;
//set default response
$response = array('status'=>'failed', 'message'=>'HTTP method not allowed');
//check if HTTP method is DELETE
if($this->request->is('delete')){
//get data from request object
$data = $this->request->input('json_decode', true);
if(empty($data)){
$data = $this->request->data;
}
//check if product ID was provided
if(!empty($data['id'])){
if($this->Product->delete($id, true)){
$response = array('status'=>'success','message'=>'Product successfully deleted');
}
}
}
$this->response->type('application/json');
$this->response->body(json_encode($response));
return $this->response->send();
}
Йиппи! Мы успешно создали API, который выполняет функции CRUD. Похлопайте себе 👍👍🤛🏾
Благодарим вас за выполнение. Наш следующий учебник научит, как использовать API CakePHP с помощью jQuery. А пока продолжайте учиться!
PS: Эта статья впервые была опубликована в моем посте на Medium: