Bootstrap von externem Skript

10

Ich versuche, Drupal-Entitätsinstanzen aus einem externen Skript zu erstellen, das nicht Teil von Drupal oder einem Drupal-Modul ist.

Für Drupal 7 drupal_bootstrapmussten die erforderlichen Drupal-Abhängigkeiten geladen werden. Nach langer Suche fand ich für Drupal 8 jedoch nur eine Notiz, die drupal_bootstrapfür Drupal 8 veraltet ist .

Und in der Tat bekomme ich eine

Aufruf der undefinierten Funktion drupal_bootstrap ()

wenn ich versuche es nach dem Einfügen wie in aufzurufen

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

Wie kann ich die Drupal 8-API von einem externen Skript aus verwenden?!

sleidig
quelle
Sie können drush PHP-Skript verwenden . Dies führt PHP-Code mit einem vollständigen Drupal-Bootstrap direkt aus einem Shell-Skript aus.
Rpayanm

Antworten:

7

Für die aktuelle Version von 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
quelle
3

Erstens: Suchen Sie immer nach Änderungshinweisen. Sie finden sie hier: https://www.drupal.org/list-changes

Hier ist das Hauptthema drupal_bootstrap(): https://www.drupal.org/node/2275139

Schauen Sie sich den Front-Controller von Drupal 8 an ( index.php).

Sie erstellen eine Instanz des Kernels und lassen ihn dann Anforderungen verarbeiten.

Da Sie jedoch nur Entitäten darin stecken möchten, werden Sie keine Anforderungen bearbeiten. Sie müssen nur den Kernel booten und dann die verschiedenen Dienste verwenden, um Ihre Entitäten hinzuzufügen. Die Liste der Dienste ist in core/core.services.ymlund ist ziemlich groß. Sie könnten suchen entity_manager.

Außerdem ist in D8 eine RESTful-API integriert, sodass Sie D8 möglicherweise die gesamte Arbeit erledigen lassen können, während Sie über http pingen.

paul-m
quelle
3

Ich bin endlich mit diesem Code gelandet. Es hat einige hässliche Extra-Includes, aber zumindest funktioniert es:

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
quelle
Sie können ohne all diese require_once-Aufrufe auskommen, wenn Sie nur autoload.php benötigen:require_once 'your_drupal/autoload.php';
paul-m
Ich glaube ich brauche autoload.php(Zeile 4)? Dies war ausreichend, als ich verwendet habe, handleRequestaber nicht, wenn versucht wurde, nur die Grundlagen zu starten, um zum Entitätsmanager zu gelangen.
Sleidig
Möglicherweise müssen Sie hinzufügenchdir()
Parag
Das Entfernen von require_once führt zu "Aufruf der undefinierten Funktion Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()", was ziemlich lahm ist :(
Clemens Tolboom