Статьи

ХФУ для общего разработчика. Часть 2

Поэтому в прошлый раз мы изучили основы создания ХФУ и общую структуру самого базового ХФУ. Сегодня мы поговорим о различных способах использования этого CFC в нашем коде.

Итак, как нам получить доступ к этой функции в нашем CFC? Можем ли мы просто включить его в страницу CFML, используя тег CFInclude, или есть что-то еще? Если вы догадались, что это еще не все, то вы на месте! У CFC есть несколько способов их использования: на основе тегов, на основе сценариев и еще одной реализации на основе тегов.

Реализация на основе тегов # 1

Теперь ХФУ на самом базовом уровне очень похожи на пользовательские теги. Чтобы использовать функции, которые вы создаете в CFC, вы должны вызвать их, а затем вывести возвращаемые данные. Поэтому для нашего приветствия CFC мы бы назвали это так:

<cfinvoke component="greeting" method="getGreeting" returnvariable="myGreeting">
<cfoutput>#myGreeting#</cfoutput>

Это будет отображать Добро пожаловать, гость! Наслаждайтесь вашим визитом и, пожалуйста, возвращайтесь скорее везде, где мы выводим переменную myGreeting. Здесь мы используем тег CFInvoke, чтобы «вызвать» наш CFC, что является просто причудливым способом сказать «позвонить», «создать экземпляр» или даже «создать». Тег CFInvoke принимает большое количество атрибутов, но пока нас интересует только 3. Компонент — это имя компонента, который мы хотим использовать. В приведенном выше коде компонент приветствия находится в той же папке, что и страница, на которой написан тег CFInvoke. Если бы у меня был CFC в другой папке, я бы использовал нотацию do, чтобы сообщить ColdFusion, где найти мой CFC. Например, если моя страница находилась в корневой папке, а мои CFC находились в папке под названием компоненты, расположенной ниже моей корневой папки, я мог бы использовать этот код:

 <cfinvoke component="components.greeting" method="getGreeting" returnvariable="myGreeting">
<cfoutput>#myGreeting#</cfoutput>

Если бы мои CFC находились в отображении под названием Global вне моей корневой папки, но в подпапке с именем CFC, я бы назвал это так:

 <cfinvoke component="Global.cfc.greeting" method="getGreeting" returnvariable="myGreeting">
<cfoutput>#myGreeting#</cfoutput>

Вы даже можете использовать переменные, сообщая ColdFusion, где найти ваши CFC:

 <cfinvoke component="#application.CFCPath#.greeting" method="getGreeting" returnvariable="myGreeting">
<cfoutput>#myGreeting#</cfoutput>

А что если мы хотим передать имя посетителя, как бы мы это сделали? Наш CFC может принимать аргумент, называемый «посетитель», и для передачи значения в этот аргумент вы должны использовать тег CFInvokeArgument следующим образом:

 <cfinvoke component="greeting" method="getGreeting" returnvariable="myGreeting">
     <cfinvokeargument name="visitor" value="Eric">
</cfinvoke>
<cfoutput>#myGreeting#</cfoutput>

