Bootstrap de script externo

10

Estou tentando criar instâncias de entidade Drupal a partir de um script externo que não faz parte do Drupal ou de um módulo Drupal.

Para o Drupal 7, havia drupal_bootstrapque carregar as dependências necessárias do Drupal. No entanto, após uma longa pesquisa, tudo o que encontrei para o Drupal 8 foi uma observação que drupal_bootstrapfoi preterida para o Drupal 8 .

E, de fato, eu recebo um

Chamada para a função indefinida drupal_bootstrap ()

quando tento chamá-lo depois de incluir como em

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

Então, como posso usar a API do Drupal 8 a partir de um script externo ?!

sleidig
fonte
Você pode usar o script php-drush . Isso executa o código php com uma inicialização completa do Drupal diretamente de um script de shell.
precisa saber é o seguinte

Respostas:

7

Para a versão atual do 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
fonte
3

Em primeiro lugar: sempre procure avisos de alterações. Você pode encontrá-los aqui: https://www.drupal.org/list-changes

Aqui está o principal deles drupal_bootstrap(): https://www.drupal.org/node/2275139

Veja o controlador frontal do Drupal 8 ( index.php).

Você cria uma instância do kernel e, em seguida, solicita que ele lide com solicitações.

Mas como você só deseja inserir entidades nele, não manipulará solicitações. Você só precisa inicializar o kernel e usar os vários serviços para adicionar suas entidades. A lista de serviços está dentro core/core.services.ymle é bastante grande. Você pode procurar entity_manager.

Além disso, o D8 possui uma API RESTful integrada, portanto, você poderá permitir que o D8 faça todo o trabalho enquanto o executa ping em http.

paul-m
fonte
3

Finalmente acabei com esse código. Possui alguns extras extras feios, mas pelo 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();
sleidig
fonte
Você pode conviver sem todas as chamadas require_once, se precisar do autoload.php:require_once 'your_drupal/autoload.php';
paul-m
Eu acho que preciso autoload.php(linha 4)? Isso foi suficiente quando eu usei, handleRequestmas não ao tentar inicializar apenas o básico para acessar o gerenciador de entidades.
sleidig
Você pode precisar adicionar #chdir()
266 Parag
A remoção de require_once fornece "Chamada para a função indefinida Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()", que é bastante manca :(
Clemens Tolboom