gstreamer0.10-ffmpeg
gstreamer0.10-plugins-good
packages.
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.
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.
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.
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.
// 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
}
}
Really happy someone is teaching this in a way that is, astonishingly enough, intelligible! I feel more nerdy by the minute. Thank you.