Модель клиента REST в CakePHP 3

Я разрабатываю приложение Cake, которое извлекает данные из базы данных, а также из стороннего REST API. Я хотел бы правильно реализовать REST API, используя модели для различных коллекций REST, к которым я пытаюсь получить доступ (наследуя от одного поведения), но я не могу заставить свою модель работать без соответствующей таблицы базы данных. Мой первоначальный план состоял в том, чтобы создать class Software extends Cake\ORM\Entity и class SoftwaresTable extends Cake\ORM\Table, а затем использовать перехватчики before* для переопределения различных вызовов и перенаправления их в API, а не в базу данных.

Однако я добавил die() к beforeMarshal, beforeRules, beforeFind, beforeSave и beforeDelete, и вызов $this->Softwares->all() с контроллера по-прежнему не работает с сообщением

SQLSTATE [42S02]: базовая таблица или представление не найдено: 1146 Таблица «inventory.softwares» не существует

Мой подход неверен? Что-то простое, чего мне не хватает?


person Mikkel    schedule 24.04.2015    source источник
comment
Спасибо @ndm; Я пропустил этот пост. Все, что я смог найти о REST и Cake, было либо а) о CakePHP 2, либо б) о создании клиента REST, а не сервера REST.   -  person Mikkel    schedule 25.04.2015
comment
Почему вы хотите создать клиент Rest с помощью Table API? Какова конечная цель для вас?   -  person José Lorenzo Rodríguez    schedule 26.04.2015
comment
@JoséLorenzo Цель состоит в том, чтобы абстрагировать уровень доступа к данным по той же причине, по которой мы используем модели баз данных.   -  person Mikkel    schedule 27.04.2015
comment
вот правильное руководство по решению вашей проблемы - geekoat.blogspot.in/2016/05/   -  person Praveen Poonia    schedule 18.05.2016


Ответы (2)


Если вы не хотите, чтобы ваши модели поддерживались таблицей базы данных, не используйте Cake\ORM\Table. Вместо этого создайте свой собственный класс базовой модели, который реализует Cake\Datasource\RepositoryInterface. Затем сделайте так, чтобы ваши модели расширяли этот базовый класс.

Это нетривиальная задача, но лучше, чем альтернатива, которую вы пытаетесь взломать обратными вызовами класса Table, чтобы предотвратить их подключение к базе данных.

person ADmad    schedule 25.04.2015
comment
Спасибо. Я надеялся на более простое решение, но я полагаю, что лучше сделать это правильно. Я позабочусь о том, чтобы реализовать базовый класс в виде плагина и открыть его исходный код для следующего человека с моей проблемой. - person Mikkel; 27.04.2015

Глядя на исходный код CakePHP 3, кажется, что модели связаны с источником данных базы данных.

В CakePHP 2.x вы могли определить свои собственные источники данных, поэтому могли легко заменить их на внешний API, а не на базу данных, но я не вижу этой функциональности на первый взгляд (кто-то, кто работал с CakePHP 3 больше, чем я могу сказать иначе).

При этом существует EntityTrait. Возможно, вам будет лучше создать свои собственные классы для представления каждой сущности, а затем добавить эту черту в свои классы. Например:

<?php
namespace App\Model;

use Cake\Datasource\EntityTrait;

class Software {

    use EntityTrait;

}
person Martin Bean    schedule 24.04.2015
comment
Пока я не ожидаю каких-либо проблем с сущностями; Насколько я могу судить, это ORM (SoftwaresTable) не сотрудничает. Но я не получил класс таблицы для создания каких-либо сущностей, так что это может стать проблемой в будущем. Как и вам, мне пришлось немало покопаться в исходниках Cake в поисках ответа; здорово, что в коде так много документации, но меня не впечатляют пробелы, оставленные онлайн-документацией, которые заставили нас обоих замарать руки... - person Mikkel; 25.04.2015