Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

Hydra: Descripción de clases, operaciones y más de la API

Video not working?

It looks like your browser may not support the H264 codec. If you're using Linux, try a different browser or try installing the gstreamer0.10-ffmpeg gstreamer0.10-plugins-good packages.

Thanks! This saves us from needing to use Flash or encode videos in multiple formats. And that let's us get back to making more videos :). But as always, please feel free to message us.

Estamos examinando la documentación JSON-LD que describe nuestra API. Ahora mismo, sabemos que sólo tenemos un recurso API: DragonTreasure. Pero si te fijas en la sección supportedClasses, en realidad hay un montón de clases compatibles. Hay una llamada Entrypoint, otra llamada ConstraintViolation, y otra llamada ConstraintViolationList. Estas dos últimas aparecerán más adelante, cuando hablemos de los errores de validación.

Punto de entrada: la página de inicio de tu API

Pero este Entrypoint es realmente interesante. Se llama "El punto de entrada de la API", y en realidad describe el aspecto de la página de inicio de nuestra API. No siempre pensamos en que nuestras API tengan una página de inicio, pero pueden y deben tenerla.

Y, ¡bienvenidos a nuestra página de inicio de la API - estilo HTML! Si te desplazas hasta la parte inferior, podrás ver otros formatos. Haz clic en "JSON-LD" y... ¡saluda a la página de inicio de la API en formato JSON-LD! Esto devuelve un recurso de la API llamado Entrypoint, cuya función es decirnos dónde podemos encontrar información sobre los demás recursos de la API ¡Es como los enlaces de una página de inicio! Puedes descubrir la API yendo a esteEntrypoint y siguiendo el enlace @context... que apunta a esto.

Hola Hydra

De todos modos, el propósito de JSON-LD es añadir esos tres campos adicionales a tus recursos API: @id, @type, y @context. Luego podemos aprovechar @context para apuntar a otra documentación para obtener más metadatos o más contexto. Por ejemplo, en la parte superior de la documentación de JSON-LD, se apunta a varios otros documentos que añaden más significado a JSON-LD.

Y aquí hay uno realmente importante llamado hydra. Hydra es, en pocas palabras, una extensión de JSON-LD: describe aún más campos que puedes añadir a JSON-LD y lo que significan.

Piénsalo: si queremos describir totalmente nuestra API, necesitamos poder comunicar cosas como qué clases tenemos, sus propiedades, si cada una es legible o escribible, y qué operaciones admite cada clase. Esa comunicación se hace aquí abajo... y en realidad forma parte de Hydra. Sí, si utilizas JSON-LD por sí mismo... no tiene una forma predefinida de anunciar cómo son tus modelos. Pero entonces Hydra dice:

¿Y si permitimos que las clases de la API se describan con una clave llamada hydra:supportedClasses?

Este es el panorama general: API Platform nos permite obtener documentación JSON-LD de la API que contenga campos adicionales hydra. El resultado final es un sistema que describe completamente nuestra API. Describen los modelos que tenemos, las operaciones... todo.

¿Por qué Hydra y OpenAPI?

Y sí, si esto suena muy parecido a lo que pretende OpenAPI, tienes toda la razón. Ambos hacen lo mismo: describir nuestra API. De hecho, si vas a/api/docs.json, ésta es la descripción OpenAPI de nuestra API. Si sustituimos.json por .jsonld, ésta es la descripción JSON-LD Hydra de la misma API. ¿Por qué tenemos las dos? Hydra es un poco más potente: puede describir ciertas cosas que OpenAPI no puede. Pero OpenAPI es mucho más común y tiene más herramientas construidas sobre ella. API Platform proporciona ambas... ¡por si las necesitas!

A continuación: Vamos a añadir algunas herramientas de depuración serias a nuestra configuración de la API Platform.

Leave a comment!

0
Login or Register to join the conversation
Cat in space

"Houston: no signs of life"
Start the conversation!

What PHP libraries does this tutorial use?

// composer.json
{
    "require": {
        "php": ">=8.1",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "api-platform/core": "^3.0", // v3.0.8
        "doctrine/annotations": "^1.0", // 1.14.2
        "doctrine/doctrine-bundle": "^2.8", // 2.8.0
        "doctrine/doctrine-migrations-bundle": "^3.2", // 3.2.2
        "doctrine/orm": "^2.14", // 2.14.0
        "nelmio/cors-bundle": "^2.2", // 2.2.0
        "nesbot/carbon": "^2.64", // 2.64.1
        "phpdocumentor/reflection-docblock": "^5.3", // 5.3.0
        "phpstan/phpdoc-parser": "^1.15", // 1.15.3
        "symfony/asset": "6.2.*", // v6.2.0
        "symfony/console": "6.2.*", // v6.2.3
        "symfony/dotenv": "6.2.*", // v6.2.0
        "symfony/expression-language": "6.2.*", // v6.2.2
        "symfony/flex": "^2", // v2.2.4
        "symfony/framework-bundle": "6.2.*", // v6.2.3
        "symfony/property-access": "6.2.*", // v6.2.3
        "symfony/property-info": "6.2.*", // v6.2.3
        "symfony/runtime": "6.2.*", // v6.2.0
        "symfony/security-bundle": "6.2.*", // v6.2.3
        "symfony/serializer": "6.2.*", // v6.2.3
        "symfony/twig-bundle": "6.2.*", // v6.2.3
        "symfony/ux-react": "^2.6", // v2.6.1
        "symfony/validator": "6.2.*", // v6.2.3
        "symfony/webpack-encore-bundle": "^1.16", // v1.16.0
        "symfony/yaml": "6.2.*" // v6.2.2
    },
    "require-dev": {
        "doctrine/doctrine-fixtures-bundle": "^3.4", // 3.4.2
        "symfony/debug-bundle": "6.2.*", // v6.2.1
        "symfony/maker-bundle": "^1.48", // v1.48.0
        "symfony/monolog-bundle": "^3.0", // v3.8.0
        "symfony/stopwatch": "6.2.*", // v6.2.0
        "symfony/web-profiler-bundle": "6.2.*", // v6.2.4
        "zenstruck/foundry": "^1.26" // v1.26.0
    }
}