Estender um CFC usando um caminho relativo
-
08-07-2019 - |
Pergunta
Eu quero estender uma CFC em um diretório diferente e eu tenho um par de opções, mas não consigo descobrir como fazer isso:
A) Use um mapeamento dinâmico (este terá que ser dinâmico baseado no site, por exemplo, para o site ao vivo seria cfc.myPackage.MyCFC mas em um site dev seria myCfcRoot.myPackage.MyCFC) - I 'tentei expressões colocando no bit estende mas obviamente CF não gosta disso, por exemplo, :
<cfcomponent name="MyComponent" extends="#config.cfcRoot#.BaseComponent">
ou
<cfcomponent name="MyComponent" extends="#GetRealPath(../BaseComponent.cfc)#">
B) Providenciar um caminho relativo (de alguma forma) para o CFC para estender.
Eu temo que eu não posso fazer isso, mas eu estou esperando que há algo que eu perdi.
Solução
Daniel é basicamente correta, você precisa de um mapeamento. No entanto, existem 3 soluções alternativas.
CFCs vai pegar o caminho atual como um mapeamento raiz relativa, por isso, se seus CFCs estão todos no mesmo diretório, você pode simplesmente dizer
<cfcomponent name="MyComponent" extends="Example">
Ou se os seus componentes estão em subdiretórios do cfc atual, você pode acessá-lo:
<cfcomponent name="MyComponent" extends="subdirectory.Example">
Em segundo lugar, se você estiver executando no ColdFusion 8, você pode definir um mapeamento em sua Application.cfc usando o struct mapeamentos como este:
<cfset this.mappings["/MyApp"] = expandPath(".") />
Há duas boas referências para Application.cfc, em primeiro lugar, Exemplo de aplicação Ray de Camden. cfc que apenas dá uma bela vista que vai aonde, então o página de configurações do aplicativo CF8 vivo Docs , que tem uma seção sobre mapeamentos juntamente com alguns bons comentários.
Finalmente, você pode usar o "MyApp" built-in de mapeamento de sua raiz web, por isso, se o seu aplicativo está em um subdiretório chamado "MyApp" fora da raiz web, o mapeamento de raiz será. Digamos que você colocar corretamente seus componentes em:
wwwroot\MyApp\com\MyApp\example.cfc
O mapeamento a esta cfc, neste caso, será:
MyApp.com.MyApp.Example
E através do seu exemplo, você pode estender como esta:
<cfcomponent name="MyComponent" extends="MyApp.com.MyApp.Example">
Qualquer outra coisa, como se os seus componentes estão fora da raiz web, ou se você não tem certeza que a estrutura da pasta do seu aplicativo concluído será, e você precisará definir um mapeamento no administrador de CF.
Outras dicas
A menos que o CFC está no mesmo diretório que o script chamando o CFC devem ser localizados e referenciado a partir de um caminho relativo a um "mapeamento".
Eu descobri que às vezes você precisa ter certeza de que "/" é mapeado para o seu documento raiz do seu servidor web e que se torna a base para todos os caminhos relativos. Ou você pode configurar um mapeamento para um diretório CFC que realizar todos os seus CFCs comuns.
Esta tela é encontrado no ColdFusion de administração em "Configurações do servidor." -> "mapeamentos"
Agora, isso só é testado em CF8 assim outro motor podem diferir.
Se você quiser usar caminhos relativos para estender aplicativos que você pode, mas o seu tem que iniciá-los com um " / .". Por exemplo, você pode fazer isso para estender um Application.cfc de sua raiz web no diretório abaixo você Webroot:
<cfcomponent output="false" extends="/.application">
<!--- whatever code you have --->
</cfcomponent>
Agora vamos dizer que eu tenho os seguintes caminhos no meu aplicativo:
[webroot]/1/1a
[webroot]/2
vamos dizer que o Application.cfc em [webroot] / 1/1-A estende o Application.cfc em [webroot] . agora eu quero colocar um Application.cfc em [webroot] / 2 e estender a Application.cfc em [webroot] / 1/1-A . Tudo o que eu teria que fazer no meu [webroot] /2/application.cfc é o seguinte:
<cfcomponent output="false" extends="/./1/1a/application">
<!--- whatever code you have --->
</cfcomponent>
Esperamos que este sentido marcas.
Em relação ao Método B. Isso pode ser feito usando um arquivo adicional no seu exemplo. É um arquivo extra por cfc que você deseja estender por diretório que você deseja estender a partir.
Os 3 arquivos que são necessários.
- /somepathtobasecomponent/basecomponent.cfc (arquivo de componente a sua base)
- /pathtoworkingcfc/function.cfc (o arquivo com o atributo extends)
- /pathtoworkingcfc/basecomponent_extend.cfc (o novo arquivo que irá fazer o estendendo)
/somepathtobasecomponent/basecomponent.cfc
Nada de mudar aqui. Este permanece o mesmo.
/pathtoworkingcfc/function.cfc
na tag cffunction
definir o estende a extends="basecomponent_extend"
/pathtoworkingcfc/basecomponent_extend.cfc
conteúdo Sole do arquivo é um cfinclude
<cfinclude template="/somepathtobasecomponent/basecomponent.cfc">