外部スクリプトからのブートストラップ


10

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

Drupal 7のdrupal_bootstrap場合、必要なDrupal依存関係をロードする必要がありました。ただし、長い検索の結果、Drupal 8で見つかったのは、Drupal 8 drupal_bootstrapでは非推奨のメモでした。

そして確かに、私は

未定義の関数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をどのように使用できますか?


drush php-scriptを使用できます。これは、シェルスクリプトから直接、完全なDrupalブートストラップを使用してphpコードを実行します。
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にはRESTful APIが組み込まれているため、httpを介してpingしている間、D8にすべての作業を実行させることができる場合があります。


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

:あなただけautoload.phpが必要な場合は、すべてのそれらのrequire_onceコールなしで取得することができますrequire_once 'your_drupal/autoload.php';
ポール・メートル

私は必要だと思いますautoload.php(4行目)?これは私が使用しhandleRequestた場合には十分でしたが、エンティティマネージャーに到達するために基本のみを起動しようとした場合には不十分でした。
sleidig

追加する必要があるかもしれませんchdir()
Parag 2017

require_onceを削除すると、「未定義の関数Drupal \ Core \ Entity \ Sql \ drupal_schema_g​​et_field_value()への呼び出し」が得られますが、これはまったく
不十分です
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.