web-dev-qa-db-fra.com

Bootstrap à partir d'un script externe

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?!

10
sleidig

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();
7
Sergey

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();
3
sleidig

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.

3
paul-m