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をどのように使用できますか?!
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();
ようやくこのコードになりました。醜い追加のインクルードがいくつかありますが、少なくとも機能します。
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();
まず、常に変更通知を探します。あなたはここでそれらを見つけることができます: 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にすべての作業を実行させることができる場合があります。