Api-platform

image
З наближенням Web 3.0 все активніше починають використовуватися підходи API first і Linked Data (або щось подібне Sematic Web). У зв'язку з цим читачам пропонується ознайомитися з фреймворком для зручного створення API на базі схем зібраних на schema.org з генерацією відповідей у вигляді JSON-LD

Це укорочена версія туториала Api-platform

  1. Встановлюємо проект за допомогою Composer
    composer create-project api-platform/api-platform blog-api
    

  2. Прибираємо дефолтну демку
    1. Очищаємо файли app/config/schema.yml і app/config/services.yml
    2. видаляємо всі файли у src/AppBundle/Entity

  3. Створення моделі даних
    1. Api-platform містить генератор моделей зі словника schema.org

    2. Йдемо на сайт і знаходимо схему, яка описує те, що нам потрібно. В даному випадку schema.org/BlogPosting
    3. Тепер треба створити конфігураційний файл app/config/schema.yml. У ньому вкажемо в якому неймспейсе створювати типи, які типи створювати і які поля нам потрібні (бо на сайті Schema.org (http://schema.org/) представлені найбільш повні схеми сутностей і зазвичай нам необхідно тільки деяка підмножина описаних полів). Крім того є можливість опису зв'язків між сутностями.

      # app/config/schema.yml
      
      annotationGenerators:
      - ApiPlatform\SchemaGenerator\AnnotationGenerator\PhpDocAnnotationGenerator
      - ApiPlatform\SchemaGenerator\AnnotationGenerator\DoctrineOrmAnnotationGenerator
      - ApiPlatform\SchemaGenerator\AnnotationGenerator\ConstraintAnnotationGenerator
      - ApiPlatform\SchemaGenerator\AnnotationGenerator\DunglasApiAnnotationGenerator
      namespaces:
      entity: AppBundle\Entity 
      types:
      SocialMediaPosting: ~
      BlogPosting: ~ 
      Article: 
      властивості: 
      articleBody: ~
      articleSection: ~
      CreativeWork:
      властивості:
      author:
      range: Person
      cardinality: (*..0)
      headline: ~
      isFamilyFriendly: ~
      datePublished: ~
      Thing:
      властивості:
      name: ~
      Person:
      properties: {} 
      

  4. Генеруємо класи, отримуємо безкоштовно:

    • документація береться з полів schema.org і переводиться у PHPDoc
    • анотації Doctrine ORM

    • анотації валідації Symfony
    • анотації Iri необхідні для виявлення семантичної (смисловий) структури даних
    • сумісність з PSR-2 coding style


    bin/schema generate-types src/ app/config/schema.yml
    


  5. Створюємо базу даних
    app/console doctrine:database:create
    

  6. І схему наших моделей
    app/console doctrine:schema:create
    

    Генерація моделей схем підтримується не тільки фреймворком Api-platform, але і простим PHP, тому що можна використовувати schema bundle самостійно.
  7. Створюємо API
    Цим займається безпосередньо ApiBundle. Достатньо лише вказати, що ми хочемо виставити в якості API у вигляді сервісів Symfony
    В даному посібнику це будуть класи BlogPosting та Person
    # app/config/services.yml
    
    services:
    resource.blog_posting:
    parent: "api.resource"
    arguments: [ "AppBundle\\Entity\\BlogPosting" ]
    tags: [ { name: "api.resource" } ]
    
    resource.person:
    parent: "api.resource"
    arguments: [ "AppBundle\\Entity\\Person" ]
    tags: [ { name: "api.resource" } ]
    
    


    Voilà! Наше Api готове до використання
  8. Перевірка

    app/console server:start
    

    localhost:8000/doc
    image

    Для зручної роботи з API можна використовувати Postman (його розширення для Google Chrome) www.getpostman.com

    Запитуємо список авторів



    Додаємо автора



    Додаємо статтю:



    Запитуємо список:



    Перевіряємо валідацію. Поле isFamilyFriendly повинно бути Boolean.

    {
    "name": "API Platform is great",
    "headline": "you'll love that framework!",
    "articleBody": "The body of my article.",
    "articleSection": "technology",
    "author": "/people/1",
    "isFamilyFriendly": "maybe",
    "datePublished": "2015-05-11"
    }
    

    І про це нам повідомляється таким чином:
    {
    "@context": "/contexts/ConstraintViolationList",
    "@type": "ConstraintViolationList",
    "hydra:title": "An error occurred",
    "hydra:description": "isFamilyFriendly: This value should be of type boolean.\n",
    "violations": [
    {
    "propertyPath": "isFamilyFriendly",
    "message": "This value should be of type boolean."
    }
    ]
    }
    
    

    Виправляємо:
    {
    "name": "API Platform is great",
    "headline": "you'll love that framework!",
    "articleBody": "The body of my article.",
    "articleSection": "technology",
    "author": "/people/1",
    "isFamilyFriendly": true, 
    "datePublished": "2015-05-11"
    }
    

    І стаття повинна успішно додатися.



Ось ще список різних можливостей головного компонента API-platform — ApiBundle:



Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.