EntityDrupalWrapper e o Drupal Orientado a Objetos

Um dos meus primeiros trabalhos com Drupal foi uma integração com webservices de um sistema acadêmico. Foi assim que usei um node_save() pela primeira vez. Em 4 anos de drupal, usei esse método para criar muitos tipos de nodes programaticamente e desde de então nada mudou nesse processo:

$node = node_load($nid); $node->field_ingredientes[LANGUAGE_NONE][0]['nid'] = $ingrediente; $node->field_dificuldade[LANGUAGE_NONE][0]['value'] = 'fácil'; node_save($node);

Isso até agora. O módulo Entity API chegou para nos dar inúmeras melhorias no núcleo do sistema de entities do drupal, como por exemplo, CRUD. Também nos dá uma técnica muito interessante para edição de nodes, que são um tipo de entity. Ao invés de usarmos a versão acima, que é muito feia, totalmente procedural e sujeita a bugs, podemos usar a classe EntityDrupalWrapper.

Com isso temos os fields como atributos do objeto node:

$node = new EntityDrupalWrapper('node', $nid); // Nos campos multivalorados temos um array $node->field_ingredientes[0]->set($ingrediente); // Nos campos com apenas um valor fica mais simples $node->field_dificuldade->set('facil'); $node->save();

Essa classe transforma os objetos do core em objetos reais e não apenas um array mais bonitinho. Ou seja, agora podemos estender uma entity e colocar nossos próprios métodos, apenas estendendo o EntityDrupalWrapper:

class Receita extends EntityDrupalWrapper { public function __construct($data = NULL, $info = array()) { parent::__construct('node', $data, $info); } public function save() { // algum código aqui parent::save(); return; } } $node = new Receita($nid); $node->field_ingredientes[0]->set($ingrediente); $node->field_dificuldade->set('dificil'); $node->save(); //Também podemos pegar os dados nesse formato $dificuldade = $node->field_dificuldade->value();

Isso é muito legal, pois vemos o Drupal caminhando cada vez mais para a orientação a objetos, nos permitindo interagir com o core de um modo muito mais elegante. O EntityDrupalWrapper nos permite encapsular muito mais que apenas nodes e nos dá muitos helpers para ajudar no desenvolvimento.

Este post é apenas conceitual, para ilustrar as mudanças que estão vindo no Drupal 8. As boas praticas dizem para usarmos entity_metadata_wrapper para fazer essa instanciação em projetos.

Então a apartir de agora, esqueça o velho método de criar nodes programaticamente e entre nessa revolução também.

Artigo baseado no artigo original da LevelTen e alguns outros: If you aren't using Entity API to create nodes, you are doing it wrong