В приведенном выше коде вы можете видеть, что мы добавили строки 2 и 3. Строка 2 — это фактический тег CFInvokeArgument, и он принимает два атрибута: имя, которое является именем переменной в нашем CFC, и значение, которое является значением, которое мы хотим получить. перейти в наш ХФУ. Строка 3 — закрывающий тег CFInvoke, который отсутствовал в наших предыдущих примерах. Для тех, кто интересуется, вы можете передать переменные в атрибуте value, просто не забывайте их набивать (#).

Реализация на основе тегов # 2

Так зачем нам 2 способа вызова CFC с тегами? Реализация № 1 хороша и эффективна, но ХФУ существует только тогда и там. Когда вы вызываете CFC с использованием кода в реализации # 1, CFC создается ColdFusion, вы также можете сказать, что экземпляр создан, то же самое, затем вызывается функция, и эти данные выводятся. Затем ColdFusion уничтожает CFC и стирает его из памяти сервера, но не самого файла, поэтому не беспокойтесь. Теперь это хорошо, если вы не хотите использовать CFC или какую-либо из его функций позже, но если вы решите это сделать, ColdFusion должен пройти через весь процесс создания заново. В программировании мы называем этот процесс создания / уничтожения «дорогим», поскольку он использует память и процессорные блоки для выполнения задачи каждый раз. Было бы намного лучше, если бы мы могли создать CFC, а затем сохранить его в области приложения или в области сеанса и повторно использовать его по всему сайту, и именно здесь приходит реализация # 2.

Сначала мы должны создать CFC, и поскольку мы хотим, чтобы CFC оставался на этом этапе, мы собираемся создать его в нашей области применения. Для тех, кто не знает, область приложения является постоянной областью, что означает, что любые переменные, созданные в этой области, будут сохраняться до тех пор, пока они не будут перезаписаны, удалены или сервер не будет перезапущен. Это отличное место для хранения вещей, которые вам нужны во всем приложении. Вот код для выполнения этой маленькой задачи:

 <cfobject type="component" name="Application.siteGreeting" component="greeting">
<cfinvoke component="#application.sitegreeting#" method="getGreeting" returnvariable="myGreeting">
     <cfinvokeargument name="visitor" value="Eric">
</cfinvoke>

По большей части этот код выглядит очень похоже на то, что мы делали в реализации # 1, но с изюминкой. Сначала посмотрите на строку 1, и вы увидите, что мы добавили новый тег CFObject, и он принимает 3 атрибута. Атрибут type сообщает ColdFusion, что мы хотим создать, и в данном случае это компонент. Далее идет имя, это переменная, которая будет создана из этого тега, который будет моим CFC. Последний является атрибутом компонента, и он работает так же, как атрибут компонента в нашем теге CFInvoke, то есть он сообщает ColdFusion, где найти компонент, который мы хотим создать. Теперь, когда этот тег запустится, у нас будет постоянный экземпляр или копия нашего CFC, и мы можем ссылаться на него как Application.siteGreeting.

Затем мы используем наш тег CFInvoke для фактического использования CFC и вызываем нашу функцию getGreeting. Вы заметите, что это похоже на реализацию # 1, за исключением атрибута компонента. Здесь мы фактически передаем переменную, которую мы создали с помощью нашего тега CFObject, и определяем ее ВМЕСТО, передавая путь к нашему CFC. Теперь в этом примере у меня есть тег CFObject прямо перед тегом CFInvoke, но на самом деле два тега могут быть разделены на несколько строк или даже в разных файлах. Пока создается мой application.siteGreeting, мой тег CFInvoke будет работать без проблем.

Так почему мы хотим этого? В конце концов, это лишняя строка кода, и действительно ли это нас так сильно экономит? Для этого примера нет, скорее всего нет, но со временем может быть очень дорого продолжать создавать и уничтожать наш CFC, используя только тег CFInvoke. Подумайте, если тысячи людей одновременно заходят на эту страницу. ColdFusion будет создавать и уничтожать один и тот же CFC каждый раз при запуске страницы. Создавая его в переменной области видимости, он становится более постоянным и не таким дорогим в использовании, поскольку он уже существует. Думайте об этом как о покупке газировки в магазине на углу. Каждый раз, когда вы хотите получить напиток, вы должны идти в магазин, забирать газировку, платить за нее в кассе, а затем вы можете пить. Вот как работает реализация # 1, но если вы уже купили газировку или даже газировку, и они сидели у вас в холодильнике, вы можете отключить «поход в магазин», «выбрать его» и « платить за это в реестре », потому что у вас уже есть и вы можете наслаждаться газировкой, когда захотите.

Реализация на основе CFScript

Если вы сценарист, и я иногда уверен, вам может понравиться эта версия:

Версия № 1

 <cfscript>
     siteGreeting = CreateObject('component','greeting');
     myGreeting = siteGreeting.getGreeting(visitor='Eric');
</cfscript>

Версия № 2

 <cfscript>
     application.siteGreeting = CreateObject('component','greeting');
     myGreeting = application.siteGreeting.getGreeting(visitor='Eric');
</cfscript>

Версия № 1 и Версия № 2 идентичны на 99%, за исключением того, что в версии № 2 мы создаем CFC в области приложения так же, как реализация № 2 на основе тегов. Здесь вы видите, что мы использовали тег CFScript для настройки среды сценариев ColdFusion. ColdFusion — это, прежде всего, язык, основанный на тегах, и это то, что он знает, но он также имеет сторону сценария, которая позволяет вам делать многое, но не все, что вы можете делать в области тегов. Все, что находится между тегами CFScript, является скриптом ColdFusion и, вероятно, очень похоже на другие языки сценариев, которые вы видели. В строке 2 приведенных выше примеров мы используем функцию CreateObject для создания нашего CFC почти так же, как мы используем тег CFObject в реализации # 2. Когда вы создаете CFC с помощью CFScript, вы всегда должны использовать функцию CreateObject, поскольку нет единого решения, такого как CFInvoke на основе тегов. Итак, в первой версии мы создаем CFC и назначаем его переменной siteGreeting, а во второй версии он назначается переменной application.siteGreeting. В строке 3 мы фактически вызываем нашу функцию, используя точечную нотацию, вспомним точечную нотацию из реализации # 1 на основе тегов, используя формат CFCNAME.functionName. Теперь, поскольку во второй версии CFC находится в области приложения, вы получаете дополнительную точку, это больше похоже на scope.CFCNAME.functionName, но в основном это одно и то же. Вы заметите, что когда я передаю наш аргумент посетителю, я делаю это в скобках как посетитель = ‘Эрик’. При выполнении CFC-метода CFScript вы можете либо передавать переменные в этой паре имя = значение, либо просто передавать значения в виде списка с разделителями-запятыми, обязательно заключая в кавычки строковые значения. НО, когда вы передаете их в виде списка, вы должны передать значения в том порядке, в котором ваш CFC имеет настройку тегов cfargument. Например, если мой CFC выглядел так:

 <cfcomponent displayname="MyFirstCFC" hint="It's just a CFC folks, don't freak out">
     <cffunction name="getGreeting" output="false" returntype="string" description="Returns a greeting string">
          <cfargument name="visitorFirstName" required="no" type="string" displayname="Visitor First Name String" hint="The Visitors name">
          <cfargument name="visitorLastName" required="no" type="string" displayname="Visitor Last Name String" hint="The Visitors name">
          <cfif IsDefined('arguments.visitor') AND Len(Trim(arguments.visitor))>
               <cfreturn 'Welcome ' & arguments.visitorFirstName & ' ' & arguments.visitorLastName & '! I hope you enjoy your stay.'>
          <cfelse>
               <cfreturn 'Welcome guest! Enjoy your visit and please come back soon.'>
          </cfif>
     </cffunction>
</cfcomponent>

Тогда я должен был бы передать мои переменные следующим образом:

myGreeting = application.siteGreeting.getGreeting (visitorFirstName = ‘Eric’, visitorLastName = ‘Jones’);

ИЛИ

myGreeting = application.siteGreeting.getGreeting (‘Эрик’, ‘Джонс’);

Только в первом примере, где я использую пару имя = значение, я мог смешать их и поставить «фамилию» первым и «имя» фамилией без проблем. Поэтому всегда полезно передавать аргументы в паре имя = значение, если у вас нет только одного аргумента для передачи.

Хорошо, на этом мы заканчиваем этот пост, и я думаю, что я на некоторое время покончил с CFC для обычного разработчика, но, пожалуйста, не стесняйтесь размещать свои вопросы здесь или на форумах . Кто знает, может быть, вы вдохновите мой следующий пост!