2013-12-04 3 views
6

Для проекта в Symfony2 мне нужно иметь возможность сохранять/извлекать объекты, используя внешний RESTful API, а не базу данных. Поскольку Doctrine сопоставляет сущность с строкой таблицы базы данных, я думал, что также должно быть легко создать сопоставление с сущностью и внешним API. Однако это ново для меня, и я не могу найти никаких описаний/учебников об этом. (возможно, мне не хватает правильных слов для моего Google-fu)Сохраняющиеся объекты, использующие API REST

Я надеялся, что есть решение, подобное Доктрине. Я бы предпочел не использовать что-то, основанное на шаблоне ActiveRecord, потому что я хочу, чтобы логика устойчивости была отделена от сущностей. Сущность не должна знать, как она сохраняется.

Я хочу, чтобы иметь возможность сделать что-то похожее на это:

$entity = new Entity(); 

$em = $this->getREST()->getManager(); // get REST Entity Manager 
$em->persist($entity); // save the entity using a POST request 
$em->flush(); 

и это:

$em = $this->getREST()->getManager(); // get REST Entity Manager 

// retrieve the entity using a GET request 
$entity = $em->getRepository('AcmeDemoBundle:Entity')->find($id); 

и это:

$em = $this->getREST()->getManager(); // get REST Entity Manager 

// retrieve all entities using a GET request 
$entities = $em->getRepository('AcmeDemoBundle:Entity')->findAll(); 

Другими словами, было бы хорошо, если синтаксис может быть почти идентичен доктрине.

Кроме того, я хотел бы настроить отображение во внешнем файле (например, YAML) вместо аннотаций в сущности. (Как я уже сказал, предприятия не должны знать, как они сохраняются)

Forgottenbas уже упоминал пару решений, но они не полностью удовлетворяют моим требованиям, и я ожидаю, что будет больше решений, так как Я уверен, что я не первый, кто должен решить эту проблему.

Может ли кто-нибудь указать мне в правильном направлении?

ответ

2

Около года назад я пытаюсь найти ответ на тот же вопрос без везения и создать собственный комплект. К сожалению, я не могу поделиться им, потому что он проприетарный и не предназначен для open-source (низкий уровень настроек, специально предназначенный для нашего корпоративного API и т. Д.). Но я могу дать вам некоторые ссылки

  1. На старте есть jms serializer для deserializtion + buzz для HTTP запросов. Вы можете обернуть его некоторым сервисом и выполненными работами.

  2. У доктрины есть потерянное решение под названием drest (доктрина отдыха).

  3. Также я нашел интересное решение, также называемое drest. Я не пытаюсь использовать его, поскольку он относительно недавно. Documentation выглядит довольно хорошо.

+0

Спасибо. Оба решения для дребезга, похоже, идут в правильном направлении. Тем не менее, я хочу сохранить стойкость, отделенную от сущностей, точно так же, как использование самой Доктрины. Doctrine's drest использует шаблон Active Record, поэтому он слишком тесно связан. Второй треск выглядит как лучший вариант, но я надеюсь, что вместо аннотаций есть другие параметры конфигурации. –

+0

@Nic Это должно быть принято как ответ. Все, что вы упомянули в своем Q, может быть достигнуто с помощью сериализатора jms. Вы можете перенести свои настройки в службу, чтобы сделать ее доступной, как диспетчер сущностей. –

+0

Спасибо, но я не уверен, как это сделать. Могу ли я каким-то образом расширить Doctrine2, чтобы сохранить тот же синтаксис, но в то же время просто заменить логику БД логикой REST? –

0

Этот вопрос я нашел во время поиска той же функции. Однако некоторое время прошло снова, и теперь кажется, что есть a solution implementing this.

Из документации:

RAPL (RESTful API Persistence Layer) представляет собой RESTful вариант ОРМ Доктрины в. Он реализует те же интерфейсы, но позволяет хранить и извлекать объекты из удаленного (RESTful) API, а не из базы данных.

+0

Забавный что вы упомянули об этом;) Это библиотека, которую я создал сам после того, как этот вопрос SO не привел к правильному решению. К сожалению, это еще не полный набор, так как у меня не было много времени для работы над ним. –

+0

LOL, действительно! :) Здесь тоже крутится ... ваша библиотека выглядит точно так же, как и то, что я ищу - предоставление элемента управления EntityManager над заполнением моделей кажется архитектурно обоснованным. Это, безусловно, лучше, чем контроль над источниками данных и постоянством для контроллера - это то, что я нашел много на других сайтах. Тем не менее, я озадачен тем, почему это не находит больше тяги ... Интересно, почему не все люди хотят это делать. Может быть, это очень конкретный вариант использования? Я не знаю. – phpPhil

+0

Я предполагаю, что в большинстве случаев имеет смысл использовать клиентскую библиотеку, поддерживаемую владельцем API. Однако RAPL должен упростить подключение к API, который не поставляется с клиентской библиотекой PHP, хотя для его работы требуется немного больше работы по сравнению с Doctrine ORM (поскольку API не так стандартизированы, как базы данных SQL). –

3

Ну Circle построил полный драйвер REST для доктрины, которая означает, что вы можете использовать ТОЧНО тот же синтаксис, потому что это доктрина действует как REST клиента:

https://github.com/CircleOfNice/DoctrineRestDriver

1

вы ищете учение DBAL driver for rest apis Я думаю

Смежные вопросы