Bootstrap à partir d'un script externe

10

J'essaie de créer des instances d'entités Drupal à partir d'un script externe qui ne fait pas partie de Drupal ou d'un module Drupal.

Pour Drupal 7, il drupal_bootstrapfallait charger les dépendances Drupal requises. Cependant, après une longue recherche, tout ce que j'ai trouvé pour Drupal 8 était une note drupal_bootstrapobsolète 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?!

Sleidig
la source
Vous pouvez utiliser drush php-script . Cela exécute du code php avec un bootstrap Drupal complet directement à partir d'un script shell.
rpayanm

Réponses:

7

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

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 œil au contrôleur frontal de Drupal 8 ( 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 d'amorcer le noyau puis d'utiliser les différents services pour ajouter vos entités. La liste des services est en place core/core.services.ymlet est assez vaste. Vous pourriez chercher entity_manager.

De plus, D8 possède une API RESTful intégrée, vous pouvez donc peut-être simplement laisser D8 faire tout le travail pendant que vous le cinglez sur http.

paul-m
la source
3

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();
Sleidig
la source
Vous pouvez vous débrouiller sans tous ces appels require_once si vous avez juste besoin d'autoload.php:require_once 'your_drupal/autoload.php';
paul-m
Je pense que j'ai besoin autoload.php(ligne 4)? Cela a suffi lorsque j'ai utilisé, handleRequestmais pas lorsque j'ai essayé de démarrer uniquement les bases pour accéder au gestionnaire d'entités.
Sleidig
Vous devrez peut-être ajouterchdir()
Parag
La suppression de require_once donne "Appel à une fonction non définie Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()", ce qui est assez boiteux :(
Clemens Tolboom