从外部脚本引导


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。这将直接从Shell脚本使用完整的Drupal引导程序执行php代码。
rpayanm

Answers:


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';
paul-m

我想我确实需要autoload.php(第4行)?这在我使用handleRequest时就足够了,但在尝试仅引导基础知识以进入实体管理器时却不能满足要求。
sleidig

您可能需要添加chdir()
Parag

删除require_once会产生“对未定义函数Drupal \ Core \ Entity \ Sql \ drupal_schema_g​​et_field_value()的调用”:(
Clemens Tolboom
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.