Bootstrap dari skrip eksternal


10

Saya mencoba membuat instance entitas Drupal dari skrip eksternal yang bukan bagian dari modul Drupal atau Drupal.

Untuk Drupal 7 ada drupal_bootstrapmemuat dependensi Drupal yang diperlukan. Namun, setelah pencarian panjang semua yang saya temukan untuk Drupal 8 adalah catatan yang drupal_bootstrapsudah usang untuk Drupal 8 .

Dan memang, saya mendapatkan

Panggil ke fungsi drupal_bootstrap () yang tidak terdefinisi

ketika saya mencoba menyebutnya setelah memasukkan seperti pada

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

Jadi bagaimana saya bisa menggunakan Drupal 8 API dari skrip luar ?!


Anda dapat menggunakan skrip php drush . Ini mengeksekusi kode php dengan bootstrap Drupal penuh langsung dari skrip shell.
rpayanm

Jawaban:


7

Untuk versi drupal 8.x saat ini:

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

Pertama: Selalu cari pemberitahuan perubahan. Anda dapat menemukannya di sini: https://www.drupal.org/list-changes

Inilah yang utama berurusan dengan drupal_bootstrap(): https://www.drupal.org/node/2275139

Lihatlah pengontrol depan Drupal 8 ( index.php).

Anda membuat instance dari kernel dan kemudian membuatnya menangani permintaan.

Tetapi karena Anda hanya ingin memasukkan entitas ke dalamnya, Anda tidak akan menangani permintaan. Anda hanya perlu mem-bootstrap kernel dan kemudian menggunakan berbagai layanan untuk menambahkan entitas Anda. Daftar layanan dalam core/core.services.ymldan cukup besar. Anda mungkin mencari entity_manager.

Selain itu, D8 memiliki RESTful API bawaan, jadi Anda mungkin bisa membiarkan D8 melakukan semua pekerjaan saat Anda melakukan ping di http.


3

Saya akhirnya berakhir dengan kode ini. Ini memiliki beberapa tambahan jelek tapi setidaknya berfungsi:

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

Anda dapat bertahan tanpa semua panggilan require_once jika Anda hanya memerlukan autoload.php:require_once 'your_drupal/autoload.php';
paul-m

Saya pikir saya perlu autoload.php(baris 4)? Ini sudah cukup ketika saya menggunakan handleRequesttetapi tidak ketika mencoba untuk boot hanya dasar-dasar untuk sampai ke manajer entitas.
sleidig

Anda mungkin perlu menambahkanchdir()
Parag

Menghapus require_once memberi "Panggil ke fungsi yang tidak ditentukan Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()" yang cukup timpang :(
Clemens Tolboom
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.