Bootstrap từ tập lệnh bên ngoài


10

Tôi đang cố gắng tạo các phiên bản thực thể Drupal từ một tập lệnh bên ngoài không phải là một phần của mô-đun Drupal hoặc Drupal.

Đối với Drupal 7, drupal_bootstrapphải tải các phụ thuộc Drupal cần thiết. Tuy nhiên, sau một thời gian dài tìm kiếm, tất cả những gì tôi tìm thấy cho Drupal 8 là một ghi chú không drupal_bootstrapđược dùng cho Drupal 8 .

Và thực sự, tôi nhận được một

Gọi hàm không xác định drupal_bootstrap ()

khi tôi cố gắng gọi nó sau khi bao gồm như trong

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

Vậy làm cách nào tôi có thể sử dụng API Drupal 8 từ một tập lệnh bên ngoài?!


Bạn có thể sử dụng kịch bản php drush . Điều này thực thi mã php với bootstrap đầy đủ Drupal trực tiếp từ tập lệnh shell.
rpayanm

Câu trả lời:


7

Đối với phiên bản hiện tại của 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

Thứ nhất: Luôn luôn tìm kiếm các thông báo thay đổi. Bạn có thể tìm thấy chúng ở đây: https://www.drupal.org/list-changes

Đây là vấn đề chính liên quan đến drupal_bootstrap(): https://www.drupal.org/node/2275139

Hãy xem bộ điều khiển phía trước của Drupal 8 ( index.php).

Bạn tạo một thể hiện của kernel và sau đó yêu cầu nó xử lý các yêu cầu.

Nhưng vì bạn chỉ muốn chọc các thực thể vào nó, bạn sẽ không xử lý các yêu cầu. Bạn chỉ cần bootstrap kernel và sau đó sử dụng các dịch vụ khác nhau để thêm các thực thể của bạn. Danh sách các dịch vụ đang ở core/core.services.ymlvà khá lớn. Bạn có thể tìm kiếm entity_manager.

Ngoài ra, D8 có API RESTful được tích hợp, vì vậy bạn có thể để D8 thực hiện tất cả công việc trong khi bạn ping nó qua http.


3

Cuối cùng tôi đã kết thúc với mã này. Nó có một số bổ sung xấu xí bao gồm nhưng ít nhất nó hoạt động:

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

Bạn có thể nhận được mà không cần tất cả các cuộc gọi request_once nếu bạn chỉ yêu cầu autoload.php:require_once 'your_drupal/autoload.php';
paul-m

Tôi nghĩ rằng tôi yêu cầu autoload.php(dòng 4)? Điều này đã đủ khi tôi sử dụng handleRequestnhưng không phải khi cố gắng khởi động chỉ những điều cơ bản để đến trình quản lý thực thể.
sleidig

Bạn có thể cần thêmchdir()
Parag

Việc xóa request_once sẽ cho "Gọi tới hàm không xác định Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()" khá khập khiễng :(
Clemens Tolboom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.