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.