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.