core.api.php 122 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587
  1. <?php
  2. /**
  3. * @file
  4. * Documentation landing page and topics, plus core library hooks.
  5. */
  6. /**
  7. * @mainpage
  8. * Welcome to the Drupal API Documentation!
  9. *
  10. * This site is an API reference for Drupal, generated from comments embedded
  11. * in the source code. More in-depth documentation can be found at
  12. * https://www.drupal.org/developing/api.
  13. *
  14. * Here are some topics to help you get started developing with Drupal.
  15. *
  16. * @section essentials Essential background concepts
  17. *
  18. * - @link oo_conventions Object-oriented conventions used in Drupal @endlink
  19. * - @link extending Extending and altering Drupal @endlink
  20. * - @link best_practices Security and best practices @endlink
  21. * - @link info_types Types of information in Drupal @endlink
  22. *
  23. * @section interface User interface
  24. *
  25. * - @link menu Menu entries, local tasks, and other links @endlink
  26. * - @link routing Routing API and page controllers @endlink
  27. * - @link form_api Forms @endlink
  28. * - @link block_api Blocks @endlink
  29. * - @link ajax Ajax @endlink
  30. *
  31. * @section store_retrieve Storing and retrieving data
  32. *
  33. * - @link entity_api Entities @endlink
  34. * - @link field Fields @endlink
  35. * - @link config_api Configuration API @endlink
  36. * - @link state_api State API @endlink
  37. * - @link views_overview Views @endlink
  38. * - @link database Database abstraction layer @endlink
  39. *
  40. * @section other_essentials Other essential APIs
  41. *
  42. * - @link plugin_api Plugins @endlink
  43. * - @link container Services and the Dependency Injection Container @endlink
  44. * - @link events Events @endlink
  45. * - @link i18n Internationalization @endlink
  46. * - @link cache Caching @endlink
  47. * - @link utility Utility classes and functions @endlink
  48. * - @link user_api User accounts, permissions, and roles @endlink
  49. * - @link theme_render Render API @endlink
  50. * - @link themeable Theme system @endlink
  51. * - @link update_api Update API @endlink
  52. * - @link migration Migration @endlink
  53. *
  54. * @section additional Additional topics
  55. *
  56. * - @link batch Batch API @endlink
  57. * - @link queue Queue API @endlink
  58. * - @link typed_data Typed Data @endlink
  59. * - @link testing Automated tests @endlink
  60. * - @link php_assert PHP Runtime Assert Statements @endlink
  61. * - @link third_party Integrating third-party applications @endlink
  62. *
  63. * @section more_info Further information
  64. *
  65. * - @link https://api.drupal.org/api/drupal/groups/8 All topics @endlink
  66. * - @link https://www.drupal.org/project/examples Examples project (sample modules) @endlink
  67. * - @link https://www.drupal.org/list-changes API change notices @endlink
  68. * - @link https://www.drupal.org/developing/api/8 Drupal 8 API longer references @endlink
  69. */
  70. /**
  71. * @defgroup third_party REST and Application Integration
  72. * @{
  73. * Integrating third-party applications using REST and related operations.
  74. *
  75. * @section sec_overview Overview of web services
  76. * Web services make it possible for applications and web sites to read and
  77. * update information from other web sites. There are several standard
  78. * techniques for providing web services, including:
  79. * - SOAP: http://wikipedia.org/wiki/SOAP
  80. * - XML-RPC: http://wikipedia.org/wiki/XML-RPC
  81. * - REST: http://wikipedia.org/wiki/Representational_state_transfer
  82. * Drupal sites can both provide web services and integrate third-party web
  83. * services.
  84. *
  85. * @section sec_rest_overview Overview of REST
  86. * The REST technique uses basic HTTP requests to obtain and update data, where
  87. * each web service defines a specific API (HTTP GET and/or POST parameters and
  88. * returned response) for its HTTP requests. REST requests are separated into
  89. * several types, known as methods, including:
  90. * - GET: Requests to obtain data.
  91. * - POST: Requests to update or create data.
  92. * - PUT: Requests to update or create data (limited support, currently unused
  93. * by entity resources).
  94. * - PATCH: Requests to update a subset of data, such as one field.
  95. * - DELETE: Requests to delete data.
  96. * The Drupal Core REST module provides support for GET, POST, PATCH, and DELETE
  97. * quests on entities, GET requests on the database log from the Database
  98. * Logging module, and a plugin framework for providing REST support for other
  99. * data and other methods.
  100. *
  101. * REST requests can be authenticated. The Drupal Core Basic Auth module
  102. * provides authentication using the HTTP Basic protocol; the contributed module
  103. * OAuth (https://www.drupal.org/project/oauth) implements the OAuth
  104. * authentication protocol. You can also use cookie-based authentication, which
  105. * would require users to be logged into the Drupal site while using the
  106. * application on the third-party site that is using the REST service.
  107. *
  108. * @section sec_rest Enabling REST for entities and the log
  109. * Here are the steps to take to use the REST operations provided by Drupal
  110. * Core:
  111. * - Enable the REST module, plus Basic Auth (or another authentication method)
  112. * and HAL.
  113. * - Node entity support is configured by default. If you would like to support
  114. * other types of entities, you can copy
  115. * core/modules/rest/config/install/rest.settings.yml to your sync
  116. * configuration directory, appropriately modified for other entity types,
  117. * and import it. Support for GET on the log from the Database Logging module
  118. * can also be enabled in this way; in this case, the 'entity:node' line
  119. * in the configuration would be replaced by the appropriate plugin ID,
  120. * 'dblog'.
  121. * - Set up permissions to allow the desired REST operations for a role, and set
  122. * up one or more user accounts to perform the operations.
  123. * - To perform a REST operation, send a request to either the canonical URL
  124. * for an entity (such as node/12345 for a node), or if the entity does not
  125. * have a canonical URL, a URL like entity/(type)/(ID). The URL for a log
  126. * entry is dblog/(ID). The request must have the following properties:
  127. * - The request method must be set to the REST method you are using (POST,
  128. * GET, PATCH, etc.).
  129. * - The content type for the data you send, or the accept type for the
  130. * data you are receiving, must be set to 'application/hal+json'.
  131. * - If you are sending data, it must be JSON-encoded.
  132. * - You'll also need to make sure the authentication information is sent
  133. * with the request, unless you have allowed access to anonymous users.
  134. *
  135. * For more detailed information on setting up REST, see
  136. * https://www.drupal.org/documentation/modules/rest.
  137. *
  138. * @section sec_plugins Defining new REST plugins
  139. * The REST framework in the REST module has support built in for entities, but
  140. * it is also an extensible plugin-based system. REST plugins implement
  141. * interface \Drupal\rest\Plugin\ResourceInterface, and generally extend base
  142. * class \Drupal\rest\Plugin\ResourceBase. They are annotated with
  143. * \Drupal\rest\Annotation\RestResource annotation, and must be in plugin
  144. * namespace subdirectory Plugin\rest\resource. For more information on how to
  145. * create plugins, see the @link plugin_api Plugin API topic. @endlink
  146. *
  147. * If you create a new REST plugin, you will also need to enable it by
  148. * providing default configuration or configuration import, as outlined in
  149. * @ref sec_rest above.
  150. *
  151. * @section sec_integrate Integrating data from other sites into Drupal
  152. * If you want to integrate data from other web sites into Drupal, here are
  153. * some notes:
  154. * - There are contributed modules available for integrating many third-party
  155. * sites into Drupal. Search on https://www.drupal.org/project/project_module
  156. * - If there is not an existing module, you will need to find documentation on
  157. * the specific web services API for the site you are trying to integrate.
  158. * - There are several classes and functions that are useful for interacting
  159. * with web services:
  160. * - You should make requests using the 'http_client' service, which
  161. * implements \GuzzleHttp\ClientInterface. See the
  162. * @link container Services topic @endlink for more information on
  163. * services. If you cannot use dependency injection to retrieve this
  164. * service, the \Drupal::httpClient() method is available. A good example
  165. * of how to use this service can be found in
  166. * \Drupal\aggregator\Plugin\aggregator\fetcher\DefaultFetcher
  167. * - \Drupal\Component\Serialization\Json (JSON encoding and decoding).
  168. * - PHP has functions and classes for parsing XML; see
  169. * http://php.net/manual/refs.xml.php
  170. * @}
  171. */
  172. /**
  173. * @defgroup state_api State API
  174. * @{
  175. * Information about the State API.
  176. *
  177. * The State API is one of several methods in Drupal for storing information.
  178. * See the @link info_types Information types topic @endlink for an
  179. * overview of the different types of information.
  180. *
  181. * The basic entry point into the State API is \Drupal::state(), which returns
  182. * an object of class \Drupal\Core\State\StateInterface. This class has
  183. * methods for storing and retrieving state information; each piece of state
  184. * information is associated with a string-valued key. Example:
  185. * @code
  186. * // Get the state class.
  187. * $state = \Drupal::state();
  188. * // Find out when cron was last run; the key is 'system.cron_last'.
  189. * $time = $state->get('system.cron_last');
  190. * // Set the cron run time to the current request time.
  191. * $state->set('system.cron_last', REQUEST_TIME);
  192. * @endcode
  193. *
  194. * For more on the State API, see https://www.drupal.org/developing/api/8/state
  195. * @}
  196. */
  197. /**
  198. * @defgroup config_api Configuration API
  199. * @{
  200. * Information about the Configuration API.
  201. *
  202. * The Configuration API is one of several methods in Drupal for storing
  203. * information. See the @link info_types Information types topic @endlink for
  204. * an overview of the different types of information. The sections below have
  205. * more information about the configuration API; see
  206. * https://www.drupal.org/developing/api/8/configuration for more details.
  207. *
  208. * @section sec_storage Configuration storage
  209. * In Drupal, there is a concept of the "active" configuration, which is the
  210. * configuration that is currently in use for a site. The storage used for the
  211. * active configuration is configurable: it could be in the database, in files
  212. * in a particular directory, or in other storage backends; the default storage
  213. * is in the database. Module developers must use the configuration API to
  214. * access the active configuration, rather than being concerned about the
  215. * details of where and how it is stored.
  216. *
  217. * Configuration is divided into individual objects, each of which has a
  218. * unique name or key. Some modules will have only one configuration object,
  219. * typically called 'mymodule.settings'; some modules will have many. Within
  220. * a configuration object, configuration settings have data types (integer,
  221. * string, Boolean, etc.) and settings can also exist in a nested hierarchy,
  222. * known as a "mapping".
  223. *
  224. * Configuration can also be overridden on a global, per-language, or
  225. * per-module basis. See https://www.drupal.org/node/1928898 for more
  226. * information.
  227. *
  228. * @section sec_yaml Configuration YAML files
  229. * Whether or not configuration files are being used for the active
  230. * configuration storage on a particular site, configuration files are always
  231. * used for:
  232. * - Defining the default configuration for an extension (module, theme, or
  233. * profile), which is imported to the active storage when the extension is
  234. * enabled. These configuration items are located in the config/install
  235. * sub-directory of the extension. Note that changes to this configuration
  236. * after a module or theme is already enabled have no effect; to make a
  237. * configuration change after a module or theme is enabled, you would need to
  238. * uninstall/reinstall or use a hook_update_N() function.
  239. * - Defining optional configuration for a module or theme. Optional
  240. * configuration items are located in the config/optional sub-directory of the
  241. * extension. These configuration items have dependencies that are not
  242. * explicit dependencies of the extension, so they are only installed if all
  243. * dependencies are met. For example, in the scenario that module A defines a
  244. * dependency which requires module B, but module A is installed first and
  245. * module B some time later, then module A's config/optional directory will be
  246. * scanned at that time for newly met dependencies, and the configuration will
  247. * be installed then. If module B is never installed, the configuration item
  248. * will not be installed either.
  249. * - Exporting and importing configuration.
  250. *
  251. * The file storage format for configuration information in Drupal is
  252. * @link http://wikipedia.org/wiki/YAML YAML files. @endlink Configuration is
  253. * divided into files, each containing one configuration object. The file name
  254. * for a configuration object is equal to the unique name of the configuration,
  255. * with a '.yml' extension. The default configuration files for each module are
  256. * placed in the config/install directory under the top-level module directory,
  257. * so look there in most Core modules for examples.
  258. *
  259. * @section sec_schema Configuration schema and translation
  260. * Each configuration file has a specific structure, which is expressed as a
  261. * YAML-based configuration schema. The configuration schema details the
  262. * structure of the configuration, its data types, and which of its values need
  263. * to be translatable. Each module needs to define its configuration schema in
  264. * files in the config/schema directory under the top-level module directory, so
  265. * look there in most Core modules for examples.
  266. *
  267. * Configuration can be internationalized; see the
  268. * @link i18n Internationalization topic @endlink for more information. Data
  269. * types label, text, and date_format in configuration schema are translatable;
  270. * string is non-translatable text (the 'translatable' property on a schema
  271. * data type definition indicates that it is translatable).
  272. *
  273. * @section sec_simple Simple configuration
  274. * The simple configuration API should be used for information that will always
  275. * have exactly one copy or version. For instance, if your module has a
  276. * setting that is either on or off, then this is only defined once, and it
  277. * would be a Boolean-valued simple configuration setting.
  278. *
  279. * The first task in using the simple configuration API is to define the
  280. * configuration file structure, file name, and schema of your settings (see
  281. * @ref sec_yaml above). Once you have done that, you can retrieve the active
  282. * configuration object that corresponds to configuration file mymodule.foo.yml
  283. * with a call to:
  284. * @code
  285. * $config = \Drupal::config('mymodule.foo');
  286. * @endcode
  287. *
  288. * This will be an object of class \Drupal\Core\Config\Config, which has methods
  289. * for getting configuration information. For instance, if your YAML file
  290. * structure looks like this:
  291. * @code
  292. * enabled: '0'
  293. * bar:
  294. * baz: 'string1'
  295. * boo: 34
  296. * @endcode
  297. * you can make calls such as:
  298. * @code
  299. * // Get a single value.
  300. * $enabled = $config->get('enabled');
  301. * // Get an associative array.
  302. * $bar = $config->get('bar');
  303. * // Get one element of the array.
  304. * $bar_baz = $config->get('bar.baz');
  305. * @endcode
  306. *
  307. * The Config object that was obtained and used in the previous examples does
  308. * not allow you to change configuration. If you want to change configuration,
  309. * you will instead need to get the Config object by making a call to
  310. * getEditable() on the config factory:
  311. * @code
  312. * $config =\Drupal::service('config.factory')->getEditable('mymodule.foo');
  313. * @endcode
  314. *
  315. * Individual configuration values can be changed or added using the set()
  316. * method and saved using the save() method:
  317. * @code
  318. * // Set a scalar value.
  319. * $config->set('enabled', 1);
  320. * // Save the configuration.
  321. * $config->save();
  322. * @endcode
  323. *
  324. * Configuration values can also be unset using the clear() method, which is
  325. * also chainable:
  326. * @code
  327. * $config->clear('bar.boo')->save();
  328. * $config_data = $config->get('bar');
  329. * @endcode
  330. * In this example $config_data would return an array with one key - 'baz' -
  331. * because 'boo' was unset.
  332. *
  333. * @section sec_entity Configuration entities
  334. * In contrast to the simple configuration settings described in the previous
  335. * section, if your module allows users to create zero or more items (where
  336. * "items" are things like content type definitions, view definitions, and the
  337. * like), then you need to define a configuration entity type to store your
  338. * configuration. Creating an entity type, loading entities, and querying them
  339. * are outlined in the @link entity_api Entity API topic. @endlink Here are a
  340. * few additional steps and notes specific to configuration entities:
  341. * - For examples, look for classes that implement
  342. * \Drupal\Core\Config\Entity\ConfigEntityInterface -- one good example is
  343. * the \Drupal\user\Entity\Role entity type.
  344. * - In the entity type annotation, you will need to define a 'config_prefix'
  345. * string. When Drupal stores a configuration item, it will be given a name
  346. * composed of your module name, your chosen config prefix, and the ID of
  347. * the individual item, separated by '.'. For example, in the Role entity,
  348. * the config prefix is 'role', so one configuration item might be named
  349. * user.role.anonymous, with configuration file user.role.anonymous.yml.
  350. * - You will need to define the schema for your configuration in your
  351. * modulename.schema.yml file, with an entry for 'modulename.config_prefix.*'.
  352. * For example, for the Role entity, the file user.schema.yml has an entry
  353. * user.role.*; see @ref sec_yaml above for more information.
  354. * - Your module can provide default/optional configuration entities in YAML
  355. * files; see @ref sec_yaml above for more information.
  356. * - Some configuration entities have dependencies on other configuration
  357. * entities, and module developers need to consider this so that configuration
  358. * can be imported, uninstalled, and synchronized in the right order. For
  359. * example, a field display configuration entity would need to depend on
  360. * field configuration, which depends on field and bundle configuration.
  361. * Configuration entity classes expose dependencies by overriding the
  362. * \Drupal\Core\Config\Entity\ConfigEntityInterface::calculateDependencies()
  363. * method.
  364. * - On routes for paths starting with '/admin' or otherwise designated as
  365. * administration paths (such as node editing when it is set as an admin
  366. * operation), if they have configuration entity placeholders, configuration
  367. * entities are normally loaded in their original language, without
  368. * translations or other overrides. This is usually desirable, because most
  369. * admin paths are for editing configuration, and you need that to be in the
  370. * source language and to lack possibly dynamic overrides. If for some reason
  371. * you need to have your configuration entity loaded in the currently-selected
  372. * language on an admin path (for instance, if you go to
  373. * example.com/es/admin/your_path and you need the entity to be in Spanish),
  374. * then you can add a 'with_config_overrides' parameter option to your route.
  375. * The same applies if you need to load the entity with overrides (or
  376. * translated) on an admin path like '/node/add/article' (when configured to
  377. * be an admin path). Here's an example using the configurable_language config
  378. * entity:
  379. * @code
  380. * mymodule.myroute:
  381. * path: '/admin/mypath/{configurable_language}'
  382. * defaults:
  383. * _controller: '\Drupal\mymodule\MyController::myMethod'
  384. * options:
  385. * parameters:
  386. * configurable_language:
  387. * type: entity:configurable_language
  388. * with_config_overrides: TRUE
  389. * @endcode
  390. * With the route defined this way, the $configurable_language parameter to
  391. * your controller method will come in translated to the current language.
  392. * Without the parameter options section, it would be in the original
  393. * language, untranslated.
  394. *
  395. * @see i18n
  396. *
  397. * @}
  398. */
  399. /**
  400. * @defgroup cache Cache API
  401. * @{
  402. * Information about the Drupal Cache API
  403. *
  404. * @section basics Basics
  405. *
  406. * Note: If not specified, all of the methods mentioned here belong to
  407. * \Drupal\Core\Cache\CacheBackendInterface.
  408. *
  409. * The Cache API is used to store data that takes a long time to compute.
  410. * Caching can either be permanent or valid only for a certain timespan, and
  411. * the cache can contain any type of data.
  412. *
  413. * To use the Cache API:
  414. * - Request a cache object through \Drupal::cache() or by injecting a cache
  415. * service.
  416. * - Define a Cache ID (cid) value for your data. A cid is a string, which must
  417. * contain enough information to uniquely identify the data. For example, if
  418. * your data contains translated strings, then your cid value must include the
  419. * interface text language selected for page.
  420. * - Call the get() method to attempt a cache read, to see if the cache already
  421. * contains your data.
  422. * - If your data is not already in the cache, compute it and add it to the
  423. * cache using the set() method. The third argument of set() can be used to
  424. * control the lifetime of your cache item.
  425. *
  426. * Example:
  427. * @code
  428. * $cid = 'mymodule_example:' . \Drupal::languageManager()->getCurrentLanguage()->getId();
  429. *
  430. * $data = NULL;
  431. * if ($cache = \Drupal::cache()->get($cid)) {
  432. * $data = $cache->data;
  433. * }
  434. * else {
  435. * $data = my_module_complicated_calculation();
  436. * \Drupal::cache()->set($cid, $data);
  437. * }
  438. * @endcode
  439. *
  440. * Note the use of $data and $cache->data in the above example. Calls to
  441. * \Drupal::cache()->get() return a record that contains the information stored
  442. * by \Drupal::cache()->set() in the data property as well as additional meta
  443. * information about the cached data. In order to make use of the cached data
  444. * you can access it via $cache->data.
  445. *
  446. * @section bins Cache bins
  447. *
  448. * Cache storage is separated into "bins", each containing various cache items.
  449. * Each bin can be configured separately; see @ref configuration.
  450. *
  451. * When you request a cache object, you can specify the bin name in your call to
  452. * \Drupal::cache(). Alternatively, you can request a bin by getting service
  453. * "cache.nameofbin" from the container. The default bin is called "default", with
  454. * service name "cache.default", it is used to store common and frequently used
  455. * caches.
  456. *
  457. * Other common cache bins are the following:
  458. * - bootstrap: Data needed from the beginning to the end of most requests,
  459. * that has a very strict limit on variations and is invalidated rarely.
  460. * - render: Contains cached HTML strings like cached pages and blocks, can
  461. * grow to large size.
  462. * - data: Contains data that can vary by path or similar context.
  463. * - discovery: Contains cached discovery data for things such as plugins,
  464. * views_data, or YAML discovered data such as library info.
  465. *
  466. * A module can define a cache bin by defining a service in its
  467. * modulename.services.yml file as follows (substituting the desired name for
  468. * "nameofbin"):
  469. * @code
  470. * cache.nameofbin:
  471. * class: Drupal\Core\Cache\CacheBackendInterface
  472. * tags:
  473. * - { name: cache.bin }
  474. * factory: cache_factory:get
  475. * arguments: [nameofbin]
  476. * @endcode
  477. * See the @link container Services topic @endlink for more on defining
  478. * services.
  479. *
  480. * @section delete Deletion
  481. *
  482. * There are two ways to remove an item from the cache:
  483. * - Deletion (using delete(), deleteMultiple() or deleteAll()) permanently
  484. * removes the item from the cache.
  485. * - Invalidation (using invalidate(), invalidateMultiple() or invalidateAll())
  486. * is a "soft" delete that only marks items as "invalid", meaning "not fresh"
  487. * or "not fresh enough". Invalid items are not usually returned from the
  488. * cache, so in most ways they behave as if they have been deleted. However,
  489. * it is possible to retrieve invalid items, if they have not yet been
  490. * permanently removed by the garbage collector, by passing TRUE as the second
  491. * argument for get($cid, $allow_invalid).
  492. *
  493. * Use deletion if a cache item is no longer useful; for instance, if the item
  494. * contains references to data that has been deleted. Use invalidation if the
  495. * cached item may still be useful to some callers until it has been updated
  496. * with fresh data. The fact that it was fresh a short while ago may often be
  497. * sufficient.
  498. *
  499. * Invalidation is particularly useful to protect against stampedes. Rather than
  500. * having multiple concurrent requests updating the same cache item when it
  501. * expires or is deleted, there can be one request updating the cache, while the
  502. * other requests can proceed using the stale value. As soon as the cache item
  503. * has been updated, all future requests will use the updated value.
  504. *
  505. * @section tags Cache Tags
  506. *
  507. * The fourth argument of the set() method can be used to specify cache tags,
  508. * which are used to identify which data is included in each cache item. A cache
  509. * item can have multiple cache tags (an array of cache tags), and each cache
  510. * tag is a string. The convention is to generate cache tags of the form
  511. * [prefix]:[suffix]. Usually, you'll want to associate the cache tags of
  512. * entities, or entity listings. You won't have to manually construct cache tags
  513. * for them — just get their cache tags via
  514. * \Drupal\Core\Cache\CacheableDependencyInterface::getCacheTags() and
  515. * \Drupal\Core\Entity\EntityTypeInterface::getListCacheTags().
  516. * Data that has been tagged can be invalidated as a group: no matter the Cache
  517. * ID (cid) of the cache item, no matter in which cache bin a cache item lives;
  518. * as long as it is tagged with a certain cache tag, it will be invalidated.
  519. *
  520. * Because of that, cache tags are a solution to the cache invalidation problem:
  521. * - For caching to be effective, each cache item must only be invalidated when
  522. * absolutely necessary. (i.e. maximizing the cache hit ratio.)
  523. * - For caching to be correct, each cache item that depends on a certain thing
  524. * must be invalidated whenever that certain thing is modified.
  525. *
  526. * A typical scenario: a user has modified a node that appears in two views,
  527. * three blocks and on twelve pages. Without cache tags, we couldn't possibly
  528. * know which cache items to invalidate, so we'd have to invalidate everything:
  529. * we had to sacrifice effectiveness to achieve correctness. With cache tags, we
  530. * can have both.
  531. *
  532. * Example:
  533. * @code
  534. * // A cache item with nodes, users, and some custom module data.
  535. * $tags = array(
  536. * 'my_custom_tag',
  537. * 'node:1',
  538. * 'node:3',
  539. * 'user:7',
  540. * );
  541. * \Drupal::cache()->set($cid, $data, CacheBackendInterface::CACHE_PERMANENT, $tags);
  542. *
  543. * // Invalidate all cache items with certain tags.
  544. * \Drupal\Core\Cache\Cache::invalidateTags(array('user:1'));
  545. * @endcode
  546. *
  547. * Drupal is a content management system, so naturally you want changes to your
  548. * content to be reflected everywhere, immediately. That's why we made sure that
  549. * every entity type in Drupal 8 automatically has support for cache tags: when
  550. * you save an entity, you can be sure that the cache items that have the
  551. * corresponding cache tags will be invalidated.
  552. * This also is the case when you define your own entity types: you'll get the
  553. * exact same cache tag invalidation as any of the built-in entity types, with
  554. * the ability to override any of the default behavior if needed.
  555. * See \Drupal\Core\Cache\CacheableDepenencyInterface::getCacheTags(),
  556. * \Drupal\Core\Entity\EntityTypeInterface::getListCacheTags(),
  557. * \Drupal\Core\Entity\Entity::invalidateTagsOnSave() and
  558. * \Drupal\Core\Entity\Entity::invalidateTagsOnDelete().
  559. *
  560. * @section context Cache contexts
  561. *
  562. * Some computed data depends on contextual data, such as the user roles of the
  563. * logged-in user who is viewing a page, the language the page is being rendered
  564. * in, the theme being used, etc. When caching the output of such a calculation,
  565. * you must cache each variation separately, along with information about which
  566. * variation of the contextual data was used in the calculatation. The next time
  567. * the computed data is needed, if the context matches that for an existing
  568. * cached data set, the cached data can be reused; if no context matches, a new
  569. * data set can be calculated and cached for later use.
  570. *
  571. * Cache contexts are services tagged with 'cache.context', whose classes
  572. * implement \Drupal\Core\Cache\Context\CacheContextInterface. See
  573. * https://www.drupal.org/developing/api/8/cache/contexts for more information
  574. * on cache contexts, including a list of the contexts that exist in Drupal
  575. * core, and information on how to define your own contexts. See the
  576. * @link container Services and the Dependency Injection Container @endlink
  577. * topic for more information about services.
  578. *
  579. * Typically, the cache context is specified as part of the #cache property
  580. * of a render array; see the Caching section of the
  581. * @link theme_render Render API overview topic @endlink for details.
  582. *
  583. * @section configuration Configuration
  584. *
  585. * By default cached data is stored in the database. This can be configured
  586. * though so that all cached data, or that of an individual cache bin, uses a
  587. * different cache backend, such as APCu or Memcache, for storage.
  588. *
  589. * In a settings.php file, you can override the service used for a particular
  590. * cache bin. For example, if your service implementation of
  591. * \Drupal\Core\Cache\CacheBackendInterface was called cache.custom, the
  592. * following line would make Drupal use it for the 'cache_render' bin:
  593. * @code
  594. * $settings['cache']['bins']['render'] = 'cache.custom';
  595. * @endcode
  596. *
  597. * Additionally, you can register your cache implementation to be used by
  598. * default for all cache bins with:
  599. * @code
  600. * $settings['cache']['default'] = 'cache.custom';
  601. * @endcode
  602. *
  603. * For cache bins that are stored in the database, the number of rows is limited
  604. * to 5000 by default. This can be changed for all database cache bins. For
  605. * example, to instead limit the number of rows to 50000:
  606. * @code
  607. * $settings['database_cache_max_rows']['default'] = 50000;
  608. * @endcode
  609. *
  610. * Or per bin (in this example we allow infinite entries):
  611. * @code
  612. * $settings['database_cache_max_rows']['bins']['dynamic_page_cache'] = -1;
  613. * @endcode
  614. *
  615. * For monitoring reasons it might be useful to figure out the amount of data
  616. * stored in tables. The following SQL snippet can be used for that:
  617. * @code
  618. * SELECT table_name AS `Table`, table_rows AS 'Num. of Rows',
  619. * ROUND(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` FROM
  620. * information_schema.TABLES WHERE table_schema = '***DATABASE_NAME***' AND
  621. * table_name LIKE 'cache_%' ORDER BY (data_length + index_length) DESC
  622. * LIMIT 10;
  623. * @endcode
  624. *
  625. * @see \Drupal\Core\Cache\DatabaseBackend
  626. *
  627. * Finally, you can chain multiple cache backends together, see
  628. * \Drupal\Core\Cache\ChainedFastBackend and \Drupal\Core\Cache\BackendChain.
  629. *
  630. * @see https://www.drupal.org/node/1884796
  631. * @}
  632. */
  633. /**
  634. * @defgroup user_api User accounts, permissions, and roles
  635. * @{
  636. * API for user accounts, access checking, roles, and permissions.
  637. *
  638. * @section sec_overview Overview and terminology
  639. * Drupal's permission system is based on the concepts of accounts, roles,
  640. * and permissions.
  641. *
  642. * Users (site visitors) have accounts, which include a user name, an email
  643. * address, a password (or some other means of authentication), and possibly
  644. * other fields (if defined on the site). Anonymous users have an implicit
  645. * account that does not have a real user name or any account information.
  646. *
  647. * Each user account is assigned one or more roles. The anonymous user account
  648. * automatically has the anonymous user role; real user accounts
  649. * automatically have the authenticated user role, plus any roles defined on
  650. * the site that they have been assigned.
  651. *
  652. * Each role, including the special anonymous and authenticated user roles, is
  653. * granted one or more named permissions, which allow them to perform certain
  654. * tasks or view certain content on the site. It is possible to designate a
  655. * role to be the "administrator" role; if this is set up, this role is
  656. * automatically granted all available permissions whenever a module is
  657. * enabled that defines permissions.
  658. *
  659. * All code in Drupal that allows users to perform tasks or view content must
  660. * check that the current user has the correct permission before allowing the
  661. * action. In the standard case, access checking consists of answering the
  662. * question "Does the current user have permission 'foo'?", and allowing or
  663. * denying access based on the answer. Note that access checking should nearly
  664. * always be done at the permission level, not by checking for a particular role
  665. * or user ID, so that site administrators can set up user accounts and roles
  666. * appropriately for their particular sites.
  667. *
  668. * @section sec_define Defining permissions
  669. * Modules define permissions via a $module.permissions.yml file. See
  670. * \Drupal\user\PermissionHandler for documentation of permissions.yml files.
  671. *
  672. * @section sec_access Access permission checking
  673. * Depending on the situation, there are several methods for ensuring that
  674. * access checks are done properly in Drupal:
  675. * - Routes: When you register a route, include a 'requirements' section that
  676. * either gives the machine name of the permission that is needed to visit the
  677. * URL of the route, or tells Drupal to use an access check method or service
  678. * to check access. See the @link menu Routing topic @endlink for more
  679. * information.
  680. * - Entities: Access for various entity operations is designated either with
  681. * simple permissions or access control handler classes in the entity
  682. * annotation. See the @link entity_api Entity API topic @endlink for more
  683. * information.
  684. * - Other code: There is a 'current_user' service, which can be injected into
  685. * classes to provide access to the current user account (see the
  686. * @link container Services and Dependency Injection topic @endlink for more
  687. * information on dependency injection). In code that cannot use dependency
  688. * injection, you can access this service and retrieve the current user
  689. * account object by calling \Drupal::currentUser(). Once you have a user
  690. * object for the current user (implementing \Drupal\user\UserInterface), you
  691. * can call inherited method
  692. * \Drupal\Core\Session\AccountInterface::hasPermission() to check
  693. * permissions, or pass this object into other functions/methods.
  694. * - Forms: Each element of a form array can have a Boolean '#access' property,
  695. * which determines whether that element is visible and/or usable. This is a
  696. * common need in forms, so the current user service (described above) is
  697. * injected into the form base class as method
  698. * \Drupal\Core\Form\FormBase::currentUser().
  699. *
  700. * @section sec_entities User and role objects
  701. * User objects in Drupal are entity items, implementing
  702. * \Drupal\user\UserInterface. Role objects in Drupal are also entity items,
  703. * implementing \Drupal\user\RoleInterface. See the
  704. * @link entity_api Entity API topic @endlink for more information about
  705. * entities in general (including how to load, create, modify, and query them).
  706. *
  707. * Roles often need to be manipulated in automated test code, such as to add
  708. * permissions to them. Here's an example:
  709. * @code
  710. * $role = \Drupal\user\Entity\Role::load('authenticated');
  711. * $role->grantPermission('access comments');
  712. * $role->save();
  713. * @endcode
  714. *
  715. * Other important interfaces:
  716. * - \Drupal\Core\Session\AccountInterface: The part of UserInterface that
  717. * deals with access checking. In writing code that checks access, your
  718. * method parameters should use this interface, not UserInterface.
  719. * - \Drupal\Core\Session\AccountProxyInterface: The interface for the
  720. * current_user service (described above).
  721. * @}
  722. */
  723. /**
  724. * @defgroup container Services and Dependency Injection Container
  725. * @{
  726. * Overview of the Dependency Injection Container and Services.
  727. *
  728. * @section sec_overview Overview of container, injection, and services
  729. * The Services and Dependency Injection Container concepts have been adopted by
  730. * Drupal from the @link http://symfony.com/ Symfony framework. @endlink A
  731. * "service" (such as accessing the database, sending email, or translating user
  732. * interface text) is defined (given a name and an interface or at least a
  733. * class that defines the methods that may be called), and a default class is
  734. * designated to provide the service. These two steps must be done together, and
  735. * can be done by Drupal Core or a module. Other modules can then define
  736. * alternative classes to provide the same services, overriding the default
  737. * classes. Classes and functions that need to use the service should always
  738. * instantiate the class via the dependency injection container (also known
  739. * simply as the "container"), rather than instantiating a particular service
  740. * provider class directly, so that they get the correct class (default or
  741. * overridden).
  742. *
  743. * See https://www.drupal.org/node/2133171 for more detailed information on
  744. * services and the dependency injection container.
  745. *
  746. * @section sec_discover Discovering existing services
  747. * Drupal core defines many core services in the core.services.yml file (in the
  748. * top-level core directory). Some Drupal Core modules and contributed modules
  749. * also define services in modulename.services.yml files. API reference sites
  750. * (such as https://api.drupal.org) generate lists of all existing services from
  751. * these files. Look for the Services link in the API Navigation block.
  752. * Alternatively you can look through the individual files manually.
  753. *
  754. * A typical service definition in a *.services.yml file looks like this:
  755. * @code
  756. * path.alias_manager:
  757. * class: Drupal\Core\Path\AliasManager
  758. * arguments: ['@path.crud', '@path.alias_whitelist', '@language_manager']
  759. * @endcode
  760. * Some services use other services as factories; a typical service definition
  761. * is:
  762. * @code
  763. * cache.entity:
  764. * class: Drupal\Core\Cache\CacheBackendInterface
  765. * tags:
  766. * - { name: cache.bin }
  767. * factory: cache_factory:get
  768. * arguments: [entity]
  769. * @endcode
  770. *
  771. * The first line of a service definition gives the unique machine name of the
  772. * service. This is often prefixed by the module name if provided by a module;
  773. * however, by convention some service names are prefixed by a group name
  774. * instead, such as cache.* for cache bins and plugin.manager.* for plugin
  775. * managers.
  776. *
  777. * The class line either gives the default class that provides the service, or
  778. * if the service uses a factory class, the interface for the service. If the
  779. * class depends on other services, the arguments line lists the machine
  780. * names of the dependencies (preceded by '@'); objects for each of these
  781. * services are instantiated from the container and passed to the class
  782. * constructor when the service class is instantiated. Other arguments can also
  783. * be passed in; see the section at https://www.drupal.org/node/2133171 for more
  784. * detailed information.
  785. *
  786. * Services using factories can be defined as shown in the above example, if the
  787. * factory is itself a service. The factory can also be a class; details of how
  788. * to use service factories can be found in the section at
  789. * https://www.drupal.org/node/2133171.
  790. *
  791. * @section sec_container Accessing a service through the container
  792. * As noted above, if you need to use a service in your code, you should always
  793. * instantiate the service class via a call to the container, using the machine
  794. * name of the service, so that the default class can be overridden. There are
  795. * several ways to make sure this happens:
  796. * - For service-providing classes, see other sections of this documentation
  797. * describing how to pass services as arguments to the constructor.
  798. * - Plugin classes, controllers, and similar classes have create() or
  799. * createInstance() methods that are used to create an instance of the class.
  800. * These methods come from different interfaces, and have different
  801. * arguments, but they all include an argument $container of type
  802. * \Symfony\Component\DependencyInjection\ContainerInterface.
  803. * If you are defining one of these classes, in the create() or
  804. * createInstance() method, call $container->get('myservice.name') to
  805. * instantiate a service. The results of these calls are generally passed to
  806. * the class constructor and saved as member variables in the class.
  807. * - For functions and class methods that do not have access to either of
  808. * the above methods of dependency injection, you can use service location to
  809. * access services, via a call to the global \Drupal class. This class has
  810. * special methods for accessing commonly-used services, or you can call a
  811. * generic method to access any service. Examples:
  812. * @code
  813. * // Retrieve the entity.manager service object (special method exists).
  814. * $manager = \Drupal::entityManager();
  815. * // Retrieve the service object for machine name 'foo.bar'.
  816. * $foobar = \Drupal::service('foo.bar');
  817. * @endcode
  818. *
  819. * As a note, you should always use dependency injection (via service arguments
  820. * or create()/createInstance() methods) if possible to instantiate services,
  821. * rather than service location (via the \Drupal class), because:
  822. * - Dependency injection facilitates writing unit tests, since the container
  823. * argument can be mocked and the create() method can be bypassed by using
  824. * the class constructor. If you use the \Drupal class, unit tests are much
  825. * harder to write and your code has more dependencies.
  826. * - Having the service interfaces on the class constructor and member variables
  827. * is useful for IDE auto-complete and self-documentation.
  828. *
  829. * @section sec_define Defining a service
  830. * If your module needs to define a new service, here are the steps:
  831. * - Choose a unique machine name for your service. Typically, this should
  832. * start with your module name. Example: mymodule.myservice.
  833. * - Create a PHP interface to define what your service does.
  834. * - Create a default class implementing your interface that provides your
  835. * service. If your class needs to use existing services (such as database
  836. * access), be sure to make these services arguments to your class
  837. * constructor, and save them in member variables. Also, if the needed
  838. * services are provided by other modules and not Drupal Core, you'll want
  839. * these modules to be dependencies of your module.
  840. * - Add an entry to a modulename.services.yml file for the service. See
  841. * @ref sec_discover above, or existing *.services.yml files in Core, for the
  842. * syntax; it will start with your machine name, refer to your default class,
  843. * and list the services that need to be passed into your constructor.
  844. *
  845. * Services can also be defined dynamically, as in the
  846. * \Drupal\Core\CoreServiceProvider class, but this is less common for modules.
  847. *
  848. * @section sec_tags Service tags
  849. * Some services have tags, which are defined in the service definition. See
  850. * @link service_tag Service Tags @endlink for usage.
  851. *
  852. * @section sec_injection Overriding the default service class
  853. * Modules can override the default classes used for services. Here are the
  854. * steps:
  855. * - Define a class in the top-level namespace for your module
  856. * (Drupal\my_module), whose name is the camel-case version of your module's
  857. * machine name followed by "ServiceProvider" (for example, if your module
  858. * machine name is my_module, the class must be named
  859. * MyModuleServiceProvider).
  860. * - The class needs to implement
  861. * \Drupal\Core\DependencyInjection\ServiceModifierInterface, which is
  862. * typically done by extending
  863. * \Drupal\Core\DependencyInjection\ServiceProviderBase.
  864. * - The class needs to contain one method: alter(). This method does the
  865. * actual work of telling Drupal to use your class instead of the default.
  866. * Here's an example:
  867. * @code
  868. * public function alter(ContainerBuilder $container) {
  869. * // Override the language_manager class with a new class.
  870. * $definition = $container->getDefinition('language_manager');
  871. * $definition->setClass('Drupal\my_module\MyLanguageManager');
  872. * }
  873. * @endcode
  874. * Note that $container here is an instance of
  875. * \Drupal\Core\DependencyInjection\ContainerBuilder.
  876. *
  877. * @see https://www.drupal.org/node/2133171
  878. * @see core.services.yml
  879. * @see \Drupal
  880. * @see \Symfony\Component\DependencyInjection\ContainerInterface
  881. * @see plugin_api
  882. * @see menu
  883. * @}
  884. */
  885. /**
  886. * @defgroup listing_page_service Page header for Services page
  887. * @{
  888. * Introduction to services
  889. *
  890. * A "service" (such as accessing the database, sending email, or translating
  891. * user interface text) can be defined by a module or Drupal core. Defining a
  892. * service means giving it a name and designating a default class to provide the
  893. * service; ideally, there should also be an interface that defines the methods
  894. * that may be called. Services are collected into the Dependency Injection
  895. * Container, and can be overridden to use different classes or different
  896. * instantiation by modules. See the
  897. * @link container Services and Dependency Injection Container topic @endlink
  898. * for details.
  899. *
  900. * Some services have tags, which are defined in the service definition. Tags
  901. * are used to define a group of related services, or to specify some aspect of
  902. * how the service behaves. See the
  903. * @link service_tag Service Tags topic @endlink for more information.
  904. *
  905. * @see container
  906. * @see service_tag
  907. *
  908. * @}
  909. */
  910. /**
  911. * @defgroup typed_data Typed Data API
  912. * @{
  913. * API for describing data based on a set of available data types.
  914. *
  915. * PHP has data types, such as int, string, float, array, etc., and it is an
  916. * object-oriented language that lets you define classes and interfaces.
  917. * However, in some cases, it is useful to be able to define an abstract
  918. * type (as in an interface, free of implementation details), that still has
  919. * properties (which an interface cannot) as well as meta-data. The Typed Data
  920. * API provides this abstraction.
  921. *
  922. * @section sec_overview Overview
  923. * Each data type in the Typed Data API is a plugin class (annotation class
  924. * example: \Drupal\Core\TypedData\Annotation\DataType); these plugins are
  925. * managed by the typed_data_manager service (by default
  926. * \Drupal\Core\TypedData\TypedDataManager). Each data object encapsulates a
  927. * single piece of data, provides access to the metadata, and provides
  928. * validation capability. Also, the typed data plugins have a shorthand
  929. * for easily accessing data values, described in @ref sec_tree.
  930. *
  931. * The metadata of a data object is defined by an object based on a class called
  932. * the definition class (see \Drupal\Core\TypedData\DataDefinitionInterface).
  933. * The class used can vary by data type and can be specified in the data type's
  934. * plugin definition, while the default is set in the $definition_class property
  935. * of the annotation class. The default class is
  936. * \Drupal\Core\TypedData\DataDefinition. For data types provided by a plugin
  937. * deriver, the plugin deriver can set the definition_class property too.
  938. * The metadata object provides information about the data, such as the data
  939. * type, whether it is translatable, the names of its properties (for complex
  940. * types), and who can access it.
  941. *
  942. * See https://www.drupal.org/node/1794140 for more information about the Typed
  943. * Data API.
  944. *
  945. * @section sec_varieties Varieties of typed data
  946. * There are three kinds of typed data: primitive, complex, and list.
  947. *
  948. * @subsection sub_primitive Primitive data types
  949. * Primitive data types wrap PHP data types and also serve as building blocks
  950. * for complex and list typed data. Each primitive data type has an interface
  951. * that extends \Drupal\Core\TypedData\PrimitiveInterface, with getValue()
  952. * and setValue() methods for accessing the data value, and a default plugin
  953. * implementation. Here's a list:
  954. * - \Drupal\Core\TypedData\Type\IntegerInterface: Plugin ID integer,
  955. * corresponds to PHP type int.
  956. * - \Drupal\Core\TypedData\Type\StringInterface: Plugin ID string,
  957. * corresponds to PHP type string.
  958. * - \Drupal\Core\TypedData\Type\FloatInterface: Plugin ID float,
  959. * corresponds to PHP type float.
  960. * - \Drupal\Core\TypedData\Type\BooleanInterface: Plugin ID bool,
  961. * corresponds to PHP type bool.
  962. * - \Drupal\Core\TypedData\Type\BinaryInterface: Plugin ID binary,
  963. * corresponds to a PHP file resource.
  964. * - \Drupal\Core\TypedData\Type\UriInterface: Plugin ID uri.
  965. *
  966. * @subsection sec_complex Complex data
  967. * Complex data types, with interface
  968. * \Drupal\Core\TypedData\ComplexDataInterface, represent data with named
  969. * properties; the properties can be accessed with get() and set() methods.
  970. * The value of each property is itself a typed data object, which can be
  971. * primitive, complex, or list data.
  972. *
  973. * The base type for most complex data is the
  974. * \Drupal\Core\TypedData\Plugin\DataType\Map class, which represents an
  975. * associative array. Map provides its own definition class in the annotation,
  976. * \Drupal\Core\TypedData\MapDataDefinition, and most complex data classes
  977. * extend this class. The getValue() and setValue() methods on the Map class
  978. * enforce the data definition and its property structure.
  979. *
  980. * The Drupal Field API uses complex typed data for its field items, with
  981. * definition class \Drupal\Core\Field\TypedData\FieldItemDataDefinition.
  982. *
  983. * @section sec_list Lists
  984. * List data types, with interface \Drupal\Core\TypedData\ListInterface,
  985. * represent data that is an ordered list of typed data, all of the same type.
  986. * More precisely, the plugins in the list must have the same base plugin ID;
  987. * however, some types (for example field items and entities) are provided by
  988. * plugin derivatives and the sub IDs can be different.
  989. *
  990. * @section sec_tree Tree handling
  991. * Typed data allows you to use shorthand to get data values nested in the
  992. * implicit tree structure of the data. For example, to get the value from
  993. * an entity field item, the Entity Field API allows you to call:
  994. * @code
  995. * $value = $entity->fieldName->propertyName;
  996. * @endcode
  997. * This is really shorthand for:
  998. * @code
  999. * $field_item_list = $entity->get('fieldName');
  1000. * $field_item = $field_item_list->get(0);
  1001. * $property = $field_item->get('propertyName');
  1002. * $value = $property->getValue();
  1003. * @endcode
  1004. * Some notes:
  1005. * - $property, $field_item, and $field_item_list are all typed data objects,
  1006. * while $value is a raw PHP value.
  1007. * - You can call $property->getParent() to get $field_item,
  1008. * $field_item->getParent() to get $field_item_list, or
  1009. * $field_item_list->getParent() to get $typed_entity ($entity wrapped in a
  1010. * typed data object). $typed_entity->getParent() is NULL.
  1011. * - For all of these ->getRoot() returns $typed_entity.
  1012. * - The langcode property is on $field_item_list, but you can access it
  1013. * on $property as well, so that all items will report the same langcode.
  1014. * - When the value of $property is changed by calling $property->setValue(),
  1015. * $property->onChange() will fire, which in turn calls the parent object's
  1016. * onChange() method and so on. This allows parent objects to react upon
  1017. * changes of contained properties or list items.
  1018. *
  1019. * @section sec_defining Defining data types
  1020. * To define a new data type:
  1021. * - Create a class that implements one of the Typed Data interfaces.
  1022. * Typically, you will want to extend one of the classes listed in the
  1023. * sections above as a starting point.
  1024. * - Make your class into a DataType plugin. To do that, put it in namespace
  1025. * \Drupal\yourmodule\Plugin\DataType (where "yourmodule" is your module's
  1026. * short name), and add annotation of type
  1027. * \Drupal\Core\TypedData\Annotation\DataType to the documentation header.
  1028. * See the @link plugin_api Plugin API topic @endlink and the
  1029. * @link annotation Annotations topic @endlink for more information.
  1030. *
  1031. * @section sec_using Using data types
  1032. * The data types of the Typed Data API can be used in several ways, once they
  1033. * have been defined:
  1034. * - In the Field API, data types can be used as the class in the property
  1035. * definition of the field. See the @link field Field API topic @endlink for
  1036. * more information.
  1037. * - In configuration schema files, you can use the unique ID ('id' annotation)
  1038. * from any DataType plugin class as the 'type' value for an entry. See the
  1039. * @link config_api Confuration API topic @endlink for more information.
  1040. * - If you need to create a typed data object in code, first get the
  1041. * typed_data_manager service from the container or by calling
  1042. * \Drupal::typedDataManager(). Then pass the plugin ID to
  1043. * $manager::createDataDefinition() to create an appropriate data definition
  1044. * object. Then pass the data definition object and the value of the data to
  1045. * $manager::create() to create a typed data object.
  1046. *
  1047. * @see plugin_api
  1048. * @see container
  1049. * @}
  1050. */
  1051. /**
  1052. * @defgroup testing Automated tests
  1053. * @{
  1054. * Overview of PHPUnit tests and Simpletest tests.
  1055. *
  1056. * The Drupal project has embraced a philosophy of using automated tests,
  1057. * consisting of both unit tests (which test the functionality of classes at a
  1058. * low level) and functional tests (which test the functionality of Drupal
  1059. * systems at a higher level, usually involving web output). The goal is to
  1060. * have test coverage for all or most of the components and features, and to
  1061. * run the automated tests before any code is changed or added, to make sure
  1062. * it doesn't break any existing functionality (regression testing).
  1063. *
  1064. * In order to implement this philosophy, developers need to do the following:
  1065. * - When making a patch to fix a bug, make sure that the bug fix patch includes
  1066. * a test that fails without the code change and passes with the code change.
  1067. * This helps reviewers understand what the bug is, demonstrates that the code
  1068. * actually fixes the bug, and ensures the bug will not reappear due to later
  1069. * code changes.
  1070. * - When making a patch to implement a new feature, include new unit and/or
  1071. * functional tests in the patch. This serves to both demonstrate that the
  1072. * code actually works, and ensure that later changes do not break the new
  1073. * functionality.
  1074. *
  1075. * @section write_unit Writing PHPUnit tests for classes
  1076. * PHPUnit tests for classes are written using the industry-standard PHPUnit
  1077. * framework. Use a PHPUnit test to test functionality of a class if the Drupal
  1078. * environment (database, settings, etc.) and web browser are not needed for the
  1079. * test, or if the Drupal environment can be replaced by a "mock" object. To
  1080. * write a PHPUnit test:
  1081. * - Define a class that extends \Drupal\Tests\UnitTestCase.
  1082. * - The class name needs to end in the word Test.
  1083. * - The namespace must be a subspace/subdirectory of \Drupal\yourmodule\Tests,
  1084. * where yourmodule is your module's machine name.
  1085. * - The test class file must be named and placed under the
  1086. * yourmodule/tests/src/Unit directory, according to the PSR-4 standard.
  1087. * - Your test class needs a phpDoc comment block with a description and
  1088. * a @group annotation, which gives information about the test.
  1089. * - Add test cases by adding method names that start with 'test' and have no
  1090. * arguments, for example testYourTestCase(). Each one should test a logical
  1091. * subset of the functionality.
  1092. * For more details, see:
  1093. * - https://www.drupal.org/phpunit for full documentation on how to write
  1094. * PHPUnit tests for Drupal.
  1095. * - http://phpunit.de for general information on the PHPUnit framework.
  1096. * - @link oo_conventions Object-oriented programming topic @endlink for more
  1097. * on PSR-4, namespaces, and where to place classes.
  1098. *
  1099. * @section write_functional Writing functional tests
  1100. * Functional tests are written using a Drupal-specific framework that is, for
  1101. * historical reasons, known as "Simpletest". Use a Simpletest test to test the
  1102. * functionality of sub-system of Drupal, if the functionality depends on the
  1103. * Drupal database and settings, or to test the web output of Drupal. To
  1104. * write a Simpletest test:
  1105. * - For functional tests of the web output of Drupal, define a class that
  1106. * extends \Drupal\simpletest\WebTestBase, which contains an internal web
  1107. * browser and defines many helpful test assertion methods that you can use
  1108. * in your tests. You can specify modules to be enabled by defining a
  1109. * $modules member variable -- keep in mind that by default, WebTestBase uses
  1110. * a "testing" install profile, with a minimal set of modules enabled.
  1111. * - For functional tests that do not test web output, define a class that
  1112. * extends \Drupal\KernelTests\KernelTestBase. This class is much faster
  1113. * than WebTestBase, because instead of making a full install of Drupal, it
  1114. * uses an in-memory pseudo-installation (similar to what the installer and
  1115. * update scripts use). To use this test class, you will need to create the
  1116. * database tables you need and install needed modules manually.
  1117. * - The namespace must be a subspace/subdirectory of \Drupal\yourmodule\Tests,
  1118. * where yourmodule is your module's machine name.
  1119. * - The test class file must be named and placed under the yourmodule/src/Tests
  1120. * directory, according to the PSR-4 standard.
  1121. * - Your test class needs a phpDoc comment block with a description and
  1122. * a @group annotation, which gives information about the test.
  1123. * - You may also override the default setUp() method, which can set be used to
  1124. * set up content types and similar procedures.
  1125. * - In some cases, you may need to write a test module to support your test;
  1126. * put such modules under the yourmodule/tests/modules directory.
  1127. * - Add test cases by adding method names that start with 'test' and have no
  1128. * arguments, for example testYourTestCase(). Each one should test a logical
  1129. * subset of the functionality. Each method runs in a new, isolated test
  1130. * environment, so it can only rely on the setUp() method, not what has
  1131. * been set up by other test methods.
  1132. * For more details, see:
  1133. * - https://www.drupal.org/simpletest for full documentation on how to write
  1134. * functional tests for Drupal.
  1135. * - @link oo_conventions Object-oriented programming topic @endlink for more
  1136. * on PSR-4, namespaces, and where to place classes.
  1137. *
  1138. * @section write_functional_phpunit Write functional PHP tests (phpunit)
  1139. * Functional tests extend the BrowserTestBase base class, and use PHPUnit as
  1140. * their underlying framework. They use a simulated browser, in which the test
  1141. * can click links, visit URLs, post to forms, etc. To write a functional test:
  1142. * - Extend \Drupal\Tests\BrowserTestBase.
  1143. * - Place the test in the yourmodule/tests/src/Functional/ directory and use
  1144. * the \Drupal\Tests\yourmodule\Functional namespace.
  1145. * - Add a @group annotation. For example, if the test is for a Drupal 6
  1146. * migration process, the group core uses is migrate_drupal_6. Use yourmodule
  1147. * as the group name if the test does not belong to another larger group.
  1148. * - You may also override the default setUp() method, which can be used to set
  1149. * up content types and similar procedures. Don't forget to call the parent
  1150. * method.
  1151. * - In some cases, you may need to write a test module to support your test;
  1152. * put such modules under the yourmodule/tests/modules directory.
  1153. * - Add test cases by adding method names that start with 'test' and have no
  1154. * arguments, for example testYourTestCase(). Each one should test a logical
  1155. * subset of the functionality. Each method runs in a new, isolated test
  1156. * environment, so it can only rely on the setUp() method, not what has
  1157. * been set up by other test methods.
  1158. * For more details, see:
  1159. * - https://www.drupal.org/docs/8/phpunit/phpunit-browser-test-tutorial for
  1160. * a full tutorial on how to write functional PHPUnit tests for Drupal.
  1161. * - https://www.drupal.org/phpunit for the full documentation on how to write
  1162. * PHPUnit tests for Drupal.
  1163. *
  1164. * @section write_jsfunctional_phpunit Write functional JavaScript tests (phpunit)
  1165. * To write a functional test that relies on JavaScript:
  1166. * - Extend \Drupal\FunctionalJavaScriptTests\JavascriptTestBase.
  1167. * - Place the test into the yourmodule/tests/src/FunctionalJavascript/
  1168. * directory and use the \Drupal\Tests\yourmodule\FunctionalJavascript
  1169. * namespace.
  1170. * - Add a @group annotation. Use yourmodule as the group name if the test does
  1171. * not belong to another larger group.
  1172. * - Set up PhantomJS; see http://phantomjs.org/download.html.
  1173. * - To run tests, see core/tests/README.md.
  1174. * - When clicking a link/button with Ajax behavior attached, keep in mind that
  1175. * the underlying browser might take time to deliver changes to the HTML. Use
  1176. * $this->assertSession()->assertWaitOnAjaxRequest() to wait for the Ajax
  1177. * request to finish.
  1178. * For more details, see:
  1179. * - https://www.drupal.org/docs/8/phpunit/phpunit-javascript-testing-tutorial
  1180. * for a full tutorial on how to write PHPUnit JavaScript tests for Drupal.
  1181. * - https://www.drupal.org/phpunit for the full documentation on how to write
  1182. * PHPUnit tests for Drupal.
  1183. *
  1184. * @section running Running tests
  1185. * You can run both Simpletest and PHPUnit tests by enabling the core Testing
  1186. * module (core/modules/simpletest). Once that module is enabled, tests can be
  1187. * run using the core/scripts/run-tests.sh script, using
  1188. * @link https://www.drupal.org/project/drush Drush @endlink, or from the
  1189. * Testing module user interface.
  1190. *
  1191. * PHPUnit tests can also be run from the command line, using the PHPUnit
  1192. * framework. See https://www.drupal.org/node/2116263 for more information.
  1193. * @}
  1194. */
  1195. /**
  1196. * @defgroup php_assert PHP Runtime Assert Statements
  1197. * @{
  1198. * Use of the assert() statement in Drupal.
  1199. *
  1200. * Unit tests also use the term "assertion" to refer to test conditions, so to
  1201. * avoid confusion the term "runtime assertion" will be used for the assert()
  1202. * statement throughout the documentation.
  1203. *
  1204. * A runtime assertion is a statement that is expected to always be true at
  1205. * the point in the code it appears at. They are tested using PHP's internal
  1206. * @link http://php.net/assert assert() @endlink statement. If an
  1207. * assertion is ever FALSE it indicates an error in the code or in module or
  1208. * theme configuration files. User-provided configuration files should be
  1209. * verified with standard control structures at all times, not just checked in
  1210. * development environments with assert() statements on.
  1211. *
  1212. * The Drupal project primarily uses runtime assertions to enforce the
  1213. * expectations of the API by failing when incorrect calls are made by code
  1214. * under development. While PHP type hinting does this for objects and arrays,
  1215. * runtime assertions do this for scalars (strings, integers, floats, etc.) and
  1216. * complex data structures such as cache and render arrays. They ensure that
  1217. * methods' return values are the documented datatypes. They also verify that
  1218. * objects have been properly configured and set up by the service container.
  1219. * They supplement unit tests by checking scenarios that do not have unit tests
  1220. * written for them.
  1221. *
  1222. * There are two php settings which affect runtime assertions. The first,
  1223. * assert.exception, should always be set to 1. The second is zend.assertions.
  1224. * Set this to -1 in production and 1 in development.
  1225. *
  1226. * See https://www.drupal.org/node/2492225 for more information on runtime
  1227. * assertions.
  1228. * @}
  1229. */
  1230. /**
  1231. * @defgroup info_types Information types
  1232. * @{
  1233. * Types of information in Drupal.
  1234. *
  1235. * Drupal has several distinct types of information, each with its own methods
  1236. * for storage and retrieval:
  1237. * - Content: Information meant to be displayed on your site: articles, basic
  1238. * pages, images, files, custom blocks, etc. Content is stored and accessed
  1239. * using @link entity_api Entities @endlink.
  1240. * - Session: Information about individual users' interactions with the site,
  1241. * such as whether they are logged in. This is really "state" information, but
  1242. * it is not stored the same way so it's a separate type here. Session
  1243. * information is available from the Request object. The session implements
  1244. * \Symfony\Component\HttpFoundation\Session\SessionInterface.
  1245. * - State: Information of a temporary nature, generally machine-generated and
  1246. * not human-edited, about the current state of your site. Examples: the time
  1247. * when Cron was last run, whether node access permissions need rebuilding,
  1248. * etc. See @link state_api the State API topic @endlink for more information.
  1249. * - Configuration: Information about your site that is generally (or at least
  1250. * can be) human-edited, but is not Content, and is meant to be relatively
  1251. * permanent. Examples: the name of your site, the content types and views
  1252. * you have defined, etc. See
  1253. * @link config_api the Configuration API topic @endlink for more information.
  1254. *
  1255. * @see cache
  1256. * @see i18n
  1257. * @}
  1258. */
  1259. /**
  1260. * @defgroup extending Extending and altering Drupal
  1261. * @{
  1262. * Overview of extensions and alteration methods for Drupal.
  1263. *
  1264. * @section sec_types Types of extensions
  1265. * Drupal's core behavior can be extended and altered via these three basic
  1266. * types of extensions:
  1267. * - Themes: Themes alter the appearance of Drupal sites. They can include
  1268. * template files, which alter the HTML markup and other raw output of the
  1269. * site; CSS files, which alter the styling applied to the HTML; and
  1270. * JavaScript, Flash, images, and other files. For more information, see the
  1271. * @link theme_render Theme system and render API topic @endlink and
  1272. * https://www.drupal.org/docs/8/theming
  1273. * - Modules: Modules add to or alter the behavior and functionality of Drupal,
  1274. * by using one or more of the methods listed below. For more information
  1275. * about creating modules, see https://www.drupal.org/developing/modules/8
  1276. * - Installation profiles: Installation profiles can be used to
  1277. * create distributions, which are complete specific-purpose packages of
  1278. * Drupal including additional modules, themes, and data. For more
  1279. * information, see https://www.drupal.org/developing/distributions.
  1280. *
  1281. * @section sec_alter Alteration methods for modules
  1282. * Here is a list of the ways that modules can alter or extend Drupal's core
  1283. * behavior, or the behavior of other modules:
  1284. * - Hooks: Specially-named functions that a module defines, which are
  1285. * discovered and called at specific times, usually to alter behavior or data.
  1286. * See the @link hooks Hooks topic @endlink for more information.
  1287. * - Plugins: Classes that a module defines, which are discovered and
  1288. * instantiated at specific times to add functionality. See the
  1289. * @link plugin_api Plugin API topic @endlink for more information.
  1290. * - Entities: Special plugins that define entity types for storing new types
  1291. * of content or configuration in Drupal. See the
  1292. * @link entity_api Entity API topic @endlink for more information.
  1293. * - Services: Classes that perform basic operations within Drupal, such as
  1294. * accessing the database and sending email. See the
  1295. * @link container Dependency Injection Container and Services topic @endlink
  1296. * for more information.
  1297. * - Routing: Providing or altering "routes", which are URLs that Drupal
  1298. * responds to, or altering routing behavior with event listener classes.
  1299. * See the @link menu Routing and menu topic @endlink for more information.
  1300. * - Events: Modules can register as event subscribers; when an event is
  1301. * dispatched, a method is called on each registered subscriber, allowing each
  1302. * one to react. See the @link events Events topic @endlink for more
  1303. * information.
  1304. *
  1305. * @section sec_sample *.info.yml files
  1306. * Extensions must each be located in a directory whose name matches the short
  1307. * name (or machine name) of the extension, and this directory must contain a
  1308. * file named machine_name.info.yml (where machine_name is the machine name of
  1309. * the extension). See \Drupal\Core\Extension\InfoParserInterface::parse() for
  1310. * documentation of the format of .info.yml files.
  1311. * @}
  1312. */
  1313. /**
  1314. * @defgroup plugin_api Plugin API
  1315. * @{
  1316. * Using the Plugin API
  1317. *
  1318. * @section sec_overview Overview and terminology
  1319. *
  1320. * The basic idea of plugins is to allow a particular module or subsystem of
  1321. * Drupal to provide functionality in an extensible, object-oriented way. The
  1322. * controlling module or subsystem defines the basic framework (interface) for
  1323. * the functionality, and other modules can create plugins (implementing the
  1324. * interface) with particular behaviors. The controlling module instantiates
  1325. * existing plugins as needed, and calls methods to invoke their functionality.
  1326. * Examples of functionality in Drupal Core that use plugins include: the block
  1327. * system (block types are plugins), the entity/field system (entity types,
  1328. * field types, field formatters, and field widgets are plugins), the image
  1329. * manipulation system (image effects and image toolkits are plugins), and the
  1330. * search system (search page types are plugins).
  1331. *
  1332. * Plugins are grouped into plugin types, each generally defined by an
  1333. * interface. Each plugin type is managed by a plugin manager service, which
  1334. * uses a plugin discovery method to discover provided plugins of that type and
  1335. * instantiate them using a plugin factory.
  1336. *
  1337. * Some plugin types make use of the following concepts or components:
  1338. * - Plugin derivatives: Allows a single plugin class to present itself as
  1339. * multiple plugins. Example: the Menu module provides a block for each
  1340. * defined menu via a block plugin derivative.
  1341. * - Plugin mapping: Allows a plugin class to map a configuration string to an
  1342. * instance, and have the plugin automatically instantiated without writing
  1343. * additional code.
  1344. * - Plugin collections: Provide a way to lazily instantiate a set of plugin
  1345. * instances from a single plugin definition.
  1346. *
  1347. * There are several things a module developer may need to do with plugins:
  1348. * - Define a completely new plugin type: see @ref sec_define below.
  1349. * - Create a plugin of an existing plugin type: see @ref sec_create below.
  1350. * - Perform tasks that involve plugins: see @ref sec_use below.
  1351. *
  1352. * See https://www.drupal.org/developing/api/8/plugins for more detailed
  1353. * documentation on the plugin system. There are also topics for a few
  1354. * of the many existing types of plugins:
  1355. * - @link block_api Block API @endlink
  1356. * - @link entity_api Entity API @endlink
  1357. * - @link field Various types of field-related plugins @endlink
  1358. * - @link views_plugins Views plugins @endlink (has links to topics covering
  1359. * various specific types of Views plugins).
  1360. * - @link search Search page plugins @endlink
  1361. *
  1362. * @section sec_define Defining a new plugin type
  1363. * To define a new plugin type:
  1364. * - Define an interface for the plugin. This describes the common set of
  1365. * behavior, and the methods you will call on each plugin class that is
  1366. * instantiated. Usually this interface will extend one or more of the
  1367. * following interfaces:
  1368. * - \Drupal\Component\Plugin\PluginInspectionInterface
  1369. * - \Drupal\Component\Plugin\ConfigurablePluginInterface
  1370. * - \Drupal\Component\Plugin\ContextAwarePluginInterface
  1371. * - \Drupal\Core\Plugin\PluginFormInterface
  1372. * - \Drupal\Core\Executable\ExecutableInterface
  1373. * - (optional) Create a base class that provides a partial implementation of
  1374. * the interface, for the convenience of developers wishing to create plugins
  1375. * of your type. The base class usually extends
  1376. * \Drupal\Core\Plugin\PluginBase, or one of the base classes that extends
  1377. * this class.
  1378. * - Choose a method for plugin discovery, and define classes as necessary.
  1379. * See @ref sub_discovery below.
  1380. * - Create a plugin manager/factory class and service, which will discover and
  1381. * instantiate plugins. See @ref sub_manager below.
  1382. * - Use the plugin manager to instantiate plugins. Call methods on your plugin
  1383. * interface to perform the tasks of your plugin type.
  1384. * - (optional) If appropriate, define a plugin collection. See @ref
  1385. * sub_collection below for more information.
  1386. *
  1387. * @subsection sub_discovery Plugin discovery
  1388. * Plugin discovery is the process your plugin manager uses to discover the
  1389. * individual plugins of your type that have been defined by your module and
  1390. * other modules. Plugin discovery methods are classes that implement
  1391. * \Drupal\Component\Plugin\Discovery\DiscoveryInterface. Most plugin types use
  1392. * one of the following discovery mechanisms:
  1393. * - Annotation: Plugin classes are annotated and placed in a defined namespace
  1394. * subdirectory. Most Drupal Core plugins use this method of discovery.
  1395. * - Hook: Plugin modules need to implement a hook to tell the manager about
  1396. * their plugins.
  1397. * - YAML: Plugins are listed in YAML files. Drupal Core uses this method for
  1398. * discovering local tasks and local actions. This is mainly useful if all
  1399. * plugins use the same class, so it is kind of like a global derivative.
  1400. * - Static: Plugin classes are registered within the plugin manager class
  1401. * itself. Static discovery is only useful if modules cannot define new
  1402. * plugins of this type (if the list of available plugins is static).
  1403. *
  1404. * It is also possible to define your own custom discovery mechanism or mix
  1405. * methods together. And there are many more details, such as annotation
  1406. * decorators, that apply to some of the discovery methods. See
  1407. * https://www.drupal.org/developing/api/8/plugins for more details.
  1408. *
  1409. * The remainder of this documentation will assume Annotation-based discovery,
  1410. * since this is the most common method.
  1411. *
  1412. * @subsection sub_manager Defining a plugin manager class and service
  1413. * To define an annotation-based plugin manager:
  1414. * - Choose a namespace subdirectory for your plugin. For example, search page
  1415. * plugins go in directory Plugin/Search under the module namespace.
  1416. * - Define an annotation class for your plugin type. This class should extend
  1417. * \Drupal\Component\Annotation\Plugin, and for most plugin types, it should
  1418. * contain member variables corresponding to the annotations plugins will
  1419. * need to provide. All plugins have at least $id: a unique string
  1420. * identifier.
  1421. * - Define an alter hook for altering the discovered plugin definitions. You
  1422. * should document the hook in a *.api.php file.
  1423. * - Define a plugin manager class. This class should implement
  1424. * \Drupal\Component\Plugin\PluginManagerInterface; most plugin managers do
  1425. * this by extending \Drupal\Core\Plugin\DefaultPluginManager. If you do
  1426. * extend the default plugin manager, the only method you will probably need
  1427. * to define is the class constructor, which will need to call the parent
  1428. * constructor to provide information about the annotation class and plugin
  1429. * namespace for discovery, set up the alter hook, and possibly set up
  1430. * caching. See classes that extend DefaultPluginManager for examples.
  1431. * - Define a service for your plugin manager. See the
  1432. * @link container Services topic for more information. @endlink Your service
  1433. * definition should look something like this, referencing your manager
  1434. * class and the parent (default) plugin manager service to inherit
  1435. * constructor arguments:
  1436. * @code
  1437. * plugin.manager.mymodule:
  1438. * class: Drupal\mymodule\MyPluginManager
  1439. * parent: default_plugin_manager
  1440. * @endcode
  1441. * - If your plugin is configurable, you will also need to define the
  1442. * configuration schema and possibly a configuration entity type. See the
  1443. * @link config_api Configuration API topic @endlink for more information.
  1444. *
  1445. * @subsection sub_collection Defining a plugin collection
  1446. * Some configurable plugin types allow administrators to create zero or more
  1447. * instances of each plugin, each with its own configuration. For example,
  1448. * a single block plugin can be configured several times, to display in
  1449. * different regions of a theme, with different visibility settings, a
  1450. * different title, or other plugin-specific settings. To make this possible,
  1451. * a plugin type can make use of what's known as a plugin collection.
  1452. *
  1453. * A plugin collection is a class that extends
  1454. * \Drupal\Component\Plugin\LazyPluginCollection or one of its subclasses; there
  1455. * are several examples in Drupal Core. If your plugin type uses a plugin
  1456. * collection, it will usually also have a configuration entity, and the entity
  1457. * class should implement
  1458. * \Drupal\Core\Entity\EntityWithPluginCollectionInterface. Again, there are
  1459. * several examples in Drupal Core; see also the @link config_api Configuration
  1460. * API topic @endlink for more information about configuration entities.
  1461. *
  1462. * @section sec_create Creating a plugin of an existing type
  1463. * Assuming the plugin type uses annotation-based discovery, in order to create
  1464. * a plugin of an existing type, you will be creating a class. This class must:
  1465. * - Implement the plugin interface, so that it has the required methods
  1466. * defined. Usually, you'll want to extend the plugin base class, if one has
  1467. * been provided.
  1468. * - Have the right annotation in its documentation header. See the
  1469. * @link annotation Annotation topic @endlink for more information about
  1470. * annotation.
  1471. * - Be in the right plugin namespace, in order to be discovered.
  1472. * Often, the easiest way to make sure this happens is to find an existing
  1473. * example of a working plugin class of the desired type, and copy it into your
  1474. * module as a starting point.
  1475. *
  1476. * You can also create a plugin derivative, which allows your plugin class
  1477. * to present itself to the user interface as multiple plugins. To do this,
  1478. * in addition to the plugin class, you'll need to create a separate plugin
  1479. * derivative class implementing
  1480. * \Drupal\Component\Plugin\Derivative\DerivativeInterface. The classes
  1481. * \Drupal\system\Plugin\Block\SystemMenuBlock (plugin class) and
  1482. * \Drupal\system\Plugin\Derivative\SystemMenuBlock (derivative class) are a
  1483. * good example to look at.
  1484. *
  1485. * @section sec_use Performing tasks involving plugins
  1486. * Here are the steps to follow to perform a task that involves plugins:
  1487. * - Locate the machine name of the plugin manager service, and instantiate the
  1488. * service. See the @link container Services topic @endlink for more
  1489. * information on how to do this.
  1490. * - On the plugin manager class, use methods like getDefinition(),
  1491. * getDefinitions(), or other methods specific to particular plugin managers
  1492. * to retrieve information about either specific plugins or the entire list of
  1493. * defined plugins.
  1494. * - Call the createInstance() method on the plugin manager to instantiate
  1495. * individual plugin objects.
  1496. * - Call methods on the plugin objects to perform the desired tasks.
  1497. *
  1498. * @see annotation
  1499. * @}
  1500. */
  1501. /**
  1502. * @defgroup oo_conventions Objected-oriented programming conventions
  1503. * @{
  1504. * PSR-4, namespaces, class naming, and other conventions.
  1505. *
  1506. * A lot of the PHP code in Drupal is object oriented (OO), making use of
  1507. * @link http://php.net/manual/language.oop5.php PHP classes, interfaces, and traits @endlink
  1508. * (which are loosely referred to as "classes" in the rest of this topic). The
  1509. * following conventions and standards apply to this version of Drupal:
  1510. * - Each class must be in its own file.
  1511. * - Classes must be namespaced. If a module defines a class, the namespace
  1512. * must start with \Drupal\module_name. If it is defined by Drupal Core for
  1513. * use across many modules, the namespace should be \Drupal\Core or
  1514. * \Drupal\Component, with the exception of the global class \Drupal. See
  1515. * https://www.drupal.org/node/1353118 for more about namespaces.
  1516. * - In order for the PSR-4-based class auto-loader to find the class, it must
  1517. * be located in a directory corresponding to the namespace. For
  1518. * module-defined classes, if the namespace is \Drupal\module_name\foo\bar,
  1519. * then the class goes under the main module directory in directory
  1520. * src/foo/bar. For Drupal-wide classes, if the namespace is
  1521. * \Drupal\Core\foo\bar, then it goes in directory
  1522. * core/lib/Drupal/Core/foo/bar. See https://www.drupal.org/node/2156625 for
  1523. * more information about PSR-4.
  1524. * - Some classes have annotations added to their documentation headers. See
  1525. * the @link annotation Annotation topic @endlink for more information.
  1526. * - Standard plugin discovery requires particular namespaces and annotation
  1527. * for most plugin classes. See the
  1528. * @link plugin_api Plugin API topic @endlink for more information.
  1529. * - There are project-wide coding standards for OO code, including naming:
  1530. * https://www.drupal.org/node/608152
  1531. * - Documentation standards for classes are covered on:
  1532. * https://www.drupal.org/coding-standards/docs#classes
  1533. * @}
  1534. */
  1535. /**
  1536. * @defgroup listing_page_class Page header for Classes page
  1537. * @{
  1538. * Introduction to classes
  1539. *
  1540. * A lot of the PHP code in Drupal is object oriented (OO), making use of
  1541. * @link http://php.net/manual/language.oop5.php PHP classes, interfaces, and traits. @endlink
  1542. * See the
  1543. * @link oo_conventions Objected-oriented programming conventions @endlink
  1544. * for more information.
  1545. *
  1546. * @see oo_conventions
  1547. *
  1548. * @}
  1549. */
  1550. /**
  1551. * @defgroup listing_page_namespace Page header for Namespaces page
  1552. * @{
  1553. * Introduction to namespaces
  1554. *
  1555. * PHP classes, interfaces, and traits in Drupal are
  1556. * @link http://php.net/manual/language.namespaces.rationale.php namespaced. @endlink
  1557. * See the
  1558. * @link oo_conventions Objected-oriented programming conventions @endlink
  1559. * for more information.
  1560. *
  1561. * @see oo_conventions
  1562. *
  1563. * @}
  1564. */
  1565. /**
  1566. * @defgroup best_practices Best practices for developers
  1567. * @{
  1568. * Overview of standards and best practices for developers
  1569. *
  1570. * Ideally, all code that is included in Drupal Core and contributed modules,
  1571. * themes, and distributions will be secure, internationalized, maintainable,
  1572. * and efficient. In order to facilitate this, the Drupal community has
  1573. * developed a set of guidelines and standards for developers to follow. Most of
  1574. * these standards can be found under
  1575. * @link https://www.drupal.org/developing/best-practices Best practices on Drupal.org @endlink
  1576. *
  1577. * Standards and best practices that developers should be aware of include:
  1578. * - Security: https://www.drupal.org/writing-secure-code and the
  1579. * @link sanitization Sanitization functions topic @endlink
  1580. * - Coding standards: https://www.drupal.org/coding-standards
  1581. * and https://www.drupal.org/coding-standards/docs
  1582. * - Accessibility: https://www.drupal.org/node/1637990 (modules) and
  1583. * https://www.drupal.org/node/464472 (themes)
  1584. * - Usability: https://www.drupal.org/ui-standards
  1585. * - Internationalization: @link i18n Internationalization topic @endlink
  1586. * - Automated testing: @link testing Automated tests topic @endlink
  1587. * @}
  1588. */
  1589. /**
  1590. * @defgroup utility Utility classes and functions
  1591. * @{
  1592. * Overview of utility classes and functions for developers.
  1593. *
  1594. * Drupal provides developers with a variety of utility functions that make it
  1595. * easier and more efficient to perform tasks that are either really common,
  1596. * tedious, or difficult. Utility functions help to reduce code duplication and
  1597. * should be used in place of one-off code whenever possible.
  1598. *
  1599. * @see common.inc
  1600. * @see file
  1601. * @see format
  1602. * @see php_wrappers
  1603. * @see sanitization
  1604. * @see transliteration
  1605. * @see validation
  1606. * @}
  1607. */
  1608. /**
  1609. * @defgroup hooks Hooks
  1610. * @{
  1611. * Define functions that alter the behavior of Drupal core.
  1612. *
  1613. * One way for modules to alter the core behavior of Drupal (or another module)
  1614. * is to use hooks. Hooks are specially-named functions that a module defines
  1615. * (this is known as "implementing the hook"), which are discovered and called
  1616. * at specific times to alter or add to the base behavior or data (this is
  1617. * known as "invoking the hook"). Each hook has a name (example:
  1618. * hook_batch_alter()), a defined set of parameters, and a defined return value.
  1619. * Your modules can implement hooks that are defined by Drupal core or other
  1620. * modules that they interact with. Your modules can also define their own
  1621. * hooks, in order to let other modules interact with them.
  1622. *
  1623. * To implement a hook:
  1624. * - Locate the documentation for the hook. Hooks are documented in *.api.php
  1625. * files, by defining functions whose name starts with "hook_" (these
  1626. * files and their functions are never loaded by Drupal -- they exist solely
  1627. * for documentation). The function should have a documentation header, as
  1628. * well as a sample function body. For example, in the core file
  1629. * system.api.php, you can find hooks such as hook_batch_alter(). Also, if
  1630. * you are viewing this documentation on an API reference site, the Core
  1631. * hooks will be listed in this topic.
  1632. * - Copy the function to your module's .module file.
  1633. * - Change the name of the function, substituting your module's short name
  1634. * (name of the module's directory, and .info.yml file without the extension)
  1635. * for the "hook" part of the sample function name. For instance, to implement
  1636. * hook_batch_alter(), you would rename it to my_module_batch_alter().
  1637. * - Edit the documentation for the function (normally, your implementation
  1638. * should just have one line saying "Implements hook_batch_alter().").
  1639. * - Edit the body of the function, substituting in what you need your module
  1640. * to do.
  1641. *
  1642. * To define a hook:
  1643. * - Choose a unique name for your hook. It should start with "hook_", followed
  1644. * by your module's short name.
  1645. * - Provide documentation in a *.api.php file in your module's main
  1646. * directory. See the "implementing" section above for details of what this
  1647. * should contain (parameters, return value, and sample function body).
  1648. * - Invoke the hook in your module's code.
  1649. *
  1650. * To invoke a hook, use methods on
  1651. * \Drupal\Core\Extension\ModuleHandlerInterface such as alter(), invoke(),
  1652. * and invokeAll(). You can obtain a module handler by calling
  1653. * \Drupal::moduleHandler(), or getting the 'module_handler' service on an
  1654. * injected container.
  1655. *
  1656. * @see extending
  1657. * @see themeable
  1658. * @see callbacks
  1659. * @see \Drupal\Core\Extension\ModuleHandlerInterface
  1660. * @see \Drupal::moduleHandler()
  1661. *
  1662. * @}
  1663. */
  1664. /**
  1665. * @defgroup callbacks Callbacks
  1666. * @{
  1667. * Callback function signatures.
  1668. *
  1669. * Drupal's API sometimes uses callback functions to allow you to define how
  1670. * some type of processing happens. A callback is a function with a defined
  1671. * signature, which you define in a module. Then you pass the function name as
  1672. * a parameter to a Drupal API function or return it as part of a hook
  1673. * implementation return value, and your function is called at an appropriate
  1674. * time. For instance, when setting up batch processing you might need to
  1675. * provide a callback function for each processing step and/or a callback for
  1676. * when processing is finished; you would do that by defining these functions
  1677. * and passing their names into the batch setup function.
  1678. *
  1679. * Callback function signatures, like hook definitions, are described by
  1680. * creating and documenting dummy functions in a *.api.php file; normally, the
  1681. * dummy callback function's name should start with "callback_", and you should
  1682. * document the parameters and return value and provide a sample function body.
  1683. * Then your API documentation can refer to this callback function in its
  1684. * documentation. A user of your API can usually name their callback function
  1685. * anything they want, although a standard name would be to replace "callback_"
  1686. * with the module name.
  1687. *
  1688. * @see hooks
  1689. * @see themeable
  1690. *
  1691. * @}
  1692. */
  1693. /**
  1694. * @defgroup form_api Form generation
  1695. * @{
  1696. * Describes how to generate and manipulate forms and process form submissions.
  1697. *
  1698. * Drupal provides a Form API in order to achieve consistency in its form
  1699. * processing and presentation, while simplifying code and reducing the amount
  1700. * of HTML that must be explicitly generated by a module.
  1701. *
  1702. * @section generating_forms Creating forms
  1703. * Forms are defined as classes that implement the
  1704. * \Drupal\Core\Form\FormInterface and are built using the
  1705. * \Drupal\Core\Form\FormBuilder class. Drupal provides a couple of utility
  1706. * classes that can be extended as a starting point for most basic forms, the
  1707. * most commonly used of which is \Drupal\Core\Form\FormBase. FormBuilder
  1708. * handles the low level processing of forms such as rendering the necessary
  1709. * HTML, initial processing of incoming $_POST data, and delegating to your
  1710. * implementation of FormInterface for validation and processing of submitted
  1711. * data.
  1712. *
  1713. * Here is an example of a Form class:
  1714. * @code
  1715. * namespace Drupal\mymodule\Form;
  1716. *
  1717. * use Drupal\Core\Form\FormBase;
  1718. * use Drupal\Core\Form\FormStateInterface;
  1719. *
  1720. * class ExampleForm extends FormBase {
  1721. * public function getFormId() {
  1722. * // Unique ID of the form.
  1723. * return 'example_form';
  1724. * }
  1725. *
  1726. * public function buildForm(array $form, FormStateInterface $form_state) {
  1727. * // Create a $form API array.
  1728. * $form['phone_number'] = array(
  1729. * '#type' => 'tel',
  1730. * '#title' => $this->t('Your phone number'),
  1731. * );
  1732. * $form['save'] = array(
  1733. * '#type' => 'submit',
  1734. * '#value' => $this->t('Save'),
  1735. * );
  1736. * return $form;
  1737. * }
  1738. *
  1739. * public function validateForm(array &$form, FormStateInterface $form_state) {
  1740. * // Validate submitted form data.
  1741. * }
  1742. *
  1743. * public function submitForm(array &$form, FormStateInterface $form_state) {
  1744. * // Handle submitted form data.
  1745. * }
  1746. * }
  1747. * @endcode
  1748. *
  1749. * @section retrieving_forms Retrieving and displaying forms
  1750. * \Drupal::formBuilder()->getForm() should be used to handle retrieving,
  1751. * processing, and displaying a rendered HTML form. Given the ExampleForm
  1752. * defined above,
  1753. * \Drupal::formBuilder()->getForm('Drupal\mymodule\Form\ExampleForm') would
  1754. * return the rendered HTML of the form defined by ExampleForm::buildForm(), or
  1755. * call the validateForm() and submitForm(), methods depending on the current
  1756. * processing state.
  1757. *
  1758. * The argument to \Drupal::formBuilder()->getForm() is the name of a class that
  1759. * implements FormInterface. Any additional arguments passed to the getForm()
  1760. * method will be passed along as additional arguments to the
  1761. * ExampleForm::buildForm() method.
  1762. *
  1763. * For example:
  1764. * @code
  1765. * $extra = '612-123-4567';
  1766. * $form = \Drupal::formBuilder()->getForm('Drupal\mymodule\Form\ExampleForm', $extra);
  1767. * ...
  1768. * public function buildForm(array $form, FormStateInterface $form_state, $extra = NULL)
  1769. * $form['phone_number'] = array(
  1770. * '#type' => 'tel',
  1771. * '#title' => $this->t('Your phone number'),
  1772. * '#value' => $extra,
  1773. * );
  1774. * return $form;
  1775. * }
  1776. * @endcode
  1777. *
  1778. * Alternatively, forms can be built directly via the routing system which will
  1779. * take care of calling \Drupal::formBuilder()->getForm(). The following example
  1780. * demonstrates the use of a routing.yml file to display a form at the given
  1781. * route.
  1782. *
  1783. * @code
  1784. * example.form:
  1785. * path: '/example-form'
  1786. * defaults:
  1787. * _title: 'Example form'
  1788. * _form: '\Drupal\mymodule\Form\ExampleForm'
  1789. * @endcode
  1790. *
  1791. * The $form argument to form-related functions is a specialized render array
  1792. * containing the elements and properties of the form. For more about render
  1793. * arrays, see the @link theme_render Render API topic. @endlink For more
  1794. * detailed explanations of the Form API workflow, see the
  1795. * @link https://www.drupal.org/node/2117411 Form API documentation section. @endlink
  1796. * In addition, there is a set of Form API tutorials in the
  1797. * @link https://www.drupal.org/project/examples Examples for Developers project. @endlink
  1798. *
  1799. * In the form builder, validation, submission, and other form methods,
  1800. * $form_state is the primary influence on the processing of the form and is
  1801. * passed to most methods, so they can use it to communicate with the form
  1802. * system and each other. $form_state is an object that implements
  1803. * \Drupal\Core\Form\FormStateInterface.
  1804. * @}
  1805. */
  1806. /**
  1807. * @defgroup queue Queue operations
  1808. * @{
  1809. * Queue items to allow later processing.
  1810. *
  1811. * The queue system allows placing items in a queue and processing them later.
  1812. * The system tries to ensure that only one consumer can process an item.
  1813. *
  1814. * Before a queue can be used it needs to be created by
  1815. * Drupal\Core\Queue\QueueInterface::createQueue().
  1816. *
  1817. * Items can be added to the queue by passing an arbitrary data object to
  1818. * Drupal\Core\Queue\QueueInterface::createItem().
  1819. *
  1820. * To process an item, call Drupal\Core\Queue\QueueInterface::claimItem() and
  1821. * specify how long you want to have a lease for working on that item.
  1822. * When finished processing, the item needs to be deleted by calling
  1823. * Drupal\Core\Queue\QueueInterface::deleteItem(). If the consumer dies, the
  1824. * item will be made available again by the Drupal\Core\Queue\QueueInterface
  1825. * implementation once the lease expires. Another consumer will then be able to
  1826. * receive it when calling Drupal\Core\Queue\QueueInterface::claimItem().
  1827. * Due to this, the processing code should be aware that an item might be handed
  1828. * over for processing more than once.
  1829. *
  1830. * The $item object used by the Drupal\Core\Queue\QueueInterface can contain
  1831. * arbitrary metadata depending on the implementation. Systems using the
  1832. * interface should only rely on the data property which will contain the
  1833. * information passed to Drupal\Core\Queue\QueueInterface::createItem().
  1834. * The full queue item returned by Drupal\Core\Queue\QueueInterface::claimItem()
  1835. * needs to be passed to Drupal\Core\Queue\QueueInterface::deleteItem() once
  1836. * processing is completed.
  1837. *
  1838. * There are two kinds of queue backends available: reliable, which preserves
  1839. * the order of messages and guarantees that every item will be executed at
  1840. * least once. The non-reliable kind only does a best effort to preserve order
  1841. * in messages and to execute them at least once but there is a small chance
  1842. * that some items get lost. For example, some distributed back-ends like
  1843. * Amazon SQS will be managing jobs for a large set of producers and consumers
  1844. * where a strict FIFO ordering will likely not be preserved. Another example
  1845. * would be an in-memory queue backend which might lose items if it crashes.
  1846. * However, such a backend would be able to deal with significantly more writes
  1847. * than a reliable queue and for many tasks this is more important. See
  1848. * aggregator_cron() for an example of how to effectively use a non-reliable
  1849. * queue. Another example is doing Twitter statistics -- the small possibility
  1850. * of losing a few items is insignificant next to power of the queue being able
  1851. * to keep up with writes. As described in the processing section, regardless
  1852. * of the queue being reliable or not, the processing code should be aware that
  1853. * an item might be handed over for processing more than once (because the
  1854. * processing code might time out before it finishes).
  1855. * @}
  1856. */
  1857. /**
  1858. * @defgroup annotation Annotations
  1859. * @{
  1860. * Annotations for class discovery and metadata description.
  1861. *
  1862. * The Drupal plugin system has a set of reusable components that developers
  1863. * can use, override, and extend in their modules. Most of the plugins use
  1864. * annotations, which let classes register themselves as plugins and describe
  1865. * their metadata. (Annotations can also be used for other purposes, though
  1866. * at the moment, Drupal only uses them for the plugin system.)
  1867. *
  1868. * To annotate a class as a plugin, add code similar to the following to the
  1869. * end of the documentation block immediately preceding the class declaration:
  1870. * @code
  1871. * * @ContentEntityType(
  1872. * * id = "comment",
  1873. * * label = @Translation("Comment"),
  1874. * * ...
  1875. * * base_table = "comment"
  1876. * * )
  1877. * @endcode
  1878. *
  1879. * Note that you must use double quotes; single quotes will not work in
  1880. * annotations.
  1881. *
  1882. * Some annotation types, which extend the "@ PluginID" annotation class, have
  1883. * only a single 'id' key in their annotation. For these, it is possible to use
  1884. * a shorthand annotation. For example:
  1885. * @code
  1886. * * @ViewsArea("entity")
  1887. * @endcode
  1888. * in place of
  1889. * @code
  1890. * * @ViewsArea(
  1891. * * id = "entity"
  1892. * *)
  1893. * @endcode
  1894. *
  1895. * The available annotation classes are listed in this topic, and can be
  1896. * identified when you are looking at the Drupal source code by having
  1897. * "@ Annotation" in their documentation blocks (without the space after @). To
  1898. * find examples of annotation for a particular annotation class, such as
  1899. * EntityType, look for class files that have an @ annotation section using the
  1900. * annotation class.
  1901. *
  1902. * @see plugin_translatable
  1903. * @see plugin_context
  1904. *
  1905. * @}
  1906. */
  1907. /**
  1908. * @addtogroup hooks
  1909. * @{
  1910. */
  1911. /**
  1912. * Perform periodic actions.
  1913. *
  1914. * Modules that require some commands to be executed periodically can
  1915. * implement hook_cron(). The engine will then call the hook whenever a cron
  1916. * run happens, as defined by the administrator. Typical tasks managed by
  1917. * hook_cron() are database maintenance, backups, recalculation of settings
  1918. * or parameters, automated mailing, and retrieving remote data.
  1919. *
  1920. * Short-running or non-resource-intensive tasks can be executed directly in
  1921. * the hook_cron() implementation.
  1922. *
  1923. * Long-running tasks and tasks that could time out, such as retrieving remote
  1924. * data, sending email, and intensive file tasks, should use the queue API
  1925. * instead of executing the tasks directly. To do this, first define one or
  1926. * more queues via a \Drupal\Core\Annotation\QueueWorker plugin. Then, add items
  1927. * that need to be processed to the defined queues.
  1928. */
  1929. function hook_cron() {
  1930. // Short-running operation example, not using a queue:
  1931. // Delete all expired records since the last cron run.
  1932. $expires = \Drupal::state()->get('mymodule.last_check', 0);
  1933. \Drupal::database()->delete('mymodule_table')
  1934. ->condition('expires', $expires, '>=')
  1935. ->execute();
  1936. \Drupal::state()->set('mymodule.last_check', REQUEST_TIME);
  1937. // Long-running operation example, leveraging a queue:
  1938. // Queue news feeds for updates once their refresh interval has elapsed.
  1939. $queue = \Drupal::queue('aggregator_feeds');
  1940. $ids = \Drupal::entityManager()->getStorage('aggregator_feed')->getFeedIdsToRefresh();
  1941. foreach (Feed::loadMultiple($ids) as $feed) {
  1942. if ($queue->createItem($feed)) {
  1943. // Add timestamp to avoid queueing item more than once.
  1944. $feed->setQueuedTime(REQUEST_TIME);
  1945. $feed->save();
  1946. }
  1947. }
  1948. $ids = \Drupal::entityQuery('aggregator_feed')
  1949. ->condition('queued', REQUEST_TIME - (3600 * 6), '<')
  1950. ->execute();
  1951. if ($ids) {
  1952. $feeds = Feed::loadMultiple($ids);
  1953. foreach ($feeds as $feed) {
  1954. $feed->setQueuedTime(0);
  1955. $feed->save();
  1956. }
  1957. }
  1958. }
  1959. /**
  1960. * Alter available data types for typed data wrappers.
  1961. *
  1962. * @param array $data_types
  1963. * An array of data type information.
  1964. *
  1965. * @see hook_data_type_info()
  1966. */
  1967. function hook_data_type_info_alter(&$data_types) {
  1968. $data_types['email']['class'] = '\Drupal\mymodule\Type\Email';
  1969. }
  1970. /**
  1971. * Alter cron queue information before cron runs.
  1972. *
  1973. * Called by \Drupal\Core\Cron to allow modules to alter cron queue settings
  1974. * before any jobs are processesed.
  1975. *
  1976. * @param array $queues
  1977. * An array of cron queue information.
  1978. *
  1979. * @see \Drupal\Core\QueueWorker\QueueWorkerInterface
  1980. * @see \Drupal\Core\Annotation\QueueWorker
  1981. * @see \Drupal\Core\Cron
  1982. */
  1983. function hook_queue_info_alter(&$queues) {
  1984. // This site has many feeds so let's spend 90 seconds on each cron run
  1985. // updating feeds instead of the default 60.
  1986. $queues['aggregator_feeds']['cron']['time'] = 90;
  1987. }
  1988. /**
  1989. * Alter an email message created with MailManagerInterface->mail().
  1990. *
  1991. * hook_mail_alter() allows modification of email messages created and sent
  1992. * with MailManagerInterface->mail(). Usage examples include adding and/or
  1993. * changing message text, message fields, and message headers.
  1994. *
  1995. * Email messages sent using functions other than MailManagerInterface->mail()
  1996. * will not invoke hook_mail_alter(). For example, a contributed module directly
  1997. * calling the MailInterface->mail() or PHP mail() function will not invoke
  1998. * this hook. All core modules use MailManagerInterface->mail() for messaging,
  1999. * it is best practice but not mandatory in contributed modules.
  2000. *
  2001. * @param $message
  2002. * An array containing the message data. Keys in this array include:
  2003. * - 'id':
  2004. * The MailManagerInterface->mail() id of the message. Look at module source
  2005. * code or MailManagerInterface->mail() for possible id values.
  2006. * - 'to':
  2007. * The address or addresses the message will be sent to. The
  2008. * formatting of this string must comply with RFC 2822.
  2009. * - 'from':
  2010. * The address the message will be marked as being from, which is
  2011. * either a custom address or the site-wide default email address.
  2012. * - 'subject':
  2013. * Subject of the email to be sent. This must not contain any newline
  2014. * characters, or the email may not be sent properly.
  2015. * - 'body':
  2016. * An array of strings or objects that implement
  2017. * \Drupal\Component\Render\MarkupInterface containing the message text. The
  2018. * message body is created by concatenating the individual array strings
  2019. * into a single text string using "\n\n" as a separator.
  2020. * - 'headers':
  2021. * Associative array containing mail headers, such as From, Sender,
  2022. * MIME-Version, Content-Type, etc.
  2023. * - 'params':
  2024. * An array of optional parameters supplied by the caller of
  2025. * MailManagerInterface->mail() that is used to build the message before
  2026. * hook_mail_alter() is invoked.
  2027. * - 'language':
  2028. * The language object used to build the message before hook_mail_alter()
  2029. * is invoked.
  2030. * - 'send':
  2031. * Set to FALSE to abort sending this email message.
  2032. *
  2033. * @see \Drupal\Core\Mail\MailManagerInterface::mail()
  2034. */
  2035. function hook_mail_alter(&$message) {
  2036. if ($message['id'] == 'modulename_messagekey') {
  2037. if (!example_notifications_optin($message['to'], $message['id'])) {
  2038. // If the recipient has opted to not receive such messages, cancel
  2039. // sending.
  2040. $message['send'] = FALSE;
  2041. return;
  2042. }
  2043. $message['body'][] = "--\nMail sent out from " . \Drupal::config('system.site')->get('name');
  2044. }
  2045. }
  2046. /**
  2047. * Prepares a message based on parameters;
  2048. *
  2049. * This hook is called from MailManagerInterface->mail(). Note that hook_mail(),
  2050. * unlike hook_mail_alter(), is only called on the $module argument to
  2051. * MailManagerInterface->mail(), not all modules.
  2052. *
  2053. * @param $key
  2054. * An identifier of the mail.
  2055. * @param $message
  2056. * An array to be filled in. Elements in this array include:
  2057. * - id: An ID to identify the mail sent. Look at module source code or
  2058. * MailManagerInterface->mail() for possible id values.
  2059. * - to: The address or addresses the message will be sent to. The
  2060. * formatting of this string must comply with RFC 2822.
  2061. * - subject: Subject of the email to be sent. This must not contain any
  2062. * newline characters, or the mail may not be sent properly.
  2063. * MailManagerInterface->mail() sets this to an empty
  2064. * string when the hook is invoked.
  2065. * - body: An array of lines containing the message to be sent. Drupal will
  2066. * format the correct line endings for you. MailManagerInterface->mail()
  2067. * sets this to an empty array when the hook is invoked. The array may
  2068. * contain either strings or objects implementing
  2069. * \Drupal\Component\Render\MarkupInterface.
  2070. * - from: The address the message will be marked as being from, which is
  2071. * set by MailManagerInterface->mail() to either a custom address or the
  2072. * site-wide default email address when the hook is invoked.
  2073. * - headers: Associative array containing mail headers, such as From,
  2074. * Sender, MIME-Version, Content-Type, etc.
  2075. * MailManagerInterface->mail() pre-fills several headers in this array.
  2076. * @param $params
  2077. * An array of parameters supplied by the caller of
  2078. * MailManagerInterface->mail().
  2079. *
  2080. * @see \Drupal\Core\Mail\MailManagerInterface::mail()
  2081. */
  2082. function hook_mail($key, &$message, $params) {
  2083. $account = $params['account'];
  2084. $context = $params['context'];
  2085. $variables = [
  2086. '%site_name' => \Drupal::config('system.site')->get('name'),
  2087. '%username' => $account->getDisplayName(),
  2088. ];
  2089. if ($context['hook'] == 'taxonomy') {
  2090. $entity = $params['entity'];
  2091. $vocabulary = Vocabulary::load($entity->id());
  2092. $variables += [
  2093. '%term_name' => $entity->name,
  2094. '%term_description' => $entity->description,
  2095. '%term_id' => $entity->id(),
  2096. '%vocabulary_name' => $vocabulary->label(),
  2097. '%vocabulary_description' => $vocabulary->getDescription(),
  2098. '%vocabulary_id' => $vocabulary->id(),
  2099. ];
  2100. }
  2101. // Node-based variable translation is only available if we have a node.
  2102. if (isset($params['node'])) {
  2103. /** @var \Drupal\node\NodeInterface $node */
  2104. $node = $params['node'];
  2105. $variables += [
  2106. '%uid' => $node->getOwnerId(),
  2107. '%url' => $node->url('canonical', ['absolute' => TRUE]),
  2108. '%node_type' => node_get_type_label($node),
  2109. '%title' => $node->getTitle(),
  2110. '%teaser' => $node->teaser,
  2111. '%body' => $node->body,
  2112. ];
  2113. }
  2114. $subject = strtr($context['subject'], $variables);
  2115. $body = strtr($context['message'], $variables);
  2116. $message['subject'] .= str_replace(["\r", "\n"], '', $subject);
  2117. $message['body'][] = MailFormatHelper::htmlToText($body);
  2118. }
  2119. /**
  2120. * Alter the list of mail backend plugin definitions.
  2121. *
  2122. * @param array $info
  2123. * The mail backend plugin definitions to be altered.
  2124. *
  2125. * @see \Drupal\Core\Annotation\Mail
  2126. * @see \Drupal\Core\Mail\MailManager
  2127. */
  2128. function hook_mail_backend_info_alter(&$info) {
  2129. unset($info['test_mail_collector']);
  2130. }
  2131. /**
  2132. * Alter the default country list.
  2133. *
  2134. * @param $countries
  2135. * The associative array of countries keyed by two-letter country code.
  2136. *
  2137. * @see \Drupal\Core\Locale\CountryManager::getList()
  2138. */
  2139. function hook_countries_alter(&$countries) {
  2140. // Elbonia is now independent, so add it to the country list.
  2141. $countries['EB'] = 'Elbonia';
  2142. }
  2143. /**
  2144. * Alter display variant plugin definitions.
  2145. *
  2146. * @param array $definitions
  2147. * The array of display variant definitions, keyed by plugin ID.
  2148. *
  2149. * @see \Drupal\Core\Display\VariantManager
  2150. * @see \Drupal\Core\Display\Annotation\DisplayVariant
  2151. */
  2152. function hook_display_variant_plugin_alter(array &$definitions) {
  2153. $definitions['full_page']['admin_label'] = t('Block layout');
  2154. }
  2155. /**
  2156. * Allow modules to alter layout plugin definitions.
  2157. *
  2158. * @param \Drupal\Core\Layout\LayoutDefinition[] $definitions
  2159. * The array of layout definitions, keyed by plugin ID.
  2160. */
  2161. function hook_layout_alter(&$definitions) {
  2162. // Remove a layout.
  2163. unset($definitions['twocol']);
  2164. }
  2165. /**
  2166. * Flush all persistent and static caches.
  2167. *
  2168. * This hook asks your module to clear all of its static caches,
  2169. * in order to ensure a clean environment for subsequently
  2170. * invoked data rebuilds.
  2171. *
  2172. * Do NOT use this hook for rebuilding information. Only use it to flush custom
  2173. * caches.
  2174. *
  2175. * Static caches using drupal_static() do not need to be reset manually.
  2176. * However, all other static variables that do not use drupal_static() must be
  2177. * manually reset.
  2178. *
  2179. * This hook is invoked by drupal_flush_all_caches(). It runs before module data
  2180. * is updated and before hook_rebuild().
  2181. *
  2182. * @see drupal_flush_all_caches()
  2183. * @see hook_rebuild()
  2184. */
  2185. function hook_cache_flush() {
  2186. if (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'update') {
  2187. _update_cache_clear();
  2188. }
  2189. }
  2190. /**
  2191. * Rebuild data based upon refreshed caches.
  2192. *
  2193. * This hook allows your module to rebuild its data based on the latest/current
  2194. * module data. It runs after hook_cache_flush() and after all module data has
  2195. * been updated.
  2196. *
  2197. * This hook is only invoked after the system has been completely cleared;
  2198. * i.e., all previously cached data is known to be gone and every API in the
  2199. * system is known to return current information, so your module can safely rely
  2200. * on all available data to rebuild its own.
  2201. *
  2202. * @see hook_cache_flush()
  2203. * @see drupal_flush_all_caches()
  2204. */
  2205. function hook_rebuild() {
  2206. $themes = \Drupal::service('theme_handler')->listInfo();
  2207. foreach ($themes as $theme) {
  2208. _block_rehash($theme->getName());
  2209. }
  2210. }
  2211. /**
  2212. * Alter the configuration synchronization steps.
  2213. *
  2214. * @param array $sync_steps
  2215. * A one-dimensional array of \Drupal\Core\Config\ConfigImporter method names
  2216. * or callables that are invoked to complete the import, in the order that
  2217. * they will be processed. Each callable item defined in $sync_steps should
  2218. * either be a global function or a public static method. The callable should
  2219. * accept a $context array by reference. For example:
  2220. * <code>
  2221. * function _additional_configuration_step(&$context) {
  2222. * // Do stuff.
  2223. * // If finished set $context['finished'] = 1.
  2224. * }
  2225. * </code>
  2226. * For more information on creating batches, see the
  2227. * @link batch Batch operations @endlink documentation.
  2228. *
  2229. * @see callback_batch_operation()
  2230. * @see \Drupal\Core\Config\ConfigImporter::initialize()
  2231. */
  2232. function hook_config_import_steps_alter(&$sync_steps, \Drupal\Core\Config\ConfigImporter $config_importer) {
  2233. $deletes = $config_importer->getUnprocessedConfiguration('delete');
  2234. if (isset($deletes['field.storage.node.body'])) {
  2235. $sync_steps[] = '_additional_configuration_step';
  2236. }
  2237. }
  2238. /**
  2239. * Alter config typed data definitions.
  2240. *
  2241. * For example you can alter the typed data types representing each
  2242. * configuration schema type to change default labels or form element renderers
  2243. * used for configuration translation.
  2244. *
  2245. * If implementations of this hook add or remove configuration schema a
  2246. * ConfigSchemaAlterException will be thrown. Keep in mind that there are tools
  2247. * that may use the configuration schema for static analysis of configuration
  2248. * files, like the string extractor for the localization system. Such systems
  2249. * won't work with dynamically defined configuration schemas.
  2250. *
  2251. * For adding new data types use configuration schema YAML files instead.
  2252. *
  2253. * @param $definitions
  2254. * Associative array of configuration type definitions keyed by schema type
  2255. * names. The elements are themselves array with information about the type.
  2256. *
  2257. * @see \Drupal\Core\Config\TypedConfigManager
  2258. * @see \Drupal\Core\Config\Schema\ConfigSchemaAlterException
  2259. */
  2260. function hook_config_schema_info_alter(&$definitions) {
  2261. // Enhance the text and date type definitions with classes to generate proper
  2262. // form elements in ConfigTranslationFormBase. Other translatable types will
  2263. // appear as a one line textfield.
  2264. $definitions['text']['form_element_class'] = '\Drupal\config_translation\FormElement\Textarea';
  2265. $definitions['date_format']['form_element_class'] = '\Drupal\config_translation\FormElement\DateFormat';
  2266. }
  2267. /**
  2268. * Alter validation constraint plugin definitions.
  2269. *
  2270. * @param array[] $definitions
  2271. * The array of validation constraint definitions, keyed by plugin ID.
  2272. *
  2273. * @see \Drupal\Core\Validation\ConstraintManager
  2274. * @see \Drupal\Core\Validation\Annotation\Constraint
  2275. */
  2276. function hook_validation_constraint_alter(array &$definitions) {
  2277. $definitions['Null']['class'] = '\Drupal\mymodule\Validator\Constraints\MyClass';
  2278. }
  2279. /**
  2280. * @} End of "addtogroup hooks".
  2281. */
  2282. /**
  2283. * @defgroup ajax Ajax API
  2284. * @{
  2285. * Overview for Drupal's Ajax API.
  2286. *
  2287. * @section sec_overview Overview of Ajax
  2288. * Ajax is the process of dynamically updating parts of a page's HTML based on
  2289. * data from the server. When a specified event takes place, a PHP callback is
  2290. * triggered, which performs server-side logic and may return updated markup or
  2291. * JavaScript commands to run. After the return, the browser runs the JavaScript
  2292. * or updates the markup on the fly, with no full page refresh necessary.
  2293. *
  2294. * Many different events can trigger Ajax responses, including:
  2295. * - Clicking a button
  2296. * - Pressing a key
  2297. * - Moving the mouse
  2298. *
  2299. * @section sec_framework Ajax responses in forms
  2300. * Forms that use the Drupal Form API (see the
  2301. * @link form_api Form API topic @endlink for more information about forms) can
  2302. * trigger AJAX responses. Here is an outline of the steps:
  2303. * - Add property '#ajax' to a form element in your form array, to trigger an
  2304. * Ajax response.
  2305. * - Write an Ajax callback to process the input and respond.
  2306. * See sections below for details on these two steps.
  2307. *
  2308. * @subsection sub_form Adding Ajax triggers to a form
  2309. * As an example of adding Ajax triggers to a form, consider editing a date
  2310. * format, where the user is provided with a sample of the generated date output
  2311. * as they type. To accomplish this, typing in the text field should trigger an
  2312. * Ajax response. This is done in the text field form array element
  2313. * in \Drupal\config_translation\FormElement\DateFormat::getFormElement():
  2314. * @code
  2315. * '#ajax' => array(
  2316. * 'callback' => 'Drupal\config_translation\FormElement\DateFormat::ajaxSample',
  2317. * 'event' => 'keyup',
  2318. * 'progress' => array(
  2319. * 'type' => 'throbber',
  2320. * 'message' => NULL,
  2321. * ),
  2322. * ),
  2323. * @endcode
  2324. *
  2325. * As you can see from this example, the #ajax property for a form element is
  2326. * an array. Here are the details of its elements, all of which are optional:
  2327. * - callback: The callback to invoke to handle the server side of the
  2328. * Ajax event. More information on callbacks is below in @ref sub_callback.
  2329. * - wrapper: The HTML 'id' attribute of the area where the content returned by
  2330. * the callback should be placed. Note that callbacks have a choice of
  2331. * returning content or JavaScript commands; 'wrapper' is used for content
  2332. * returns.
  2333. * - method: The jQuery method for placing the new content (used with
  2334. * 'wrapper'). Valid options are 'replaceWith' (default), 'append', 'prepend',
  2335. * 'before', 'after', or 'html'. See
  2336. * http://api.jquery.com/category/manipulation/ for more information on these
  2337. * methods.
  2338. * - effect: The jQuery effect to use when placing the new HTML (used with
  2339. * 'wrapper'). Valid options are 'none' (default), 'slide', or 'fade'.
  2340. * - speed: The effect speed to use (used with 'effect' and 'wrapper'). Valid
  2341. * options are 'slow' (default), 'fast', or the number of milliseconds the
  2342. * effect should run.
  2343. * - event: The JavaScript event to respond to. This is selected automatically
  2344. * for the type of form element; provide a value to override the default.
  2345. * - prevent: A JavaScript event to prevent when the event is triggered. For
  2346. * example, if you use event 'mousedown' on a button, you might want to
  2347. * prevent 'click' events from also being triggered.
  2348. * - progress: An array indicating how to show Ajax processing progress. Can
  2349. * contain one or more of these elements:
  2350. * - type: Type of indicator: 'throbber' (default) or 'bar'.
  2351. * - message: Translated message to display.
  2352. * - url: For a bar progress indicator, URL path for determining progress.
  2353. * - interval: For a bar progress indicator, how often to update it.
  2354. * - url: A \Drupal\Core\Url to which to submit the Ajax request. If omitted,
  2355. * defaults to either the same URL as the form or link destination is for
  2356. * someone with JavaScript disabled, or a slightly modified version (e.g.,
  2357. * with a query parameter added, removed, or changed) of that URL if
  2358. * necessary to support Drupal's content negotiation. It is recommended to
  2359. * omit this key and use Drupal's content negotiation rather than using
  2360. * substantially different URLs between Ajax and non-Ajax.
  2361. *
  2362. * @subsection sub_callback Setting up a callback to process Ajax
  2363. * Once you have set up your form to trigger an Ajax response (see @ref sub_form
  2364. * above), you need to write some PHP code to process the response. If you use
  2365. * 'path' in your Ajax set-up, your route controller will be triggered with only
  2366. * the information you provide in the URL. If you use 'callback', your callback
  2367. * method is a function, which will receive the $form and $form_state from the
  2368. * triggering form. You can use $form_state to get information about the
  2369. * data the user has entered into the form. For instance, in the above example
  2370. * for the date format preview,
  2371. * \Drupal\config_translation\FormElement\DateFormat\ajaxSample() does this to
  2372. * get the format string entered by the user:
  2373. * @code
  2374. * $format_value = \Drupal\Component\Utility\NestedArray::getValue(
  2375. * $form_state->getValues(),
  2376. * $form_state->getTriggeringElement()['#array_parents']);
  2377. * @endcode
  2378. *
  2379. * Once you have processed the input, you have your choice of returning HTML
  2380. * markup or a set of Ajax commands. If you choose to return HTML markup, you
  2381. * can return it as a string or a renderable array, and it will be placed in
  2382. * the defined 'wrapper' element (see documentation above in @ref sub_form).
  2383. * In addition, any messages returned by drupal_get_messages(), themed as in
  2384. * status-messages.html.twig, will be prepended.
  2385. *
  2386. * To return commands, you need to set up an object of class
  2387. * \Drupal\Core\Ajax\AjaxResponse, and then use its addCommand() method to add
  2388. * individual commands to it. In the date format preview example, the format
  2389. * output is calculated, and then it is returned as replacement markup for a div
  2390. * like this:
  2391. * @code
  2392. * $response = new AjaxResponse();
  2393. * $response->addCommand(new ReplaceCommand(
  2394. * '#edit-date-format-suffix',
  2395. * '<small id="edit-date-format-suffix">' . $format . '</small>'));
  2396. * return $response;
  2397. * @endcode
  2398. *
  2399. * The individual commands that you can return implement interface
  2400. * \Drupal\Core\Ajax\CommandInterface. Available commands provide the ability
  2401. * to pop up alerts, manipulate text and markup in various ways, redirect
  2402. * to a new URL, and the generic \Drupal\Core\Ajax\InvokeCommand, which
  2403. * invokes an arbitrary jQuery command.
  2404. *
  2405. * As noted above, status messages are prepended automatically if you use the
  2406. * 'wrapper' method and return HTML markup. This is not the case if you return
  2407. * commands, but if you would like to show status messages, you can add
  2408. * @code
  2409. * array('#type' => 'status_messages')
  2410. * @endcode
  2411. * to a render array, use drupal_render() to render it, and add a command to
  2412. * place the messages in an appropriate location.
  2413. *
  2414. * @section sec_other Other methods for triggering Ajax
  2415. * Here are some additional methods you can use to trigger Ajax responses in
  2416. * Drupal:
  2417. * - Add class 'use-ajax' to a link. The link will be loaded using an Ajax
  2418. * call. When using this method, the href of the link can contain '/nojs/' as
  2419. * part of the path. When the Ajax JavaScript processes the page, it will
  2420. * convert this to '/ajax/'. The server is then able to easily tell if this
  2421. * request was made through an actual Ajax request or in a degraded state, and
  2422. * respond appropriately.
  2423. * - Add class 'use-ajax-submit' to a submit button in a form. The form will
  2424. * then be submitted via Ajax to the path specified in the #action. Like the
  2425. * ajax-submit class on links, this path will have '/nojs/' replaced with
  2426. * '/ajax/' so that the submit handler can tell if the form was submitted in a
  2427. * degraded state or not.
  2428. * - Add property '#autocomplete_route_name' to a text field in a form. The
  2429. * route controller for this route must return an array of options for
  2430. * autocomplete, as a \Symfony\Component\HttpFoundation\JsonResponse object.
  2431. * See the @link menu Routing topic @endlink for more information about
  2432. * routing.
  2433. */
  2434. /**
  2435. * @} End of "defgroup ajax".
  2436. */
  2437. /**
  2438. * @defgroup service_tag Service Tags
  2439. * @{
  2440. * Service tags overview
  2441. *
  2442. * Some services have tags, which are defined in the service definition. Tags
  2443. * are used to define a group of related services, or to specify some aspect of
  2444. * how the service behaves. Typically, if you tag a service, your service class
  2445. * must also implement a corresponding interface. Some common examples:
  2446. * - access_check: Indicates a route access checking service; see the
  2447. * @link menu Menu and routing system topic @endlink for more information.
  2448. * - cache.bin: Indicates a cache bin service; see the
  2449. * @link cache Cache topic @endlink for more information.
  2450. * - event_subscriber: Indicates an event subscriber service. Event subscribers
  2451. * can be used for dynamic routing and route altering; see the
  2452. * @link menu Menu and routing system topic @endlink for more information.
  2453. * They can also be used for other purposes; see
  2454. * http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html
  2455. * for more information.
  2456. * - needs_destruction: Indicates that a destruct() method needs to be called
  2457. * at the end of a request to finalize operations, if this service was
  2458. * instantiated. Services should implement \Drupal\Core\DestructableInterface
  2459. * in this case.
  2460. * - context_provider: Indicates a block context provider, used for example
  2461. * by block conditions. It has to implement
  2462. * \Drupal\Core\Plugin\Context\ContextProviderInterface.
  2463. * - http_client_middleware: Indicates that the service provides a guzzle
  2464. * middleware, see
  2465. * https://guzzle.readthedocs.org/en/latest/handlers-and-middleware.html for
  2466. * more information.
  2467. *
  2468. * Creating a tag for a service does not do anything on its own, but tags
  2469. * can be discovered or queried in a compiler pass when the container is built,
  2470. * and a corresponding action can be taken. See
  2471. * \Drupal\Core\Render\MainContent\MainContentRenderersPass for an example of
  2472. * finding tagged services.
  2473. *
  2474. * See @link container Services and Dependency Injection Container @endlink for
  2475. * information on services and the dependency injection container.
  2476. *
  2477. * @}
  2478. */
  2479. /**
  2480. * @defgroup events Events
  2481. * @{
  2482. * Overview of event dispatch and subscribing
  2483. *
  2484. * @section sec_intro Introduction and terminology
  2485. * Events are part of the Symfony framework: they allow for different components
  2486. * of the system to interact and communicate with each other. Each event has a
  2487. * unique string name. One system component dispatches the event at an
  2488. * appropriate time; many events are dispatched by Drupal core and the Symfony
  2489. * framework in every request. Other system components can register as event
  2490. * subscribers; when an event is dispatched, a method is called on each
  2491. * registered subscriber, allowing each one to react. For more on the general
  2492. * concept of events, see
  2493. * http://symfony.com/doc/current/components/event_dispatcher/introduction.html
  2494. *
  2495. * @section sec_dispatch Dispatching events
  2496. * To dispatch an event, call the
  2497. * \Symfony\Component\EventDispatcher\EventDispatcherInterface::dispatch()
  2498. * method on the 'event_dispatcher' service (see the
  2499. * @link container Services topic @endlink for more information about how to
  2500. * interact with services). The first argument is the unique event name, which
  2501. * you should normally define as a constant in a separate static class (see
  2502. * \Symfony\Component\HttpKernel\KernelEvents and
  2503. * \Drupal\Core\Config\ConfigEvents for examples). The second argument is a
  2504. * \Symfony\Component\EventDispatcher\Event object; normally you will need to
  2505. * extend this class, so that your event class can provide data to the event
  2506. * subscribers.
  2507. *
  2508. * @section sec_subscribe Registering event subscribers
  2509. * Here are the steps to register an event subscriber:
  2510. * - Define a service in your module, tagged with 'event_subscriber' (see the
  2511. * @link container Services topic @endlink for instructions).
  2512. * - Define a class for your subscriber service that implements
  2513. * \Symfony\Component\EventDispatcher\EventSubscriberInterface
  2514. * - In your class, the getSubscribedEvents method returns a list of the events
  2515. * this class is subscribed to, and which methods on the class should be
  2516. * called for each one. Example:
  2517. * @code
  2518. * public static function getSubscribedEvents() {
  2519. * // Subscribe to kernel terminate with priority 100.
  2520. * $events[KernelEvents::TERMINATE][] = array('onTerminate', 100);
  2521. * // Subscribe to kernel request with default priority of 0.
  2522. * $events[KernelEvents::REQUEST][] = array('onRequest');
  2523. * return $events;
  2524. * }
  2525. * @endcode
  2526. * - Write the methods that respond to the events; each one receives the
  2527. * event object provided in the dispatch as its one argument. In the above
  2528. * example, you would need to write onTerminate() and onRequest() methods.
  2529. *
  2530. * Note that in your getSubscribedEvents() method, you can optionally set the
  2531. * priority of your event subscriber (see terminate example above). Event
  2532. * subscribers with higher priority numbers get executed first; the default
  2533. * priority is zero. If two event subscribers for the same event have the same
  2534. * priority, the one defined in a module with a lower module weight will fire
  2535. * first. Subscribers defined in the same services file are fired in
  2536. * definition order. If order matters defining a priority is strongly advised
  2537. * instead of relying on these two tie breaker rules as they might change in a
  2538. * minor release.
  2539. * @}
  2540. */