web-dev-qa-db-ja.com

Bootstrap外部スクリプトから

DrupalまたはDrupalモジュールの一部ではない外部スクリプトからDrupalエンティティインスタンスを作成しようとしています。

Drupal 7の場合、必要なDrupal依存関係をロードする drupal_bootstrap がありました。しかし、長い検索の結果、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);

では、外部スクリプトからDrupal 8 APIをどのように使用できますか?!

10
sleidig

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

ようやくこのコードになりました。醜い追加のインクルードがいくつかありますが、少なくとも機能します。

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

まず、常に変更通知を探します。あなたはここでそれらを見つけることができます: https://www.drupal.org/list-changes

これがdrupal_bootstrap()を扱う主なものです: https://www.drupal.org/node/2275139

Drupal 8のフロントコントローラ(index.php)]をご覧ください。

カーネルのインスタンスを作成し、リクエストを処理させます。

しかし、エンティティをそこに突っ込みたいだけなので、リクエストを処理しません。 bootstrapカーネルを実行してから、さまざまなサービスを使用してエンティティを追加するだけです。サービスのリストはcore/core.services.ymlにあり、非常に膨大です。entity_manager

また、D8にはRESTful APIが組み込まれているため、httpを介してpingしている間、D8にすべての作業を実行させることができる場合があります。

3
paul-m