Bootstrap ze skryptu zewnętrznego

10

Próbuję utworzyć instancje encji Drupal ze skryptu zewnętrznego, który nie jest częścią Drupala ani modułu Drupal.

W przypadku Drupala 7 konieczne było drupal_bootstrapzaładowanie wymaganych zależności Drupala. Jednak po długim poszukiwaniu Drupala 8 znalazłem notatkę, która drupal_bootstrapjest nieaktualna dla Drupala 8 .

I rzeczywiście dostaję

Wywołanie niezdefiniowanej funkcji drupal_bootstrap ()

kiedy próbuję zadzwonić po włączeniu jak w

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

Jak więc mogę korzystać z interfejsu API Drupal 8 ze skryptu zewnętrznego ?!

Sleidig
źródło
Możesz użyć skryptu php drush . Wykonuje to kod php z pełnym bootstrapem Drupal bezpośrednio ze skryptu powłoki.
rpayanm

Odpowiedzi:

7

Dla aktualnej wersji 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();
Siergiej
źródło
3

Po pierwsze: zawsze szukaj powiadomień o zmianach. Można je znaleźć tutaj: https://www.drupal.org/list-changes

Oto główny temat dotyczący drupal_bootstrap(): https://www.drupal.org/node/2275139

Spójrz na przedni kontroler Drupala 8 ( index.php).

Wykonujesz instancję jądra, a następnie obsługujesz żądania.

Ale ponieważ chcesz tylko włożyć w to byty, nie będziesz obsługiwać żądań. Musisz tylko załadować jądro, a następnie użyć różnych usług, aby dodać swoje byty. Lista usług core/core.services.ymljest już dość duża. Możesz szukać entity_manager.

Ponadto D8 ma wbudowany interfejs API RESTful, więc możesz po prostu pozwolić D8 wykonać całą pracę podczas pingowania go przez http.

paul-m
źródło
3

W końcu skończyłem z tym kodem. Ma trochę brzydkich dodatków, ale przynajmniej działa:

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
źródło
Możesz obejść się bez tych wszystkich wywołań request_once, jeśli potrzebujesz tylko autoload.php:require_once 'your_drupal/autoload.php';
paul-m
Myślę, że wymagam autoload.php(linia 4)? To wystarczyło, kiedy użyłem, handleRequestale nie przy próbie uruchomienia tylko podstaw, aby dostać się do menedżera encji.
sleidig
Konieczne może być dodaniechdir()
Parag
Usunięcie requ_once daje „Wywołanie niezdefiniowanej funkcji Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()”, co jest dość kiepskie :(
Clemens Tolboom