Résumé de la question: Conceptuellement, que sont les getters et setters et pourquoi les utiliserions-nous?
Extrait de http://docs.sequelizejs.com/en/latest/docs/models-definition/?highlight=getterMethods#getters-setters :
Il est possible de définir des getters et des fonctions de définition de "propriété d'objet" sur vos modèles, ceux-ci peuvent être utilisés à la fois pour "protéger" les propriétés qui correspondent aux champs de la base de données et pour définir les "pseudo" propriétés.
Que signifie "protéger"? Contre quoi?
Que sont les propriétés "pseudo"?
Je me bats également avec l'exemple de code ci-dessous. Il semble que nous définissions deux fois le titre. Et quel est l'argument "v"?
Voir ci-dessous:
var Foo = sequelize.define('Foo', {
title: {
type : Sequelize.STRING,
allowNull: false,
}
}, {
getterMethods : {
title : function() { /* do your magic here and return something! */ },
title_slug : function() { return slugify(this.title); }
},
setterMethods : {
title : function(v) { /* do your magic with the input here! */ },
}
});
Un exemple concret au lieu de "faire de la magie" serait grandement apprécié!
pseudo propriétés
Seraient des propriétés qui, du point de vue de l'utilisateur, semblent être des propriétés normales de l'objet, mais n'existent pas dans la base de données. Prenons par exemple un objet utilisateur qui a des prénoms et des champs de nom de famille. Vous pouvez ensuite créer un setter de nom complet:
var foo = sequelize.define('foo', {
..
}, {
getterMethods: {
fullName: function () {
return this.getDataValue('firstName') + ' ' + this.getDataValue('lastName')
}
},
setterMethods: {
fullName: function (value) {
var parts = value.split(' ')
this.setDataValue('lastName', parts[parts.length-1])
this.setDataValue('firstName', parts[0]) // this of course does not work if the user has several first names
}
}
})
Lorsque vous avez un objet utilisateur, vous pouvez simplement le faire
console.log(user.fullName)
Pour voir le nom complet de l'utilisateur. Le getter est alors invoqué dans les coulisses.
De même, si vous définissez une méthode de définition pour le nom complet, vous pouvez le faire
user.fullName = 'John Doe'
Ce qui diviserait ensuite la chaîne passée en deux parties et les enregistrerait en prénom et nom. (voir l'exemple simplifié ci-dessus)
Protéger les propriétés
@ahiipsa en a déjà fourni un bon exemple. Les accesseurs sont appelés lorsque vous effectuez user.toJSON (), vous pouvez donc utiliser les accesseurs pour supprimer facilement les données sensibles avant de les envoyer à l'utilisateur.