Bootstrap da script esterno


10

Sto cercando di creare istanze di entità Drupal da uno script esterno che non fa parte di Drupal o di un modulo Drupal.

Per Drupal 7 era drupal_bootstrapnecessario caricare le dipendenze Drupal richieste. Tuttavia, dopo una lunga ricerca, ho scoperto che Drupal 8 era una nota drupal_bootstrapdeprecata per Drupal 8 .

E in effetti, ottengo un

Chiamata alla funzione indefinita drupal_bootstrap ()

quando provo a chiamarlo dopo aver incluso come in

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

Quindi, come posso usare l'API di Drupal 8 da uno script esterno ?!


Puoi usare drush php-script . Questo esegue il codice php con un bootstrap Drupal completo direttamente da uno script di shell.
rpayanm,

Risposte:


7

Per la versione corrente di 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();

3

Primo: cerca sempre avvisi di modifica. Puoi trovarli qui: https://www.drupal.org/list-changes

Ecco quello principale che tratta drupal_bootstrap(): https://www.drupal.org/node/2275139

Dai un'occhiata al front controller di Drupal 8 ( index.php).

Si crea un'istanza del kernel e poi si fa gestire le richieste.

Ma dal momento che vuoi solo inserire le entità, non gestirai le richieste. Devi solo avviare il kernel e quindi usare i vari servizi per aggiungere le tue entità. L'elenco dei servizi è in core/core.services.ymled è piuttosto vasto. Potresti cercare entity_manager.

Inoltre, D8 ha un'API RESTful integrata, quindi potresti essere in grado di consentire a D8 di fare tutto il lavoro mentre esegui il ping su http.


3

Alla fine ho finito con questo codice. Ha alcuni brutti extra inclusi ma almeno funziona:

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

Puoi cavartela senza tutte quelle chiamate request_once se hai solo bisogno di autoload.php:require_once 'your_drupal/autoload.php';
paul-m

Penso di aver bisogno autoload.php(linea 4)? Questo è bastato quando l'ho usato, handleRequestma non quando ho cercato di avviare solo le basi per arrivare al gestore delle entità.
sleidig,

Potrebbe essere necessario aggiungerechdir()
Parag

La rimozione di request_once dà "Chiama alla funzione indefinita Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()" che è abbastanza zoppo :(
Clemens Tolboom
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.