Drupal moduli custom: scaffold

Sviluppare un modulo custom

Sviluppare un modulo Drupal e' lo strumento principale per estendere il CMS oltre quanto offerto da core e contrib. Un modulo può aggiungere routing, blocchi, plugin, servizi, comandi Drush, REST endpoint. La struttura e' standardizzata e prevedibile.

Struttura base

modules/custom/my_module/
  my_module.info.yml
  my_module.module
  my_module.routing.yml
  my_module.services.yml
  my_module.links.menu.yml
  src/
    Controller/
    Form/
    Plugin/
    Service/

info.yml

name: 'My Module'
type: module
description: 'Custom module example.'
package: 'Custom'
core_version_requirement: ^10 || ^11
dependencies:
  - drupal:node
  - drupal:user

Drush generate

Drush genera lo scaffolding:

drush generate module
drush generate controller
drush generate form
drush generate plugin:block
drush generate service
drush generate event-subscriber

Risposte interattive a poche domande producono codice pronto.

Routing e Controller

my_module.routing.yml:

my_module.hello:
  path: '/hello'
  defaults:
    _controller: '\Drupal\my_module\Controller\HelloController::index'
    _title: 'Hello'
  requirements:
    _permission: 'access content'

Controller in src/Controller/HelloController.php:

namespace Drupal\my_module\Controller;
use Drupal\Core\Controller\ControllerBase;
class HelloController extends ControllerBase {
  public function index() {
    return ['#markup' => 'Hello world'];
  }
}

Form API

I form ereditano FormBase o ConfigFormBase. Si definiscono buildForm(), validateForm(), submitForm(). Form complessi con AJAX, multi-step (StepableForm), conditional fields.

Plugin: Block

I blocchi sono plugin con annotation:

/**
 * @Block(
 *   id = "my_module_hello",
 *   admin_label = @Translation("Hello block")
 * )
 */
class HelloBlock extends BlockBase {
  public function build() {
    return ['#markup' => 'Hello block!'];
  }
}

Services

I service vivono in src/Service/ e si dichiarano in my_module.services.yml:

services:
  my_module.utility:
    class: Drupal\my_module\Service\UtilityService
    arguments: ['@entity_type.manager']

Dependency injection

I servizi (entity_type.manager, current_user, config.factory) si iniettano via costruttore, evitando l'antipattern \Drupal::service() nel codice di produzione.

Hooks legacy

I vecchi hook PHP (hook_form_alter, hook_node_presave) restano in my_module.module per compatibilità. Per nuovi sviluppi preferire event subscriber dove disponibili.

Hai bisogno di aiuto?

Se vuoi un sito Drupal performante dal team di G Tech Group, scrivici tramite il modulo di contatto.

Hai trovato utile quest'articolo?