3 <html lang=
"en" class=
"no-js">
7 <meta name=
"viewport" content=
"width=device-width,initial-scale=1">
11 <link rel=
"canonical" href=
"https://docs.woltlab.com/6.0/migration/wsc54/php/">
14 <link rel=
"prev" href=
"../../wsc55/deprecations_removals/">
17 <link rel=
"next" href=
"../javascript/">
19 <link rel=
"icon" href=
"../../../assets/default.favicon.ico">
20 <meta name=
"generator" content=
"mkdocs-1.4.3, mkdocs-material-9.1.15">
24 <title>PHP API - WoltLab Suite Documentation
</title>
28 <link rel=
"stylesheet" href=
"../../../assets/stylesheets/main.26e3688c.min.css">
31 <link rel=
"stylesheet" href=
"../../../assets/stylesheets/palette.ecc896b0.min.css">
41 <link rel=
"stylesheet" href=
"../../../stylesheets/extra.css">
43 <script>__md_scope=new URL(
"../../..",location),__md_hash=e=
>[...e].reduce((e,_)=
>(e<
<5)-e+_.charCodeAt(
0),
0),__md_get=(e,_=localStorage,t=__md_scope)=
>JSON.parse(_.getItem(t.pathname+
"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=
>{try{t.setItem(a.pathname+
"."+e,JSON.stringify(_))}catch(e){}}
</script>
58 <body dir=
"ltr" data-md-color-scheme=
"default" data-md-color-primary=
"teal" data-md-color-accent=
"indigo">
62 <input class=
"md-toggle" data-md-toggle=
"drawer" type=
"checkbox" id=
"__drawer" autocomplete=
"off">
63 <input class=
"md-toggle" data-md-toggle=
"search" type=
"checkbox" id=
"__search" autocomplete=
"off">
64 <label class=
"md-overlay" for=
"__drawer"></label>
65 <div data-md-component=
"skip">
68 <a href=
"#migrating-from-woltlab-suite-54-php" class=
"md-skip">
73 <div data-md-component=
"announce">
75 <aside class=
"md-banner">
76 <div class=
"md-banner__inner md-grid md-typeset">
79 <a href=
"https://www.woltlab.com">Back to
<strong>woltlab.com
</strong></a>
87 <div data-md-color-scheme=
"default" data-md-component=
"outdated" hidden
>
96 <header class=
"md-header md-header--shadow" data-md-component=
"header">
97 <nav class=
"md-header__inner md-grid" aria-label=
"Header">
98 <a href=
"../../.." title=
"WoltLab Suite Documentation" class=
"md-header__button md-logo" aria-label=
"WoltLab Suite Documentation" data-md-component=
"logo">
100 <img src=
"../../../assets/logo.png" alt=
"logo">
103 <label class=
"md-header__button md-icon" for=
"__drawer">
104 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
106 <div class=
"md-header__title" data-md-component=
"header-title">
107 <div class=
"md-header__ellipsis">
108 <div class=
"md-header__topic">
109 <span class=
"md-ellipsis">
110 WoltLab Suite Documentation
113 <div class=
"md-header__topic" data-md-component=
"header-topic">
114 <span class=
"md-ellipsis">
127 <label class=
"md-header__button md-icon" for=
"__search">
128 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
130 <div class=
"md-search" data-md-component=
"search" role=
"dialog">
131 <label class=
"md-search__overlay" for=
"__search"></label>
132 <div class=
"md-search__inner" role=
"search">
133 <form class=
"md-search__form" name=
"search">
134 <input type=
"text" class=
"md-search__input" name=
"query" aria-label=
"Search" placeholder=
"Search" autocapitalize=
"off" autocorrect=
"off" autocomplete=
"off" spellcheck=
"false" data-md-component=
"search-query" required
>
135 <label class=
"md-search__icon md-icon" for=
"__search">
136 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
137 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
139 <nav class=
"md-search__options" aria-label=
"Search">
141 <button type=
"reset" class=
"md-search__icon md-icon" title=
"Clear" aria-label=
"Clear" tabindex=
"-1">
142 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
147 <div class=
"md-search__output">
148 <div class=
"md-search__scrollwrap" data-md-scrollfix
>
149 <div class=
"md-search-result" data-md-component=
"search-result">
150 <div class=
"md-search-result__meta">
153 <ol class=
"md-search-result__list" role=
"presentation"></ol>
161 <div class=
"md-header__source">
162 <a href=
"https://github.com/WoltLab/docs.woltlab.com/" title=
"Go to repository" class=
"md-source" data-md-component=
"source">
163 <div class=
"md-source__icon md-icon">
165 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=
"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
167 <div class=
"md-source__repository">
177 <div class=
"md-container" data-md-component=
"container">
184 <main class=
"md-main" data-md-component=
"main">
185 <div class=
"md-main__inner md-grid">
189 <div class=
"md-sidebar md-sidebar--primary" data-md-component=
"sidebar" data-md-type=
"navigation" >
190 <div class=
"md-sidebar__scrollwrap">
191 <div class=
"md-sidebar__inner">
195 <nav class=
"md-nav md-nav--primary" aria-label=
"Navigation" data-md-level=
"0">
196 <label class=
"md-nav__title" for=
"__drawer">
197 <a href=
"../../.." title=
"WoltLab Suite Documentation" class=
"md-nav__button md-logo" aria-label=
"WoltLab Suite Documentation" data-md-component=
"logo">
199 <img src=
"../../../assets/logo.png" alt=
"logo">
202 WoltLab Suite Documentation
205 <div class=
"md-nav__source">
206 <a href=
"https://github.com/WoltLab/docs.woltlab.com/" title=
"Go to repository" class=
"md-source" data-md-component=
"source">
207 <div class=
"md-source__icon md-icon">
209 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=
"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
211 <div class=
"md-source__repository">
217 <ul class=
"md-nav__list" data-md-scrollfix
>
226 <li class=
"md-nav__item">
227 <a href=
"../../../getting-started/" class=
"md-nav__link">
242 <li class=
"md-nav__item md-nav__item--nested">
247 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_2" >
251 <label class=
"md-nav__link" for=
"__nav_2" id=
"__nav_2_label" tabindex=
"0">
253 <span class=
"md-nav__icon md-icon"></span>
256 <nav class=
"md-nav" data-md-level=
"1" aria-labelledby=
"__nav_2_label" aria-expanded=
"false">
257 <label class=
"md-nav__title" for=
"__nav_2">
258 <span class=
"md-nav__icon md-icon"></span>
261 <ul class=
"md-nav__list" data-md-scrollfix
>
268 <li class=
"md-nav__item">
269 <a href=
"../../../php/pages/" class=
"md-nav__link">
282 <li class=
"md-nav__item">
283 <a href=
"../../../php/database-objects/" class=
"md-nav__link">
296 <li class=
"md-nav__item">
297 <a href=
"../../../php/database-access/" class=
"md-nav__link">
310 <li class=
"md-nav__item">
311 <a href=
"../../../php/exceptions/" class=
"md-nav__link">
325 <li class=
"md-nav__item md-nav__item--nested">
330 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_2_5" >
334 <label class=
"md-nav__link" for=
"__nav_2_5" id=
"__nav_2_5_label" tabindex=
"0">
336 <span class=
"md-nav__icon md-icon"></span>
339 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_2_5_label" aria-expanded=
"false">
340 <label class=
"md-nav__title" for=
"__nav_2_5">
341 <span class=
"md-nav__icon md-icon"></span>
344 <ul class=
"md-nav__list" data-md-scrollfix
>
352 <li class=
"md-nav__item md-nav__item--nested">
357 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_2_5_1" >
361 <label class=
"md-nav__link" for=
"__nav_2_5_1" id=
"__nav_2_5_1_label" tabindex=
"0">
363 <span class=
"md-nav__icon md-icon"></span>
366 <nav class=
"md-nav" data-md-level=
"3" aria-labelledby=
"__nav_2_5_1_label" aria-expanded=
"false">
367 <label class=
"md-nav__title" for=
"__nav_2_5_1">
368 <span class=
"md-nav__icon md-icon"></span>
371 <ul class=
"md-nav__list" data-md-scrollfix
>
378 <li class=
"md-nav__item">
379 <a href=
"../../../php/api/caches/" class=
"md-nav__link">
392 <li class=
"md-nav__item">
393 <a href=
"../../../php/api/caches_persistent-caches/" class=
"md-nav__link">
406 <li class=
"md-nav__item">
407 <a href=
"../../../php/api/caches_runtime-caches/" class=
"md-nav__link">
427 <li class=
"md-nav__item">
428 <a href=
"../../../php/api/comments/" class=
"md-nav__link">
441 <li class=
"md-nav__item">
442 <a href=
"../../../php/api/cronjobs/" class=
"md-nav__link">
455 <li class=
"md-nav__item">
456 <a href=
"../../../php/api/events/" class=
"md-nav__link">
470 <li class=
"md-nav__item md-nav__item--nested">
475 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_2_5_5" >
479 <label class=
"md-nav__link" for=
"__nav_2_5_5" id=
"__nav_2_5_5_label" tabindex=
"0">
481 <span class=
"md-nav__icon md-icon"></span>
484 <nav class=
"md-nav" data-md-level=
"3" aria-labelledby=
"__nav_2_5_5_label" aria-expanded=
"false">
485 <label class=
"md-nav__title" for=
"__nav_2_5_5">
486 <span class=
"md-nav__icon md-icon"></span>
489 <ul class=
"md-nav__list" data-md-scrollfix
>
496 <li class=
"md-nav__item">
497 <a href=
"../../../php/api/form_builder/overview/" class=
"md-nav__link">
510 <li class=
"md-nav__item">
511 <a href=
"../../../php/api/form_builder/structure/" class=
"md-nav__link">
524 <li class=
"md-nav__item">
525 <a href=
"../../../php/api/form_builder/form_fields/" class=
"md-nav__link">
538 <li class=
"md-nav__item">
539 <a href=
"../../../php/api/form_builder/validation_data/" class=
"md-nav__link">
552 <li class=
"md-nav__item">
553 <a href=
"../../../php/api/form_builder/dependencies/" class=
"md-nav__link">
573 <li class=
"md-nav__item">
574 <a href=
"../../../php/api/package_installation_plugins/" class=
"md-nav__link">
575 Package Installation Plugins
587 <li class=
"md-nav__item">
588 <a href=
"../../../php/api/user_activity_points/" class=
"md-nav__link">
601 <li class=
"md-nav__item">
602 <a href=
"../../../php/api/user_notifications/" class=
"md-nav__link">
615 <li class=
"md-nav__item">
616 <a href=
"../../../php/api/sitemaps/" class=
"md-nav__link">
636 <li class=
"md-nav__item">
637 <a href=
"../../../php/code-style/" class=
"md-nav__link">
650 <li class=
"md-nav__item">
651 <a href=
"../../../php/apps/" class=
"md-nav__link">
664 <li class=
"md-nav__item">
665 <a href=
"../../../php/gdpr/" class=
"md-nav__link">
687 <li class=
"md-nav__item md-nav__item--nested">
692 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_3" >
696 <label class=
"md-nav__link" for=
"__nav_3" id=
"__nav_3_label" tabindex=
"0">
697 Languages, Templates & CSS
698 <span class=
"md-nav__icon md-icon"></span>
701 <nav class=
"md-nav" data-md-level=
"1" aria-labelledby=
"__nav_3_label" aria-expanded=
"false">
702 <label class=
"md-nav__title" for=
"__nav_3">
703 <span class=
"md-nav__icon md-icon"></span>
704 Languages, Templates & CSS
706 <ul class=
"md-nav__list" data-md-scrollfix
>
713 <li class=
"md-nav__item">
714 <a href=
"../../../view/languages/" class=
"md-nav__link">
727 <li class=
"md-nav__item">
728 <a href=
"../../../view/templates/" class=
"md-nav__link">
741 <li class=
"md-nav__item">
742 <a href=
"../../../view/template-modifiers/" class=
"md-nav__link">
755 <li class=
"md-nav__item">
756 <a href=
"../../../view/template-plugins/" class=
"md-nav__link">
769 <li class=
"md-nav__item">
770 <a href=
"../../../view/css/" class=
"md-nav__link">
792 <li class=
"md-nav__item md-nav__item--nested">
797 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_4" >
801 <label class=
"md-nav__link" for=
"__nav_4" id=
"__nav_4_label" tabindex=
"0">
802 TypeScript and JavaScript API
803 <span class=
"md-nav__icon md-icon"></span>
806 <nav class=
"md-nav" data-md-level=
"1" aria-labelledby=
"__nav_4_label" aria-expanded=
"false">
807 <label class=
"md-nav__title" for=
"__nav_4">
808 <span class=
"md-nav__icon md-icon"></span>
809 TypeScript and JavaScript API
811 <ul class=
"md-nav__list" data-md-scrollfix
>
818 <li class=
"md-nav__item">
819 <a href=
"../../../javascript/general-usage/" class=
"md-nav__link">
832 <li class=
"md-nav__item">
833 <a href=
"../../../javascript/typescript/" class=
"md-nav__link">
847 <li class=
"md-nav__item md-nav__item--nested">
852 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_4_3" >
856 <label class=
"md-nav__link" for=
"__nav_4_3" id=
"__nav_4_3_label" tabindex=
"0">
858 <span class=
"md-nav__icon md-icon"></span>
861 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_4_3_label" aria-expanded=
"false">
862 <label class=
"md-nav__title" for=
"__nav_4_3">
863 <span class=
"md-nav__icon md-icon"></span>
866 <ul class=
"md-nav__list" data-md-scrollfix
>
873 <li class=
"md-nav__item">
874 <a href=
"../../../javascript/components_confirmation/" class=
"md-nav__link">
887 <li class=
"md-nav__item">
888 <a href=
"../../../javascript/components_dialog/" class=
"md-nav__link">
901 <li class=
"md-nav__item">
902 <a href=
"../../../javascript/components_google_maps/" class=
"md-nav__link">
915 <li class=
"md-nav__item">
916 <a href=
"../../../javascript/components_pagination/" class=
"md-nav__link">
937 <li class=
"md-nav__item md-nav__item--nested">
942 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_4_4" >
946 <label class=
"md-nav__link" for=
"__nav_4_4" id=
"__nav_4_4_label" tabindex=
"0">
948 <span class=
"md-nav__icon md-icon"></span>
951 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_4_4_label" aria-expanded=
"false">
952 <label class=
"md-nav__title" for=
"__nav_4_4">
953 <span class=
"md-nav__icon md-icon"></span>
956 <ul class=
"md-nav__list" data-md-scrollfix
>
963 <li class=
"md-nav__item">
964 <a href=
"../../../javascript/new-api_writing-a-module/" class=
"md-nav__link">
977 <li class=
"md-nav__item">
978 <a href=
"../../../javascript/new-api_core/" class=
"md-nav__link">
991 <li class=
"md-nav__item">
992 <a href=
"../../../javascript/new-api_dom/" class=
"md-nav__link">
1005 <li class=
"md-nav__item">
1006 <a href=
"../../../javascript/new-api_events/" class=
"md-nav__link">
1019 <li class=
"md-nav__item">
1020 <a href=
"../../../javascript/new-api_ajax/" class=
"md-nav__link">
1033 <li class=
"md-nav__item">
1034 <a href=
"../../../javascript/new-api_dialogs/" class=
"md-nav__link">
1047 <li class=
"md-nav__item">
1048 <a href=
"../../../javascript/new-api_browser/" class=
"md-nav__link">
1049 Browser and Screen Sizes
1061 <li class=
"md-nav__item">
1062 <a href=
"../../../javascript/new-api_ui/" class=
"md-nav__link">
1082 <li class=
"md-nav__item">
1083 <a href=
"../../../javascript/legacy-api/" class=
"md-nav__link">
1096 <li class=
"md-nav__item">
1097 <a href=
"../../../javascript/code-snippets/" class=
"md-nav__link">
1119 <li class=
"md-nav__item md-nav__item--nested">
1124 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_5" >
1128 <label class=
"md-nav__link" for=
"__nav_5" id=
"__nav_5_label" tabindex=
"0">
1130 <span class=
"md-nav__icon md-icon"></span>
1133 <nav class=
"md-nav" data-md-level=
"1" aria-labelledby=
"__nav_5_label" aria-expanded=
"false">
1134 <label class=
"md-nav__title" for=
"__nav_5">
1135 <span class=
"md-nav__icon md-icon"></span>
1138 <ul class=
"md-nav__list" data-md-scrollfix
>
1145 <li class=
"md-nav__item">
1146 <a href=
"../../../package/package-xml/" class=
"md-nav__link">
1160 <li class=
"md-nav__item md-nav__item--nested">
1165 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_5_2" >
1169 <label class=
"md-nav__link" for=
"__nav_5_2" id=
"__nav_5_2_label" tabindex=
"0">
1171 <span class=
"md-nav__icon md-icon"></span>
1174 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_5_2_label" aria-expanded=
"false">
1175 <label class=
"md-nav__title" for=
"__nav_5_2">
1176 <span class=
"md-nav__icon md-icon"></span>
1179 <ul class=
"md-nav__list" data-md-scrollfix
>
1186 <li class=
"md-nav__item">
1187 <a href=
"../../../package/pip/" class=
"md-nav__link">
1200 <li class=
"md-nav__item">
1201 <a href=
"../../../package/pip/acl-option/" class=
"md-nav__link">
1214 <li class=
"md-nav__item">
1215 <a href=
"../../../package/pip/acp-menu/" class=
"md-nav__link">
1228 <li class=
"md-nav__item">
1229 <a href=
"../../../package/pip/acp-search-provider/" class=
"md-nav__link">
1242 <li class=
"md-nav__item">
1243 <a href=
"../../../package/pip/acp-template/" class=
"md-nav__link">
1256 <li class=
"md-nav__item">
1257 <a href=
"../../../package/pip/acp-template-delete/" class=
"md-nav__link">
1270 <li class=
"md-nav__item">
1271 <a href=
"../../../package/pip/bbcode/" class=
"md-nav__link">
1284 <li class=
"md-nav__item">
1285 <a href=
"../../../package/pip/box/" class=
"md-nav__link">
1298 <li class=
"md-nav__item">
1299 <a href=
"../../../package/pip/clipboard-action/" class=
"md-nav__link">
1312 <li class=
"md-nav__item">
1313 <a href=
"../../../package/pip/core-object/" class=
"md-nav__link">
1326 <li class=
"md-nav__item">
1327 <a href=
"../../../package/pip/cronjob/" class=
"md-nav__link">
1340 <li class=
"md-nav__item">
1341 <a href=
"../../../package/pip/database/" class=
"md-nav__link">
1354 <li class=
"md-nav__item">
1355 <a href=
"../../../package/pip/event-listener/" class=
"md-nav__link">
1368 <li class=
"md-nav__item">
1369 <a href=
"../../../package/pip/file/" class=
"md-nav__link">
1382 <li class=
"md-nav__item">
1383 <a href=
"../../../package/pip/file-delete/" class=
"md-nav__link">
1396 <li class=
"md-nav__item">
1397 <a href=
"../../../package/pip/language/" class=
"md-nav__link">
1410 <li class=
"md-nav__item">
1411 <a href=
"../../../package/pip/media-provider/" class=
"md-nav__link">
1424 <li class=
"md-nav__item">
1425 <a href=
"../../../package/pip/menu/" class=
"md-nav__link">
1438 <li class=
"md-nav__item">
1439 <a href=
"../../../package/pip/menu-item/" class=
"md-nav__link">
1452 <li class=
"md-nav__item">
1453 <a href=
"../../../package/pip/object-type/" class=
"md-nav__link">
1466 <li class=
"md-nav__item">
1467 <a href=
"../../../package/pip/object-type-definition/" class=
"md-nav__link">
1468 objectTypeDefinition
1480 <li class=
"md-nav__item">
1481 <a href=
"../../../package/pip/option/" class=
"md-nav__link">
1494 <li class=
"md-nav__item">
1495 <a href=
"../../../package/pip/page/" class=
"md-nav__link">
1508 <li class=
"md-nav__item">
1509 <a href=
"../../../package/pip/pip/" class=
"md-nav__link">
1522 <li class=
"md-nav__item">
1523 <a href=
"../../../package/pip/script/" class=
"md-nav__link">
1536 <li class=
"md-nav__item">
1537 <a href=
"../../../package/pip/smiley/" class=
"md-nav__link">
1550 <li class=
"md-nav__item">
1551 <a href=
"../../../package/pip/sql/" class=
"md-nav__link">
1564 <li class=
"md-nav__item">
1565 <a href=
"../../../package/pip/style/" class=
"md-nav__link">
1578 <li class=
"md-nav__item">
1579 <a href=
"../../../package/pip/template/" class=
"md-nav__link">
1592 <li class=
"md-nav__item">
1593 <a href=
"../../../package/pip/template-delete/" class=
"md-nav__link">
1606 <li class=
"md-nav__item">
1607 <a href=
"../../../package/pip/template-listener/" class=
"md-nav__link">
1620 <li class=
"md-nav__item">
1621 <a href=
"../../../package/pip/user-group-option/" class=
"md-nav__link">
1634 <li class=
"md-nav__item">
1635 <a href=
"../../../package/pip/user-menu/" class=
"md-nav__link">
1648 <li class=
"md-nav__item">
1649 <a href=
"../../../package/pip/user-notification-event/" class=
"md-nav__link">
1650 userNotificationEvent
1662 <li class=
"md-nav__item">
1663 <a href=
"../../../package/pip/user-option/" class=
"md-nav__link">
1676 <li class=
"md-nav__item">
1677 <a href=
"../../../package/pip/user-profile-menu/" class=
"md-nav__link">
1697 <li class=
"md-nav__item">
1698 <a href=
"../../../package/database-php-api/" class=
"md-nav__link">
1722 <li class=
"md-nav__item md-nav__item--active md-nav__item--nested">
1727 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_6" checked
>
1731 <label class=
"md-nav__link" for=
"__nav_6" id=
"__nav_6_label" tabindex=
"0">
1733 <span class=
"md-nav__icon md-icon"></span>
1736 <nav class=
"md-nav" data-md-level=
"1" aria-labelledby=
"__nav_6_label" aria-expanded=
"true">
1737 <label class=
"md-nav__title" for=
"__nav_6">
1738 <span class=
"md-nav__icon md-icon"></span>
1741 <ul class=
"md-nav__list" data-md-scrollfix
>
1749 <li class=
"md-nav__item md-nav__item--nested">
1754 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_6_1" >
1758 <label class=
"md-nav__link" for=
"__nav_6_1" id=
"__nav_6_1_label" tabindex=
"0">
1759 From WoltLab Suite
5.5
1760 <span class=
"md-nav__icon md-icon"></span>
1763 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_6_1_label" aria-expanded=
"false">
1764 <label class=
"md-nav__title" for=
"__nav_6_1">
1765 <span class=
"md-nav__icon md-icon"></span>
1766 From WoltLab Suite
5.5
1768 <ul class=
"md-nav__list" data-md-scrollfix
>
1775 <li class=
"md-nav__item">
1776 <a href=
"../../wsc55/php/" class=
"md-nav__link">
1789 <li class=
"md-nav__item">
1790 <a href=
"../../wsc55/javascript/" class=
"md-nav__link">
1791 TypeScript and JavaScript
1803 <li class=
"md-nav__item">
1804 <a href=
"../../wsc55/templates/" class=
"md-nav__link">
1817 <li class=
"md-nav__item">
1818 <a href=
"../../wsc55/icons/" class=
"md-nav__link">
1831 <li class=
"md-nav__item">
1832 <a href=
"../../wsc55/dialogs/" class=
"md-nav__link">
1845 <li class=
"md-nav__item">
1846 <a href=
"../../wsc55/libraries/" class=
"md-nav__link">
1847 Third Party Libraries
1859 <li class=
"md-nav__item">
1860 <a href=
"../../wsc55/deprecations_removals/" class=
"md-nav__link">
1861 Deprecations and Removals
1883 <li class=
"md-nav__item md-nav__item--active md-nav__item--nested">
1888 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_6_2" checked
>
1892 <label class=
"md-nav__link" for=
"__nav_6_2" id=
"__nav_6_2_label" tabindex=
"0">
1893 From WoltLab Suite
5.4
1894 <span class=
"md-nav__icon md-icon"></span>
1897 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_6_2_label" aria-expanded=
"true">
1898 <label class=
"md-nav__title" for=
"__nav_6_2">
1899 <span class=
"md-nav__icon md-icon"></span>
1900 From WoltLab Suite
5.4
1902 <ul class=
"md-nav__list" data-md-scrollfix
>
1911 <li class=
"md-nav__item md-nav__item--active">
1913 <input class=
"md-nav__toggle md-toggle" type=
"checkbox" id=
"__toc">
1919 <label class=
"md-nav__link md-nav__link--active" for=
"__toc">
1921 <span class=
"md-nav__icon md-icon"></span>
1924 <a href=
"./" class=
"md-nav__link md-nav__link--active">
1930 <nav class=
"md-nav md-nav--secondary" aria-label=
"Table of contents">
1937 <label class=
"md-nav__title" for=
"__toc">
1938 <span class=
"md-nav__icon md-icon"></span>
1941 <ul class=
"md-nav__list" data-md-component=
"toc" data-md-scrollfix
>
1943 <li class=
"md-nav__item">
1944 <a href=
"#initial-psr-7-support" class=
"md-nav__link">
1945 Initial PSR-
7 support
1948 <nav class=
"md-nav" aria-label=
"Initial PSR-7 support">
1949 <ul class=
"md-nav__list">
1951 <li class=
"md-nav__item">
1952 <a href=
"#recommended-changes-for-woltlab-suite-55" class=
"md-nav__link">
1953 Recommended changes for WoltLab Suite
5.5
1956 <nav class=
"md-nav" aria-label=
"Recommended changes for WoltLab Suite 5.5">
1957 <ul class=
"md-nav__list">
1959 <li class=
"md-nav__item">
1960 <a href=
"#migrating-redirects" class=
"md-nav__link">
1966 <li class=
"md-nav__item">
1967 <a href=
"#migrating-json-responses" class=
"md-nav__link">
1968 Migrating JSON responses
1983 <li class=
"md-nav__item">
1984 <a href=
"#events" class=
"md-nav__link">
1990 <li class=
"md-nav__item">
1991 <a href=
"#authentication" class=
"md-nav__link">
1997 <li class=
"md-nav__item">
1998 <a href=
"#embedded-objects-in-comments" class=
"md-nav__link">
1999 Embedded Objects in Comments
2004 <li class=
"md-nav__item">
2005 <a href=
"#emails" class=
"md-nav__link">
2009 <nav class=
"md-nav" aria-label=
"Emails">
2010 <ul class=
"md-nav__list">
2012 <li class=
"md-nav__item">
2013 <a href=
"#mailbox" class=
"md-nav__link">
2019 <li class=
"md-nav__item">
2020 <a href=
"#smtp" class=
"md-nav__link">
2031 <li class=
"md-nav__item">
2032 <a href=
"#search" class=
"md-nav__link">
2036 <nav class=
"md-nav" aria-label=
"Search">
2037 <ul class=
"md-nav__list">
2039 <li class=
"md-nav__item">
2040 <a href=
"#search-form" class=
"md-nav__link">
2046 <li class=
"md-nav__item">
2047 <a href=
"#exceptions" class=
"md-nav__link">
2058 <li class=
"md-nav__item">
2059 <a href=
"#package-installation-plugins" class=
"md-nav__link">
2060 Package Installation Plugins
2063 <nav class=
"md-nav" aria-label=
"Package Installation Plugins">
2064 <ul class=
"md-nav__list">
2066 <li class=
"md-nav__item">
2067 <a href=
"#database" class=
"md-nav__link">
2073 <li class=
"md-nav__item">
2074 <a href=
"#file-deletion" class=
"md-nav__link">
2080 <li class=
"md-nav__item">
2081 <a href=
"#language" class=
"md-nav__link">
2092 <li class=
"md-nav__item">
2093 <a href=
"#board-and-thread-subscriptions" class=
"md-nav__link">
2094 Board and Thread Subscriptions
2099 <li class=
"md-nav__item">
2100 <a href=
"#miscellaneous-changes" class=
"md-nav__link">
2101 Miscellaneous Changes
2104 <nav class=
"md-nav" aria-label=
"Miscellaneous Changes">
2105 <ul class=
"md-nav__list">
2107 <li class=
"md-nav__item">
2108 <a href=
"#view-counters" class=
"md-nav__link">
2114 <li class=
"md-nav__item">
2115 <a href=
"#form-builder" class=
"md-nav__link">
2140 <li class=
"md-nav__item">
2141 <a href=
"../javascript/" class=
"md-nav__link">
2142 TypeScript and JavaScript
2154 <li class=
"md-nav__item">
2155 <a href=
"../templates/" class=
"md-nav__link">
2168 <li class=
"md-nav__item">
2169 <a href=
"../libraries/" class=
"md-nav__link">
2170 Third Party Libraries
2182 <li class=
"md-nav__item">
2183 <a href=
"../deprecations_removals/" class=
"md-nav__link">
2184 Deprecations and Removals
2204 <li class=
"md-nav__item md-nav__item--nested">
2209 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_6_3" >
2213 <label class=
"md-nav__link" for=
"__nav_6_3" id=
"__nav_6_3_label" tabindex=
"0">
2214 From WoltLab Suite
5.3
2215 <span class=
"md-nav__icon md-icon"></span>
2218 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_6_3_label" aria-expanded=
"false">
2219 <label class=
"md-nav__title" for=
"__nav_6_3">
2220 <span class=
"md-nav__icon md-icon"></span>
2221 From WoltLab Suite
5.3
2223 <ul class=
"md-nav__list" data-md-scrollfix
>
2230 <li class=
"md-nav__item">
2231 <a href=
"../../wsc53/php/" class=
"md-nav__link">
2244 <li class=
"md-nav__item">
2245 <a href=
"../../wsc53/session/" class=
"md-nav__link">
2246 Session Handling and Authentication
2258 <li class=
"md-nav__item">
2259 <a href=
"../../wsc53/javascript/" class=
"md-nav__link">
2260 TypeScript and JavaScript
2272 <li class=
"md-nav__item">
2273 <a href=
"../../wsc53/templates/" class=
"md-nav__link">
2286 <li class=
"md-nav__item">
2287 <a href=
"../../wsc53/libraries/" class=
"md-nav__link">
2288 Third Party Libraries
2308 <li class=
"md-nav__item md-nav__item--nested">
2313 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_6_4" >
2317 <label class=
"md-nav__link" for=
"__nav_6_4" id=
"__nav_6_4_label" tabindex=
"0">
2318 From WoltLab Suite
5.2
2319 <span class=
"md-nav__icon md-icon"></span>
2322 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_6_4_label" aria-expanded=
"false">
2323 <label class=
"md-nav__title" for=
"__nav_6_4">
2324 <span class=
"md-nav__icon md-icon"></span>
2325 From WoltLab Suite
5.2
2327 <ul class=
"md-nav__list" data-md-scrollfix
>
2334 <li class=
"md-nav__item">
2335 <a href=
"../../wsc52/php/" class=
"md-nav__link">
2348 <li class=
"md-nav__item">
2349 <a href=
"../../wsc52/templates/" class=
"md-nav__link">
2350 Templates and Languages
2362 <li class=
"md-nav__item">
2363 <a href=
"../../wsc52/libraries/" class=
"md-nav__link">
2364 Third Party Libraries
2384 <li class=
"md-nav__item md-nav__item--nested">
2389 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_6_5" >
2393 <label class=
"md-nav__link" for=
"__nav_6_5" id=
"__nav_6_5_label" tabindex=
"0">
2394 From WoltLab Suite
3.1
2395 <span class=
"md-nav__icon md-icon"></span>
2398 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_6_5_label" aria-expanded=
"false">
2399 <label class=
"md-nav__title" for=
"__nav_6_5">
2400 <span class=
"md-nav__icon md-icon"></span>
2401 From WoltLab Suite
3.1
2403 <ul class=
"md-nav__list" data-md-scrollfix
>
2410 <li class=
"md-nav__item">
2411 <a href=
"../../wsc31/php/" class=
"md-nav__link">
2432 <li class=
"md-nav__item md-nav__item--nested">
2437 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_6_6" >
2441 <label class=
"md-nav__link" for=
"__nav_6_6" id=
"__nav_6_6_label" tabindex=
"0">
2442 From WoltLab Suite
3.0
2443 <span class=
"md-nav__icon md-icon"></span>
2446 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_6_6_label" aria-expanded=
"false">
2447 <label class=
"md-nav__title" for=
"__nav_6_6">
2448 <span class=
"md-nav__icon md-icon"></span>
2449 From WoltLab Suite
3.0
2451 <ul class=
"md-nav__list" data-md-scrollfix
>
2458 <li class=
"md-nav__item">
2459 <a href=
"../../wsc30/php/" class=
"md-nav__link">
2472 <li class=
"md-nav__item">
2473 <a href=
"../../wsc30/javascript/" class=
"md-nav__link">
2486 <li class=
"md-nav__item">
2487 <a href=
"../../wsc30/templates/" class=
"md-nav__link">
2500 <li class=
"md-nav__item">
2501 <a href=
"../../wsc30/css/" class=
"md-nav__link">
2514 <li class=
"md-nav__item">
2515 <a href=
"../../wsc30/package/" class=
"md-nav__link">
2536 <li class=
"md-nav__item md-nav__item--nested">
2541 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_6_7" >
2545 <label class=
"md-nav__link" for=
"__nav_6_7" id=
"__nav_6_7_label" tabindex=
"0">
2547 <span class=
"md-nav__icon md-icon"></span>
2550 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_6_7_label" aria-expanded=
"false">
2551 <label class=
"md-nav__title" for=
"__nav_6_7">
2552 <span class=
"md-nav__icon md-icon"></span>
2555 <ul class=
"md-nav__list" data-md-scrollfix
>
2562 <li class=
"md-nav__item">
2563 <a href=
"../../wcf21/php/" class=
"md-nav__link">
2576 <li class=
"md-nav__item">
2577 <a href=
"../../wcf21/templates/" class=
"md-nav__link">
2590 <li class=
"md-nav__item">
2591 <a href=
"../../wcf21/css/" class=
"md-nav__link">
2604 <li class=
"md-nav__item">
2605 <a href=
"../../wcf21/package/" class=
"md-nav__link">
2634 <li class=
"md-nav__item md-nav__item--nested">
2639 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_7" >
2643 <label class=
"md-nav__link" for=
"__nav_7" id=
"__nav_7_label" tabindex=
"0">
2645 <span class=
"md-nav__icon md-icon"></span>
2648 <nav class=
"md-nav" data-md-level=
"1" aria-labelledby=
"__nav_7_label" aria-expanded=
"false">
2649 <label class=
"md-nav__title" for=
"__nav_7">
2650 <span class=
"md-nav__icon md-icon"></span>
2653 <ul class=
"md-nav__list" data-md-scrollfix
>
2661 <li class=
"md-nav__item md-nav__item--nested">
2666 <input class=
"md-nav__toggle md-toggle " type=
"checkbox" id=
"__nav_7_1" >
2670 <label class=
"md-nav__link" for=
"__nav_7_1" id=
"__nav_7_1_label" tabindex=
"0">
2672 <span class=
"md-nav__icon md-icon"></span>
2675 <nav class=
"md-nav" data-md-level=
"2" aria-labelledby=
"__nav_7_1_label" aria-expanded=
"false">
2676 <label class=
"md-nav__title" for=
"__nav_7_1">
2677 <span class=
"md-nav__icon md-icon"></span>
2680 <ul class=
"md-nav__list" data-md-scrollfix
>
2687 <li class=
"md-nav__item">
2688 <a href=
"../../../tutorial/series/overview/" class=
"md-nav__link">
2701 <li class=
"md-nav__item">
2702 <a href=
"../../../tutorial/series/part_1/" class=
"md-nav__link">
2715 <li class=
"md-nav__item">
2716 <a href=
"../../../tutorial/series/part_2/" class=
"md-nav__link">
2729 <li class=
"md-nav__item">
2730 <a href=
"../../../tutorial/series/part_3/" class=
"md-nav__link">
2743 <li class=
"md-nav__item">
2744 <a href=
"../../../tutorial/series/part_4/" class=
"md-nav__link">
2757 <li class=
"md-nav__item">
2758 <a href=
"../../../tutorial/series/part_5/" class=
"md-nav__link">
2771 <li class=
"md-nav__item">
2772 <a href=
"../../../tutorial/series/part_6/" class=
"md-nav__link">
2801 <div class=
"md-sidebar md-sidebar--secondary" data-md-component=
"sidebar" data-md-type=
"toc" >
2802 <div class=
"md-sidebar__scrollwrap">
2803 <div class=
"md-sidebar__inner">
2806 <nav class=
"md-nav md-nav--secondary" aria-label=
"Table of contents">
2813 <label class=
"md-nav__title" for=
"__toc">
2814 <span class=
"md-nav__icon md-icon"></span>
2817 <ul class=
"md-nav__list" data-md-component=
"toc" data-md-scrollfix
>
2819 <li class=
"md-nav__item">
2820 <a href=
"#initial-psr-7-support" class=
"md-nav__link">
2821 Initial PSR-
7 support
2824 <nav class=
"md-nav" aria-label=
"Initial PSR-7 support">
2825 <ul class=
"md-nav__list">
2827 <li class=
"md-nav__item">
2828 <a href=
"#recommended-changes-for-woltlab-suite-55" class=
"md-nav__link">
2829 Recommended changes for WoltLab Suite
5.5
2832 <nav class=
"md-nav" aria-label=
"Recommended changes for WoltLab Suite 5.5">
2833 <ul class=
"md-nav__list">
2835 <li class=
"md-nav__item">
2836 <a href=
"#migrating-redirects" class=
"md-nav__link">
2842 <li class=
"md-nav__item">
2843 <a href=
"#migrating-json-responses" class=
"md-nav__link">
2844 Migrating JSON responses
2859 <li class=
"md-nav__item">
2860 <a href=
"#events" class=
"md-nav__link">
2866 <li class=
"md-nav__item">
2867 <a href=
"#authentication" class=
"md-nav__link">
2873 <li class=
"md-nav__item">
2874 <a href=
"#embedded-objects-in-comments" class=
"md-nav__link">
2875 Embedded Objects in Comments
2880 <li class=
"md-nav__item">
2881 <a href=
"#emails" class=
"md-nav__link">
2885 <nav class=
"md-nav" aria-label=
"Emails">
2886 <ul class=
"md-nav__list">
2888 <li class=
"md-nav__item">
2889 <a href=
"#mailbox" class=
"md-nav__link">
2895 <li class=
"md-nav__item">
2896 <a href=
"#smtp" class=
"md-nav__link">
2907 <li class=
"md-nav__item">
2908 <a href=
"#search" class=
"md-nav__link">
2912 <nav class=
"md-nav" aria-label=
"Search">
2913 <ul class=
"md-nav__list">
2915 <li class=
"md-nav__item">
2916 <a href=
"#search-form" class=
"md-nav__link">
2922 <li class=
"md-nav__item">
2923 <a href=
"#exceptions" class=
"md-nav__link">
2934 <li class=
"md-nav__item">
2935 <a href=
"#package-installation-plugins" class=
"md-nav__link">
2936 Package Installation Plugins
2939 <nav class=
"md-nav" aria-label=
"Package Installation Plugins">
2940 <ul class=
"md-nav__list">
2942 <li class=
"md-nav__item">
2943 <a href=
"#database" class=
"md-nav__link">
2949 <li class=
"md-nav__item">
2950 <a href=
"#file-deletion" class=
"md-nav__link">
2956 <li class=
"md-nav__item">
2957 <a href=
"#language" class=
"md-nav__link">
2968 <li class=
"md-nav__item">
2969 <a href=
"#board-and-thread-subscriptions" class=
"md-nav__link">
2970 Board and Thread Subscriptions
2975 <li class=
"md-nav__item">
2976 <a href=
"#miscellaneous-changes" class=
"md-nav__link">
2977 Miscellaneous Changes
2980 <nav class=
"md-nav" aria-label=
"Miscellaneous Changes">
2981 <ul class=
"md-nav__list">
2983 <li class=
"md-nav__item">
2984 <a href=
"#view-counters" class=
"md-nav__link">
2990 <li class=
"md-nav__item">
2991 <a href=
"#form-builder" class=
"md-nav__link">
3011 <div class=
"md-content" data-md-component=
"content">
3012 <article class=
"md-content__inner md-typeset">
3020 <h1 id=
"migrating-from-woltlab-suite-54-php">Migrating from WoltLab Suite
5.4 - PHP
<a class=
"headerlink" href=
"#migrating-from-woltlab-suite-54-php" title=
"Permanent link">#
</a></h1>
3021 <h2 id=
"initial-psr-7-support">Initial PSR-
7 support
<a class=
"headerlink" href=
"#initial-psr-7-support" title=
"Permanent link">#
</a></h2>
3022 <p>WoltLab Suite will
<em>incrementally
</em> add support for object oriented request/response handling based off the
<a href=
"https://www.php-fig.org/psr/psr-7/">PSR-
7</a> and
<a href=
"https://www.php-fig.org/psr/psr-15/">PSR-
15</a> standards in the upcoming versions.
</p>
3023 <p>WoltLab Suite
5.5 adds initial support by allowing to define the response using objects implementing the PSR-
7 <code>ResponseInterface
</code>.
3024 If a controller returns such a response object from its
<code>__run()
</code> method, this response will automatically emitted to the client.
</p>
3025 <p>Any PSR-
7 implementation is supported, but WoltLab Suite
5.5 ships with
<a href=
"https://docs.laminas.dev/laminas-diactoros/">laminas-diactoros
</a> as the recommended “batteries included” implementation of PSR-
7.
</p>
3026 <p>Support for PSR-
7 requests and PSR-
15 middlewares is expected to follow in future versions.
</p>
3027 <p>See
<a href=
"https://github.com/WoltLab/WCF/pull/4437">WoltLab/WCF#
4437</a> for details.
</p>
3028 <h3 id=
"recommended-changes-for-woltlab-suite-55">Recommended changes for WoltLab Suite
5.5<a class=
"headerlink" href=
"#recommended-changes-for-woltlab-suite-55" title=
"Permanent link">#
</a></h3>
3029 <p>With the current support in WoltLab Suite
5.5 it is recommended to migrate the
<code>*Action
</code> classes to make use of PSR-
7 responses.
3030 Control and data flow is typically fairly simple in
<code>*Action
</code> classes with most requests ending up in either a redirect or a JSON response, commonly followed by a call to
<code>exit;
</code>.
</p>
3031 <p>Experimental support for
<code>*Page
</code> and
<code>*Form
</code> is available.
3032 It is recommended to wait for a future version before migrating these types of controllers.
</p>
3033 <h4 id=
"migrating-redirects">Migrating Redirects
<a class=
"headerlink" href=
"#migrating-redirects" title=
"Permanent link">#
</a></h4>
3035 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">lib/action/ExampleRedirectAction.class.php
</span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
3036 <span class=
"normal"> 2</span>
3037 <span class=
"normal"> 3</span>
3038 <span class=
"normal"> 4</span>
3039 <span class=
"normal"> 5</span>
3040 <span class=
"normal"> 6</span>
3041 <span class=
"normal"> 7</span>
3042 <span class=
"normal"> 8</span>
3043 <span class=
"normal"> 9</span>
3044 <span class=
"normal">10</span>
3045 <span class=
"normal">11</span>
3046 <span class=
"normal">12</span>
3047 <span class=
"normal">13</span>
3048 <span class=
"normal">14</span>
3049 <span class=
"normal">15</span>
3050 <span class=
"normal">16</span>
3051 <span class=
"normal">17</span>
3052 <span class=
"normal">18</span>
3053 <span class=
"normal">19</span>
3054 <span class=
"normal">20</span>
3055 <span class=
"normal">21</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
3057 <span class=
"k">namespace
</span> <span class=
"nx">wcf\action
</span><span class=
"p">;
</span>
3059 <span class=
"k">use
</span> <span class=
"nx">wcf\system\request\LinkHandler
</span><span class=
"p">;
</span>
3060 <span class=
"k">use
</span> <span class=
"nx">wcf\util\HeaderUtil
</span><span class=
"p">;
</span>
3062 <span class=
"k">final
</span> <span class=
"k">class
</span> <span class=
"nc">ExampleRedirectAction
</span> <span class=
"k">extends
</span> <span class=
"nx">AbstractAction
</span>
3063 <span class=
"p">{
</span>
3064 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"nf">execute
</span><span class=
"p">()
</span>
3065 <span class=
"p">{
</span>
3066 <span class=
"k">parent
</span><span class=
"o">::
</span><span class=
"na">execute
</span><span class=
"p">();
</span>
3068 <span class=
"c1">// Redirect to the landing page.
</span>
3069 <span class=
"nx">HeaderUtil
</span><span class=
"o">::
</span><span class=
"na">redirect
</span><span class=
"p">(
</span>
3070 <span class=
"nx">LinkHandler
</span><span class=
"o">::
</span><span class=
"na">getInstance
</span><span class=
"p">()
</span><span class=
"o">-
></span><span class=
"na">getLink
</span><span class=
"p">()
</span>
3071 <span class=
"p">);
</span>
3073 <span class=
"k">exit
</span><span class=
"p">;
</span>
3074 <span class=
"p">}
</span>
3075 <span class=
"p">}
</span>
3076 </code></pre></div></td></tr></table></div>
3078 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">lib/action/ExampleRedirectAction.class.php
</span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
3079 <span class=
"normal"> 2</span>
3080 <span class=
"normal"> 3</span>
3081 <span class=
"normal"> 4</span>
3082 <span class=
"normal"> 5</span>
3083 <span class=
"normal"> 6</span>
3084 <span class=
"normal"> 7</span>
3085 <span class=
"normal"> 8</span>
3086 <span class=
"normal"> 9</span>
3087 <span class=
"normal">10</span>
3088 <span class=
"normal">11</span>
3089 <span class=
"normal">12</span>
3090 <span class=
"normal">13</span>
3091 <span class=
"normal">14</span>
3092 <span class=
"normal">15</span>
3093 <span class=
"normal">16</span>
3094 <span class=
"normal">17</span>
3095 <span class=
"normal">18</span>
3096 <span class=
"normal">19</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
3098 <span class=
"k">namespace
</span> <span class=
"nx">wcf\action
</span><span class=
"p">;
</span>
3100 <span class=
"k">use
</span> <span class=
"nx">Laminas\Diactoros\Response\RedirectResponse
</span><span class=
"p">;
</span>
3101 <span class=
"k">use
</span> <span class=
"nx">wcf\system\request\LinkHandler
</span><span class=
"p">;
</span>
3103 <span class=
"k">final
</span> <span class=
"k">class
</span> <span class=
"nc">ExampleRedirectAction
</span> <span class=
"k">extends
</span> <span class=
"nx">AbstractAction
</span>
3104 <span class=
"p">{
</span>
3105 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"nf">execute
</span><span class=
"p">()
</span>
3106 <span class=
"p">{
</span>
3107 <span class=
"k">parent
</span><span class=
"o">::
</span><span class=
"na">execute
</span><span class=
"p">();
</span>
3109 <span class=
"c1">// Redirect to the landing page.
</span>
3110 <span class=
"k">return
</span> <span class=
"k">new
</span> <span class=
"nx">RedirectResponse
</span><span class=
"p">(
</span>
3111 <span class=
"nx">LinkHandler
</span><span class=
"o">::
</span><span class=
"na">getInstance
</span><span class=
"p">()
</span><span class=
"o">-
></span><span class=
"na">getLink
</span><span class=
"p">()
</span>
3112 <span class=
"p">);
</span>
3113 <span class=
"p">}
</span>
3114 <span class=
"p">}
</span>
3115 </code></pre></div></td></tr></table></div>
3116 <h4 id=
"migrating-json-responses">Migrating JSON responses
<a class=
"headerlink" href=
"#migrating-json-responses" title=
"Permanent link">#
</a></h4>
3118 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">lib/action/ExampleJsonAction.class.php
</span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
3119 <span class=
"normal"> 2</span>
3120 <span class=
"normal"> 3</span>
3121 <span class=
"normal"> 4</span>
3122 <span class=
"normal"> 5</span>
3123 <span class=
"normal"> 6</span>
3124 <span class=
"normal"> 7</span>
3125 <span class=
"normal"> 8</span>
3126 <span class=
"normal"> 9</span>
3127 <span class=
"normal">10</span>
3128 <span class=
"normal">11</span>
3129 <span class=
"normal">12</span>
3130 <span class=
"normal">13</span>
3131 <span class=
"normal">14</span>
3132 <span class=
"normal">15</span>
3133 <span class=
"normal">16</span>
3134 <span class=
"normal">17</span>
3135 <span class=
"normal">18</span>
3136 <span class=
"normal">19</span>
3137 <span class=
"normal">20</span>
3138 <span class=
"normal">21</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
3140 <span class=
"k">namespace
</span> <span class=
"nx">wcf\action
</span><span class=
"p">;
</span>
3142 <span class=
"k">use
</span> <span class=
"nx">wcf\util\JSON
</span><span class=
"p">;
</span>
3144 <span class=
"k">final
</span> <span class=
"k">class
</span> <span class=
"nc">ExampleJsonAction
</span> <span class=
"k">extends
</span> <span class=
"nx">AbstractAction
</span>
3145 <span class=
"p">{
</span>
3146 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"nf">execute
</span><span class=
"p">()
</span>
3147 <span class=
"p">{
</span>
3148 <span class=
"k">parent
</span><span class=
"o">::
</span><span class=
"na">execute
</span><span class=
"p">();
</span>
3150 <span class=
"nx">\header
</span><span class=
"p">(
</span><span class=
"s1">'Content-type: application/json; charset=UTF-
8'</span><span class=
"p">);
</span>
3152 <span class=
"k">echo
</span> <span class=
"nx">JSON
</span><span class=
"o">::
</span><span class=
"na">encode
</span><span class=
"p">([
</span>
3153 <span class=
"s1">'foo
'</span> <span class=
"o">=
></span> <span class=
"s1">'bar
'</span><span class=
"p">,
</span>
3154 <span class=
"p">]);
</span>
3156 <span class=
"k">exit
</span><span class=
"p">;
</span>
3157 <span class=
"p">}
</span>
3158 <span class=
"p">}
</span>
3159 </code></pre></div></td></tr></table></div>
3161 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">lib/action/ExampleJsonAction.class.php
</span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
3162 <span class=
"normal"> 2</span>
3163 <span class=
"normal"> 3</span>
3164 <span class=
"normal"> 4</span>
3165 <span class=
"normal"> 5</span>
3166 <span class=
"normal"> 6</span>
3167 <span class=
"normal"> 7</span>
3168 <span class=
"normal"> 8</span>
3169 <span class=
"normal"> 9</span>
3170 <span class=
"normal">10</span>
3171 <span class=
"normal">11</span>
3172 <span class=
"normal">12</span>
3173 <span class=
"normal">13</span>
3174 <span class=
"normal">14</span>
3175 <span class=
"normal">15</span>
3176 <span class=
"normal">16</span>
3177 <span class=
"normal">17</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
3179 <span class=
"k">namespace
</span> <span class=
"nx">wcf\action
</span><span class=
"p">;
</span>
3181 <span class=
"k">use
</span> <span class=
"nx">Laminas\Diactoros\Response\JsonResponse
</span><span class=
"p">;
</span>
3183 <span class=
"k">final
</span> <span class=
"k">class
</span> <span class=
"nc">ExampleJsonAction
</span> <span class=
"k">extends
</span> <span class=
"nx">AbstractAction
</span>
3184 <span class=
"p">{
</span>
3185 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"nf">execute
</span><span class=
"p">()
</span>
3186 <span class=
"p">{
</span>
3187 <span class=
"k">parent
</span><span class=
"o">::
</span><span class=
"na">execute
</span><span class=
"p">();
</span>
3189 <span class=
"k">return
</span> <span class=
"k">new
</span> <span class=
"nx">JsonResponse
</span><span class=
"p">([
</span>
3190 <span class=
"s1">'foo
'</span> <span class=
"o">=
></span> <span class=
"s1">'bar
'</span><span class=
"p">,
</span>
3191 <span class=
"p">]);
</span>
3192 <span class=
"p">}
</span>
3193 <span class=
"p">}
</span>
3194 </code></pre></div></td></tr></table></div>
3195 <h2 id=
"events">Events
<a class=
"headerlink" href=
"#events" title=
"Permanent link">#
</a></h2>
3196 <p>Historically, events were tightly coupled with a single class, with the event object being an object of this class, expecting the event listener to consume public properties and method of the event object.
3197 The
<code>$parameters
</code> array was introduced due to limitations of this pattern, avoiding moving all the values that might be of interest to the event listener into the state of the object.
3198 Events were still tightly coupled with the class that fired the event and using the opaque parameters array prevented IDEs from assisting with autocompletion and typing.
</p>
3199 <p>WoltLab Suite
5.5 introduces the concept of dedicated, reusable event classes.
3200 Any newly introduced event will receive a dedicated class, implementing the
<code>wcf\system\event\IEvent
</code> interface.
3201 These event classes may be fired from multiple locations, making them reusable to convey that a conceptual action happened, instead of a specific class doing something.
3202 An example for using the new event system could be a user logging in:
3203 Instead of listening on a the login form being submitted and the Facebook login action successfully running, an event
<code>UserLoggedIn
</code> might be fired whenever a user logs in, no matter how the login is performed.
</p>
3204 <p>Additionally, these dedicated event classes will benefit from full IDE support.
3205 All the relevant values may be stored as real properties on the event object.
</p>
3206 <p>Event classes should not have an
<code>Event
</code> suffix and should be stored in an
<code>event
</code> namespace in a matching location.
3207 Thus, the
<code>UserLoggedIn
</code> example might have a FQCN of
<code>\wcf\system\user\authentication\event\UserLoggedIn
</code>.
</p>
3208 <p>Event listeners for events implementing
<code>IEvent
</code> need to follow
<a href=
"https://www.php-fig.org/psr/psr-14/">PSR-
14</a>, i.e. they need to be callable.
3209 In practice, this means that the event listener class needs to implement
<code>__invoke()
</code>.
3210 No interface has to be implemented in this case.
</p>
3212 <div class=
"highlight"><table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3213 <span class=
"normal">2</span>
3214 <span class=
"normal">3</span>
3215 <span class=
"normal">4</span>
3216 <span class=
"normal">5</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"nv">$parameters
</span> <span class=
"o">=
</span> <span class=
"p">[
</span>
3217 <span class=
"s1">'value
'</span> <span class=
"o">=
></span> <span class=
"nx">\random_int
</span><span class=
"p">(
</span><span class=
"mi">1</span><span class=
"p">,
</span> <span class=
"mi">1024</span><span class=
"p">),
</span>
3218 <span class=
"p">];
</span>
3220 <span class=
"nx">EventHandler
</span><span class=
"o">::
</span><span class=
"na">getInstance
</span><span class=
"p">()
</span><span class=
"o">-
></span><span class=
"na">fireAction
</span><span class=
"p">(
</span><span class=
"nv">$this
</span><span class=
"p">,
</span> <span class=
"s1">'valueAvailable
'</span><span class=
"p">,
</span> <span class=
"nv">$parameters
</span><span class=
"p">);
</span>
3221 </code></pre></div></td></tr></table></div>
3222 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">lib/system/event/listener/ValueDumpListener.class.php
</span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
3223 <span class=
"normal"> 2</span>
3224 <span class=
"normal"> 3</span>
3225 <span class=
"normal"> 4</span>
3226 <span class=
"normal"> 5</span>
3227 <span class=
"normal"> 6</span>
3228 <span class=
"normal"> 7</span>
3229 <span class=
"normal"> 8</span>
3230 <span class=
"normal"> 9</span>
3231 <span class=
"normal">10</span>
3232 <span class=
"normal">11</span>
3233 <span class=
"normal">12</span>
3234 <span class=
"normal">13</span>
3235 <span class=
"normal">14</span>
3236 <span class=
"normal">15</span>
3237 <span class=
"normal">16</span>
3238 <span class=
"normal">17</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
3240 <span class=
"k">namespace
</span> <span class=
"nx">wcf\system\event\listener
</span><span class=
"p">;
</span>
3242 <span class=
"k">use
</span> <span class=
"nx">wcf\form\ValueForm
</span><span class=
"p">;
</span>
3244 <span class=
"k">final
</span> <span class=
"k">class
</span> <span class=
"nc">ValueDumpListener
</span> <span class=
"k">implements
</span> <span class=
"nx">IParameterizedEventListener
</span>
3245 <span class=
"p">{
</span>
3246 <span class=
"sd">/**
</span>
3247 <span class=
"sd"> * @inheritDoc
</span>
3248 <span class=
"sd"> * @param ValueForm $eventObj
</span>
3249 <span class=
"sd"> */
</span>
3250 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"nf">execute
</span><span class=
"p">(
</span><span class=
"nv">$eventObj
</span><span class=
"p">,
</span> <span class=
"nv">$className
</span><span class=
"p">,
</span> <span class=
"nv">$eventName
</span><span class=
"p">,
</span> <span class=
"k">array
</span> <span class=
"o">&</span><span class=
"nv">$parameters
</span><span class=
"p">)
</span>
3251 <span class=
"p">{
</span>
3252 <span class=
"nb">var_dump
</span><span class=
"p">(
</span><span class=
"nv">$parameters
</span><span class=
"p">[
</span><span class=
"s1">'value
'</span><span class=
"p">]);
</span>
3253 <span class=
"p">}
</span>
3254 <span class=
"p">}
</span>
3255 </code></pre></div></td></tr></table></div>
3257 <div class=
"highlight"><table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"nx">EventHandler
</span><span class=
"o">::
</span><span class=
"na">getInstance
</span><span class=
"p">()
</span><span class=
"o">-
></span><span class=
"na">fire
</span><span class=
"p">(
</span><span class=
"k">new
</span> <span class=
"nx">ValueAvailable
</span><span class=
"p">(
</span><span class=
"nx">\random_int
</span><span class=
"p">(
</span><span class=
"mi">1</span><span class=
"p">,
</span> <span class=
"mi">1024</span><span class=
"p">)));
</span>
3258 </code></pre></div></td></tr></table></div>
3259 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">lib/system/foo/event/ValueAvailable.class.php
</span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
3260 <span class=
"normal"> 2</span>
3261 <span class=
"normal"> 3</span>
3262 <span class=
"normal"> 4</span>
3263 <span class=
"normal"> 5</span>
3264 <span class=
"normal"> 6</span>
3265 <span class=
"normal"> 7</span>
3266 <span class=
"normal"> 8</span>
3267 <span class=
"normal"> 9</span>
3268 <span class=
"normal">10</span>
3269 <span class=
"normal">11</span>
3270 <span class=
"normal">12</span>
3271 <span class=
"normal">13</span>
3272 <span class=
"normal">14</span>
3273 <span class=
"normal">15</span>
3274 <span class=
"normal">16</span>
3275 <span class=
"normal">17</span>
3276 <span class=
"normal">18</span>
3277 <span class=
"normal">19</span>
3278 <span class=
"normal">20</span>
3279 <span class=
"normal">21</span>
3280 <span class=
"normal">22</span>
3281 <span class=
"normal">23</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
3283 <span class=
"k">namespace
</span> <span class=
"nx">wcf\system\foo\event
</span><span class=
"p">;
</span>
3285 <span class=
"k">use
</span> <span class=
"nx">wcf\system\event\IEvent
</span><span class=
"p">;
</span>
3287 <span class=
"k">final
</span> <span class=
"k">class
</span> <span class=
"nc">ValueAvailable
</span> <span class=
"k">implements
</span> <span class=
"nx">IEvent
</span>
3288 <span class=
"p">{
</span>
3289 <span class=
"sd">/**
</span>
3290 <span class=
"sd"> * @var int
</span>
3291 <span class=
"sd"> */
</span>
3292 <span class=
"k">private
</span> <span class=
"nv">$value
</span><span class=
"p">;
</span>
3294 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"fm">__construct
</span><span class=
"p">(
</span><span class=
"nx">int
</span> <span class=
"nv">$value
</span><span class=
"p">)
</span>
3295 <span class=
"p">{
</span>
3296 <span class=
"nv">$this
</span><span class=
"o">-
></span><span class=
"na">value
</span> <span class=
"o">=
</span> <span class=
"nv">$value
</span><span class=
"p">;
</span>
3297 <span class=
"p">}
</span>
3299 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"nf">getValue
</span><span class=
"p">()
</span><span class=
"o">:
</span> <span class=
"nx">int
</span>
3300 <span class=
"p">{
</span>
3301 <span class=
"k">return
</span> <span class=
"nv">$this
</span><span class=
"o">-
></span><span class=
"na">value
</span><span class=
"p">;
</span>
3302 <span class=
"p">}
</span>
3303 <span class=
"p">}
</span>
3304 </code></pre></div></td></tr></table></div>
3305 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">lib/system/event/listener/ValueDumpListener.class.php
</span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
3306 <span class=
"normal"> 2</span>
3307 <span class=
"normal"> 3</span>
3308 <span class=
"normal"> 4</span>
3309 <span class=
"normal"> 5</span>
3310 <span class=
"normal"> 6</span>
3311 <span class=
"normal"> 7</span>
3312 <span class=
"normal"> 8</span>
3313 <span class=
"normal"> 9</span>
3314 <span class=
"normal">10</span>
3315 <span class=
"normal">11</span>
3316 <span class=
"normal">12</span>
3317 <span class=
"normal">13</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"o"><?
</span><span class=
"nx">php
</span>
3319 <span class=
"k">namespace
</span> <span class=
"nx">wcf\system\event\listener
</span><span class=
"p">;
</span>
3321 <span class=
"k">use
</span> <span class=
"nx">wcf\system\foo\event\ValueAvailable
</span><span class=
"p">;
</span>
3323 <span class=
"k">final
</span> <span class=
"k">class
</span> <span class=
"nc">ValueDumpListener
</span>
3324 <span class=
"p">{
</span>
3325 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"fm">__invoke
</span><span class=
"p">(
</span><span class=
"nx">ValueAvailable
</span> <span class=
"nv">$event
</span><span class=
"p">)
</span><span class=
"o">:
</span> <span class=
"nx">void
</span>
3326 <span class=
"p">{
</span>
3327 <span class=
"nx">\var_dump
</span><span class=
"p">(
</span><span class=
"nv">$event
</span><span class=
"o">-
></span><span class=
"na">getValue
</span><span class=
"p">());
</span>
3328 <span class=
"p">}
</span>
3329 <span class=
"p">}
</span>
3330 </code></pre></div></td></tr></table></div>
3331 <p>See
<a href=
"https://github.com/WoltLab/WCF/pull/4000">WoltLab/WCF#
4000</a> and
<a href=
"https://github.com/WoltLab/WCF/pull/4265">WoltLab/WCF#
4265</a> for details.
</p>
3332 <h2 id=
"authentication">Authentication
<a class=
"headerlink" href=
"#authentication" title=
"Permanent link">#
</a></h2>
3333 <p>The
<a href=
"https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/authentication/event/UserLoggedIn.class.php"><code>UserLoggedIn
</code></a> event was added.
3334 You should fire this event if you implement a custom login process (e.g. when adding additional external authentication providers).
</p>
3336 <div class=
"highlight"><table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3337 <span class=
"normal">2</span>
3338 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"nx">EventHandler
</span><span class=
"o">::
</span><span class=
"na">getInstance
</span><span class=
"p">()
</span><span class=
"o">-
></span><span class=
"na">fire
</span><span class=
"p">(
</span>
3339 <span class=
"k">new
</span> <span class=
"nx">UserLoggedIn
</span><span class=
"p">(
</span><span class=
"nv">$user
</span><span class=
"p">)
</span>
3340 <span class=
"p">);
</span>
3341 </code></pre></div></td></tr></table></div>
3342 <p>See
<a href=
"https://github.com/WoltLab/WCF/pull/4356">WoltLab/WCF#
4356</a> for details.
</p>
3343 <h2 id=
"embedded-objects-in-comments">Embedded Objects in Comments
<a class=
"headerlink" href=
"#embedded-objects-in-comments" title=
"Permanent link">#
</a></h2>
3344 <p><a href=
"https://github.com/WoltLab/WCF/pull/4275">WoltLab/WCF#
4275</a> added support for embedded objects like mentions for comments and comment responses.
3345 To properly render embedded objects whenever you are using comments in your packages, you have to use
<code>ViewableCommentList
</code>/
<code>ViewableCommentResponseList
</code> in these places or
<code>ViewableCommentRuntimeCache
</code>/
<code>ViewableCommentResponseRuntimeCache
</code>.
3346 While these runtime caches are only available since version
5.5, the viewable list classes have always been available so that changing
<code>CommentList
</code> to
<code>ViewableCommentList
</code>, for example, is a backwards-compatible change.
</p>
3347 <h2 id=
"emails">Emails
<a class=
"headerlink" href=
"#emails" title=
"Permanent link">#
</a></h2>
3348 <h3 id=
"mailbox">Mailbox
<a class=
"headerlink" href=
"#mailbox" title=
"Permanent link">#
</a></h3>
3349 <p>The
<code>Mailbox
</code> and
<code>UserMailbox
</code> classes no longer store the passed
<code>Language
</code> and
<code>User
</code> objects, but the respective ID instead.
3350 This change reduces the size of the serialized email when stored in the background queue.
</p>
3351 <p>If you inherit from the
<code>Mailbox
</code> or
<code>UserMailbox
</code> classes, you might experience issues if you directly access the
<code>$this-
>language
</code> or
<code>$this-
>user
</code> properties.
3352 Adjust your class to use composition instead of inheritance if possible.
3353 Use the
<code>getLanguage()
</code> or
<code>getUser()
</code> getters if using composition is not possible.
</p>
3354 <p>See
<a href=
"https://github.com/WoltLab/WCF/pull/4389">WoltLab/WCF#
4389</a> for details.
</p>
3355 <h3 id=
"smtp">SMTP
<a class=
"headerlink" href=
"#smtp" title=
"Permanent link">#
</a></h3>
3356 <p>The
<code>SmtpEmailTransport
</code> no longer supports a value of
<code>may
</code> for the
<code>$starttls
</code> property.
</p>
3357 <p>Using the
<code>may
</code> value is unsafe as it allows for undetected MITM attacks.
3358 The use of
<code>encrypt
</code> is recommended, unless it is certain that the SMTP server does not support TLS.
</p>
3359 <p>See
<a href=
"https://github.com/WoltLab/WCF/pull/4398">WoltLab/WCF#
4398</a> for details.
</p>
3360 <h2 id=
"search">Search
<a class=
"headerlink" href=
"#search" title=
"Permanent link">#
</a></h2>
3361 <h3 id=
"search-form">Search Form
<a class=
"headerlink" href=
"#search-form" title=
"Permanent link">#
</a></h3>
3362 <p>After the overhaul of the search form, search providers are no longer bound to
<code>SearchForm
</code> and
<code>SearchResultPage
</code>.
3363 The interface
<code>ISearchObjectType
</code> and the abstract implementation
<code>AbstractSearchableObjectType
</code> have been replaced by
<code>ISearchProvider
</code> and
<code>AbstractSearchProvider
</code>.
</p>
3364 <p>Please use
<a href=
"https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/search/ArticleSearch.class.php"><code>ArticleSearch
</code></a> as a template for your own implementation
</p>
3365 <p>See
<a href=
"https://github.com/WoltLab/WCF/pull/4605">WoltLab/WCF#
4605</a> for details.
</p>
3366 <h3 id=
"exceptions">Exceptions
<a class=
"headerlink" href=
"#exceptions" title=
"Permanent link">#
</a></h3>
3367 <p>A new
<a href=
"https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/search/exception/SearchFailed.class.php"><code>wcf\system\search\exception\SearchFailed
</code></a> exception was added.
3368 This exception should be thrown when executing the search query fails for (mostly) temporary reasons, such as a network partition to a remote service.
3369 It is not meant as a blanket exception to wrap everything.
3370 For example it must not be returned obvious programming errors, such as an access to an undefined variable (
<code>ErrorException
</code>).
</p>
3371 <p>Catching the
<code>SearchFailed
</code> exception allows consuming code to gracefully handle search requests that are not essential for proceeding, without silencing other types of error.
</p>
3372 <p>See
<a href=
"https://github.com/WoltLab/WCF/issues/4476">WoltLab/WCF#
4476</a> and
<a href=
"https://github.com/WoltLab/WCF/pull/4483">WoltLab/WCF#
4483</a> for details.
</p>
3373 <h2 id=
"package-installation-plugins">Package Installation Plugins
<a class=
"headerlink" href=
"#package-installation-plugins" title=
"Permanent link">#
</a></h2>
3374 <h3 id=
"database">Database
<a class=
"headerlink" href=
"#database" title=
"Permanent link">#
</a></h3>
3375 <p>WoltLab Suite
5.5 changes the factory classes for common configurations of database columns within the PHP-based DDL API to contain a private constructor, preventing object creation.
</p>
3376 <p>This change affects the following classes:
</p>
3378 <li><code>DefaultFalseBooleanDatabaseTableColumn
</code></li>
3379 <li><code>DefaultTrueBooleanDatabaseTableColumn
</code></li>
3380 <li><code>NotNullInt10DatabaseTableColumn
</code></li>
3381 <li><code>NotNullVarchar191DatabaseTableColumn
</code></li>
3382 <li><code>NotNullVarchar255DatabaseTableColumn
</code></li>
3384 <p><code>ObjectIdDatabaseTableColumn
</code></p>
3387 <p><code>DatabaseTablePrimaryIndex
</code></p>
3390 <p>The static
<code>create()
</code> method never returned an object of the factory class, but instead in object of the base type (e.g.
<code>IntDatabaseTableColumn
</code> for
<code>NotNullInt10DatabaseTableColumn
</code>).
3391 Constructing an object of these factory classes is considered a bug, as the class name implies a specific column configuration, that might or might not hold if the object is modified afterwards.
</p>
3392 <p>See
<a href=
"https://github.com/WoltLab/WCF/pull/4564">WoltLab/WCF#
4564</a> for details.
</p>
3393 <p>WoltLab Suite
5.5 adds the
<code>IDefaultValueDatabaseTableColumn
</code> interface which is used to check whether specifying a default value is legal.
3394 For backwards compatibility this interface is implemented by
<code>AbstractDatabaseTableColumn
</code>.
3395 You should explicitly add this interface to custom table column type classes to avoid breakage if the interface is removed from
<code>AbstractDatabaseTableColumn
</code> in a future version.
3396 Likewise you should explicitly check for the interface before attempting to access the methods related to the default value of a column.
</p>
3397 <p>See
<a href=
"https://github.com/WoltLab/WCF/pull/4733">WoltLab/WCF#
4733</a> for details.
</p>
3398 <h3 id=
"file-deletion">File Deletion
<a class=
"headerlink" href=
"#file-deletion" title=
"Permanent link">#
</a></h3>
3399 <p>Three new package installation plugins have been added to delete ACP templates with
<a href=
"../../../package/pip/acp-template-delete/">acpTemplateDelete
</a>, files with
<a href=
"../../../package/pip/file-delete/">fileDelete
</a>, and templates with
<a href=
"../../../package/pip/template-delete/">templateDelete
</a>.
</p>
3400 <h3 id=
"language">Language
<a class=
"headerlink" href=
"#language" title=
"Permanent link">#
</a></h3>
3401 <p><a href=
"https://github.com/WoltLab/WCF/pull/4261">WoltLab/WCF#
4261</a> has added support for deleting existing phrases with the
<code>language
</code> package installation plugin.
</p>
3402 <p>The current structure of the language XML files
</p>
3403 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">language/en.xml
<a class=
"codeBoxTitleGitHubLink" href=
"https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/migration/wsc54/en_old.xml" title=
"View on GitHub"><span class=
"twemoji"><svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3404 <span class=
"normal">2</span>
3405 <span class=
"normal">3</span>
3406 <span class=
"normal">4</span>
3407 <span class=
"normal">5</span>
3408 <span class=
"normal">6</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"cp"><?xml version=
"1.0" encoding=
"UTF-
8"?
></span>
3409 <span class=
"nt"><language
</span><span class=
"w"> </span><span class=
"na">xmlns=
</span><span class=
"s">"http://www.woltlab.com
"</span><span class=
"w"> </span><span class=
"na">xmlns:xsi=
</span><span class=
"s">"http://www.w3.org/
2001/XMLSchema-instance
"</span><span class=
"w"> </span><span class=
"na">xsi:schemaLocation=
</span><span class=
"s">"http://www.woltlab.com http://www.woltlab.com/XSD/
5.4/language.xsd
"</span><span class=
"w"> </span><span class=
"na">languagecode=
</span><span class=
"s">"en
"</span><span class=
"w"> </span><span class=
"na">languagename=
</span><span class=
"s">"English
"</span><span class=
"w"> </span><span class=
"na">countrycode=
</span><span class=
"s">"gb
"</span><span class=
"nt">></span>
3410 <span class=
"w"> </span><span class=
"nt"><category
</span><span class=
"w"> </span><span class=
"na">name=
</span><span class=
"s">"wcf.foo
"</span><span class=
"nt">></span>
3411 <span class=
"w"> </span><span class=
"nt"><item
</span><span class=
"w"> </span><span class=
"na">name=
</span><span class=
"s">"wcf.foo.bar
"</span><span class=
"nt">></span><span class=
"cp"><![CDATA[Bar]]
></span><span class=
"nt"></item
></span>
3412 <span class=
"w"> </span><span class=
"nt"></category
></span>
3413 <span class=
"nt"></language
></span>
3414 </code></pre></div></td></tr></table></div>
3415 <p>is deprecated and should be replaced with the new structure with an explicit
<code><import
></code> element like in the other package installation plugins:
</p>
3416 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">language/en.xml
<a class=
"codeBoxTitleGitHubLink" href=
"https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/migration/wsc54/en_new.xml" title=
"View on GitHub"><span class=
"twemoji"><svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3417 <span class=
"normal">2</span>
3418 <span class=
"normal">3</span>
3419 <span class=
"normal">4</span>
3420 <span class=
"normal">5</span>
3421 <span class=
"normal">6</span>
3422 <span class=
"normal">7</span>
3423 <span class=
"normal">8</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"cp"><?xml version=
"1.0" encoding=
"UTF-
8"?
></span>
3424 <span class=
"nt"><language
</span><span class=
"w"> </span><span class=
"na">xmlns=
</span><span class=
"s">"http://www.woltlab.com
"</span><span class=
"w"> </span><span class=
"na">xmlns:xsi=
</span><span class=
"s">"http://www.w3.org/
2001/XMLSchema-instance
"</span><span class=
"w"> </span><span class=
"na">xsi:schemaLocation=
</span><span class=
"s">"http://www.woltlab.com http://www.woltlab.com/XSD/
5.4/language.xsd
"</span><span class=
"w"> </span><span class=
"na">languagecode=
</span><span class=
"s">"en
"</span><span class=
"w"> </span><span class=
"na">languagename=
</span><span class=
"s">"English
"</span><span class=
"w"> </span><span class=
"na">countrycode=
</span><span class=
"s">"gb
"</span><span class=
"nt">></span>
3425 <span class=
"w"> </span><span class=
"nt"><import
></span>
3426 <span class=
"w"> </span><span class=
"nt"><category
</span><span class=
"w"> </span><span class=
"na">name=
</span><span class=
"s">"wcf.foo
"</span><span class=
"nt">></span>
3427 <span class=
"w"> </span><span class=
"nt"><item
</span><span class=
"w"> </span><span class=
"na">name=
</span><span class=
"s">"wcf.foo.bar
"</span><span class=
"nt">></span><span class=
"cp"><![CDATA[Bar]]
></span><span class=
"nt"></item
></span>
3428 <span class=
"w"> </span><span class=
"nt"></category
></span>
3429 <span class=
"w"> </span><span class=
"nt"></import
></span>
3430 <span class=
"nt"></language
></span>
3431 </code></pre></div></td></tr></table></div>
3432 <p>Additionally, to now also support deleting phrases with this package installation plugin, support for a
<code><delete
></code> element has been added:
</p>
3433 <div class=
"highlight"><table class=
"highlighttable"><tr><th colspan=
"2" class=
"filename"><span class=
"filename">language/en.xml
<a class=
"codeBoxTitleGitHubLink" href=
"https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/migration/wsc54/en_new_with_delete.xml" title=
"View on GitHub"><span class=
"twemoji"><svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
3434 <span class=
"normal"> 2</span>
3435 <span class=
"normal"> 3</span>
3436 <span class=
"normal"> 4</span>
3437 <span class=
"normal"> 5</span>
3438 <span class=
"normal"> 6</span>
3439 <span class=
"normal"> 7</span>
3440 <span class=
"normal"> 8</span>
3441 <span class=
"normal"> 9</span>
3442 <span class=
"normal">10</span>
3443 <span class=
"normal">11</span></pre></div></td><td class=
"code"><div><pre><span></span><code><span class=
"cp"><?xml version=
"1.0" encoding=
"UTF-
8"?
></span>
3444 <span class=
"nt"><language
</span><span class=
"w"> </span><span class=
"na">xmlns=
</span><span class=
"s">"http://www.woltlab.com
"</span><span class=
"w"> </span><span class=
"na">xmlns:xsi=
</span><span class=
"s">"http://www.w3.org/
2001/XMLSchema-instance
"</span><span class=
"w"> </span><span class=
"na">xsi:schemaLocation=
</span><span class=
"s">"http://www.woltlab.com http://www.woltlab.com/XSD/
5.4/language.xsd
"</span><span class=
"w"> </span><span class=
"na">languagecode=
</span><span class=
"s">"en
"</span><span class=
"w"> </span><span class=
"na">languagename=
</span><span class=
"s">"English
"</span><span class=
"w"> </span><span class=
"na">countrycode=
</span><span class=
"s">"gb
"</span><span class=
"nt">></span>
3445 <span class=
"w"> </span><span class=
"nt"><import
></span>
3446 <span class=
"w"> </span><span class=
"nt"><category
</span><span class=
"w"> </span><span class=
"na">name=
</span><span class=
"s">"wcf.foo
"</span><span class=
"nt">></span>
3447 <span class=
"w"> </span><span class=
"nt"><item
</span><span class=
"w"> </span><span class=
"na">name=
</span><span class=
"s">"wcf.foo.bar
"</span><span class=
"nt">></span><span class=
"cp"><![CDATA[Bar]]
></span><span class=
"nt"></item
></span>
3448 <span class=
"w"> </span><span class=
"nt"></category
></span>
3449 <span class=
"w"> </span><span class=
"nt"></import
></span>
3450 <span class=
"w"> </span><span class=
"nt"><delete
></span>
3451 <span class=
"w"> </span><span class=
"nt"><item
</span><span class=
"w"> </span><span class=
"na">name=
</span><span class=
"s">"wcf.foo.barrr
"</span><span class=
"nt">/
></span>
3452 <span class=
"w"> </span><span class=
"nt"></delete
></span>
3453 <span class=
"nt"></language
></span>
3454 </code></pre></div></td></tr></table></div>
3455 <p>Note that when deleting phrases, the category does not have to be specified because phrase identifiers are unique globally.
</p>
3456 <div class=
"admonition warning">
3457 <p class=
"admonition-title">Mixing the old structure and the new structure is not supported and will result in an error message during the import!
</p>
3459 <h2 id=
"board-and-thread-subscriptions">Board and Thread Subscriptions
<a class=
"headerlink" href=
"#board-and-thread-subscriptions" title=
"Permanent link">#
</a></h2>
3460 <p>WoltLab Suite Forum
5.5 updates the subscription logic for boards and threads to properly support the ignoring of threads.
3461 See the
<a href=
"../forum_subscriptions/">dedicated migration guide
</a> for details.
</p>
3462 <h2 id=
"miscellaneous-changes">Miscellaneous Changes
<a class=
"headerlink" href=
"#miscellaneous-changes" title=
"Permanent link">#
</a></h2>
3463 <h3 id=
"view-counters">View Counters
<a class=
"headerlink" href=
"#view-counters" title=
"Permanent link">#
</a></h3>
3464 <p>With WoltLab Suite
5.5 it is expected that view/download counters do not increase for disabled content.
</p>
3465 <p>See
<a href=
"https://github.com/WoltLab/WCF/pull/4374">WoltLab/WCF#
4374</a> for details.
</p>
3466 <h3 id=
"form-builder">Form Builder
<a class=
"headerlink" href=
"#form-builder" title=
"Permanent link">#
</a></h3>
3468 <li><a href=
"../../../php/api/form_builder/dependencies/#valueintervalformfielddependency"><code>ValueIntervalFormFieldDependency
</code></a></li>
3469 <li><a href=
"../../../php/api/form_builder/form_fields/#colorformfield"><code>ColorFormField
</code></a></li>
3470 <li><a href=
"../../../php/api/form_builder/form_fields/#multipleboardselectionformfield"><code>MultipleBoardSelectionFormField
</code></a></li>
3474 <div class=
"md-source-file">
3496 <footer class=
"md-footer">
3498 <div class=
"md-footer-meta md-typeset">
3499 <div class=
"md-footer-meta__inner md-grid">
3500 <div class=
"md-copyright">
3502 <div class=
"md-copyright__highlight">
3503 Copyright ©
2020 WoltLab GmbH
3508 <a href=
"https://squidfunk.github.io/mkdocs-material/" target=
"_blank" rel=
"noopener">
3514 <div class=
"md-copyright">
3515 <a href=
"https://www.woltlab.com/legal-notice/">Legal Notice
</a>
3516 <a href=
"https://www.woltlab.com/privacy-policy/">Privacy Policy
</a>
3524 <div class=
"md-dialog" data-md-component=
"dialog">
3525 <div class=
"md-dialog__inner md-typeset"></div>
3528 <script id=
"__config" type=
"application/json">{
"base":
"../../..",
"features": [
"navigation.tracking"],
"search":
"../../../assets/javascripts/workers/search.208ed371.min.js",
"translations": {
"clipboard.copied":
"Copied to clipboard",
"clipboard.copy":
"Copy to clipboard",
"search.result.more.one":
"1 more on this page",
"search.result.more.other":
"# more on this page",
"search.result.none":
"No matching documents",
"search.result.one":
"1 matching document",
"search.result.other":
"# matching documents",
"search.result.placeholder":
"Type to start searching",
"search.result.term.missing":
"Missing",
"select.version":
"Select version"},
"version": {
"provider":
"mike"}}
</script>
3531 <script src=
"../../../assets/javascripts/bundle.b4d07000.min.js"></script>