2 votes

Quelle est la bonne façon d'attribuer un udf général à application.cfc ?

Je veux simplement définir une fonction dans application.cfc et l'exposer à toutes les demandes. Il est préférable que l'"affectation" ne se produise qu'au démarrage de l'application.

Est-ce que la méthode préférée est de faire quelque chose comme ça :

<CFCOMPONENT OUTPUT="FALSE">
<CFSET this.name = "Website">
<CFSET this.clientManagement = true>
<CFSET this.SessionManagement = true>

<CFFUNCTION NAME="GetProperty" OUTPUT="False">
    <CFARGUMENT NAME="Property">

    <CFRETURN this.Props[Property]>
</CFFUNCTION>

<CFFUNCTION NAME="OnApplicationStart" OUTPUT="FALSE">
    <CFSET Application.GetProperty = GetProperty>
.
.
.

ou y a-t-il quelque chose de mieux ?

2voto

Sergii Points 6082

Par défaut, GetProperty sera déjà visible dans la portée Variables, ce qui peut être suffisant pour de nombreux usages (dans les modèles .cfm).

Si vous souhaitez utiliser ces méthodes directement dans les composants, vous pouvez les référencer dans la portée de l'application.

Bien que je le fasse avec la portée de la requête dans le onRequestStart(), c'est juste ma préférence personnelle. Quelque chose comme ça :

request.udf = {};
request.udf.halt = halt;

Veuillez noter que la meilleure pratique en général est d'incapsuler les objets et de les référencer dans la portée des variables de l'objet hôte. Je le fais généralement lors de l'initialisation de l'objet, en passant simplement les objets précédemment créés comme arguments init().

P.S. De nos jours, il est recommandé d'utiliser les minuscules pour les balises et leurs attributs. C'est une sorte de bonne pratique de codage.

2voto

Greg S Points 126

La meilleure façon de stocker des données de configuration spécifiques à un site est probablement de créer un nouveau composant nommé de la façon suivante SiteConfig.cfc avec des méthodes telles que getProperty(nom de la propriété) y setProperty(nom de la propriété, valeur) . Vous devez ensuite stocker ce CFC dans la portée de l'application en faisant ce qui suit à l'intérieur de la méthode onApplicationStart de Application.cfc comme suit :

<cfset application.siteConfig = createObject("component", "SiteConfig").init() />

Pour en revenir à votre question initiale sur le stockage d'un UDF dans le champ d'application, voici une façon de le faire. La base est que dans onApplicationStart vous créerez une nouvelle structure persistante d'application avec les propriétés de configuration de votre site comme le nom du site et tout autre élément. Ensuite, une fonction est stockée dans un fichier CFM qui n'est cfincluded que dans onApplicationStart, puis copiée dans la portée de l'application. Cela signifie que tous vos fichiers CFM de pages ordinaires peuvent utiliser la fonction application.getProperty(propertyName) . Étant donné que la fonction n'est créée qu'une seule fois et qu'elle est stockée dans le champ d'application, elle répond aux exigences de votre question initiale, à savoir que l'affectation ne doit avoir lieu qu'au démarrage de l'application.

J'espère que cela vous aidera un peu !

getProperty.function.cfm

<cffunction name="getProperty" output="false">
    <cfargument name="propertyName" type="string" required="true" />
    <cfreturn application.config[propertyName] />
</cffunction>

Application.cfc

<cffunction name="onApplicationStart" output="false">
 <cfset application.config = structNew() />
 <cfset application.config.siteName = "My App's Display Name" />
 <cfinclude template="getProperty.function.cfm" />
 <cfset application.getProperty = variables.getProperty />
</cffunction>

test.cfm

<cfset propertyValue = application.getProperty("siteName") />
<cfdump var="#propertyValue#" />

0voto

tony Points 111

Vous pourriez envisager de créer un CFC "propriétés" séparé et de l'instancier en tant que un singleton dans la portée du SERVEUR, il sera alors disponible à partir de n'importe quelle page CFML même si même si elle ne fait pas partie d'une application. Si vous suivez cette voie, il n'y a pas d'événement "server start" à lier. A la place, vous pouvez mettre ceci dans le contructeur de application.cfc ou dans le corps du fichier application.cfm

    <cfif not structkeyexists(server,"properties")>
        <cflock name ="loadProperties"
            timeout ="10"
            type ="exclusive"
        >
            <cfif not structkeyexists(server,"properties")>

                <cfset server.properties = 
                    createObject("component","path-to-props.cfc")
                    .init({..inital properties..})
                >
            </cfif>
        </cflock>
    </cfif>

Le code de verrouillage permet d'éviter le surcoût lié à la création et à l'affectation de l'UDF sur chaque demande. Cela permet également à l'instance de propriétés de persister, de sorte que le fait d'avoir une requête properties.SetProperty() fonctionnera.

0voto

rip747 Points 4033

Vous pouvez également utiliser la technique discutée aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X