Bootstrap จากสคริปต์ภายนอก


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

ดังนั้นฉันจะใช้ Drupal 8 API จากสคริปต์ภายนอกได้อย่างไร!


คุณสามารถใช้drush PHP รันโค้ด php ด้วย bootstrap 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 ยังมี RESTful API อยู่ภายในดังนั้นคุณอาจปล่อยให้ D8 ทำงานได้ทั้งหมดในขณะที่คุณ ping ผ่าน 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();

คุณสามารถรับสายได้โดยไม่ต้องใช้การโทรเหล่านั้นถ้าคุณต้องการ autoload.php:require_once 'your_drupal/autoload.php';
paul-m

ฉันคิดว่าฉันต้องการautoload.php(บรรทัด 4) หรือไม่ สิ่งนี้ไม่เพียงพอเมื่อฉันใช้handleRequestแต่ไม่ใช่เมื่อพยายามบูตเฉพาะข้อมูลพื้นฐานเพื่อไปยังตัวจัดการเอนทิตี
sleidig

คุณอาจต้องเพิ่มchdir()
Parag

การลบ require_once ให้ "ฟังก์ชัน Call to undefined Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()" ซึ่งค่อนข้างอ่อนแอ :(
Clemens Tolboom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.