Бутстрап из внешнего скрипта

10

Я пытаюсь создать экземпляры сущности Drupal из внешнего скрипта, который не является частью Drupal или модуля Drupal.

Для Drupal 7 необходимо было drupal_bootstrapзагрузить необходимые зависимости Drupal. Однако после долгого поиска все, что я нашел для Drupal 8, было запиской, которая drupal_bootstrapустарела для Drupal 8 .

И действительно, я получаю

Вызов неопределенной функции drupal_bootstrap ()

когда я пытаюсь позвонить после того, как в

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

Так как я могу использовать API Drupal 8 из внешнего скрипта ?!

sleidig
источник
Вы можете использовать drush php-скрипт . Это выполняет PHP-код с полной загрузкой Drupal непосредственно из сценария оболочки.
rpayanm

Ответы:

7

Для текущей версии 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

Во-первых: всегда ищите уведомления об изменениях. Вы можете найти их здесь: https://www.drupal.org/list-changes

Вот основной, имеющий дело с drupal_bootstrap(): https://www.drupal.org/node/2275139

Посмотрите на фронтальный контроллер Drupal 8 ( index.php).

Вы создаете экземпляр ядра и затем обрабатываете его запросы.

Но так как вы хотите только вставить в него сущности, вы не будете обрабатывать запросы. Вам просто нужно загрузить ядро ​​и затем использовать различные сервисы для добавления ваших сущностей. Список услуг есть core/core.services.ymlи довольно большой. Вы можете искать entity_manager.

Кроме того, в D8 встроен API-интерфейс RESTful, так что вы можете просто позволить D8 выполнять всю работу, пока вы пингуете его через http.

Поль-м
источник
3

Я наконец-то закончил с этим кодом. У этого есть некоторые уродливые дополнительные включения, но по крайней мере это работает:

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
источник
Вы можете обойтись без всех этих вызовов require_once, если вам просто нужен autoload.php:require_once 'your_drupal/autoload.php';
paul-m
Я думаю, что мне нужно autoload.php(строка 4)? Этого было достаточно, когда я использовал, handleRequestно не пытался загрузить только основы, чтобы добраться до менеджера сущностей.
Sleidig
Вы можете добавитьchdir()
Параг
Удаление require_once дает «Вызов неопределенной функции Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()», что довольно
неубедительно