J'essaie de créer des instances Drupal entité à partir d'un script externe qui ne fait pas partie de Drupal ou d'un module Drupal.
Pour Drupal 7, il y avait drupal_bootstrap
pour charger les dépendances requises Drupal. Cependant, après une longue recherche, tout ce que j'ai trouvé pour Drupal 8 était une note qui drupal_bootstrap
est déconseillé pour Drupal 8 .
Et en effet, je reçois un
Appel à la fonction non définie drupal_bootstrap ()
quand j'essaie de l'appeler après avoir inclus comme dans
define('DRUPAL_ROOT', __DIR__ .'/../drupal');
require_once DRUPAL_ROOT . '/core/vendor/autoload.php';
require_once DRUPAL_ROOT . '/core/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
Alors, comment puis-je utiliser l'API Drupal 8 à partir d'un script extérieur?!
Pour la version actuelle de drupal 8.x:
define('DRUPAL_DIR', '/usr/share/nginx/html');
use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpFoundation\Request;
require_once DRUPAL_DIR . '/core/includes/database.inc';
require_once DRUPAL_DIR . '/core/includes/schema.inc';
// Specify relative path to the drupal root.
$autoloader = require_once DRUPAL_DIR . '/autoload.php';
$request = Request::createFromGlobals();
// Bootstrap drupal to different levels
$kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');
$kernel->boot();
$kernel->prepareLegacyRequest($request);
$em = $kernel->getContainer()->get('entity.manager');
$entity = $em->getStorage('node')->create(
array(
'type' => "article",
'title'=> "test entity",
'body' => "body body body",
));
$entity->save();
Je me suis finalement retrouvé avec ce code. Il a quelques vilains extras mais au moins ça marche:
define('DRUPAL_DIR', __DIR__ .'/../drupal');
use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpFoundation\Request;
$autoloader = require_once DRUPAL_DIR . '/autoload.php';
$request = Request::createFromGlobals();
$kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');
$kernel->boot();
require_once DRUPAL_DIR . '/core/includes/database.inc';
require_once DRUPAL_DIR . '/core/includes/schema.inc';
$em = $kernel->getContainer()->get('entity.manager');
$entity = $em->getStorage('my_entity')->create(array(
'id' => "116",
'name' => "test entity",
));
$entity->save();
Premièrement: recherchez toujours les avis de modification. Vous pouvez les trouver ici: https://www.drupal.org/list-changes
Voici le principal traitant de drupal_bootstrap()
: https://www.drupal.org/node/2275139
Jetez un oeil à Drupal 8 contrôleur avant (index.php
).
Vous créez une instance du noyau, puis vous lui faites gérer les demandes.
Mais comme vous ne voulez y insérer que des entités, vous ne gérerez pas les demandes. Il vous suffit de bootstrap le noyau et ensuite utiliser les différents services pour ajouter vos entités. La liste des services est dans core/core.services.yml
et est assez énorme. Vous pourriez rechercher entity_manager
.
De plus, D8 possède une API RESTful intégrée, vous pouvez donc simplement laisser D8 faire tout le travail pendant que vous le pingez sur http.