У меня есть сайт, использующий CF8 и Fusebox 5. Каждый раз, когда мне нужно добавить новую функцию на сайт, мне обычно приходится добавлять новый предохранитель в Circuit.xml.cfm либо для контроллера, либо для модели, либо для представления, либо для всего. Чтобы включить эти новые функции/страницы, я перехожу по следующему URL-адресу:
?fusebox.load=true&fusebox.parse=true&fusebox.password=password&fusebox.loadclean=true
Последний параметр я недавно обнаружил и решил, что его использование активирует мои новые предохранители; без него новые предохранители не распознаются. Однако, когда я это делаю, все мои файлы синтаксического анализа, которые были сгенерированы ранее, удаляются. Это не большая проблема, так как они регенерируются на лету, когда они нужны в первый раз, но у меня есть некоторые страницы, которые возвращают ошибки при доступе к ним. Ошибка говорит, что каталог не найден, но они там есть, каждый раз это происходит потому, что файл синтаксического анализа не существует.
Вот пример одной ошибки с трассировкой стека:
Error - Parsed File or Directory not found.
Date/Time: Apr 25 2009 12:26:02
Type: fusebox.missingParsedFile
Message: Parsed File or Directory not found.
Detail:
Attempting to execute the parsed file 'login.logout.cfm' threw an error. This can occur if the parsed file does not exist in the parsed directory or if the parsed directory itself is missing.
Stack Trace:
coldfusion.runtime.CustomException: Parsed File or Directory not found.
at coldfusion.tagext.lang.ThrowTag.doStartTag(ThrowTag.java:124)
at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644)
at cffusebox52ecfm1214986498.runPage(C:\example.com\fb5core\fusebox5.cfm:216)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366)
at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644)
at cfindex2ecfm584653367.runPage(C:\example.com\index.cfm:3)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366)
at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644)
at cfApplication2ecfc1103573364$funcONREQUEST.runFunction(C:\example.com\Application.cfc:36)
at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:418)
at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:360)
at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:324)
at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:56)
at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:277)
at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:192)
at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:448)
at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:308)
at coldfusion.runtime.AppEventInvoker.invoke(AppEventInvoker.java:74)
at coldfusion.runtime.AppEventInvoker.onRequest(AppEventInvoker.java:243)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:269)
at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
at coldfusion.CfmServlet.service(CfmServlet.java:175)
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
at jrun.servlet.FilterChain.service(FilterChain.java:101)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:284)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
Чтобы решить эту проблему, я перехожу по следующему URL-адресу, который похож на предыдущий, но без fusebox.loadclean=true:
?fusebox.password=password&fusebox.load=true&fusebox.parse=true
То, что я пытался сделать, было после перехода к первому URL-адресу, я бы пошел по этому второму, но ошибка все еще возникает.
Я ищу правильный способ перезагрузить схемы без появления этих ошибок. Я третий разработчик, участвующий в этом сайте, так что у двух предыдущих, возможно, были разные стили настройки каждого экземпляра Circuit.xml.cfm. Эти файлы используются для определения потока приложений, необходимых для включения, дополнительных уровней безопасности и определения определенных атрибутов. Вот метод Fusebox:
<!-- controller/circuit.xml.cfm -->
<circuit access="public">
<fuseaction name="index">
<set name="request.title" value="Account overview" />
<do action="layout.header" />
<do action="mdashboard.index" />
<do action="vdashboard.index" />
<do action="layout.footer" />
</fuseaction>
<fuseaction name="profile">
<set name="request.title" value="Your Profile" />
<do action="layout.header" />
<!-- form submitted to the same page -->
<if condition="isDefined('attributes.submit')">
<true>
<do action="mdashboard.updateprofile" />
<do action="vdashboard.profile" />
</true>
<false>
<do action="mdashboard.profile" />
<do action="vdashboard.profile" />
</false>
</if>
<do action="layout.footer" />
</fuseaction>
</circuit>
<!-- model/circuit.xml.cfm -->
<circuit access="internal">
<fuseaction name="index">
<include template="sqlIndex" />
</fuseaction>
<fuseaction name="profile">
<include template="sqlProfile" />
</fuseaction>
<fuseaction name="updateprofile">
<include template="actUpdateProfile" />
</fuseaction>
</circuit>
<!-- view/circuit.xml.cfm -->
<circuit access="internal">
<fuseaction name="index">
<include template="dspIndex" />
</fuseaction>
<fuseaction name="profile">
<include template="dspProfile" />
</fuseaction>
</circuit>
Вот смесь методов Fusebox и ColdFusion:
<!-- controller/circuit.xml.cfm -->
<circuit access="public">
<fuseaction name="index">
<set name="request.title" value="Account overview" />
<do action="layout.header" />
<include template="ctrlIndex" />
<do action="layout.footer" />
</fuseaction>
<fuseaction name="profile">
<set name="request.title" value="Your Profile" />
<do action="layout.header" />
<include template="ctrlProfile" />
<do action="layout.footer" />
</fuseaction>
</circuit>
<!-- model/circuit.xml.cfm -->
<circuit access="internal">
</circuit>
<!-- view/circuit.xml.cfm -->
<circuit access="internal">
</circuit>
<!-- controller/ctrlProfile.cfm -->
<cfif isDefined("attributes.submit")>
<cfinclude template="../model/actUpdateProfile.cfm">
</cfif>
<cfinclude template="../model/sqlPaymentOptions.cfm">
<cfinclude template="../view/dspPaymentOptions.cfm">
Оба метода используются на сайте, и я не возражаю против использования любого из них, но моя цель — уменьшить количество ошибок, которые могут возникнуть, когда пользователь пытается получить доступ к определенной странице. Я думал, что, возможно, проблема в смешанном методе конфигураций, что я должен придерживаться, скажем, только метода Fusebox, но я не смог найти общую тенденцию в этой ошибке. Обработчик ошибок, который у нас есть, отправляет мне электронное письмо каждый раз, когда страница получает ошибку, поэтому я думаю, что я мог бы автоматически вызывать свой второй URL-адрес и перенаправлять их обратно на страницу, которая сгенерировала ошибку, когда возникает эта конкретная ошибка, но это потенциал для бесконечного цикла, и это не решает реальную проблему.
Я неправильно об этом говорю? Есть ли набор атрибутов, которые я могу включить в URL-адрес, который заставит сайт распознавать новые предохранители без очистки моих файлов синтаксического анализа? CF сам по себе кодить несложно, но я все еще относительно новичок в этом, так что я мог бы идти об этом в обратном направлении. Спасибо!