Estoy familiarizado con el uso module_exists
en un módulo, y usarlo en situaciones como:
- Habilite alguna funcionalidad adicional en un módulo, siempre que algún otro módulo esté disponible en el sitio también. El módulo Reservas: Correo electrónico contiene un ejemplo (en realidad, hay muchos ejemplos de esto), como se muestra en la fuente de su módulo : para usar tokens (en el cuerpo del correo electrónico) se requiere que el módulo Token esté habilitado.
- Implemente dependencias de módulos en un tema, como se muestra en la respuesta a " ¿Cómo implementar dependencias de módulos en un tema y paquetes de módulos con un tema? ".
Sin embargo, también existe function_exists
, como se muestra en la respuesta a " ¿Es posible declarar una dependencia de la biblioteca Javascript en Hook.info? ".
Tengo la impresión de que usar function_exists
es un enfoque más robusto (seguro) en comparación con module_exists
. Especialmente si desea asegurarse de que alguna función (agregada en una versión más nueva de un módulo) esté disponible, mientras que con solo usarla module_exists
, corre el riesgo de encontrarse con errores como esos:
- si un sitio está siendo utilizando una vieja versión de un módulo, que no tiene esa función todavía (lo que no debería tratar de usarlo sin embargo ).
- si un sitio está ya utilizando una nueva versión de un módulo, que no tiene esa función más (lo que no debería tratar de usarlo más ).
Mi pregunta : ¿cuáles son los criterios típicos, o pros / contras, para decidir el uso de module_exists
versus function_exists
?
fuente
MODULENAME_requirements
en la publicación vinculada? Sí, eso tendría más sentido como una llamada amodule_exists
. Como mencionó MPD, la forma más abstracta / de nivel superior para garantizar que una dependencia tenga cierta funcionalidad es examinar el código para una versión y hacer que su código se base en una versión específica con la que sabe que funciona. Al igual que Composer / NPM / Bundler / etc, hazloTiene razón,
function_exists
es una forma más sólida de verificar la existencia de la función API proporcionada por el módulo contrib. Es muy adecuado para usar directamente la API del módulo contrib.Uso la API de caché de sesión como ejemplo:
Sin embargo, algunos módulos contrib solo proporcionan algunas propiedades o características adicionales, es muy difícil decir qué función dependiente es. En este caso, debe usar
module_exists
Yo uso Elements como ejemplo:
fuente
session_cache_set
está siendo proporcionada por drupal.org/project/session_cache u otro módulo, y por lo tanto hace lo que quiere?function_exists
puede evitar errores de función indefinidos cuando el módulo contrib cambió su API después de la actualización. Por supuesto, el método más garantía es envolverfunction_exists
conmodule_exits
tan @Clive mencionado, pero, para mí, es demasiado tedioso.function_exits
hecho , evite que el sitio se desplace por completo ...Las 3 respuestas (interesantes) anteriores me parecen de alguna manera confirmando mi "percepción" (como describí en mi pregunta). Curiosamente, esas respuestas se escribieron originalmente de forma independiente entre sí (se publicaron más o menos en el mismo momento, como se ilustra en la línea de tiempo de esta pregunta , use el "formato de alternar" para ver "minutos").
La respuesta de Jimmy Ko (+ comentarios debajo) ilustra algunos ejemplos más de cómo el uso
function_exists
puede hacer que un módulo sea más robusto con respecto a los posibles cambios en algún otro módulo que un módulo usa (depende de).La respuesta de Clive muestra que también podrías combinar
module_exists
yfunction_exists
, mientras que el comentario a continuación resolvió mis dudas sobre mifunction_exists
ejemplo (es decir, debería usarlomodule_exists
).La respuesta de mpdonadio (+ comentarios debajo) es, al menos para mí, la más difícil de digerir. Pero después de revisar el comentario de Shawn Conn debajo, encontré algunos enlaces más que proporcionan más detalles sobre todo esto, es decir:
"Mi conclusión" (después de digerir las respuestas anteriores): déjelo al núcleo de Drupal para que lo use
function_exists
, y los módulos contribuidos / personalizados deberían intentar, en la medida de lo posible, apegarse amodule_exists
... aunque hay excepciones ...fuente