Bonjour Γ tous !
Jβai une question pour les experts de JSON:API
Jβai un site Next.js en front et un Drupal en back-end. La communication se fait via JSON:API, et le site est multilingue.
Jβutilise Redis pour amΓ©liorer les performances, et je souhaite prΓ©-gΓ©nΓ©rer les caches Redis via une cron.
Le problΓ¨me : lorsque jβexΓ©cute le cron, les donnΓ©es mises en cache sont toujours dans la langue par dΓ©faut (ou celle du back-office), au lieu de respecter la langue que je passe dans ma boucle.
β Connaissez-vous une maniΓ¨re fiable de forcer la langue de contexte lors de lβexΓ©cution dβune cron ou dβune sous-requΓͺte JSON:API en PHP (via $this->kernel->handle() par exemple) ?
Pour donner plus de contexte, voici un extrait du code utilisΓ© dans mon cron :
$cache = \Drupal::service('lagoon_global.cache'); $languages = ['en', 'fr', 'de', 'es', 'it', 'pt-pt']; foreach ($languages as $language) { $cache->lifeOnBoardListJsonApi($language); }
La mΓ©thode appelΓ©e :
$collection = $this->jsonapi_client->getNodeCollection('life_on_board', $filters, $options, true, $language, true);
et ensuite la mΓ©thode getNodeCollection est :
public function getNodeCollection(string $bundle, array $filters = [], array $options = [], bool $decode = true, ?string $language = null, ?int $runAsUid = null) { $prefix = $language ? sprintf('/%s', $language) : ''; $path = sprintf('%s/jsonapi/node/%s', $prefix, $bundle); $query = [ "filter" => $filters, ...$options ]; return $this->requestJsonApi('GET', $path, $query, null, $decode, $runAsUid); }
et finalement :
public function requestJsonApi(string $method, string $path, array $query = [], $body = null, bool $decode = true, ?int $runAsUid = null) { $server = [ 'HTTP_ACCEPT' => 'application/vnd.api+json', 'CONTENT_TYPE' => 'application/vnd.api+json', ]; $query[] = []; $secret = getenv('JSONAPI_SECRET_KEY'); if ($secret) { $server['HTTP_secret-key'] = $secret; } $request = Request::create($path, $method, $query, [], [], $server, is_array($body) ? json_encode($body) : $body); $response = null; if ($response === null) { $response = $this->kernel->handle($request, HttpKernelInterface::SUB_REQUEST); } $status = $response->getStatusCode(); $content = $response->getContent(); if ($status < 200 || $status >= 300) { $this->logger?->error('JSON:API {method} {path} a renvoyΓ© {status}: {body}', [ 'method' => $method, 'path' => $path, 'status' => $status, 'body' => $content, ]); throw new \RuntimeException(sprintf('Erreur JSON:API %s %s (%d)', $method, $path, $status)); } return $decode ? json_decode($content, true, flags: JSON_THROW_ON_ERROR) : $content; }
Merci dβavance pour vos idΓ©es ou retours dβexpΓ©rience !