Harici komut dosyasından önyükleme


10

Drupal veya Drupal modülünün bir parçası olmayan bir dış komut dosyasından Drupal varlık örnekleri oluşturmaya çalışıyorum.

Drupal 7 drupal_bootstrapiçin gerekli Drupal bağımlılıkları yüklenecekti. Ancak, uzun bir aramadan sonra Drupal 8 için bulduğum tek şey Drupal 8 drupal_bootstrapiçin onaylanmamış bir nottu .

Ve gerçekten,

Undefined fonksiyonuna çağrı drupal_bootstrap ()

ekledikten sonra aramaya çalıştığımda

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

Öyleyse Drupal 8 API'sini harici bir komut dosyasından nasıl kullanabilirim ?!


Drush php-script kullanabilirsiniz . Bu doğrudan bir kabuk komut dosyasından tam bir Drupal önyükleme ile php kodu yürütmek.
rpayanm

Yanıtlar:


7

Mevcut drupal 8.x sürümü için:

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

İlk olarak: Her zaman değişiklik bildirimlerini arayın. Bunları burada bulabilirsiniz: https://www.drupal.org/list-changes

İşte ana uğraş drupal_bootstrap(): https://www.drupal.org/node/2275139

Drupal 8'in ön kontrolörüne ( index.php) bir göz atın .

Çekirdeğin bir örneğini oluşturup istekleri işlemesini sağlayabilirsiniz.

Ancak yalnızca varlıkları içine sokmak istediğiniz için istekleri yerine getiremezsiniz. Sadece çekirdeği önyüklemeniz ve daha sonra varlıklarınızı eklemek için çeşitli hizmetleri kullanmanız gerekir. Hizmet listesi içinde core/core.services.ymlve oldukça büyük. Arayabilirsiniz entity_manager.

Ayrıca, D8'in yerleşik bir RESTful API'si vardır, bu yüzden D8'in http üzerinde ping yaparken tüm işleri yapmasına izin verebilirsiniz.


3

Sonunda bu kod ile sona erdi. Bazı çirkin ekstra içerir ama en azından çalışır:

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

Sadece autoload.php'ye ihtiyacınız varsa tüm bu requir_once çağrıları olmadan alabilirsiniz:require_once 'your_drupal/autoload.php';
paul-m

Sanırım ihtiyacım var autoload.php(4. satır)? Bu, kullandığım zaman yeterliydi, handleRequestancak varlık yöneticisine ulaşmak için yalnızca temel bilgileri önyüklemeye çalışırken değil.
sleidig

chdir()
Eklemeniz

Require_once kaldırıldığında "Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()" çağrısı oldukça topal olan :(
Clemens Tolboom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.