Bootstrap desde script externo


10

Estoy tratando de crear instancias de entidad de Drupal a partir de un script externo que no es parte de Drupal o un módulo de Drupal.

Para Drupal 7 había drupal_bootstrapque cargar las dependencias de Drupal requeridas. Sin embargo, después de una larga búsqueda, todo lo que encontré para Drupal 8 fue una nota en drupal_bootstrapdesuso para Drupal 8 .

Y de hecho, obtengo un

Llamar a la función indefinida drupal_bootstrap ()

cuando trato de llamarlo después de incluir como en

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

Entonces, ¿cómo puedo usar la API de Drupal 8 desde un script externo?


Puedes usar drush php-script . Esto ejecuta código php con un bootstrap completo de Drupal directamente desde un script de shell.
rpayanm

Respuestas:


7

Para la versión actual 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();

3

Primero: siempre busque avisos de cambio. Puede encontrarlos aquí: https://www.drupal.org/list-changes

Aquí está el principal que trata drupal_bootstrap(): https://www.drupal.org/node/2275139

Eche un vistazo al controlador frontal de Drupal 8 ( index.php).

Hace una instancia del núcleo y luego hace que maneje las solicitudes.

Pero dado que solo desea meter entidades en él, no manejará las solicitudes. Solo necesita arrancar el núcleo y luego usar los diversos servicios para agregar sus entidades. La lista de servicios está en core/core.services.ymly es bastante grande. Podrías buscar entity_manager.

Además, D8 tiene una API RESTful incorporada, por lo que es posible que pueda dejar que D8 haga todo el trabajo mientras hace ping a través de http.


3

Finalmente terminé con este código. Tiene algunos feos extras incluidos pero al menos funciona:

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

Puede pasar sin todas esas llamadas require_once si solo necesita autoload.php:require_once 'your_drupal/autoload.php';
paul-m

Creo que sí requiero autoload.php(línea 4)? Esto fue suficiente cuando lo usé, handleRequestpero no cuando intenté arrancar solo lo básico para llegar al administrador de la entidad.
sleidig 01 de

Es posible que deba agregarchdir()
Parag

Al eliminar require_once aparece "Llamada a la función indefinida Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()", que es bastante lamentable :(
Clemens Tolboom
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.