외부 스크립트에서 부트 스트랩


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에서 찾을 수 있습니다.

https://www.drupal.org/node/2275139를 다루는 주요 내용은 다음과 drupal_bootstrap()같습니다.

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_get_field_value ()에 호출"이 상당히
절실합니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.