' . PHP_EOL . $gitHubLink . PHP_EOL,
- $content
- );
-
- file_put_contents($filePath, $content, LOCK_EX);
-
- // Move the cursor up 1 line
- echo "\033[1A";
- echo 'done: ' . $filePath . PHP_EOL;
-}
diff --git a/user_guide_src/cilexer/pycilexer.egg-info/top_level.txt b/user_guide_src/cilexer/pycilexer.egg-info/top_level.txt
deleted file mode 100644
index 2f88e1d75272..000000000000
--- a/user_guide_src/cilexer/pycilexer.egg-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-cilexer
diff --git a/user_guide_src/ghpages.rst b/user_guide_src/ghpages.rst
deleted file mode 100644
index 682c1eee49ce..000000000000
--- a/user_guide_src/ghpages.rst
+++ /dev/null
@@ -1,52 +0,0 @@
-#########################
-Generating the User Guide
-#########################
-
-The intent is, eventually, for the in-progress user guide to be automatically
-generated as part of a PR merge. This writeup explains how it can be done manually
-in the meantime.
-
-The user guide takes advantage of GitHub pages, where the "gh-pages" branch of
-a repo, containing HTML only, is accessible through `github.io
-
`_.
-
-Setup for Repo Maintainers
-==========================
-
-You already have the repo cloned into ``CodeIgniter4`` in a projects folder.
-Create another folder at the same level as this, ``CodeIgniter4-guide``.
-Clone the CodeIgniter4 repo again, into ``CodeIgniter4-guide/html``.
-
-Inside the ``html`` folder, ``git checkout gh-pages``.
-All you should see is the generated HTML for the user guide.
-
-Re-generating the User Guide
-============================
-
-In the ``user_guide_src`` folder, you generate a conventional user guide,
-for testing, using the command::
-
- make html
-
-An additional target has been configured, which will generate the same
-HTML but inside the ``html`` folder of the second repo clone::
-
- make ghpages
-
-After making this target, update the online user guide by switching to
-the ``CodeIgniter4-guide/html`` folder, and then::
-
- git add .
- git commit -S -m "Suitable comment"
- git push origin gh-pages
-
-Process
-=======
-
-There should be only one maintainer doing this, to avoid collisions.
-The user guide would get regenerated whenever there is a PR merge
-that affects it.
-
-Note: You might have to delete the ``user_guide_src/doctree`` folder before
-making the ``gh-pages`` version of the guide, to make sure that the TOC
-is properly rebuilt, especially if you are rebuilding the ``html`` target a number of times.
diff --git a/user_guide_src/make.bat b/user_guide_src/make.bat
deleted file mode 100644
index 9534b018135e..000000000000
--- a/user_guide_src/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=source
-set BUILDDIR=build
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.http://sphinx-doc.org/
- exit /b 1
-)
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/user_guide_src/requirements.txt b/user_guide_src/requirements.txt
deleted file mode 100644
index caf5a68f9a1c..000000000000
--- a/user_guide_src/requirements.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-sphinx>=8.0.0,<9.0.0
-sphinxcontrib-phpdomain>=0.11.0
-docutils>=0.19
-sphinx-rtd-theme>=3.0.0
-jinja2>=3.1.3,<4.0.0
diff --git a/user_guide_src/source/.nojekyll b/user_guide_src/source/.nojekyll
deleted file mode 100644
index e69de29bb2d1..000000000000
diff --git a/user_guide_src/source/_static/ci-logo-text.svg b/user_guide_src/source/_static/ci-logo-text.svg
deleted file mode 100644
index 964782602e10..000000000000
--- a/user_guide_src/source/_static/ci-logo-text.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/user_guide_src/source/_static/css/citheme.css b/user_guide_src/source/_static/css/citheme.css
deleted file mode 100644
index fae4909dd62c..000000000000
--- a/user_guide_src/source/_static/css/citheme.css
+++ /dev/null
@@ -1,354 +0,0 @@
-/* RTD Theme ---------------------------------------------------------------- */
-
-@import 'theme.css';
-
-/* Raleway Font ------------------------------------------------------------- */
-
-@font-face {
- font-family: 'Raleway';
- font-style: normal;
- font-weight: 200;
- src: url('../fonts/Raleway/raleway-v14-latin-200.eot'); /* IE9 Compat Modes */
- src: local('Raleway ExtraLight'), local('Raleway-ExtraLight'),
- url('../fonts/Raleway/raleway-v14-latin-200.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('../fonts/Raleway/raleway-v14-latin-200.woff2') format('woff2'), /* Super Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-200.woff') format('woff'), /* Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-200.ttf') format('truetype'), /* Safari, Android, iOS */
- url('../fonts/Raleway/raleway-v14-latin-200.svg#Raleway') format('svg'); /* Legacy iOS */
-}
-
-@font-face {
- font-family: 'Raleway';
- font-style: italic;
- font-weight: 200;
- src: url('../fonts/Raleway/raleway-v14-latin-200italic.eot'); /* IE9 Compat Modes */
- src: local('Raleway ExtraLight Italic'), local('Raleway-ExtraLightItalic'),
- url('../fonts/Raleway/raleway-v14-latin-200italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('../fonts/Raleway/raleway-v14-latin-200italic.woff2') format('woff2'), /* Super Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-200italic.woff') format('woff'), /* Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-200italic.ttf') format('truetype'), /* Safari, Android, iOS */
- url('../fonts/Raleway/raleway-v14-latin-200italic.svg#Raleway') format('svg'); /* Legacy iOS */
-}
-
-@font-face {
- font-family: 'Raleway';
- font-style: normal;
- font-weight: 400;
- src: url('../fonts/Raleway/raleway-v14-latin-regular.eot'); /* IE9 Compat Modes */
- src: local('Raleway'), local('Raleway-Regular'),
- url('../fonts/Raleway/raleway-v14-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('../fonts/Raleway/raleway-v14-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-regular.woff') format('woff'), /* Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
- url('../fonts/Raleway/raleway-v14-latin-regular.svg#Raleway') format('svg'); /* Legacy iOS */
-}
-
-@font-face {
- font-family: 'Raleway';
- font-style: italic;
- font-weight: 400;
- src: url('../fonts/Raleway/raleway-v14-latin-italic.eot'); /* IE9 Compat Modes */
- src: local('Raleway Italic'), local('Raleway-Italic'),
- url('../fonts/Raleway/raleway-v14-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('../fonts/Raleway/raleway-v14-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-italic.woff') format('woff'), /* Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */
- url('../fonts/Raleway/raleway-v14-latin-italic.svg#Raleway') format('svg'); /* Legacy iOS */
-}
-
-@font-face {
- font-family: 'Raleway';
- font-style: normal;
- font-weight: 700;
- src: url('../fonts/Raleway/raleway-v14-latin-700.eot'); /* IE9 Compat Modes */
- src: local('Raleway Bold'), local('Raleway-Bold'),
- url('../fonts/Raleway/raleway-v14-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('../fonts/Raleway/raleway-v14-latin-700.woff2') format('woff2'), /* Super Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-700.woff') format('woff'), /* Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */
- url('../fonts/Raleway/raleway-v14-latin-700.svg#Raleway') format('svg'); /* Legacy iOS */
-}
-
-@font-face {
- font-family: 'Raleway';
- font-style: italic;
- font-weight: 700;
- src: url('../fonts/Raleway/raleway-v14-latin-700italic.eot'); /* IE9 Compat Modes */
- src: local('Raleway Bold Italic'), local('Raleway-BoldItalic'),
- url('../fonts/Raleway/raleway-v14-latin-700italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('../fonts/Raleway/raleway-v14-latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-700italic.woff') format('woff'), /* Modern Browsers */
- url('../fonts/Raleway/raleway-v14-latin-700italic.ttf') format('truetype'), /* Safari, Android, iOS */
- url('../fonts/Raleway/raleway-v14-latin-700italic.svg#Raleway') format('svg'); /* Legacy iOS */
-}
-
-/* General ------------------------------------------------------------------ */
-
-body, p, legend {
- font-family: "Raleway","Helvetica", "Arial", sans-serif;
-}
-
-.wy-nav-content {
- background-image: url('../img/ci-background.png');
- background-position: bottom right;
- background-repeat: no-repeat;
- background-size: 200px;
-}
-
-/* Titles ------------------------------------------------------------------- */
-
-h1, h2, h3, h4, h5, h6 {
- font-family: "Raleway", "Helvetica", "Arial", sans-serif;
-}
-
-h1 {
- margin-bottom: 2rem;
-}
-
-h2, h3 {
- margin-bottom: 2rem;
- margin-top: 3rem;
-}
-
-/* Images ------------------------------------------------------------------- */
-
-.rst-content img {
- -webkit-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.75);
- -moz-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.75);
- box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.75);
- display: block;
- height: auto!important;
- margin: 3rem auto!important;
- max-width: 700px;
- width: 100%!important;
-}
-
-.rst-content img.align-left {
- margin-right: 2rem!important;
- max-width: 375px;
-}
-
-.rst-content img.align-right {
- margin-left: 2rem!important;
- max-width: 400px;
-}
-
-/* Side Menu ---------------------------------------------------------------- */
-
-.wy-nav-side {
- background: #252525;
-}
-
-.wy-side-nav-search {
- background: #dd4814;
-}
-
-.wy-side-nav-search .logo {
- width: 100% !important;
-}
-
-.wy-side-nav-search a {
- color: #ffffff;
-}
-
-.wy-side-nav-search input[type=text] {
- border-color: #dd4815;
-}
-
-.wy-nav-top {
- background-color: #dd4814;
-}
-
-.wy-nav-top a {
- color: #ffffff!important;
-}
-
-.wy-menu-vertical a:active {
- background-color: #dd4814;
-}
-
-.wy-nav-content {
- max-width: 900px;
-}
-
-.wy-nav-content-wrap a, .wy-nav-content-wrap a:visited {
- color: #dd4814;
-}
-
-.wy-nav-content-wrap a:hover, .wy-nav-content-wrap a:active {
- color: #97310e;
-}
-
-.wy-menu-vertical li span.toctree-expand {
- margin-right: 0.65em;
-}
-
-.wy-menu-vertical li span.toctree-expand::before {
- display: none !important;
-}
-
-/* Elements ----------------------------------------------------------------- */
-
-.highlighted {
- padding: 0px !important;
- font-weight: inherit !important;
- background-color: #f1d40f !important;
-}
-
-/* override table width restrictions */
-.wy-table-responsive table td, .wy-table-responsive table th {
- white-space: pre;
-}
-
-.rst-content dl.class>dt {
- margin-bottom: 1rem !important;
-}
-
-.rst-content .section ol p, .rst-content .section ul p {
- margin: 0;
-}
-
-html.writer-html4 .rst-content dl:not(.docutils)>dt,
-html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt {
- background: #fdc894;
- color: #434343;
- border-top: solid 3px #dd4814;
-}
-
-html.writer-html4 .rst-content dl:not(.docutils) code.descname,
-html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname {
- padding-right: 0.2rem;
-}
-
-.rst-content dl.field-list {
- margin-top: 1rem;
- margin-bottom: 0.5rem;
-}
-
-.rst-content dl.field-list dt, .rst-content dl.field-list p,
-html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,
-html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt {
- font-size: 90%;
-}
-
-html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,
-html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt {
- padding: 6px;
-}
-
-.admonition {
- margin-bottom: 2.5rem!important;
- margin-top: 2rem;
-}
-
-.highlight-console .highlight {
- background-color: #fffff0;
-}
-
-span.std,
-span.pre {
- text-wrap: nowrap;
-}
-
-/* Messages ----------------------------------------------------------------- */
-
-.rst-content .success {
- background: #dff0d8;
-}
-
-.rst-content .success .admonition-title {
- background-color: #9ace25;
-}
-
-.rst-content .info {
- background: #e8eff1;
-}
-
-.rst-content .info .admonition-title {
- background: #5bc0de;
-}
-
-.rst-content .important {
- background: #f9f3f3;
-}
-
-.rst-content .important .admonition-title {
- background: #dd4814;
-}
-
-.versionadded {
- background: #dff0d8;
- padding: 0 5px;
-}
-
-.deprecated:not(.versionmodified) {
- background: #f2dede;
- padding: 0 5px;
-}
-
-/* Footer ------------------------------------------------------------------- */
-
-.rst-footer-buttons {
- margin-bottom: 2.5rem;
- margin-top: 2.5rem;
-}
-
-/* Carbon Ads --------------------------------------------------------------- */
-
-#carbonads {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu,
- Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-
-#carbonads {
- display: flex;
- max-width: 330px;
- background-color: hsla(0, 0%, 98%, 0.1);
- border: 1px solid hsla(0, 0%, 98%, 0.15);
- margin: 3em 1.5em;
-}
-
-#carbonads a {
- color: inherit;
- text-decoration: none;
-}
-
-#carbonads a:hover {
- color: inherit;
-}
-
-#carbonads span {
- position: relative;
- display: block;
- overflow: hidden;
-}
-
-.carbon-img {
- display: block;
- margin: 0;
- line-height: 1;
- text-align: center;
-}
-
-.carbon-img img {
- display: block;
- margin: auto;
-}
-
-.carbon-text {
- font-size: 13px;
- padding: 10px;
- line-height: 1.5;
- text-align: left;
-}
-
-.carbon-poweredby {
- display: block;
- padding: 8px 10px;
- text-align: center;
- text-transform: uppercase;
- letter-spacing: .5px;
- font-weight: lighter;
- font-size: 9px;
- line-height: 1;
-}
diff --git a/user_guide_src/source/_static/css/citheme_dark.css b/user_guide_src/source/_static/css/citheme_dark.css
deleted file mode 100644
index 649625a6b150..000000000000
--- a/user_guide_src/source/_static/css/citheme_dark.css
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Based heavily on https://darkreader.org/
- */
-
-@media (prefers-color-scheme: dark) {
-
- hr {
- border-top: 1px solid rgb(56, 61, 63);
- }
-
- pre {
- background-color: #282b2d !important
- }
-
- img:not([src*='.svg']) {
- filter: grayscale(50%) contrast(70%);;
- }
-
- html {
- background-color: #181a1b !important;
- }
-
- html, body {
- background-color: #181a1b;
- color: rgb(192, 186, 178);
- }
-
- table {
- border-color: #545b5e;
- }
-
- ::placeholder {
- color: #b2aba1;
- }
-
- input:-webkit-autofill,
- textarea:-webkit-autofill,
- select:-webkit-autofill {
- background-color: #404400 !important;
- color: #e8e6e3 !important;
- }
-
- .wy-side-nav-search {
- background-color: #b13a10;
- color: rgb(230, 228, 225);
- }
-
- .wy-side-nav-search input[type=text] {
- box-shadow: rgb(43 47 49) 0px 1px 3px inset;
- border-color: rgb(59 59 59);
- background-color: rgb(59 59 59);
- color: #96928c;
- }
-
- .btn {
- color: rgb(232, 230, 227);
- border-color: rgba(140, 130, 115, 0.1);
- background-color: rgb(31, 139, 77);
- text-decoration-color: initial;
- box-shadow: rgb(24 26 27 / 50%) 0px 1px 2px -1px inset, rgb(0 0 0 / 10%) 0px -2px 0px 0px inset;
- padding: 8px 8px 6px;
- line-height: 15px;
- }
-
- .btn-neutral, .btn-neutral:visited {
- background-color: rgb(27, 36, 36) !important;
- color: rgb(192, 186, 178) !important;
- }
-
- .btn-neutral:hover {
- background-color: rgb(42, 47, 47) !important;
- }
-
- footer {
- color: rgb(152, 143, 129) !important;
- }
-
- .wy-nav-content {
- background-color: #181a1b !important;
- color: rgb(192, 186, 178) !important;
- }
-
- .method .sig-object, .class dt, .data dt, .attribute dt, .function dt,
- .descclassname, .descname {
- background-color: rgb(40, 43, 45) !important;
- color: rgb(192, 186, 178) !important;
- }
-
- html.writer-html4 .rst-content dl:not(.docutils) > dt, html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.citation):not(.glossary):not(.simple) > dt {
- color: #cccccc !important;
- }
-
- html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list) > dt, html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.citation):not(.glossary):not(.simple) dl:not(.field-list) > dt {
- color: #96928c !important;
- border-left: 3px solid #3f4547 !important;
- }
-
- html.writer-html4 .rst-content dl:not(.docutils) .optional, html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.citation):not(.glossary):not(.simple) .optional {
- color: #c0bab2 !important;
- }
-
- .method dt, .function .field-list dt {
- background-color: inherit !important;
- }
-
- .rst-content .toc-backref {
- color: rgb(192, 186, 178) !important;
- }
-
- code.literal {
- background-color: #2d2d2d !important;
- border: 1px solid #6d6d6d !important;
- }
-
- .wy-nav-top {
- background-color: #b13a10 !important;
- }
-
- .wy-nav-side {
- background-color: rgb(28, 30, 31) !important;
- }
-
- .wy-menu-vertical a:visited {
- color: rgb(192, 186, 178) !important;
- }
-
- .wy-menu-vertical li.current > a button.toctree-expand, .wy-menu-vertical li.on a button.toctree-expand {
- color: rgb(200, 195, 188) !important;
- }
- .wy-menu-vertical a:hover button.toctree-expand {
- color: rgb(208, 204, 198) !important;
- }
-
- .wy-nav-content-wrap {
- background-color: #181a1b !important;
- }
-
- .wy-nav-content-wrap a, .wy-nav-content-wrap a:visited {
- color: rgb(237, 101, 54) !important;
- }
-
- .wy-nav-content-wrap a:hover, .wy-nav-content-wrap a:active {
- color: rgb(241, 138, 103) !important;
- }
-
- .wy-menu-vertical a:active {
- background-color: #b13a10 !important;
- }
-
- .sidebar {
- background-color: #191919 !important;
- }
-
- .sidebar-title {
- background-color: #2b2b2b !important;
- }
-
- .xref, .py-meth {
- color: #96928c !important;
- }
-
- .admonition, .note {
- background-color: #2d2d2d !important;
- }
-
- /* override table width restrictions */
-
- .wy-table thead, .rst-content table.docutils thead, .rst-content table.field-list thead {
- background-color: inherit;
- }
-
- .rst-content table.docutils thead, .rst-content table.field-list thead, .wy-table thead {
- color: #c0bab2 !important;
- }
-
- .wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th {
- border: solid 1px #c0bab2 !important;
- }
-
- .rst-content table.docutils td, .wy-table-bordered-all td {
- border-bottom: 1px solid #c0bab2 !important;
- border-left: 1px solid #c0bab2 !important;
- }
-
- .rst-content table.docutils, .wy-table-bordered-all {
- border: solid 1px #c0bab2 !important;
- }
-
- .wy-table thead p, .rst-content table.docutils thead p, .rst-content table.field-list thead p {
- margin: 0;
- }
-
- .wy-table-odd td, .wy-table-striped tr:nth-child(2n-1) td, .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td {
- background-color: #343131 !important;
- }
-
- /* Messages ----------------------------------------------------------------- */
-
- .rst-content .section .admonition ul {
- margin-bottom: 0;
- }
-
- .rst-content code.literal, .rst-content tt.literal {
- color: rgb(233, 88, 73) !important;
- }
-
- .rst-content .note .admonition-title, .rst-content .note .wy-alert-title, .rst-content .seealso .admonition-title, .rst-content .seealso .wy-alert-title, .rst-content .wy-alert-info.admonition-todo .admonition-title, .rst-content .wy-alert-info.admonition-todo .wy-alert-title, .rst-content .wy-alert-info.admonition .admonition-title, .rst-content .wy-alert-info.admonition .wy-alert-title, .rst-content .wy-alert-info.attention .admonition-title, .rst-content .wy-alert-info.attention .wy-alert-title, .rst-content .wy-alert-info.caution .admonition-title, .rst-content .wy-alert-info.caution .wy-alert-title, .rst-content .wy-alert-info.danger .admonition-title, .rst-content .wy-alert-info.danger .wy-alert-title, .rst-content .wy-alert-info.error .admonition-title, .rst-content .wy-alert-info.error .wy-alert-title, .rst-content .wy-alert-info.hint .admonition-title, .rst-content .wy-alert-info.hint .wy-alert-title, .rst-content .wy-alert-info.important .admonition-title, .rst-content .wy-alert-info.important .wy-alert-title, .rst-content .wy-alert-info.tip .admonition-title, .rst-content .wy-alert-info.tip .wy-alert-title, .rst-content .wy-alert-info.warning .admonition-title, .rst-content .wy-alert-info.warning .wy-alert-title, .rst-content .wy-alert.wy-alert-info .admonition-title, .wy-alert.wy-alert-info .rst-content .admonition-title, .wy-alert.wy-alert-info .wy-alert-title {
- background: #3a6d8e !important;
- color: #cdcdcd !important;
- }
-
- .rst-content .admonition-todo .admonition-title, .rst-content .admonition-todo .wy-alert-title, .rst-content .attention .admonition-title, .rst-content .attention .wy-alert-title, .rst-content .caution .admonition-title, .rst-content .caution .wy-alert-title, .rst-content .warning .admonition-title, .rst-content .warning .wy-alert-title, .rst-content .wy-alert-warning.admonition .admonition-title, .rst-content .wy-alert-warning.admonition .wy-alert-title, .rst-content .wy-alert-warning.danger .admonition-title, .rst-content .wy-alert-warning.danger .wy-alert-title, .rst-content .wy-alert-warning.error .admonition-title, .rst-content .wy-alert-warning.error .wy-alert-title, .rst-content .wy-alert-warning.hint .admonition-title, .rst-content .wy-alert-warning.hint .wy-alert-title, .rst-content .wy-alert-warning.important .admonition-title, .rst-content .wy-alert-warning.important .wy-alert-title, .rst-content .wy-alert-warning.note .admonition-title, .rst-content .wy-alert-warning.note .wy-alert-title, .rst-content .wy-alert-warning.seealso .admonition-title, .rst-content .wy-alert-warning.seealso .wy-alert-title, .rst-content .wy-alert-warning.tip .admonition-title, .rst-content .wy-alert-warning.tip .wy-alert-title, .rst-content .wy-alert.wy-alert-warning .admonition-title, .wy-alert.wy-alert-warning .rst-content .admonition-title, .wy-alert.wy-alert-warning .wy-alert-title {
- background: #b96a26 !important;
- color: #cdcdcd !important;
- }
-
- /* Content ----------------------------------------------------------------- */
-
- .rst-content .important .admonition-title {
- background: #b04926 !important;
- color: #cdcdcd !important;
- }
-
- .rst-content div[class^="highlight"], .rst-content pre.literal-block {
- border: 1px solid rgb(63, 69, 71) !important;
- }
-
- html.writer-html4 .rst-content dl:not(.docutils) > dt, html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.citation):not(.glossary):not(.simple) > dt {
- border-top: solid 3px #b13a10 !important;
- }
-
- html.writer-html4 .rst-content dl:not(.docutils) > dt, html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.citation):not(.glossary):not(.simple) > dt {
- background: #282b2d !important;
- }
-
- /* Side Menu ---------------------------------------------------------------- */
-
- .wy-menu-vertical li.current {
- background: rgb(40, 43, 45) !important;
- }
-
- .wy-menu-vertical li.current > a, .wy-menu-vertical li.on a, .wy-menu-vertical li.current > a:hover, .wy-menu-vertical li.on a:hover {
- background-color: rgb(24, 26, 27) !important;
- color: rgb(192, 186, 178) !important;
- }
-
- .wy-menu-vertical li.toctree-l1.current > a {
- border-bottom-color: rgb(63, 69, 71) !important;
- border-top-color: rgb(63, 69, 71) !important;
-
- }
-
- .wy-menu-vertical li.current a {
- border-right-color: rgb(63, 69, 71) !important;
- }
-
- .wy-menu-vertical li.toctree-l2.current > a, .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a,
- .wy-menu-vertical li.toctree-l2.current:hover > a, .wy-menu-vertical li.toctree-l2.current li.toctree-l3:hover > a {
- background: #3c3c3c !important;
- border-right-color: rgb(63, 69, 71) !important;
- }
-
- .wy-menu-vertical li.toctree-l2:hover > a, .wy-menu-vertical li.toctree-l2.current li.toctree-l3:hover > a {
- background: #1c2020 !important;
- }
-
- .wy-menu-vertical li.toctree-l2 a, .wy-menu-vertical li.toctree-l3 a, .wy-menu-vertical li.toctree-l4 a, .wy-menu-vertical li.toctree-l5 a, .wy-menu-vertical li.toctree-l6 a, .wy-menu-vertical li.toctree-l7 a, .wy-menu-vertical li.toctree-l8 a, .wy-menu-vertical li.toctree-l9 a, .wy-menu-vertical li.toctree-l10 a {
- color: rgb(192, 186, 178) !important;
- }
-
- .wy-menu-vertical li code {
- color: rgb(237, 101, 54) !important;
- }
-
- .wy-menu-vertical .xref {
- color: #2980B9 !important;
- }
-
- /* Search results ---------------------------------------------------------------- */
-
- #search-results .search li:first-child {
- border-top: 1px solid rgb(56, 61, 63);
- }
-
- #search-results .search li {
- border-bottom: 1px solid rgb(56, 61, 63);
- padding-bottom: 14px !important;
- }
-
- .highlighted {
- background-color: #5e5939 !important
- }
-
- a .highlighted {
- color: #cecece;
- }
-
- .rst-content .highlighted {
- box-shadow: 0 0 0 2px #b3a159;
- }
-
- .versionadded {
- background: #275b11;
- }
-
- .deprecated:not(.versionmodified) {
- background: #86371b;
- }
-
- /* Elements ----------------------------------------------------------------- */
-
- .highlight .m {
- color: inherit
- }
-
- .highlight .nt {
- color: #a6a6df;
- }
-
- .highlight .nv {
- color: #4f9fd5;
- }
-
- .highlight .na {
- color: #57acac;
- }
-
- .highlight .nc {
- color: #7687b9;
- font-weight: bold;
- }
-
- .highlight .nf {
- color: #b96f6f;
- font-weight: bold;
- }
-
- .highlight .fm {
- color: #b96f6f;
- font-weight: bold;
- }
-
- .highlight .ni {
- color: #b780b7;
- }
-
- .highlight-console .highlight pre {
- background: #434343;
- }
-}
diff --git a/user_guide_src/source/_static/favicon.ico b/user_guide_src/source/_static/favicon.ico
deleted file mode 100644
index a725c10e7251..000000000000
Binary files a/user_guide_src/source/_static/favicon.ico and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.eot b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.eot
deleted file mode 100644
index 6af49a8f2d87..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.eot and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.svg b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.svg
deleted file mode 100644
index 958f46b7618f..000000000000
--- a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.svg
+++ /dev/null
@@ -1,347 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.ttf b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.ttf
deleted file mode 100644
index 88e34739f314..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.ttf and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.woff b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.woff
deleted file mode 100644
index d1bbeaacadae..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.woff and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.woff2 b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.woff2
deleted file mode 100644
index e13afef7dae6..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200.woff2 and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.eot b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.eot
deleted file mode 100644
index b485d5cd296e..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.eot and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.svg b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.svg
deleted file mode 100644
index ce455d6e530d..000000000000
--- a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.svg
+++ /dev/null
@@ -1,363 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.ttf b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.ttf
deleted file mode 100644
index d29beb2646cd..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.ttf and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.woff b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.woff
deleted file mode 100644
index 7db615057dff..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.woff and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.woff2 b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.woff2
deleted file mode 100644
index 629105aa6909..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-200italic.woff2 and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.eot b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.eot
deleted file mode 100644
index f37ca0fb751e..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.eot and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.svg b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.svg
deleted file mode 100644
index 0d682387f0e3..000000000000
--- a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.svg
+++ /dev/null
@@ -1,343 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.ttf b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.ttf
deleted file mode 100644
index 8f3846413034..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.ttf and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.woff b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.woff
deleted file mode 100644
index d89a0a2b5ddd..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.woff and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.woff2 b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.woff2
deleted file mode 100644
index 022064260400..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700.woff2 and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.eot b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.eot
deleted file mode 100644
index 4f61611231f7..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.eot and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.svg b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.svg
deleted file mode 100644
index deac2f332c68..000000000000
--- a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.svg
+++ /dev/null
@@ -1,352 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.ttf b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.ttf
deleted file mode 100644
index 052e0b56450b..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.ttf and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.woff b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.woff
deleted file mode 100644
index f412eab113a3..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.woff and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.woff2 b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.woff2
deleted file mode 100644
index e0742c8adaa3..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-700italic.woff2 and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.eot b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.eot
deleted file mode 100644
index 7d6b20a04b43..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.eot and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.svg b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.svg
deleted file mode 100644
index c6dcd46742d4..000000000000
--- a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.svg
+++ /dev/null
@@ -1,361 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.ttf b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.ttf
deleted file mode 100644
index 7f632b12f729..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.ttf and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.woff b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.woff
deleted file mode 100644
index 48b91a4d3fe7..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.woff and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.woff2 b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.woff2
deleted file mode 100644
index e142d3f82761..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-italic.woff2 and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.eot b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.eot
deleted file mode 100644
index 84de35ba4c5f..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.eot and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.svg b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.svg
deleted file mode 100644
index 35870707df86..000000000000
--- a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.svg
+++ /dev/null
@@ -1,347 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.ttf b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.ttf
deleted file mode 100644
index 03b5a21daa03..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.ttf and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.woff b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.woff
deleted file mode 100644
index ab3a51bc092f..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.woff and /dev/null differ
diff --git a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.woff2 b/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.woff2
deleted file mode 100644
index 86b505ec5c5c..000000000000
Binary files a/user_guide_src/source/_static/fonts/Raleway/raleway-v14-latin-regular.woff2 and /dev/null differ
diff --git a/user_guide_src/source/_static/img/ci-background.png b/user_guide_src/source/_static/img/ci-background.png
deleted file mode 100644
index 845e6e0da943..000000000000
Binary files a/user_guide_src/source/_static/img/ci-background.png and /dev/null differ
diff --git a/user_guide_src/source/_static/js/carbon.js b/user_guide_src/source/_static/js/carbon.js
deleted file mode 100644
index 35968db75e95..000000000000
--- a/user_guide_src/source/_static/js/carbon.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Add Carbon Ads underneath navigation to support CodeIgniter Foundation
- */
-if (window.location.hostname === 'codeigniter.com') {
- window.onload = function () {
- // Create a HTML DOM Element Object
- var carbon = document.createElement('script');
- carbon.async = true;
- carbon.type = 'text/javascript';
- carbon.src = 'https://cdn.carbonads.com/carbon.js?serve=CE7I62QW&placement=codeignitercom';
- carbon.id = '_carbonads_js';
-
- // Append Carbon Ads to .wy-menu
- document.querySelector('.wy-menu').appendChild(carbon);
- }
-}
diff --git a/user_guide_src/source/_static/js/citheme.js b/user_guide_src/source/_static/js/citheme.js
deleted file mode 100644
index 1de776d85487..000000000000
--- a/user_guide_src/source/_static/js/citheme.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Add classes to the body of each page of the documentation.
- *
- * From: [...]/outgoing/api_responses.html
- * Into: ci-outgoing ci-api-responses
- */
-window.onload = function() {
- // Regular expression for finding chapter and subject in the current url
- const regexUrl = new RegExp(/\/([a-z0-9_.-]+)\/([a-z0-9_.-]+)\.html/);
-
- // Get the current url
- const currentUrl = window.location.href;
-
- // Get the document body
- const documentBody = document.body;
-
- // Placeholder for documentation index
- var index = null;
-
- if ((index = regexUrl.exec(currentUrl)) !== null)
- {
- // Sanitize the documentation chapter and subject
- var chapter = sanitizeClass(index[1]);
- var subject = sanitizeClass(index[2]);
-
- // Documentation is generated into an html-folder for developers.
- // This isn't a valid chapter. We are on documentation index.
- if (chapter === 'html')
- {
- index = null;
- }
- // Add chapter and subject className(s) to the document body
- else
- {
- addClass(documentBody, chapter);
- addClass(documentBody, subject);
- }
- }
-
- // No chapter and subject found. We are on documentation index.
- if (index === null)
- {
- addClass(documentBody, 'documentation');
- addClass(documentBody, 'index');
- }
-}
-
-/**
- * Sanitize the string - removing invalid characters
- *
- * @param {string} className className to be sanitized
- *
- * @return {string}
- */
-sanitizeClass = function(className) {
- return className.replace(/_/g, '-').replace(/[^a-z0-9-]/g, '');
-}
-
-/**
- * Add class to HTML DOM Element Object
- *
- * @param {object} el The HTML DOM Element Object
- * @param {string} className className to be added
- * @param {string} namePrefix namePrefix to be added to className
- *
- * @return {void}
- */
-addClass = function(el, className, namePrefix) {
- namePrefix = namePrefix || 'ci-';
-
- if (el.classList && className.length > 0)
- {
- el.classList.add(namePrefix + className);
- }
-}
diff --git a/user_guide_src/source/_static/js/version_switcher.js b/user_guide_src/source/_static/js/version_switcher.js
deleted file mode 100644
index d33c33ea1509..000000000000
--- a/user_guide_src/source/_static/js/version_switcher.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Version switcher for the user guide sidebar.
- *
- * Injects the sphinx_rtd_theme's native ".switch-menus > .version-switch"
- * scaffolding above the search box in the left sidebar, containing a
- * so readers can jump between:
- * - stable: https://codeigniter.com/user_guide/
- * - latest (in-progress): https://codeigniter4.github.io/CodeIgniter4/
- * - local build: file:// or localhost, etc. (only shown when not on a deployed host)
- */
-(() => {
- const VERSIONS = [
- {
- slug: 'stable',
- label: 'Stable',
- host: 'codeigniter.com',
- pathPrefix: '/user_guide/',
- },
- {
- slug: 'latest (in-progress)',
- label: 'Latest (in-progress)',
- host: 'codeigniter4.github.io',
- pathPrefix: '/CodeIgniter4/',
- },
- ];
-
- const LOCAL = Object.freeze({
- slug: 'local build',
- label: 'Local build',
- host: null,
- pathPrefix: null,
- });
-
- const detect_current = () =>
- VERSIONS.find((version) => version.host === window.location.hostname) ?? LOCAL;
-
- /*
- * Derive the absolute URL of the documentation root by inspecting the
- *
diff --git a/user_guide_src/source/helpers/html_helper/011.php b/user_guide_src/source/helpers/html_helper/011.php
deleted file mode 100644
index 586621f9c207..000000000000
--- a/user_guide_src/source/helpers/html_helper/011.php
+++ /dev/null
@@ -1,6 +0,0 @@
- 'js/printer.js', 'defer' => null];
-
-echo script_tag($script);
-//
diff --git a/user_guide_src/source/helpers/html_helper/012.php b/user_guide_src/source/helpers/html_helper/012.php
deleted file mode 100644
index 941de51da134..000000000000
--- a/user_guide_src/source/helpers/html_helper/012.php
+++ /dev/null
@@ -1,15 +0,0 @@
- 'boldlist',
- 'id' => 'mylist',
-];
-
-echo ul($list, $attributes);
diff --git a/user_guide_src/source/helpers/html_helper/013.php b/user_guide_src/source/helpers/html_helper/013.php
deleted file mode 100644
index 113ecbbaf6c6..000000000000
--- a/user_guide_src/source/helpers/html_helper/013.php
+++ /dev/null
@@ -1,38 +0,0 @@
- 'boldlist',
- 'id' => 'mylist',
-];
-
-$list = [
- 'colors' => [
- 'red',
- 'blue',
- 'green',
- ],
- 'shapes' => [
- 'round',
- 'square',
- 'circles' => [
- 'ellipse',
- 'oval',
- 'sphere',
- ],
- ],
- 'moods' => [
- 'happy',
- 'upset' => [
- 'defeated' => [
- 'dejected',
- 'disheartened',
- 'depressed',
- ],
- 'annoyed',
- 'cross',
- 'angry',
- ],
- ],
-];
-
-echo ul($list, $attributes);
diff --git a/user_guide_src/source/helpers/html_helper/014.php b/user_guide_src/source/helpers/html_helper/014.php
deleted file mode 100644
index f7936d29488a..000000000000
--- a/user_guide_src/source/helpers/html_helper/014.php
+++ /dev/null
@@ -1,27 +0,0 @@
-
diff --git a/user_guide_src/source/helpers/html_helper/016.php b/user_guide_src/source/helpers/html_helper/016.php
deleted file mode 100644
index 15234546db04..000000000000
--- a/user_guide_src/source/helpers/html_helper/016.php
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/user_guide_src/source/helpers/html_helper/017.php b/user_guide_src/source/helpers/html_helper/017.php
deleted file mode 100644
index da3ee54b366f..000000000000
--- a/user_guide_src/source/helpers/html_helper/017.php
+++ /dev/null
@@ -1,13 +0,0 @@
-
diff --git a/user_guide_src/source/helpers/html_helper/019.php b/user_guide_src/source/helpers/html_helper/019.php
deleted file mode 100644
index 90c4c430d07c..000000000000
--- a/user_guide_src/source/helpers/html_helper/019.php
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/user_guide_src/source/helpers/html_helper/020.php b/user_guide_src/source/helpers/html_helper/020.php
deleted file mode 100644
index 1bd614043095..000000000000
--- a/user_guide_src/source/helpers/html_helper/020.php
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-echo doctype('html4-trans');
-//
diff --git a/user_guide_src/source/helpers/index.rst b/user_guide_src/source/helpers/index.rst
deleted file mode 100644
index 90196c47b0fa..000000000000
--- a/user_guide_src/source/helpers/index.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-#######
-Helpers
-#######
-
-Helpers are collections of useful procedural functions. See also :doc:`../general/helpers`.
-
-.. toctree::
- :glob:
- :titlesonly:
-
- *
diff --git a/user_guide_src/source/helpers/inflector_helper.rst b/user_guide_src/source/helpers/inflector_helper.rst
deleted file mode 100644
index fdd069c9511e..000000000000
--- a/user_guide_src/source/helpers/inflector_helper.rst
+++ /dev/null
@@ -1,151 +0,0 @@
-################
-Inflector Helper
-################
-
-The Inflector Helper file contains functions that permit you to change **English** words to plural, singular, camel
-case, etc.
-
-.. contents::
- :local:
- :depth: 2
-
-Loading this Helper
-===================
-
-This helper is loaded using the following code:
-
-.. literalinclude:: inflector_helper/001.php
-
-Available Functions
-===================
-
-The following functions are available:
-
-.. php:function:: singular($string)
-
- :param string $string: Input string
- :returns: A singular word
- :rtype: string
-
- Changes a plural word to singular. Example:
-
- .. literalinclude:: inflector_helper/002.php
-
-.. php:function:: plural($string)
-
- :param string $string: Input string
- :returns: A plural word
- :rtype: string
-
- Changes a singular word to plural. Example:
-
- .. literalinclude:: inflector_helper/003.php
-
-.. php:function:: counted($count, $string)
-
- :param int $count: Number of items
- :param string $string: Input string
- :returns: A singular or plural phrase
- :rtype: string
-
- Changes a word and its count to a phrase. Example:
-
- .. literalinclude:: inflector_helper/004.php
-
-.. php:function:: camelize($string)
-
- :param string $string: Input string
- :returns: Camel case string
- :rtype: string
-
- Changes a string of words separated by spaces or underscores to camel case. Example:
-
- .. literalinclude:: inflector_helper/005.php
-
-.. php:function:: pascalize($string)
-
- :param string $string: Input string
- :returns: Pascal case string
- :rtype: string
-
- Changes a string of words separated by spaces or underscores to Pascal case, which is camel case with the first
- letter capitalized. Example:
-
- .. literalinclude:: inflector_helper/006.php
-
-.. php:function:: underscore($string)
-
- :param string $string: Input string
- :returns: String containing underscores instead of spaces
- :rtype: string
-
- Takes multiple words separated by spaces and underscores them. Example:
-
- .. literalinclude:: inflector_helper/007.php
-
-.. php:function:: decamelize($string)
-
- :param string $string: Input string
- :returns: String containing underscores between words
- :rtype: string
-
- Takes multiple words in camelCase or PascalCase and converts them to snake_case. Example:
-
- .. literalinclude:: inflector_helper/014.php
-
-.. php:function:: humanize($string[, $separator = '_'])
-
- :param string $string: Input string
- :param string $separator: Input separator
- :returns: Humanized string
- :rtype: string
-
- Takes multiple words separated by underscores and adds spaces between them. Each word is capitalized.
-
- Example:
-
- .. literalinclude:: inflector_helper/008.php
-
- To use dashes instead of underscores:
-
- .. literalinclude:: inflector_helper/009.php
-
-.. php:function:: is_pluralizable($word)
-
- :param string $word: Input string
- :returns: true if the word is countable or false if not
- :rtype: bool
-
- Checks if the given word has a plural version. Example:
-
- .. literalinclude:: inflector_helper/010.php
-
-.. php:function:: dasherize($string)
-
- :param string $string: Input string
- :returns: Dasherized string
- :rtype: string
-
- Replaces underscores with dashes in the string. Example:
-
- .. literalinclude:: inflector_helper/011.php
-
-.. php:function:: ordinal($integer)
-
- :param int $integer: The integer to determine the suffix for
- :returns: Ordinal suffix
- :rtype: string
-
- Returns the suffix that should be added to a number to denote the position, such as 1st, 2nd, 3rd, 4th. Example:
-
- .. literalinclude:: inflector_helper/012.php
-
-.. php:function:: ordinalize($integer)
-
- :param int $integer: The integer to ordinalize
- :returns: Ordinalized integer
- :rtype: string
-
- Turns a number into an ordinal string used to denote the position, such as 1st, 2nd, 3rd, 4th. Example:
-
- .. literalinclude:: inflector_helper/013.php
diff --git a/user_guide_src/source/helpers/inflector_helper/001.php b/user_guide_src/source/helpers/inflector_helper/001.php
deleted file mode 100644
index 985243995503..000000000000
--- a/user_guide_src/source/helpers/inflector_helper/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
-/Number.php*
-
-.. php:function:: number_to_amount($num[, $precision = 0[, $locale = null]])
-
- :param mixed $num: Number to format
- :param int $precision: Floating point precision
- :param string|null $locale: The locale to use for formatting
- :returns: A human-readable version of the string, or false if the provided value is not numeric
- :rtype: string|false
-
- Converts a number into a human-readable version, like **123.4 trillion** for numbers up to the quadrillions.
- Examples:
-
- .. literalinclude:: number_helper/005.php
-
- An optional second parameter allows you to set the precision of the result:
-
- .. literalinclude:: number_helper/006.php
-
- An optional third parameter allows the locale to be specified:
-
- .. literalinclude:: number_helper/007.php
-
-.. php:function:: number_to_currency($num, $currency[, $locale = null[, $fraction = 0]])
-
- :param float $num: Number to format
- :param string $currency: The currency type, e.g., USD, EUR, etc.
- :param string|null $locale: The locale to use for formatting
- :param integer $fraction: Number of fraction digits after the decimal point
- :returns: The number as the appropriate currency for the locale
- :rtype: string
-
- Converts a number to common currency formats, like USD, EUR, GBP, etc:
-
- .. literalinclude:: number_helper/008.php
-
- If you don't specify a locale, the Request locale is used.
-
-.. php:function:: number_to_roman($num)
-
- :param int|string $num: The number to convert
- :returns: The Roman numeral converted from the given parameter
- :rtype: string|null
-
- Converts a number into a Roman numeral:
-
- .. literalinclude:: number_helper/009.php
-
- This function only handles numbers in the range 1 through 3999. It will return ``null`` for any value outside that
- range.
diff --git a/user_guide_src/source/helpers/number_helper/001.php b/user_guide_src/source/helpers/number_helper/001.php
deleted file mode 100644
index 9ff7e68b56c6..000000000000
--- a/user_guide_src/source/helpers/number_helper/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
-` documentation.
-
-.. php:function:: strip_image_tags($str)
-
- :param string $str: Input string
- :returns: The input string with no image tags
- :rtype: string
-
- This is a security function that will strip image tags from a string. It leaves the image URL as plain text.
-
- Example:
-
- .. literalinclude:: security_helper/002.php
-
-.. php:function:: encode_php_tags($str)
-
- :param string $str: Input string
- :returns: Safely formatted string
- :rtype: string
-
- This is a security function that converts PHP tags to entities.
-
- Example:
-
- .. literalinclude:: security_helper/003.php
diff --git a/user_guide_src/source/helpers/security_helper/001.php b/user_guide_src/source/helpers/security_helper/001.php
deleted file mode 100644
index e06bb8876dec..000000000000
--- a/user_guide_src/source/helpers/security_helper/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
-assertTrue($this->userHasAccess($user));
- }
-}
diff --git a/user_guide_src/source/helpers/text_helper.rst b/user_guide_src/source/helpers/text_helper.rst
deleted file mode 100644
index 97aecd708962..000000000000
--- a/user_guide_src/source/helpers/text_helper.rst
+++ /dev/null
@@ -1,350 +0,0 @@
-###########
-Text Helper
-###########
-
-The Text Helper file contains functions that assist in working with text.
-
-.. contents::
- :local:
- :depth: 2
-
-Loading this Helper
-===================
-
-This helper is loaded using the following code:
-
-.. literalinclude:: text_helper/001.php
-
-Available Functions
-===================
-
-The following functions are available:
-
-.. php:function:: random_string([$type = 'alnum'[, $len = 8]])
-
- :param string $type: Randomization type
- :param int $len: Output string length
- :returns: A random string
- :rtype: string
-
- Generates a random string based on the type and length you specify. Useful for creating passwords or generating
- random hashes.
-
- The first parameter specifies the type of string, and the second parameter specifies the length. The following
- choices are available:
-
- - **alpha**: A string with lower and uppercase letters only.
- - **alnum**: Alphanumeric string with lower and uppercase characters.
- - **numeric**: Numeric string.
- - **nozero**: Numeric string with no zeros.
- - **crypto**: A random string based on ``random_bytes()``.
-
- .. note:: When you use **crypto**, you must pass an even number as the second parameter. Since v4.2.2, if you set an
- odd number, ``InvalidArgumentException`` will be thrown.
-
- .. note:: Since v4.3.3, **alpha**, **alnum** and **nozero** use ``random_bytes()``, and **numeric** uses
- ``random_int()``. In previous versions, they used ``str_shuffle()``, which is not cryptographically secure.
-
- Usage example:
-
- .. literalinclude:: text_helper/002.php
-
-.. php:function:: increment_string($str[, $separator = '_'[, $first = 1]])
-
- :param string $str: Input string
- :param string $separator: Separator to append a duplicate number with
- :param int $first: Starting number
- :returns: An incremented string
- :rtype: string
-
- Increments a string by appending a number to it or increasing the number. Useful for creating "copies" of a file or
- duplicating database content which has unique titles or slugs.
-
- Usage example:
-
- .. literalinclude:: text_helper/003.php
-
-.. php:function:: alternator($args)
-
- :param mixed $args: A variable number of arguments
- :returns: Alternated string(s)
- :rtype: mixed
-
- Allows two or more items to be alternated between, when cycling through a loop. Example:
-
- .. literalinclude:: text_helper/004.php
-
- You can add as many parameters as you want, and with each iteration of your loop the next item will be returned.
-
- .. literalinclude:: text_helper/005.php
-
- .. note:: To use multiple separate calls to this function, simply call the function with no arguments to
- re-initialize.
-
-.. php:function:: reduce_double_slashes($str)
-
- :param string $str: Input string
- :returns: A string with normalized slashes
- :rtype: string
-
- Converts double slashes in a string to a single slash, except those found in URL protocol prefixes (e.g.,
- ``http://``).
-
- Example:
-
- .. literalinclude:: text_helper/006.php
-
-.. php:function:: strip_slashes($data)
-
- :param mixed $data: Input string or an array of strings
- :returns: String(s) with stripped slashes
- :rtype: mixed
-
- Removes any slashes from an array of strings.
-
- Example:
-
- .. literalinclude:: text_helper/007.php
-
- The above will return the following array:
-
- .. literalinclude:: text_helper/008.php
-
- .. note:: For historical reasons, this function will also accept and handle string inputs. However, this makes it
- just an alias for ``stripslashes()``.
-
-.. php:function:: reduce_multiples($str[, $character = ','[, $trim = false]])
-
- :param string $str: Text to search in
- :param string $character: Character to reduce
- :param bool $trim: Whether to also trim the specified character
- :returns: Reduced string
- :rtype: string
-
- Reduces multiple instances of a particular character occurring directly after each other. Example:
-
- .. literalinclude:: text_helper/009.php
-
- If the third parameter is set to ``true``, it will remove occurrences of the character at the beginning and the end
- of the string. Example:
-
- .. literalinclude:: text_helper/010.php
-
-.. php:function:: quotes_to_entities($str)
-
- :param string $str: Input string
- :returns: String with quotes converted to HTML entities
- :rtype: string
-
- Converts single and double quotes in a string to the corresponding HTML entities. Example:
-
- .. literalinclude:: text_helper/011.php
-
-.. php:function:: strip_quotes($str)
-
- :param string $str: Input string
- :returns: String with quotes stripped
- :rtype: string
-
- Removes single and double quotes from a string. Example:
-
- .. literalinclude:: text_helper/012.php
-
-.. php:function:: word_limiter($str[, $limit = 100[, $endChar = '…']])
-
- :param string $str: Input string
- :param int $limit: Limit
- :param string $endChar: End character (usually an ellipsis)
- :returns: Word-limited string
- :rtype: string
-
- Truncates a string to the number of *words* specified. Example:
-
- .. literalinclude:: text_helper/013.php
-
- The third parameter is an optional suffix added to the string. By default, it adds an ellipsis.
-
-.. php:function:: character_limiter($string[, $limit = 500[, $endChar = '…']])
-
- :param string $string: Input string
- :param int $limit: Number of characters
- :param string $endChar: End character (usually an ellipsis)
- :returns: Character-limited string
- :rtype: string
-
- Truncates a string to the number of *characters* specified. It maintains the integrity of words, so the character
- count may be slightly more or less than what you specify.
-
- Example:
-
- .. literalinclude:: text_helper/014.php
-
- The third parameter is an optional suffix added to the string. If undeclared, this helper uses an ellipsis.
-
- .. note:: If you need to truncate to an exact number of characters, please see the :php:func:`ellipsize()` function
- below.
-
-.. php:function:: ascii_to_entities($str)
-
- :param string $str: Input string
- :returns: A string with ASCII values converted to entities
- :rtype: string
-
- Converts ASCII values to character entities, including high ASCII and MS Word characters that can cause problems
- when used in a web page, so that they can be shown consistently regardless of browser settings or stored reliably in
- a database. There is some dependence on your server's supported character sets, so it may not be 100% reliable in
- all cases, but for the most part, it should correctly identify characters outside the normal range (like accented
- characters).
-
- Example:
-
- .. literalinclude:: text_helper/015.php
-
-.. php:function:: entities_to_ascii($str[, $all = true])
-
- :param string $str: Input string
- :param bool $all: Whether to convert unsafe entities as well
- :returns: A string with HTML entities converted to ASCII characters
- :rtype: string
-
- This function does the opposite of :php:func:`ascii_to_entities()`. It turns character entities back into ASCII.
-
-.. php:function:: convert_accented_characters($str)
-
- :param string $str: Input string
- :returns: A string with accented characters converted
- :rtype: string
-
- Transliterates high ASCII characters to low ASCII equivalents. Useful when non-English characters need to be used
- where only standard ASCII characters are safely used, for instance, in URLs.
-
- Example:
-
- .. literalinclude:: text_helper/016.php
-
- .. note:: This function uses a companion config file **app/Config/ForeignCharacters.php** to define the to and from
- array for transliteration.
-
-.. php:function:: word_censor($str, $censored[, $replacement = ''])
-
- :param string $str: Input string
- :param array $censored: List of bad words to censor
- :param string $replacement: What to replace bad words with
- :returns: Censored string
- :rtype: string
-
- Enables you to censor words within a text string. The first parameter will contain the original string. The second
- will contain an array of words which you disallow. The third (optional) parameter can contain a replacement value
- for the words. If not specified, they are replaced with pound signs: ####.
-
- Example:
-
- .. literalinclude:: text_helper/017.php
-
-.. php:function:: highlight_code($str)
-
- :param string $str: Input string
- :returns: String with code highlighted via HTML
- :rtype: string
-
- Colorizes a string of code (PHP, HTML, etc.). Example:
-
- .. literalinclude:: text_helper/018.php
-
- The function uses PHP's ``highlight_string()`` function, so the colors used are the ones specified in your
- **php.ini** file.
-
-.. php:function:: highlight_phrase($str, $phrase[, $tag_open = ''[, $tag_close = ' ']])
-
- :param string $str: Input string
- :param string $phrase: Phrase to highlight
- :param string $tag_open: Opening tag used for the highlight
- :param string $tag_close: Closing tag for the highlight
- :returns: String with a phrase highlighted via HTML
- :rtype: string
-
- Will highlight a phrase within a text string. The first parameter will contain the original string, and the second
- will contain the phrase you wish to highlight. The third and fourth parameters will contain the opening/closing HTML
- tags you would like the phrase wrapped in.
-
- Example:
-
- .. literalinclude:: text_helper/019.php
-
- The above code prints::
-
- Here is a nice text string about nothing in particular.
-
- .. note:: This function used to use the ```` tag by default. Older browsers
- might not support the new HTML5 mark tag, so it is recommended that you
- insert the following CSS code into your stylesheet if you need to support
- such browsers::
-
- mark {
- background: #ff0;
- color: #000;
- }
-
-.. php:function:: word_wrap($str[, $charlim = 76])
-
- :param string $str: Input string
- :param int $charlim: Character limit
- :returns: Word-wrapped string
- :rtype: string
-
- Wraps text at the specified *character* count while maintaining complete words.
-
- Example:
-
- .. literalinclude:: text_helper/020.php
-
-.. php:function:: ellipsize($str, $max_length[, $position = 1[, $ellipsis = '…']])
-
- :param string $str: Input string
- :param int $max_length: String length limit
- :param mixed $position: Position to split at (int or float)
- :param string $ellipsis: What to use as the ellipsis character
- :returns: Ellipsized string
- :rtype: string
-
- This function will strip tags from a string, split it at a defined maximum length, and insert an ellipsis.
-
- The first parameter is the string to ellipsize, and the second is the number of characters in the final string. The
- third parameter is where in the string the ellipsis should appear from 0 - 1, left to right. For example, a value of
- 1 will place the ellipsis at the right of the string, .5 in the middle, and 0 at the left.
-
- An optional fourth parameter is the kind of ellipsis. By default, ``…`` will be inserted.
-
- Example:
-
- .. literalinclude:: text_helper/021.php
-
- Produces::
-
- this_string_is_e…ak_my_design.jpg
-
-.. php:function:: excerpt($text, $phrase = false, $radius = 100, $ellipsis = '...')
-
- :param string $text: Text to extract an excerpt from
- :param string $phrase: Phrase or word to extract the text around
- :param int $radius: Number of characters before and after ``$phrase``
- :param string $ellipsis: What to use as the ellipsis character
- :returns: Excerpt.
- :rtype: string
-
- This function will extract ``$radius`` number of characters before and after the central ``$phrase`` with an
- ellipsis before and after.
-
- The first parameter is the text to extract an excerpt from, and the second is the central word or phrase to count
- before and after. The third parameter is the number of characters to count before and after the central phrase. If
- no phrase is passed, the excerpt will include the first ``$radius`` characters with the ellipsis at the end.
-
- Example:
-
- .. literalinclude:: text_helper/022.php
-
- Produces::
-
- ... non mauris lectus. Phasellus eu sodales sem. Integer dictum purus ac
- enim hendrerit gravida. Donec ac magna vel nunc tincidunt molestie sed
- vitae nisl. Cras sed auctor mauris, non dictum tortor. ...
diff --git a/user_guide_src/source/helpers/text_helper/001.php b/user_guide_src/source/helpers/text_helper/001.php
deleted file mode 100644
index fdf999c3d9c6..000000000000
--- a/user_guide_src/source/helpers/text_helper/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
- "Is your name O\\'reilly?",
- 'answer' => "No, my name is O\\'connor.",
-];
-
-$str = strip_slashes($str);
diff --git a/user_guide_src/source/helpers/text_helper/008.php b/user_guide_src/source/helpers/text_helper/008.php
deleted file mode 100644
index c4cd2f1c53ca..000000000000
--- a/user_guide_src/source/helpers/text_helper/008.php
+++ /dev/null
@@ -1,6 +0,0 @@
- "Is your name O'reilly?",
- 'answer' => "No, my name is O'connor.",
-];
diff --git a/user_guide_src/source/helpers/text_helper/009.php b/user_guide_src/source/helpers/text_helper/009.php
deleted file mode 100644
index 073efcee9319..000000000000
--- a/user_guide_src/source/helpers/text_helper/009.php
+++ /dev/null
@@ -1,4 +0,0 @@
-', '');
diff --git a/user_guide_src/source/helpers/text_helper/020.php b/user_guide_src/source/helpers/text_helper/020.php
deleted file mode 100644
index 8b2606aea1bf..000000000000
--- a/user_guide_src/source/helpers/text_helper/020.php
+++ /dev/null
@@ -1,13 +0,0 @@
-`_ method, which accepts either a window name
- or a window target.
-
- .. note:: Any attribute other than those listed above will be parsed as an HTML attribute to the anchor tag.
-
- .. note:: Attributes passed into the anchor_popup function are automatically escaped to protect against XSS attacks.
-
-.. php:function:: mailto($email[, $title = ''[, $attributes = '']])
-
- :param string $email: E-mail address
- :param string $title: Anchor title
- :param array|object|string $attributes: HTML attributes
- :returns: A "mail to" hyperlink
- :rtype: string
-
- Creates a standard HTML e-mail link. Usage example:
-
- .. literalinclude:: url_helper/011.php
-
- As with the :php:func:`anchor()` function above, you can set attributes using the third parameter:
-
- .. literalinclude:: url_helper/012.php
-
- .. note:: Attributes passed into the mailto function are automatically escaped to protect against XSS attacks.
-
-.. php:function:: safe_mailto($email[, $title = ''[, $attributes = '']])
-
- :param string $email: E-mail address
- :param string $title: Anchor title
- :param array|object|string $attributes: HTML attributes
- :returns: A spam-safe "mail to" hyperlink
- :rtype: string
-
- Identical to the :php:func:`mailto()` function except it writes an obfuscated version of the *mailto* tag using
- ordinal numbers written with JavaScript to help prevent the e-mail address from being harvested by spam bots.
-
-.. php:function:: auto_link($str[, $type = 'both'[, $popup = false]])
-
- :param string $str: Input string
- :param string $type: Link type (``'email'``, ``'url'`` or ``'both'``)
- :param bool $popup: Whether to create popup links
- :returns: Linkified string
- :rtype: string
-
- Automatically turns URLs and e-mail addresses contained in a string into links. Example:
-
- .. literalinclude:: url_helper/013.php
-
- The second parameter determines whether URLs and e-mails are converted or just one or the other. The default
- behavior is both if the parameter is not specified. E-mail links are encoded as :php:func:`safe_mailto()` as shown
- above.
-
- Converts only URLs:
-
- .. literalinclude:: url_helper/014.php
-
- Converts only e-mail addresses:
-
- .. literalinclude:: url_helper/015.php
-
- The third parameter determines whether links are shown in a new window. The value can be true or false (boolean):
-
- .. literalinclude:: url_helper/016.php
-
- .. note:: The only URLs recognized are those that start with ``www.`` or with ``://``.
-
-.. php:function:: url_title($str[, $separator = '-'[, $lowercase = false]])
-
- :param string $str: Input string
- :param string $separator: Word separator (usually ``'-'`` or ``'_'``)
- :param bool $lowercase: Whether to transform the output string to lowercase
- :returns: URL-formatted string
- :rtype: string
-
- Takes a string as input and creates a human-friendly URL string. This is useful if, for example, you have a blog in
- which you'd like to use the title of your entries in the URL. Example:
-
- .. literalinclude:: url_helper/017.php
-
- The second parameter determines the word delimiter. By default, dashes are used. Preferred options are: ``-`` (dash)
- or ``_`` (underscore).
-
- Example:
-
- .. literalinclude:: url_helper/018.php
-
- The third parameter determines whether or not lowercase characters are forced. By default, they are not. Options are
- boolean true/false.
-
- Example:
-
- .. literalinclude:: url_helper/019.php
-
-.. php:function:: mb_url_title($str[, $separator = '-'[, $lowercase = false]])
-
- :param string $str: Input string
- :param string $separator: Word separator (usually ``'-'`` or ``'_'``)
- :param bool $lowercase: Whether to transform the output string to lowercase
- :returns: URL-formatted string
- :rtype: string
-
- This function works the same as :php:func:`url_title()` but it converts all accented characters automatically.
-
-.. php:function:: parse_subdomain([$host = null])
-
- :param string|null $host: The hostname to parse. If null, uses the current request's host.
- :returns: The subdomain, or an empty string if none exists.
- :rtype: string
-
- Parses the subdomain from the given host name.
-
- Here are some examples:
-
- .. literalinclude:: url_helper/027.php
-
- You can customize the list of known two-part TLDs by adding them to the ``Config\Hostnames::TWO_PART_TLDS`` array.
-
-.. php:function:: prep_url([$str = ''[, $secure = false]])
-
- :param string $str: URL string
- :param boolean $secure: true for ``https://``
- :returns: Protocol-prefixed URL string
- :rtype: string
-
- This function will add ``http://`` or ``https://`` in the event that a protocol prefix is missing from a URL.
-
- Pass the URL string to the function like this:
-
- .. literalinclude:: url_helper/020.php
-
-.. php:function:: url_to($controller[, ...$args])
-
- :param string $controller: Route name or ``Controller::method``
- :param int|string ...$args: One or more parameters to be passed to the route. The last parameter allows you to set the locale.
- :returns: Absolute URL
- :rtype: string
-
- .. note:: This function requires the controller/method to have a route defined in **app/Config/Routes.php**.
-
- Builds an absolute URL to a controller method in your app. Example:
-
- .. literalinclude:: url_helper/021.php
-
- You can also add arguments to the route. Here is an example:
-
- .. literalinclude:: url_helper/022.php
-
- This is useful because you can still change your routes after putting links into your views.
-
- Since v4.3.0, when you use ``{locale}`` in your route, you can optionally specify the locale value as the last
- parameter.
-
- .. literalinclude:: url_helper/025.php
-
- For full details, see :ref:`reverse-routing` and :ref:`using-named-routes`.
-
-.. php:function:: url_is($path)
-
- :param string $path: The URL path relative to baseURL to check the current URI path against.
- :rtype: boolean
-
- Compares the current URL's path against the given path to see if they match. Example:
-
- .. literalinclude:: url_helper/023.php
-
- This would match **http://example.com/admin**. It would match **http://example.com/subdir/admin** if your baseURL is
- ``http://example.com/subdir/``.
-
- You can use the ``*`` wildcard to match any other applicable characters in the URL:
-
- .. literalinclude:: url_helper/024.php
-
- This would match any of the following:
-
- - /admin
- - /admin/
- - /admin/users
- - /admin/users/schools/classmates/...
diff --git a/user_guide_src/source/helpers/url_helper/001.php b/user_guide_src/source/helpers/url_helper/001.php
deleted file mode 100644
index cf11aa2d2541..000000000000
--- a/user_guide_src/source/helpers/url_helper/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
-My News
-
-echo anchor('news/local/123', 'My News', ['title' => 'The best news!']);
-// Prints: My News
-
-echo anchor('', 'Click here');
-// Prints: Click here
diff --git a/user_guide_src/source/helpers/url_helper/009.php b/user_guide_src/source/helpers/url_helper/009.php
deleted file mode 100644
index d8a04af25055..000000000000
--- a/user_guide_src/source/helpers/url_helper/009.php
+++ /dev/null
@@ -1,14 +0,0 @@
- 800,
- 'height' => 600,
- 'scrollbars' => 'yes',
- 'status' => 'yes',
- 'resizable' => 'yes',
- 'screenx' => 0,
- 'screeny' => 0,
- 'window_name' => '_blank',
-];
-
-echo anchor_popup('news/local/123', 'Click Me!', $atts);
diff --git a/user_guide_src/source/helpers/url_helper/010.php b/user_guide_src/source/helpers/url_helper/010.php
deleted file mode 100644
index cb1e202af757..000000000000
--- a/user_guide_src/source/helpers/url_helper/010.php
+++ /dev/null
@@ -1,3 +0,0 @@
- 'Mail me'];
-echo mailto('me@my-site.com', 'Contact Me', $attributes);
diff --git a/user_guide_src/source/helpers/url_helper/013.php b/user_guide_src/source/helpers/url_helper/013.php
deleted file mode 100644
index 65bf083b99cf..000000000000
--- a/user_guide_src/source/helpers/url_helper/013.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('/', 'Home::index');
-
-?>
-
-Home
-
-
diff --git a/user_guide_src/source/helpers/url_helper/022.php b/user_guide_src/source/helpers/url_helper/022.php
deleted file mode 100644
index 53bef5e55232..000000000000
--- a/user_guide_src/source/helpers/url_helper/022.php
+++ /dev/null
@@ -1,9 +0,0 @@
-get('pages/(:segment)', 'Page::index/$1');
-
-?>
-
-Home
-
diff --git a/user_guide_src/source/helpers/url_helper/023.php b/user_guide_src/source/helpers/url_helper/023.php
deleted file mode 100644
index 5f12524f3029..000000000000
--- a/user_guide_src/source/helpers/url_helper/023.php
+++ /dev/null
@@ -1,5 +0,0 @@
-add(
- '{locale}/users/(:num)/gallery/(:num)',
- 'Galleries::showUserGallery/$1/$2',
- ['as' => 'user_gallery'],
-);
-
-?>
-
-View Gallery
-
diff --git a/user_guide_src/source/helpers/url_helper/026.php b/user_guide_src/source/helpers/url_helper/026.php
deleted file mode 100644
index d746e9812c1e..000000000000
--- a/user_guide_src/source/helpers/url_helper/026.php
+++ /dev/null
@@ -1,4 +0,0 @@
-
- - Single and double quotes: ' "
- - Dashes: -
-
- This function ignores ampersands if they are part of existing numbered character entities, e.g., {. Example:
-
- .. literalinclude:: xml_helper/002.php
-
- Outputs:
-
- .. code-block:: html
-
- <p>Here is a paragraph & an entity ({).</p>
diff --git a/user_guide_src/source/helpers/xml_helper/001.php b/user_guide_src/source/helpers/xml_helper/001.php
deleted file mode 100644
index f92f3a7da3c2..000000000000
--- a/user_guide_src/source/helpers/xml_helper/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
-Here is a paragraph & an entity ({).';
-$string = xml_convert($string);
-echo $string;
diff --git a/user_guide_src/source/images/debugbar.png b/user_guide_src/source/images/debugbar.png
deleted file mode 100644
index 1661e893aa3d..000000000000
Binary files a/user_guide_src/source/images/debugbar.png and /dev/null differ
diff --git a/user_guide_src/source/images/error.png b/user_guide_src/source/images/error.png
deleted file mode 100644
index 14fac852d48f..000000000000
Binary files a/user_guide_src/source/images/error.png and /dev/null differ
diff --git a/user_guide_src/source/images/tutorial1.png b/user_guide_src/source/images/tutorial1.png
deleted file mode 100644
index 9ec9abf9a6fa..000000000000
Binary files a/user_guide_src/source/images/tutorial1.png and /dev/null differ
diff --git a/user_guide_src/source/images/tutorial2.png b/user_guide_src/source/images/tutorial2.png
deleted file mode 100644
index a65e0e0885b3..000000000000
Binary files a/user_guide_src/source/images/tutorial2.png and /dev/null differ
diff --git a/user_guide_src/source/images/tutorial3.png b/user_guide_src/source/images/tutorial3.png
deleted file mode 100644
index 16f557595d04..000000000000
Binary files a/user_guide_src/source/images/tutorial3.png and /dev/null differ
diff --git a/user_guide_src/source/images/tutorial4.png b/user_guide_src/source/images/tutorial4.png
deleted file mode 100644
index 33c33ae2615c..000000000000
Binary files a/user_guide_src/source/images/tutorial4.png and /dev/null differ
diff --git a/user_guide_src/source/images/welcome.png b/user_guide_src/source/images/welcome.png
deleted file mode 100644
index d3a2b3c38377..000000000000
Binary files a/user_guide_src/source/images/welcome.png and /dev/null differ
diff --git a/user_guide_src/source/incoming/auto_routing_improved.rst b/user_guide_src/source/incoming/auto_routing_improved.rst
deleted file mode 100644
index 207bd1564348..000000000000
--- a/user_guide_src/source/incoming/auto_routing_improved.rst
+++ /dev/null
@@ -1,455 +0,0 @@
-.. _auto-routing-improved:
-
-#######################
-Auto Routing (Improved)
-#######################
-
-.. versionadded:: 4.2.0
-
-.. contents::
- :local:
- :depth: 3
-
-********************************
-What is Auto Routing (Improved)?
-********************************
-
-By default, all routes must be :ref:`defined ` in the configuration file.
-
-However, with **Auto Routing (Improved)**, you can define the controller name and its method name according to the
-convention and it will be automatically routed. In other words, there is no need to define routes manually.
-
-If you enable Auto Routing (Improved), when no defined route is found that matches the URI, the system will attempt to
-match that URI against the controllers and methods.
-
-.. important:: For security reasons, if a controller is used in the defined routes, Auto Routing (Improved) does not
- route to the controller.
-
-.. note:: Auto Routing (Improved) is disabled by default. To use it, see :ref:`enabled-auto-routing-improved`.
-
-**************************************
-Differences from Auto Routing (Legacy)
-**************************************
-
-:ref:`auto-routing-legacy` is a routing system from CodeIgniter 3. If you are not familiar with it, go to the next
-section.
-
-If you know it well, these are some changes in **Auto Routing (Improved)**:
-
-- A controller method needs an HTTP verb prefix like ``getIndex()``, ``postCreate()``.
-
- - Since developers always know the HTTP method, a request with an unexpected HTTP method will never execute the
- controller.
-
-- The Default Controller (``Home`` by default) and the Default Method (``index`` by default) must be omitted in the URI.
-
- - It restricts one-to-one correspondence between controller methods and URIs.
- - For example, by default, you can access ``/``, but ``/home`` and ``/home/index`` will be 404 Not Found.
-
-- It checks the method parameter count.
-
- - If there are more parameters in the URI than the method parameters, it results in 404 Not Found.
-
-- It does not support the ``_remap()`` method.
-
- - It restricts one-to-one correspondence between controller methods and URIs.
- - But it has the :ref:`auto-routing-improved-default-method-fallback` feature instead.
-
-- It cannot access controllers in Defined Routes.
-
- - It completely separates controllers accessible via **Auto Routing** from those accessible via **Defined Routes**.
-
-.. _enabled-auto-routing-improved:
-
-******************************
-Enable Auto Routing (Improved)
-******************************
-
-To use it, you need to set the ``$autoRoute`` option to ``true`` in **app/Config/Routing.php**::
-
- public bool $autoRoute = true;
-
-And you need to change the property ``$autoRoutesImproved`` to ``true`` in **app/Config/Feature.php**::
-
- public bool $autoRoutesImproved = true;
-
-.. important:: When you use Auto Routing (Improved), you must remove the line ``$routes->get('/', 'Home::index');`` in
- **app/Config/Routes.php**, because defined routes take precedence over Auto Routing, and controllers defined in the
- defined routes are denied access by Auto Routing (Improved) for security reasons.
-
-************
-URI Segments
-************
-
-The segments in the URL, following the Model-View-Controller approach, usually represent::
-
- http://example.com/{class}/{method}/{param1}
-
-1. The first segment represents the controller **class** that should be invoked.
-2. The second segment represents the class **method** that should be called.
-3. The third, and any additional segments, represent any **parameters** that will be passed to the controller method.
-
-Consider this URI::
-
- http://example.com/hello-world/hello/1
-
-In the above example, when you send an HTTP request with the **GET** method, Auto Routing (Improved) would attempt to
-find a controller named ``App\Controllers\HelloWorld`` and execute the ``getHello()`` method, passing ``'1'`` as the
-first parameter.
-
-.. note:: A controller method that will be executed by Auto Routing (Improved) needs an HTTP verb (``get``, ``post``,
- ``put``, etc.) prefix like ``getIndex()``, ``postCreate()``.
-
-.. note:: When a controller's short name matches the first segment of a URI, it will be loaded.
-
-**************************
-Let's try it: Hello World!
-**************************
-
-Let's create a simple controller so you can see it in action.
-
-Create a Controller
-===================
-
-Using your text editor, create a file called **HelloWorld.php** in your **app/Controllers** directory, and put the
-following code in it.
-
-.. literalinclude:: auto_routing_improved/020.php
-
-.. important:: The file must be called **HelloWorld.php**. When you use Auto Routing (Improved), controller class names
- MUST be CamelCase.
-
-You will notice that the ``HelloWorld`` Controller is extending the ``BaseController``. You can also extend the
-``CodeIgniter\Controller`` if you do not need the functionality of the BaseController.
-
-The BaseController provides a convenient place for loading components and performing functions that are needed by all
-your controllers. You can extend this class in any new controller.
-
-.. important:: A controller method that will be executed by Auto Routing (Improved) needs an HTTP verb (``get``,
- ``post``, ``put``, etc.) prefix like ``getIndex()``, ``postCreate()``.
-
-Check the Routes
-================
-
-You can check your routes with the ``spark routes`` command.
-
-.. code-block:: console
-
- php spark routes
-
-If you did it right, you should see:
-
-.. code-block:: none
-
- +-----------+-------------+------+---------------------------------------+----------------+---------------+
- | Method | Route | Name | Handler | Before Filters | After Filters |
- +-----------+-------------+------+---------------------------------------+----------------+---------------+
- | GET(auto) | hello-world | | \App\Controllers\HelloWorld::getIndex | | |
- +-----------+-------------+------+---------------------------------------+----------------+---------------+
-
-See :ref:`routing-spark-routes` for the output details.
-
-Visit Your Site
-===============
-
-Now visit your site using a URL similar to this::
-
- http://example.com/hello-world
-
-The system automatically translates a URI with dashes (``-``) to CamelCase in the controller and method URI segments.
-
-For example, the URI ``sub-dir/hello-controller/some-method`` will execute the
-``SubDir\HelloController::getSomeMethod()`` method.
-
-If you did it right, you should see::
-
- Hello World!
-
-****************************
-Examples of Controller Names
-****************************
-
-The following is a valid controller name, because ``App\Controllers\HelloWorld`` is CamelCase.
-
-.. literalinclude:: auto_routing_improved/009.php
-
-The following is **not** valid, because the first letter (``h``) is not capitalized.
-
-.. literalinclude:: auto_routing_improved/010.php
-
-The following is also **not** valid, because the first letter (``h``) is not capitalized.
-
-.. literalinclude:: auto_routing_improved/011.php
-
-******************
-Controller Methods
-******************
-
-Method Visibility
-=================
-
-When you define a method that is executable via HTTP request, the method must be declared as ``public``.
-
-.. warning:: For security reasons, be sure to declare any new utility methods as ``protected`` or ``private``.
-
-Default Method
-==============
-
-In the above example, the method name is ``getIndex()``. The method (HTTP verb + ``Index()``) is called the
-**Default Method**, and is loaded if the **second segment** of the URI is empty.
-
-Normal Methods
-==============
-
-The second segment of the URI determines which method in the controller gets called.
-
-Let's try it. Add a new method to your controller:
-
-.. literalinclude:: auto_routing_improved/021.php
-
-Now load the following URL to see the ``getComment()`` method::
-
- http://example.com/hello-world/comment/
-
-You should see your new message.
-
-************************************
-Passing URI Segments to Your Methods
-************************************
-
-If your URI contains more than two segments, they will be passed to your method as parameters.
-
-For example, let's say you have a URI like this::
-
- http://example.com/products/shoes/sandals/123
-
-Your method will be passed URI segments 3 and 4 (``'sandals'`` and ``'123'``):
-
-.. literalinclude:: auto_routing_improved/022.php
-
-.. note:: If there are more parameters in the URI than the method parameters, Auto Routing (Improved) does not execute
- the method, and it results in 404 Not Found.
-
-******************
-Default Controller
-******************
-
-The **Default Controller** is a special controller that is used when a URI ends with a directory name or when a URI is
-not present, as will be the case when only your site root URL is requested.
-
-By default, the Default Controller is ``Home``.
-
-.. note:: Define only the default method (``getIndex()`` for GET requests) in the default controller. If you define any
- other public method, that method will not be executed.
-
-For more information, please refer to the :ref:`routing-auto-routing-improved-configuration-options`.
-
-.. _auto-routing-improved-default-method-fallback:
-
-***********************
-Default Method Fallback
-***********************
-
-.. versionadded:: 4.4.0
-
-If the controller method corresponding to the URI segment of the method name does not exist, and if the default method
-is defined, the remaining URI segments are passed to the default method for execution.
-
-.. literalinclude:: controllers/024.php
-
-Load the following URL::
-
- http://example.com/product/15/edit
-
-The method will be passed URI segments 2 and 3 (``'15'`` and ``'edit'``).
-
-.. important:: If there are more parameters in the URI than the method parameters, Auto Routing (Improved) does not
- execute the method, and it results in 404 Not Found.
-
-Fallback to Default Controller
-==============================
-
-If the controller corresponding to the URI segment of the controller name does not exist, and if the default controller
-(``Home`` by default) exists in the directory, the remaining URI segments are passed to the default controller's default
-method.
-
-For example, when you have the following default controller ``Home`` in the **app/Controllers/News** directory:
-
-.. literalinclude:: controllers/025.php
-
-Load the following URL::
-
- http://example.com/news/101
-
-The ``News\Home`` controller and the default ``getIndex()`` method will be found. So the default method will get the
-second URI segment (``'101'``).
-
-.. note:: If there is an ``App\Controllers\News`` controller, it takes precedence. The URI segments are searched
- sequentially and the first controller found is used.
-
-.. note:: If there are more parameters in the URI than the method parameters, Auto Routing (Improved) does not execute
- the method, and it results in 404 Not Found.
-
-************************************************
-Organizing Your Controllers into Sub-directories
-************************************************
-
-If you are building a large application, you might want to hierarchically organize or structure your controllers into
-sub-directories. CodeIgniter permits you to do this.
-
-Simply create sub-directories under the main **app/Controllers**, and place your controller classes within them.
-
-.. important:: Directory names MUST start with an uppercase letter and be CamelCase.
-
-When using this feature, the first segment of your URI must specify the directory. For example, let's say you have a
-controller located here::
-
- app/Controllers/Products/Shoes.php
-
-To call the above controller, your URI will look something like this::
-
- http://example.com/products/shoes/show/123
-
-.. note:: You cannot have directories with the same name in **app/Controllers** and **public**. This is because if there
- is a directory, the web server will search for it and it will not be routed to CodeIgniter.
-
-Each of your sub-directories may contain a default controller which will be called if the URL contains *only* the
-sub-directory. Simply put a controller in there that matches the name of your default controller as specified in your
-**app/Config/Routing.php** file.
-
-***************************************
-Examples of Controller/Methods and URIs
-***************************************
-
-In the case of a **GET** request with the default configuration, the mapping between controller/methods and URIs is as
-follows:
-
-============================ ============================ =============================================
-Controller/Method URI Description
-============================ ============================ =============================================
-``Home::getIndex()`` / The default controller and default method.
-``Blog::getIndex()`` /blog The default method.
-``UserProfile::getIndex()`` /user-profile The default method.
-``Blog::getTags()`` /blog/tags
-``Blog::getNews($id)`` /blog/news/123
-``Blog\Home::getIndex()`` /blog Sub-directory ``Blog`` and the default
- controller and the default method.
- A ``Blog`` controller takes precedence.
-``Blog\Tags::getIndex()`` /blog/tags Sub-directory ``Blog`` and the default
- method. If a ``Blog`` controller exists, it
- takes precedence.
-``Blog\News::getIndex($id)`` /blog/news/123 Sub-directory ``Blog`` and the default method
- fallback. If a ``Blog`` controller exists, it
- takes precedence.
-============================ ============================ =============================================
-
-****************
-Applying Filters
-****************
-
-Applying controller filters allows you to add processing before and after the controller method execution. This is
-especially handy during authentication or API logging.
-
-If you use Auto Routing, set the filters to be applied in **app/Config/Filters.php**. See
-:doc:`Controller Filters ` for more information on setting up filters.
-
-.. _routing-auto-routing-improved-configuration-options:
-
-*********************
-Configuration Options
-*********************
-
-These options are available in the **app/Config/Routing.php** file.
-
-Default Controller
-==================
-
-For Site Root URI
------------------
-
-When a user visits the root of your site (i.e., **http://example.com**), the controller to use is determined by the
-value set to the ``$defaultController`` property, unless a route exists for it explicitly.
-
-The default value for this is ``Home``, which matches the controller at **app/Controllers/Home.php**::
-
- public string $defaultController = 'Home';
-
-For Directory URI
------------------
-
-The default controller is also used when no matching route has been found, and the URI would point to a directory in the
-controllers directory. For example, if the user visits **http://example.com/admin**, and a controller was found at
-**app/Controllers/Admin/Home.php**, it would be used.
-
-.. important:: You cannot access the default controller with the URI of the controller name. When the default controller
- is ``Home``, you can access **http://example.com/**, but if you access **http://example.com/home**, it will not be
- found.
-
-.. _routing-auto-routing-improved-default-method:
-
-Default Method
-==============
-
-This works similarly to the default controller setting, but is used to determine the default method that is used when a
-controller is found that matches the URI, but no segment exists for the method. The default value is ``index``.
-
-In this example, if the user were to visit **example.com/products**, and a ``Products`` controller existed, the
-``Products::getListAll()`` method would be executed::
-
- public string $defaultMethod = 'listAll';
-
-.. important:: You cannot access the controller with the URI of the default method name. In the example above, you can
- access **example.com/products**, but if you access **example.com/products/listall**, it will not be found.
-
-.. _translate-uri-to-camelcase:
-
-Translate URI To CamelCase
-==========================
-
-.. versionadded:: 4.5.0
-
-.. note:: Since v4.6.0, the ``$translateUriToCamelCase`` option is enabled by default.
-
-Since v4.5.0, the ``$translateUriToCamelCase`` option has been implemented, which works well with CodeIgniter's current
-coding standards.
-
-This option enables you to automatically translate a URI with dashes (``-``) to CamelCase in the controller and method
-URI segments.
-
-For example, the URI ``sub-dir/hello-controller/some-method`` will execute the
-``SubDir\HelloController::getSomeMethod()`` method.
-
-.. note:: When this option is enabled, the ``$translateURIDashes`` option is ignored.
-
-Disable Translate URI To CamelCase
-----------------------------------
-
-.. note:: The option to disable "Translate URI To CamelCase" exists only for backward compatibility. We don't recommend
- disabling it.
-
-To disable it, you need to set the ``$translateUriToCamelCase`` option to ``false`` in **app/Config/Routing.php**::
-
- public bool $translateUriToCamelCase = false;
-
-.. _auto-routing-improved-module-routing:
-
-**************
-Module Routing
-**************
-
-.. versionadded:: 4.4.0
-
-You can use auto routing even if you use :doc:`../general/modules` and place the controllers in a different namespace.
-
-To route to a module, the ``$moduleRoutes`` property in **app/Config/Routing.php** must be set::
-
- public array $moduleRoutes = [
- 'blog' => 'Acme\Blog\Controllers',
- ];
-
-The key is the first URI segment for the module, and the value is the controller namespace. In the above configuration,
-**http://localhost:8080/blog/foo/bar** will be routed to ``Acme\Blog\Controllers\Foo::getBar()``.
-
-.. note:: If you define ``$moduleRoutes``, the routing for the module takes precedence. In the above example, even if
- you have the ``App\Controllers\Blog`` controller, **http://localhost:8080/blog** will be routed to the default
- controller ``Acme\Blog\Controllers\Home``.
diff --git a/user_guide_src/source/incoming/auto_routing_improved/009.php b/user_guide_src/source/incoming/auto_routing_improved/009.php
deleted file mode 100644
index 7615eecaeba0..000000000000
--- a/user_guide_src/source/incoming/auto_routing_improved/009.php
+++ /dev/null
@@ -1,8 +0,0 @@
-`_.
-
-Character Set
-=============
-
-The desired character set is passed through the ``Accept-Charset`` header::
-
- GET /foo HTTP/1.1
- Accept-Charset: utf-16, utf-8
-
-By default, if no matches are found, **utf-8** will be returned:
-
-.. literalinclude:: content_negotiation/007.php
diff --git a/user_guide_src/source/incoming/content_negotiation/001.php b/user_guide_src/source/incoming/content_negotiation/001.php
deleted file mode 100644
index fbd07a975ee3..000000000000
--- a/user_guide_src/source/incoming/content_negotiation/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
-negotiate('media', ['foo', 'bar']);
diff --git a/user_guide_src/source/incoming/content_negotiation/003.php b/user_guide_src/source/incoming/content_negotiation/003.php
deleted file mode 100644
index 262a4d74f3be..000000000000
--- a/user_guide_src/source/incoming/content_negotiation/003.php
+++ /dev/null
@@ -1,11 +0,0 @@
-negotiate('media', $supported);
-// or
-$format = $negotiate->media($supported);
diff --git a/user_guide_src/source/incoming/content_negotiation/004.php b/user_guide_src/source/incoming/content_negotiation/004.php
deleted file mode 100644
index c02b2219fb2b..000000000000
--- a/user_guide_src/source/incoming/content_negotiation/004.php
+++ /dev/null
@@ -1,5 +0,0 @@
-negotiate('media', $supported, true);
-// or
-$format = $negotiate->media($supported, true);
diff --git a/user_guide_src/source/incoming/content_negotiation/005.php b/user_guide_src/source/incoming/content_negotiation/005.php
deleted file mode 100644
index a5413d43f94d..000000000000
--- a/user_guide_src/source/incoming/content_negotiation/005.php
+++ /dev/null
@@ -1,10 +0,0 @@
-negotiate('language', $supported);
-// or
-$lang = $negotiate->language($supported);
diff --git a/user_guide_src/source/incoming/content_negotiation/006.php b/user_guide_src/source/incoming/content_negotiation/006.php
deleted file mode 100644
index 3cd6d0378617..000000000000
--- a/user_guide_src/source/incoming/content_negotiation/006.php
+++ /dev/null
@@ -1,5 +0,0 @@
-negotiate('encoding', ['gzip']);
-// or
-$type = $negotiate->encoding(['gzip']);
diff --git a/user_guide_src/source/incoming/content_negotiation/007.php b/user_guide_src/source/incoming/content_negotiation/007.php
deleted file mode 100644
index eeaf3a26c876..000000000000
--- a/user_guide_src/source/incoming/content_negotiation/007.php
+++ /dev/null
@@ -1,5 +0,0 @@
-negotiate('charset', ['utf-8']);
-// or
-$charset = $negotiate->charset(['utf-8']);
diff --git a/user_guide_src/source/incoming/content_negotiation/008.php b/user_guide_src/source/incoming/content_negotiation/008.php
deleted file mode 100644
index 2b4a67f1a6d0..000000000000
--- a/user_guide_src/source/incoming/content_negotiation/008.php
+++ /dev/null
@@ -1,10 +0,0 @@
-negotiate('language', $supported);
-// or
-$lang = $negotiate->language($supported);
diff --git a/user_guide_src/source/incoming/controller_attributes.rst b/user_guide_src/source/incoming/controller_attributes.rst
deleted file mode 100644
index 098c2a41993f..000000000000
--- a/user_guide_src/source/incoming/controller_attributes.rst
+++ /dev/null
@@ -1,88 +0,0 @@
-.. _incoming/controller_attributes:
-
-#####################
-Controller Attributes
-#####################
-
-PHP Attributes can be used to define filters and other metadata on controller classes and methods. This keeps the
-configuration close to the code it affects, and can make it easier to see at a glance what filters are applied to a
-given controller or method. This works across all routing methods, including auto-routing, which allows for near feature
-parity between the more robust route declarations and auto-routing.
-
-.. contents::
- :local:
- :depth: 2
-
-Getting Started
-***************
-
-Controller Attributes can be applied to either the entire class or a specific method. The following example shows how to
-apply the ``Filter`` attribute to a controller class:
-
-.. literalinclude:: controller_attributes/001.php
-
-In this example, the ``Auth`` filter will be applied to all methods in ``AdminController``.
-
-You can also apply the ``Filter`` attribute to a specific method within a controller. This allows you to apply filters
-only to certain methods, while leaving others unaffected. Here's an example:
-
-.. literalinclude:: controller_attributes/002.php
-
-Class-level and method-level attributes can work together to provide a flexible way to manage your routes at the
-controller level.
-
-Disabling Attributes
---------------------
-
-If you know that you will not be using attributes in your application, you can disable the feature by setting the
-``$useControllerAttributes`` property in your ``app/Config/Routing.php`` file to ``false``.
-
-Provided Attributes
-*******************
-
-Filter
-------
-
-The repeatable ``Filter`` attribute applies a filter to a controller class or method. You can also provide arguments to
-the filter. Repeat the attribute to apply multiple filters:
-
-.. literalinclude:: controller_attributes/003.php
-
-.. note::
-
- When filters are applied both by an attribute and in the filter configuration file, they will both be applied, but
- that could lead to unexpected results.
-
-.. note::
-
- Please remember that every parameter applied to the filter will be converted to a string. This behavior affects only
- filters.
-
-Restrict
---------
-
-The ``Restrict`` attribute allows you to restrict access to the class or method based on the domain, the sub-domain, or
-the environment the application is running in. Here's an example of how to use the ``Restrict`` attribute:
-
-.. literalinclude:: controller_attributes/004.php
-
-Cache
------
-
-The ``Cache`` attribute allows the output of the controller method to be cached for a specified amount of time. You can
-specify a duration in seconds, and optionally a cache key. Here's an example of how to use the ``Cache`` attribute:
-
-.. literalinclude:: controller_attributes/005.php
-
-Custom Attributes
-*****************
-
-You can also create your own custom attributes to add metadata or behavior to your controllers and methods. Custom
-attributes must implement the ``CodeIgniter\Router\Attributes\RouteAttributeInterface`` interface. Here's an example of
-a custom attribute that adds a custom header to the response:
-
-.. literalinclude:: controller_attributes/006.php
-
-You can then apply this custom attribute to a controller class or method just like the built-in attributes:
-
-.. literalinclude:: controller_attributes/007.php
diff --git a/user_guide_src/source/incoming/controller_attributes/001.php b/user_guide_src/source/incoming/controller_attributes/001.php
deleted file mode 100644
index 6b1bb4957d0d..000000000000
--- a/user_guide_src/source/incoming/controller_attributes/001.php
+++ /dev/null
@@ -1,14 +0,0 @@
-setHeader($this->name, $this->value);
-
- return $response;
- }
-}
diff --git a/user_guide_src/source/incoming/controller_attributes/007.php b/user_guide_src/source/incoming/controller_attributes/007.php
deleted file mode 100644
index 07386c1c16d0..000000000000
--- a/user_guide_src/source/incoming/controller_attributes/007.php
+++ /dev/null
@@ -1,52 +0,0 @@
-response->setJSON([
- 'name' => 'John Doe',
- 'email' => 'john@example.com',
- ]);
- }
-
- /**
- * Add multiple custom headers using the IS_REPEATABLE attribute option.
- * Each AddHeader attribute will be executed in order.
- */
- #[AddHeader('X-API-Version', '2.0')]
- #[AddHeader('X-Rate-Limit', '100')]
- #[AddHeader('X-Content-Source', 'cache')]
- public function statistics()
- {
- return $this->response->setJSON([
- 'users' => 1500,
- 'posts' => 3200,
- ]);
- }
-
- /**
- * Combine custom attributes with built-in attributes.
- * The Cache attribute will cache the response,
- * and AddHeader will add the custom header.
- */
- #[AddHeader('X-Powered-By', 'My Custom API')]
- #[Cache(for: 3600)]
- public function dashboard()
- {
- return $this->response->setJSON([
- 'status' => 'operational',
- 'uptime' => '99.9%',
- ]);
- }
-}
diff --git a/user_guide_src/source/incoming/controllers.rst b/user_guide_src/source/incoming/controllers.rst
deleted file mode 100644
index 60f7995fdd1d..000000000000
--- a/user_guide_src/source/incoming/controllers.rst
+++ /dev/null
@@ -1,384 +0,0 @@
-###########
-Controllers
-###########
-
-Controllers are the heart of your application, as they determine how HTTP requests should be handled.
-
-.. contents::
- :local:
- :depth: 2
-
-What is a Controller?
-*********************
-
-A Controller is simply a class file that handles an HTTP request. :doc:`URI Routing ` associates a URI with a
-controller. It returns a view string or ``Response`` object.
-
-Every controller you create should extend the ``BaseController`` class. This class provides several features that are
-available to all of your controllers.
-
-.. _controller-constructor:
-
-Constructor
-***********
-
-CodeIgniter's Controller has a special constructor ``initController()``. It will be called by the framework after PHP's
-constructor ``__construct()`` execution.
-
-If you want to override ``initController()``, don't forget to add
-``parent::initController($request, $response, $logger);`` in the method:
-
-.. literalinclude:: controllers/023.php
-
-.. important:: You cannot use ``return`` in the constructor. So ``return redirect()->to('route');`` does not work.
-
-The ``initController()`` method sets the following three properties.
-
-Included Properties
-*******************
-
-CodeIgniter's Controller provides these properties.
-
-Request Object
-==============
-
-The application's main :doc:`Request Instance ` is always available as a class property,
-``$this->request``.
-
-Response Object
-===============
-
-The application's main :doc:`Response Instance ` is always available as a class property,
-``$this->response``.
-
-Logger Object
-=============
-
-An instance of the :doc:`Logger <../general/logging>` class is available as a class property, ``$this->logger``.
-
-.. _controllers-helpers:
-
-Helpers
-=======
-
-You can define an array of helper files as a class property. Whenever the controller is loaded, these helper files will
-be automatically loaded into memory so that you can use their functions anywhere inside the controller:
-
-.. literalinclude:: controllers/001.php
-
-forceHTTPS
-**********
-
-A convenience method for forcing a method to be accessed via HTTPS is available within all controllers:
-
-.. literalinclude:: controllers/002.php
-
-By default, and in modern browsers that support the HTTP Strict Transport Security header, this call should force the
-browser to convert non-HTTPS calls to HTTPS calls for one year. You can modify this by passing the duration (in seconds)
-as the first parameter:
-
-.. literalinclude:: controllers/003.php
-
-.. note:: A number of :doc:`time-based constants ` are always available for you to use,
- including ``YEAR``, ``MONTH``, and more.
-
-.. _controllers-validating-data:
-
-Validating Data
-***************
-
-.. _controller-validatedata:
-
-$this->validateData()
-=====================
-
-.. versionadded:: 4.2.0
-
-To simplify data checking, the controller also provides the convenience method ``validateData()``.
-
-The method accepts (1) an array of data to validate, (2) an array of rules,
-(3) an optional array of custom error messages to display if the items are not valid,
-and (4) an optional database group to use.
-
-The :doc:`Validation Library docs ` have details on rule and message array formats, as well as
-available rules:
-
-.. literalinclude:: controllers/006.php
-
-.. _controller-validate:
-
-$this->validate()
-=================
-
-.. important:: This method exists only for backward compatibility. Do not use it in new projects. Even if you are
- already using it, we recommend that you use the ``validateData()`` method instead.
-
-The controller also provides the convenience method ``validate()``.
-
-.. warning:: Instead of ``validate()``, use ``validateData()`` to validate POST data only. ``validate()`` uses
- ``$request->getVar()`` which returns ``$_GET``, ``$_POST`` or ``$_COOKIE`` data in that order (depending on
- **php.ini** `request-order `_). Newer values override
- older values. POST values may be overridden by the cookies if they have the same name.
-
-The method accepts an array of rules in the first parameter, and in the optional second parameter, an array of custom
-error messages to display if the items are not valid.
-
-Internally, this uses the controller's ``$this->request`` instance to get the data to be validated.
-
-The :doc:`Validation Library docs ` have details on rule and message array formats, as well as
-available rules:
-
-.. literalinclude:: controllers/004.php
-
-.. warning:: When you use the ``validate()`` method, you should use the
- :ref:`getValidated() ` method to get the validated data, because the
- ``validate()`` method uses the :ref:`Validation::withRequest() ` method internally, and it
- validates data from :ref:`$request->getJSON() ` or
- :ref:`$request->getRawInput() ` or
- :ref:`$request->getVar() `, and an attacker could change what data is validated.
-
-.. note:: The :ref:`$this->validator->getValidated() ` method can be used since
- v4.4.0.
-
-If you find it simpler to keep the rules in the configuration file, you can replace the ``$rules`` array with the name
-of the group as defined in **app/Config/Validation.php**:
-
-.. literalinclude:: controllers/005.php
-
-.. note:: Validation can also be handled automatically in the model, but sometimes it's easier to do it in the
- controller. The choice is up to you.
-
-Protecting Methods
-******************
-
-In some cases, you may want certain methods hidden from public access. To achieve this, simply declare the method as
-``private`` or ``protected``. That will prevent it from being served by a URL request.
-
-For example, if you were to define a method like this for the ``Helloworld`` controller:
-
-.. literalinclude:: controllers/007.php
-
-and to define a route (``helloworld/utility``) for the method, then trying to access it using the following URL will not
-work::
-
- example.com/index.php/helloworld/utility
-
-Auto-routing also will not work.
-
-.. _controller-auto-routing-improved:
-
-Auto Routing (Improved)
-***********************
-
-.. versionadded:: 4.2.0
-
-Auto Routing (Improved) is a new, more secure automatic routing system.
-
-See :doc:`auto_routing_improved` for details.
-
-.. _controller-auto-routing-legacy:
-
-Auto Routing (Legacy)
-*********************
-
-.. important:: This feature exists only for backward compatibility. Do not use it in new projects. Even if you are
- already using it, we recommend that you use the :ref:`auto-routing-improved` instead.
-
-This section describes the functionality of Auto Routing (Legacy), a routing system from CodeIgniter 3. It automatically
-routes an HTTP request, and executes the corresponding controller method without route definitions. Auto-routing is
-disabled by default.
-
-.. warning:: To prevent misconfiguration and miscoding, we recommend that you do not use Auto Routing (Legacy). It is
- easy to create vulnerable apps where controller filters or CSRF protection are bypassed.
-
-.. important:: Auto Routing (Legacy) routes an HTTP request with **any** HTTP method to a controller method.
-
-.. important:: Since v4.5.0, if Auto Routing (Legacy) doesn't find the controller, it will throw a
- ``PageNotFoundException`` exception before the Controller Filters execute.
-
-Consider this URI::
-
- example.com/index.php/helloworld/
-
-In the above example, CodeIgniter would attempt to find a controller named **Helloworld.php** and load it.
-
-.. note:: When a controller's short name matches the first segment of a URI, it will be loaded.
-
-Let's try it: Hello World! (Legacy)
-===================================
-
-Let's create a simple controller so you can see it in action. Using your text editor, create a file called
-**Helloworld.php**, and put the following code in it. You will notice that the ``Helloworld`` Controller is extending
-the ``BaseController``. You can also extend the ``CodeIgniter\Controller`` if you do not need the functionality of the
-BaseController.
-
-The BaseController provides a convenient place for loading components and performing functions that are needed by all
-your controllers. You can extend this class in any new controller.
-
-For security reasons, be sure to declare any new utility methods as ``protected`` or ``private``:
-
-.. literalinclude:: controllers/008.php
-
-Then save the file to your **app/Controllers** directory.
-
-.. important:: The file must be called **Helloworld.php**, with a capital ``H``. When you use Auto Routing, Controller
- class names MUST start with an uppercase letter and ONLY the first character can be uppercase.
-
-Now visit your site using a URL similar to this::
-
- example.com/index.php/helloworld
-
-If you did it right, you should see::
-
- Hello World!
-
-This is valid:
-
-.. literalinclude:: controllers/009.php
-
-This is **not** valid:
-
-.. literalinclude:: controllers/010.php
-
-This is **not** valid:
-
-.. literalinclude:: controllers/011.php
-
-Also, always make sure your controller extends the parent controller class so that it can inherit all its methods.
-
-.. note::
- The system will attempt to match the URI against Controllers by matching each segment against directories/files in
- **app/Controllers**, when a match wasn't found against defined routes. That's why your directories/files MUST start
- with a capital letter and the rest MUST be lowercase.
-
- If you want another naming convention you need to manually define it using the
- :ref:`Defined Route Routing `. Here is an example based on PSR-4 Autoloader:
-
- .. literalinclude:: controllers/012.php
-
-Methods (Legacy)
-================
-
-In the above example, the method name is ``index()``. The ``index()`` method is always loaded by default if the
-**second segment** of the URI is empty. Another way to show your "Hello World" message would be this::
-
- example.com/index.php/helloworld/index/
-
-**The second segment of the URI determines which method in the controller gets called.**
-
-Let's try it. Add a new method to your controller:
-
-.. literalinclude:: controllers/013.php
-
-Now load the following URL to see the comment method::
-
- example.com/index.php/helloworld/comment/
-
-You should see your new message.
-
-Passing URI Segments to Your Methods (Legacy)
-=============================================
-
-If your URI contains more than two segments, they will be passed to your method as parameters.
-
-For example, let's say you have a URI like this::
-
- example.com/index.php/products/shoes/sandals/123
-
-Your method will be passed URI segments 3 and 4 (``'sandals'`` and ``'123'``):
-
-.. literalinclude:: controllers/014.php
-
-Default Controller (Legacy)
-===========================
-
-The Default Controller is a special controller that is used when a URI ends with a directory name or when a URI is not
-present, as will be the case when only your site root URL is requested.
-
-Defining a Default Controller (Legacy)
---------------------------------------
-
-Let's try it with the ``Helloworld`` controller.
-
-To specify a default controller, open your **app/Config/Routing.php** file and set this property::
-
- public string $defaultController = 'Helloworld';
-
-Here, ``Helloworld`` is the name of the controller class you want to use.
-
-And comment out the line in **app/Config/Routes.php**:
-
-.. literalinclude:: controllers/016.php
- :lines: 2-
-
-If you now browse to your site without specifying any URI segments, you'll see the "Hello World" message.
-
-.. note:: The line ``$routes->get('/', 'Home::index');`` is an optimization that you will want to use in a "real-world"
- app. But for demonstration purposes we don't want to use that feature. ``$routes->get()`` is explained in
- :doc:`URI Routing `.
-
-For more information, please refer to the :ref:`routing-auto-routing-legacy-configuration-options` documentation.
-
-Organizing Your Controllers into Sub-directories (Legacy)
-=========================================================
-
-If you are building a large application, you might want to hierarchically organize or structure your controllers into
-sub-directories. CodeIgniter permits you to do this.
-
-Simply create sub-directories under the main **app/Controllers**, and place your controller classes within them.
-
-.. important:: Directory names MUST start with an uppercase letter and ONLY the first character can be uppercase.
-
-When using this feature, the first segment of your URI must specify the directory. For example, let's say you have a
-controller located here::
-
- app/Controllers/Products/Shoes.php
-
-To call the above controller, your URI will look something like this::
-
- example.com/index.php/products/shoes/show/123
-
-.. note:: You cannot have directories with the same name in **app/Controllers** and **public/**. This is because if
- there is a directory, the web server will search for it and it will not be routed to CodeIgniter.
-
-Each of your sub-directories may contain a default controller which will be called if the URL contains *only* the
-sub-directory. Simply put a controller in there that matches the name of your default controller as specified in your
-**app/Config/Routing.php** file.
-
-CodeIgniter also permits you to map your URIs using its :ref:`Defined Route Routing `.
-
-Remapping Method Calls
-**********************
-
-.. note:: **Auto Routing (Improved)** intentionally does not support this feature.
-
-As noted above, the second segment of the URI typically determines which method in the controller gets called.
-CodeIgniter permits you to override this behavior through the use of the ``_remap()`` method:
-
-.. literalinclude:: controllers/017.php
-
-.. important:: If your controller contains a method named ``_remap()``, it will **always** get called regardless of what
- your URI contains. It overrides the normal behavior in which the URI determines which method is called, allowing you
- to define your own method routing rules.
-
-The overridden method call (typically the second segment of the URI) will be passed as a parameter to the ``_remap()``
-method:
-
-.. literalinclude:: controllers/018.php
-
-Any extra segments after the method name are passed into ``_remap()``. These parameters can be passed to the method to
-emulate CodeIgniter's default behavior.
-
-Example:
-
-.. literalinclude:: controllers/019.php
-
-Extending the Controller
-************************
-
-If you want to extend the controller, see :doc:`../extending/basecontroller`.
-
-That's it!
-**********
-
-That, in a nutshell, is all there is to know about controllers.
diff --git a/user_guide_src/source/incoming/controllers/001.php b/user_guide_src/source/incoming/controllers/001.php
deleted file mode 100644
index ff3ab9edfcf1..000000000000
--- a/user_guide_src/source/incoming/controllers/001.php
+++ /dev/null
@@ -1,8 +0,0 @@
-request->isSecure()) {
- $this->forceHTTPS();
-}
diff --git a/user_guide_src/source/incoming/controllers/003.php b/user_guide_src/source/incoming/controllers/003.php
deleted file mode 100644
index c3309ddbf201..000000000000
--- a/user_guide_src/source/incoming/controllers/003.php
+++ /dev/null
@@ -1,5 +0,0 @@
-request->isSecure()) {
- $this->forceHTTPS(31536000); // one year
-}
diff --git a/user_guide_src/source/incoming/controllers/004.php b/user_guide_src/source/incoming/controllers/004.php
deleted file mode 100644
index afdf0a145852..000000000000
--- a/user_guide_src/source/incoming/controllers/004.php
+++ /dev/null
@@ -1,26 +0,0 @@
-validate([
- 'email' => "required|is_unique[users.email,id,{$userID}]",
- 'name' => 'required|alpha_numeric_spaces',
- ])) {
- // The validation failed.
- return view('users/update', [
- 'errors' => $this->validator->getErrors(),
- ]);
- }
-
- // The validation was successful.
-
- // Get the validated data.
- $validData = $this->validator->getValidated();
-
- // ...
- }
-}
diff --git a/user_guide_src/source/incoming/controllers/005.php b/user_guide_src/source/incoming/controllers/005.php
deleted file mode 100644
index 34170437355d..000000000000
--- a/user_guide_src/source/incoming/controllers/005.php
+++ /dev/null
@@ -1,23 +0,0 @@
-validate('userRules')) {
- // The validation failed.
- return view('users/update', [
- 'errors' => $this->validator->getErrors(),
- ]);
- }
-
- // The validation was successful.
-
- // Get the validated data.
- $validData = $this->validator->getValidated();
-
- // ...
- }
-}
diff --git a/user_guide_src/source/incoming/controllers/006.php b/user_guide_src/source/incoming/controllers/006.php
deleted file mode 100644
index 8bf7045411f1..000000000000
--- a/user_guide_src/source/incoming/controllers/006.php
+++ /dev/null
@@ -1,27 +0,0 @@
- $id,
- 'name' => $this->request->getPost('name'),
- ];
-
- $rule = [
- 'id' => 'integer',
- 'name' => 'required|max_length[255]',
- ];
-
- if (! $this->validateData($data, $rule)) {
- return view('store/product', [
- 'errors' => $this->validator->getErrors(),
- ]);
- }
-
- // ...
- }
-}
diff --git a/user_guide_src/source/incoming/controllers/007.php b/user_guide_src/source/incoming/controllers/007.php
deleted file mode 100644
index e943c78bfcca..000000000000
--- a/user_guide_src/source/incoming/controllers/007.php
+++ /dev/null
@@ -1,11 +0,0 @@
-(\)*\
- */
-
-$routes->get('helloworld', '\App\Controllers\HelloWorld::index');
diff --git a/user_guide_src/source/incoming/controllers/013.php b/user_guide_src/source/incoming/controllers/013.php
deleted file mode 100644
index 68d4450d4e3a..000000000000
--- a/user_guide_src/source/incoming/controllers/013.php
+++ /dev/null
@@ -1,16 +0,0 @@
-get('/', 'Home::index');
diff --git a/user_guide_src/source/incoming/controllers/017.php b/user_guide_src/source/incoming/controllers/017.php
deleted file mode 100644
index 8bcb6a2b00f9..000000000000
--- a/user_guide_src/source/incoming/controllers/017.php
+++ /dev/null
@@ -1,11 +0,0 @@
-{$method}();
- }
-
- return $this->default_method();
- }
-}
diff --git a/user_guide_src/source/incoming/controllers/019.php b/user_guide_src/source/incoming/controllers/019.php
deleted file mode 100644
index 4bfdb1393d02..000000000000
--- a/user_guide_src/source/incoming/controllers/019.php
+++ /dev/null
@@ -1,17 +0,0 @@
-{$method}(...$params);
- }
-
- throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
- }
-}
diff --git a/user_guide_src/source/incoming/controllers/023.php b/user_guide_src/source/incoming/controllers/023.php
deleted file mode 100644
index ed1fde5b4f47..000000000000
--- a/user_guide_src/source/incoming/controllers/023.php
+++ /dev/null
@@ -1,22 +0,0 @@
-`, you can choose the specific URIs or routes to which the filters will be applied.
-Before filters may modify the Request while after filters can act on and even modify the Response, allowing for a lot of
-flexibility and power.
-
-Some common examples of tasks that might be performed with filters are:
-
-* Performing CSRF protection on the incoming requests
-* Restricting areas of your site based upon their Role
-* Performing rate limiting on certain endpoints
-* Displaying a "Down for Maintenance" page
-* Performing automatic content negotiation
-* and more...
-
-*****************
-Creating a Filter
-*****************
-
-Filters are simple classes that implement ``CodeIgniter\Filters\FilterInterface``. They contain two methods:
-``before()`` and ``after()``, which hold the code that will run before and after the controller respectively. Your class
-must contain both methods but may leave the methods empty if they are not needed. A skeleton filter class looks like:
-
-.. literalinclude:: filters/001.php
-
-Before Filters
-==============
-
-Replacing Request
------------------
-
-From any filter, you can return the ``$request`` object and it will replace the current Request, allowing you to make
-changes that will still be present when the controller executes.
-
-Stopping Later Filters
-----------------------
-
-When you have a series of filters, you may also want to stop the execution of the later filters after a certain filter.
-You can easily do this by returning **any non-empty** result. If the before filter returns an empty result, the
-controller actions or the later filters will still be executed.
-
-An exception to the non-empty result rule is the ``Request`` instance. Returning it in the before filter will not stop
-the execution but only replace the current ``$request`` object.
-
-Returning Response
-------------------
-
-Since before filters are executed prior to your controller being executed, you may at times want to stop the actions in
-the controller from happening.
-
-This is typically used to perform redirects, like in this example:
-
-.. literalinclude:: filters/002.php
-
-If a ``Response`` instance is returned, the Response will be sent back to the client and script execution will stop.
-This can be useful for implementing rate limiting for APIs. See :doc:`Throttler <../libraries/throttler>` for an
-example.
-
-.. _after-filters:
-
-After Filters
-=============
-
-After filters are nearly identical to before filters, except that you can only return the ``$response`` object, and you
-cannot stop script execution. This does allow you to modify the final output, or simply do something with the final
-output. This could be used to ensure certain security headers were set the correct way, or to cache the final output, or
-even to filter the final output with a bad words filter.
-
-*******************
-Configuring Filters
-*******************
-
-There are two ways to configure filters when they get run. One is done in **app/Config/Filters.php**, and the other is
-done in **app/Config/Routes.php**.
-
-If you want to specify filters for defined routes, use **app/Config/Routes.php** and see
-:ref:`URI Routing `.
-
-.. Note:: The safest way to apply filters is to :ref:`disable auto-routing `, and :ref:`set filters to routes `.
-
-app/Config/Filters.php
-======================
-
-The **app/Config/Filters.php** file contains four properties that allow you to configure exactly when the filters run.
-
-.. Warning:: It is recommended that you always add ``*`` at the end of a URI in the filter settings,
- because a controller method might be accessible by different URLs than you think. For example, when
- :ref:`auto-routing-legacy` is enabled, if you have ``Blog::index()``, it can be accessed with ``blog``,
- ``blog/index``, ``blog/index/1``, etc.
-
-.. _filters-aliases:
-
-$aliases
---------
-
-The ``$aliases`` array is used to associate a simple name with one or more fully-qualified class names that are the
-filters to run:
-
-.. literalinclude:: filters/003.php
-
-Aliases are mandatory, and if you try to use a full class name later, the system will throw an error.
-
-Defining them in this way makes it simple to switch out the class used. This is great for when you decide you need to
-change to a different authentication system, since you only change the filter's class and you're done.
-
-You can combine multiple filters into one alias, making complex sets of filters simple to apply:
-
-.. literalinclude:: filters/004.php
-
-You should define as many aliases as you need.
-
-.. _filters-required:
-
-$required
----------
-
-.. versionadded:: 4.5.0
-
-The second section allows you to define **Required Filters**. They are special filters that are applied to every request
-made by the framework. They are applied before and after other kinds of filters that are explained below.
-
-.. note:: The Required Filters are always executed. However, if the route does not exist, only the Before Filters are
- executed.
-
-You should take care with how many you use here, since it could have performance implications to have too many run on
-every request. But the filters set by default provide framework functionality. If removed, those functions will no
-longer work. See :ref:`provided-filters` for details.
-
-Filters can be specified by adding their alias to either the ``before`` or ``after`` array:
-
-.. literalinclude:: filters/013.php
-
-.. _filters-globals:
-
-$globals
---------
-
-The third section allows you to define any filters that should be applied to every valid request made by the framework.
-
-You should take care with how many you use here, since it could have performance implications to have too many run on
-every request.
-
-Filters can be specified by adding their alias to either the ``before`` or ``after`` array:
-
-.. literalinclude:: filters/005.php
-
-Except for a Few URIs
-^^^^^^^^^^^^^^^^^^^^^
-
-There are times when you want to apply a filter to almost every request, but have a few that should be left alone. One
-common example is if you need to exclude a few URIs from the CSRF protection filter to allow requests from third-party
-websites to hit one or two specific URIs, while keeping the rest of them protected.
-
-To do this, add an array with the ``except`` key and a URI path (relative to BaseURL) to match as the value alongside
-the alias:
-
-.. literalinclude:: filters/006.php
-
-.. Warning:: Prior to v4.4.7, due to a bug, the URI paths processed by the filter
- were not URL-decoded. In other words, the URI paths specified in the routing and the URI paths specified in the
- filter could be different. See :ref:`upgrade-447-filter-paths` for details.
-
-Any place you can use a URI path (relative to BaseURL) in the filter settings, you can use a regular expression or, as
-in the example above, use an asterisk (``*``) for a wildcard that will match all characters after that. In this example,
-any URI path starting with ``api/`` would be exempted from CSRF protection, but the site's forms would all be protected.
-
-If you need to specify multiple URI paths, you can use an array of URI path patterns:
-
-.. literalinclude:: filters/007.php
-
-$methods
---------
-
-.. Warning:: If you use ``$methods`` filters, you should :ref:`disable Auto Routing (Legacy) `
- because :ref:`auto-routing-legacy` permits any HTTP method to access a controller. Accessing the controller with a
- method you don't expect could bypass the filter.
-
-You can apply filters to all requests of a certain HTTP method, like ``POST``, ``GET``, ``PUT``, etc. Its value would be
-an array of filters to run:
-
-.. literalinclude:: filters/008.php
-
-.. note:: Unlike the ``$globals`` or the ``$filters`` properties, these will only run as before filters.
-
-In addition to the standard HTTP methods, this also supports one special case: ``CLI``. The ``CLI`` method would apply
-to all requests that were run from the command line.
-
-.. note:: Prior to v4.5.0, due to a bug, you needed to specify the HTTP method names in **lowercase**.
-
-$filters
---------
-
-This property is an array of filter aliases. For each alias, you can specify ``before`` and ``after`` arrays that
-contain a list of URI path (relative to BaseURL) patterns that the filter should apply to:
-
-.. literalinclude:: filters/009.php
-
-.. Warning:: Prior to v4.4.7, due to a bug, the URI paths processed by the filter
- were not URL-decoded. In other words, the URI paths specified in the routing and the URI paths specified in the
- filter could be different. See :ref:`upgrade-447-filter-paths` for details.
-
-.. _filters-filters-filter-arguments:
-
-Filter Arguments
-^^^^^^^^^^^^^^^^
-
-.. versionadded:: 4.4.0
-
-When configuring ``$filters``, additional arguments may be passed to a filter:
-
-.. literalinclude:: filters/012.php
-
-In this example, when the URI matches ``admin/*``, the array ``['admin', 'superadmin']`` will be passed in
-``$arguments`` to the ``group`` filter's ``before()`` method. When the URI matches ``admin/users/*``, the array
-``['users.manage']`` will be passed in ``$arguments`` to the ``permission`` filter's ``before()`` method.
-
-.. note:: Prior to v4.6.0, the same filter could not be run multiple times with different arguments.
-
-.. _filter-execution-order:
-
-Filter Execution Order
-======================
-
-.. important:: Starting with v4.5.0, the order in which filters are executed has changed. If you wish to maintain the
- same execution order as in previous versions, you must set ``Config\Feature::$oldFilterOrder`` to ``true``.
-
-Filters are executed in the following order:
-
-- **Before Filters**: required → globals → methods → filters → route
-- **After Filters**: route → filters → globals → required
-
-.. note:: The *required* filters can be used since v4.5.0.
-
-.. note:: Prior to v4.5.0, the filters specified for a route (in **app/Config/Routes.php**) were executed before the
- filters specified in **app/Config/Filters.php**. And the execution order of the After Filters in Route filters and
- Filters filters was not reversed. See :ref:`Upgrading Guide ` for details.
-
-******************
-Confirming Filters
-******************
-
-CodeIgniter has the following :doc:`command <../cli/spark_commands>` to check the filters for a route.
-
-.. _spark-filter-check:
-
-filter:check
-============
-
-.. versionadded:: 4.3.0
-
-For example, check the filters for the route ``/`` with the **GET** method:
-
-.. code-block:: console
-
- php spark filter:check get /
-
-The output is like the following:
-
-.. code-block:: none
-
- +--------+-------+----------------------+-------------------------------+
- | Method | Route | Before Filters | After Filters |
- +--------+-------+----------------------+-------------------------------+
- | GET | / | forcehttps pagecache | pagecache performance toolbar |
- +--------+-------+----------------------+-------------------------------+
-
- Before Filter Classes:
- CodeIgniter\Filters\ForceHTTPS → CodeIgniter\Filters\PageCache
- After Filter Classes:
- CodeIgniter\Filters\PageCache → CodeIgniter\Filters\PerformanceMetrics → CodeIgniter\Filters\DebugToolbar
-
-.. note:: Since v4.6.0, filter arguments are displayed in the output table. Also, the actual filter classnames are
- displayed at the end.
-
-You can also see the routes and filters with the ``spark routes`` command, but it might not show accurate filters when
-you use regular expressions for routes. See :ref:`URI Routing ` for details.
-
-.. _provided-filters:
-
-****************
-Provided Filters
-****************
-
-The filters bundled with CodeIgniter4 are:
-
-- ``cors`` => :doc:`../libraries/cors`
-- ``csrf`` => :ref:`CSRF `
-- ``toolbar`` => :ref:`DebugToolbar `
-- ``honeypot`` => :doc:`Honeypot <../libraries/honeypot>`
-- ``invalidchars`` => :ref:`invalidchars`
-- ``secureheaders`` => :ref:`secureheaders`
-- ``forcehttps`` => :ref:`forcehttps`
-- ``pagecache`` => :doc:`PageCache <../general/caching>`
-- ``performance`` => :ref:`performancemetrics`
-
-.. note:: The filters are executed in the order defined in the config file. However, if enabled, ``DebugToolbar`` is
- always executed last because it should be able to capture everything that happens in the other filters.
-
-.. _forcehttps:
-
-ForceHTTPS
-==========
-
-.. versionadded:: 4.5.0
-
-This filter provides the "Force Global Secure Requests" feature.
-
-If you set ``Config\App::$forceGlobalSecureRequests`` to true, this will force every request made to this application to
-be made via a secure connection (HTTPS). If the incoming request is not secure, the user will be redirected to a secure
-version of the page and the HTTP Strict Transport Security (HSTS) header will be set.
-
-.. _performancemetrics:
-
-PerformanceMetrics
-==================
-
-.. versionadded:: 4.5.0
-
-This filter provides the pseudo-variables for performance metrics.
-
-If you would like to display the total elapsed time from the moment CodeIgniter starts to the moment right before the
-final output is sent to the browser, simply place this pseudo-variable in one of your views::
-
- {elapsed_time}
-
-If you would like to show your memory usage in your view files, use this pseudo-variable::
-
- {memory_usage}
-
-If you don't need this feature, remove ``'performance'`` from ``$required['after']``.
-
-.. _invalidchars:
-
-InvalidChars
-============
-
-This filter prohibits user input data (``$_GET``, ``$_POST``, ``$_COOKIE``, ``php://input``) from containing the
-following characters:
-
-- invalid UTF-8 characters
-- control characters except line break and tab code
-
-.. _secureheaders:
-
-SecureHeaders
-=============
-
-This filter adds HTTP response headers that your application can use to increase the security of your application.
-
-If you want to customize the headers, extend ``CodeIgniter\Filters\SecureHeaders`` and override the ``$headers``
-property. And change the ``$aliases`` property in **app/Config/Filters.php**:
-
-.. literalinclude:: filters/011.php
-
-If you want to know about secure headers, see
-`OWASP Secure Headers Project `_.
diff --git a/user_guide_src/source/incoming/filters/001.php b/user_guide_src/source/incoming/filters/001.php
deleted file mode 100644
index 50e41518cabf..000000000000
--- a/user_guide_src/source/incoming/filters/001.php
+++ /dev/null
@@ -1,20 +0,0 @@
-isLoggedIn()) {
- return redirect()->to(site_url('login'));
- }
- }
-}
diff --git a/user_guide_src/source/incoming/filters/003.php b/user_guide_src/source/incoming/filters/003.php
deleted file mode 100644
index af170fa37ac0..000000000000
--- a/user_guide_src/source/incoming/filters/003.php
+++ /dev/null
@@ -1,14 +0,0 @@
- \CodeIgniter\Filters\CSRF::class,
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/filters/004.php b/user_guide_src/source/incoming/filters/004.php
deleted file mode 100644
index fbaa8358ad60..000000000000
--- a/user_guide_src/source/incoming/filters/004.php
+++ /dev/null
@@ -1,17 +0,0 @@
- [
- \App\Filters\Negotiate::class,
- \App\Filters\ApiAuth::class,
- ],
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/filters/005.php b/user_guide_src/source/incoming/filters/005.php
deleted file mode 100644
index 8b00ce682b1b..000000000000
--- a/user_guide_src/source/incoming/filters/005.php
+++ /dev/null
@@ -1,19 +0,0 @@
- [
- 'csrf',
- ],
- 'after' => [],
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/filters/006.php b/user_guide_src/source/incoming/filters/006.php
deleted file mode 100644
index a7f4336a635f..000000000000
--- a/user_guide_src/source/incoming/filters/006.php
+++ /dev/null
@@ -1,19 +0,0 @@
- [
- 'csrf' => ['except' => 'api/*'],
- ],
- 'after' => [],
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/filters/007.php b/user_guide_src/source/incoming/filters/007.php
deleted file mode 100644
index b3c9cc8ed996..000000000000
--- a/user_guide_src/source/incoming/filters/007.php
+++ /dev/null
@@ -1,19 +0,0 @@
- [
- 'csrf' => ['except' => ['foo/*', 'bar/*']],
- ],
- 'after' => [],
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/filters/008.php b/user_guide_src/source/incoming/filters/008.php
deleted file mode 100644
index 7538a199394a..000000000000
--- a/user_guide_src/source/incoming/filters/008.php
+++ /dev/null
@@ -1,17 +0,0 @@
- ['invalidchars', 'csrf'],
- 'GET' => ['csrf'],
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/filters/009.php b/user_guide_src/source/incoming/filters/009.php
deleted file mode 100644
index 274a4cb6256b..000000000000
--- a/user_guide_src/source/incoming/filters/009.php
+++ /dev/null
@@ -1,17 +0,0 @@
- ['before' => ['admin/*'], 'after' => ['users/*']],
- 'bar' => ['before' => ['api/*', 'admin/*']],
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/filters/011.php b/user_guide_src/source/incoming/filters/011.php
deleted file mode 100644
index 6c12e301ff6b..000000000000
--- a/user_guide_src/source/incoming/filters/011.php
+++ /dev/null
@@ -1,15 +0,0 @@
- \App\Filters\SecureHeaders::class,
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/filters/012.php b/user_guide_src/source/incoming/filters/012.php
deleted file mode 100644
index 799bd57fce7d..000000000000
--- a/user_guide_src/source/incoming/filters/012.php
+++ /dev/null
@@ -1,17 +0,0 @@
- ['before' => ['admin/*']],
- 'permission:users.manage' => ['before' => ['admin/users/*']],
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/filters/013.php b/user_guide_src/source/incoming/filters/013.php
deleted file mode 100644
index 5e7154bd4c9e..000000000000
--- a/user_guide_src/source/incoming/filters/013.php
+++ /dev/null
@@ -1,23 +0,0 @@
- [
- 'forcehttps', // Force Global Secure Requests
- 'pagecache', // Web Page Caching
- ],
- 'after' => [
- 'pagecache', // Web Page Caching
- 'performance', // Performance Metrics
- 'toolbar', // Debug Toolbar
- ],
- ];
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/incomingrequest.rst b/user_guide_src/source/incoming/incomingrequest.rst
deleted file mode 100644
index d19302e0ae72..000000000000
--- a/user_guide_src/source/incoming/incomingrequest.rst
+++ /dev/null
@@ -1,526 +0,0 @@
-#####################
-IncomingRequest Class
-#####################
-
-The IncomingRequest class provides an object-oriented representation of an HTTP request from a client, like a browser.
-It extends from, and has access to all the methods of the :doc:`Request ` and
-:doc:`Message ` classes, in addition to the methods listed below.
-
-.. contents::
- :local:
- :depth: 2
-
-Accessing the Request
-*********************
-
-An instance of the request class is already populated for you if the current class is a descendant of
-``CodeIgniter\Controller`` and can be accessed as a class property:
-
-.. literalinclude:: incomingrequest/001.php
-
-If you are not within a controller, but still need access to the application's Request object, you can get a copy of it
-through the :doc:`Services class `:
-
-.. literalinclude:: incomingrequest/002.php
-
-It's preferable, though, to pass the request in as a dependency if the class is anything other than the controller,
-where you can save it as a class property:
-
-.. literalinclude:: incomingrequest/003.php
-
-Determining Request Type
-************************
-
-A request could be of several types, including an AJAX request or a request from the command line. This can be checked
-with the ``isAJAX()`` and ``isCLI()`` methods:
-
-.. literalinclude:: incomingrequest/004.php
-
-.. note:: The ``isAJAX()`` method depends on the ``X-Requested-With`` header, which in some cases is not sent by default
- in XHR requests via JavaScript (i.e., fetch). See the :doc:`AJAX Requests ` section on how to avoid
- this problem.
-
-.. _incomingrequest-is:
-
-is()
-====
-
-.. versionadded:: 4.3.0
-
-Since v4.3.0, you can use the ``is()`` method. It accepts an HTTP method, ``'ajax'``, or ``'json'``, and returns a
-boolean.
-
-.. note:: The HTTP method should be case-sensitive, but the parameter is case-insensitive.
-
-.. literalinclude:: incomingrequest/040.php
-
-getMethod()
-===========
-
-You can check the HTTP method that this request represents with the ``getMethod()`` method:
-
-.. literalinclude:: incomingrequest/005.php
-
-The HTTP method is case-sensitive, and by convention, standardized methods are defined in all-uppercase US-ASCII
-letters.
-
-.. note:: Prior to v4.5.0, by default, the method was returned as a lowercase string (i.e., ``'get'``, ``'post'``,
- etc.). This was a bug.
-
-You can get a lowercase version by wrapping the call in ``strtolower()``::
-
- // Returns 'get'
- $method = strtolower($request->getMethod());
-
-You can also check if the request was made through an HTTPS connection with the ``isSecure()`` method:
-
-.. literalinclude:: incomingrequest/006.php
-
-.. important:: The ``X-Forwarded-Proto`` and ``Front-End-Https`` headers are taken into account only when the request
- comes from a trusted proxy configured in ``Config\App::$proxyIPs``. Otherwise, they are client-supplied and could be
- spoofed.
-
-.. note:: On dual-stack servers, a proxy's IPv4 address may be reported as an IPv4-mapped IPv6 address (e.g.,
- ``::ffff:192.168.5.21``), which does not match an IPv4 entry such as ``192.168.5.0/24``. In that case, add the
- IPv4-mapped form to ``Config\App::$proxyIPs``, e.g., ``::ffff:192.168.5.21`` or ``::ffff:192.168.5.0/120``.
-
-Retrieving Input
-****************
-
-You can retrieve input from ``$_GET``, ``$_POST``, ``$_COOKIE``, ``$_SERVER`` and ``$_ENV`` through the Request object.
-The data is not automatically filtered and returns the raw input data as passed in the request.
-
-.. note:: It is bad practice to use global variables. Basically, they should be avoided, and it is recommended to use
- methods of the Request object.
-
-The main advantages to using these methods instead of accessing them directly (``$_POST['something']``) are that they
-will return null if the item doesn't exist, and you can have the data filtered. This lets you conveniently use data
-without having to test whether an item exists first. In other words, normally you might do something like this:
-
-.. literalinclude:: incomingrequest/007.php
-
-With CodeIgniter's built-in methods, you can simply do this:
-
-.. literalinclude:: incomingrequest/008.php
-
-.. _incomingrequest-getting-data:
-
-Getting Data
-============
-
-getGet()
---------
-
-The ``getGet()`` method will pull from ``$_GET``.
-
-* ``$request->getGet()``
-
-getPost()
----------
-
-The ``getPost()`` method will pull from ``$_POST``.
-
-* ``$request->getPost()``
-
-getCookie()
------------
-
-The ``getCookie()`` method will pull from ``$_COOKIE``.
-
-* ``$request->getCookie()``
-
-getServer()
------------
-
-The ``getServer()`` method will pull from ``$_SERVER``.
-
-* ``$request->getServer()``
-
-getPostGet()
-------------
-
-In addition, there are a few utility methods for retrieving information from either ``$_GET`` or ``$_POST``, while
-maintaining the ability to control the order you look for it:
-
-* ``$request->getPostGet()`` - checks ``$_POST`` first, then ``$_GET``
-
-getGetPost()
-------------
-
-* ``$request->getGetPost()`` - checks ``$_GET`` first, then ``$_POST``
-
-getVar()
---------
-
-.. important:: This method exists only for backward compatibility. Do not use it in new projects. Even if you are
- already using it, we recommend that you use another, more appropriate method.
-
-The ``getVar()`` method will pull from ``$_REQUEST``, so it will return any data from ``$_GET``, ``$_POST``, or
-``$_COOKIE`` (depending on **php.ini** `request-order `_).
-
-.. warning:: If you want to validate POST data only, don't use ``getVar()``. Newer values override older values. POST
- values may be overridden by the cookies if they have the same name, and you set "C" after "P" in
- `request-order `_.
-
-.. note:: If the incoming request has a ``Content-Type`` header set to ``application/json``, the ``getVar()`` method
- returns the JSON data instead of ``$_REQUEST`` data.
-
-.. _incomingrequest-getting-json-data:
-
-Getting JSON Data
-=================
-
-You can grab the contents of ``php://input`` as a JSON stream with ``getJSON()``.
-
-.. note:: This has no way of checking if the incoming data is valid JSON or not, so you should only use this method if
- you know that you're expecting JSON.
-
-.. literalinclude:: incomingrequest/009.php
-
-By default, this will return any objects in the JSON data as objects. If you want that converted to associative arrays,
-pass in ``true`` as the first parameter.
-
-The second and third parameters match up to the ``$depth`` and ``$flags`` arguments of the
-`json_decode() `_ PHP function.
-
-Getting Specific Data from JSON
-===============================
-
-You can get a specific piece of data from a JSON stream by passing a variable name into ``getJsonVar()`` for the data
-that you want, or you can use "dot" notation to dig into the JSON to get data that is not on the root level.
-
-.. literalinclude:: incomingrequest/010.php
-
-If you want the result to be an associative array instead of an object, you can pass true in the second parameter:
-
-.. literalinclude:: incomingrequest/011.php
-
-.. note:: See the documentation for :php:func:`dot_array_search()` in the ``Array`` helper for more information on "dot"
- notation.
-
-.. _incomingrequest-retrieving-raw-data:
-
-Retrieving Raw Data (PUT, PATCH, DELETE)
-========================================
-
-Finally, you can grab the contents of ``php://input`` as a raw stream with ``getRawInput()``:
-
-.. literalinclude:: incomingrequest/012.php
-
-This will retrieve data and convert it to an array. Like this:
-
-.. literalinclude:: incomingrequest/013.php
-
-You can also use ``getRawInputVar()`` to get the specified variable from the raw stream and filter it.
-
-.. literalinclude:: incomingrequest/039.php
-
-.. _incomingrequest-filtering-input-data:
-
-Filtering Input Data
-====================
-
-To maintain the security of your application, you will want to filter all input as you access it. You can pass the type
-of filter to use as the second parameter of any of these methods. The native ``filter_var()`` function is used for the
-filtering. Head over to the PHP manual for a list of `valid filter types `_.
-
-Filtering a POST variable would look like this:
-
-.. literalinclude:: incomingrequest/014.php
-
-All of the methods mentioned above support the filter type passed in as the second parameter, with the exception of
-``getJSON()`` and ``getRawInput()``.
-
-Retrieving Headers
-******************
-
-You can get access to any header that was sent with the request with the ``headers()`` method, which returns an array of
-all headers, with the key as the name of the header, and the value as an instance of ``CodeIgniter\HTTP\Header``:
-
-.. literalinclude:: incomingrequest/015.php
-
-If you only need a single header, you can pass the name into the ``header()`` method. This will grab the specified
-header object in a case-insensitive manner if it exists. If not, then it will return ``null``:
-
-.. literalinclude:: incomingrequest/016.php
-
-You can always use ``hasHeader()`` to see if the header existed in this request:
-
-.. literalinclude:: incomingrequest/017.php
-
-If you need the value of a header as a string with all values on one line, you can use the ``getHeaderLine()`` method:
-
-.. literalinclude:: incomingrequest/018.php
-
-If you need the entire header, with the name and values in a single string, simply cast the header as a string:
-
-.. literalinclude:: incomingrequest/019.php
-
-The Request URL
-***************
-
-You can retrieve a :doc:`URI ` object that represents the current URI for this request through the
-``$request->getUri()`` method. You can cast this object as a string to get a full URL for the current request:
-
-.. literalinclude:: incomingrequest/020.php
-
-The object gives you the full ability to grab any part of the request on its own:
-
-.. literalinclude:: incomingrequest/021.php
-
-You can work with the current URI string (the path relative to your baseURL) using the ``getRoutePath()`` method.
-
-.. note:: The ``getRoutePath()`` method can be used since v4.4.0. Prior to v4.4.0, the ``getPath()`` method returned the
- path relative to your baseURL.
-
-Uploaded Files
-**************
-
-Information about all uploaded files can be retrieved through ``$request->getFiles()``, which returns an array of
-``CodeIgniter\HTTP\Files\UploadedFile`` instances. This helps to ease the pain of working with uploaded files, and uses
-best practices to minimize any security risks.
-
-.. literalinclude:: incomingrequest/023.php
-
-See :ref:`Working with Uploaded Files ` for the details.
-
-You can retrieve a single file uploaded on its own, based on the filename given in the HTML file input:
-
-.. literalinclude:: incomingrequest/024.php
-
-You can retrieve an array of same-named files uploaded as part of a multi-file upload, based on the filename given in
-the HTML file input:
-
-.. literalinclude:: incomingrequest/025.php
-
-.. note:: The files here correspond to ``$_FILES``. Even if a user just clicks the submit button of a form and does not
- upload any file, the file will still exist. You can check that the file was actually uploaded with the ``isValid()``
- method in UploadedFile. See :ref:`verify-a-file` for more details.
-
-Content Negotiation
-*******************
-
-You can easily negotiate content types with the request through the ``negotiate()`` method:
-
-.. literalinclude:: incomingrequest/026.php
-
-See the :doc:`Content Negotiation ` page for more details.
-
-Class Reference
-***************
-
-.. note:: In addition to the methods listed here, this class inherits the methods from the
- :doc:`Request Class ` and the :doc:`Message Class `.
-
-The methods provided by the parent classes that are available are:
-
-* :meth:`CodeIgniter\\HTTP\\Request::getIPAddress`
-* :meth:`CodeIgniter\\HTTP\\Request::isValidIP`
-* :meth:`CodeIgniter\\HTTP\\Request::getMethod`
-* :meth:`CodeIgniter\\HTTP\\Request::setMethod`
-* :meth:`CodeIgniter\\HTTP\\Request::getServer`
-* :meth:`CodeIgniter\\HTTP\\Request::setGlobal`
-* :meth:`CodeIgniter\\HTTP\\Request::fetchGlobal`
-* :meth:`CodeIgniter\\HTTP\\Message::getBody`
-* :meth:`CodeIgniter\\HTTP\\Message::setBody`
-* :meth:`CodeIgniter\\HTTP\\Message::appendBody`
-* :meth:`CodeIgniter\\HTTP\\Message::populateHeaders`
-* :meth:`CodeIgniter\\HTTP\\Message::headers`
-* :meth:`CodeIgniter\\HTTP\\Message::header`
-* :meth:`CodeIgniter\\HTTP\\Message::hasHeader`
-* :meth:`CodeIgniter\\HTTP\\Message::getHeaderLine`
-* :meth:`CodeIgniter\\HTTP\\Message::setHeader`
-* :meth:`CodeIgniter\\HTTP\\Message::removeHeader`
-* :meth:`CodeIgniter\\HTTP\\Message::appendHeader`
-* :meth:`CodeIgniter\\HTTP\\Message::prependHeader`
-* :meth:`CodeIgniter\\HTTP\\Message::getProtocolVersion`
-* :meth:`CodeIgniter\\HTTP\\Message::setProtocolVersion`
-
-.. php:namespace:: CodeIgniter\HTTP
-
-.. php:class:: IncomingRequest
-
- .. php:method:: isCLI()
-
- :returns: True if the request was initiated from the command line, otherwise false.
- :rtype: bool
-
- .. php:method:: isAJAX()
-
- :returns: True if the request is an AJAX request, otherwise false.
- :rtype: bool
-
- .. php:method:: isSecure()
-
- :returns: True if the request is an HTTPS request, otherwise false.
- :rtype: bool
-
- .. important:: The ``X-Forwarded-Proto`` and ``Front-End-Https`` headers are taken into account only when the
- request comes from a trusted proxy configured in ``Config\App::$proxyIPs``.
-
- .. php:method:: getVar([$index = null[, $filter = null[, $flags = null]]])
-
- :param string $index: The name of the variable/key to look for.
- :param int $filter: The type of filter to apply. A list of filters can be found in
- `Types of filters `__.
- :param int $flags: Flags to apply. A list of flags can be found in
- `Filter flags `__.
- :returns: ``$_REQUEST`` if no parameters supplied, otherwise the REQUEST value if found, or null if not
- :rtype: array|bool|float|int|object|string|null
-
- .. important:: This method exists only for backward compatibility. Do not use it in new projects. Even if you
- are already using it, we recommend that you use another, more appropriate method.
-
- This method is identical to ``getGet()``, only it fetches REQUEST data.
-
- .. php:method:: getGet([$index = null[, $filter = null[, $flags = null]]])
-
- :param array|string $index: The name of the variable/key to look for, or an array of names.
- :param int $filter: The type of filter to apply. A list of filters can be found in
- `Types of filters `__.
- :param int $flags: Flags to apply. A list of flags can be found in
- `Filter flags `__.
- :returns: ``$_GET`` if no parameters supplied, otherwise the GET value if found, or null if not
- :rtype: array|bool|float|int|object|string|null
-
- The first parameter will contain the name of the GET item you are looking for:
-
- .. literalinclude:: incomingrequest/041.php
-
- The method returns null if the item you are attempting to retrieve does not exist.
-
- The second optional parameter lets you run the data through PHP's filters. Pass in the desired filter type as
- the second parameter:
-
- .. literalinclude:: incomingrequest/042.php
-
- To return an array of all GET items, call without any parameters.
-
- To return all GET items and pass them through the filter, set the first parameter to null while setting the
- second parameter to the filter you want to use:
-
- .. literalinclude:: incomingrequest/043.php
-
- To return an array of multiple GET parameters, pass all the required keys as an array:
-
- .. literalinclude:: incomingrequest/044.php
-
- The same rule applies here: to retrieve the parameters with filtering, set the second parameter to the filter
- type to apply:
-
- .. literalinclude:: incomingrequest/045.php
-
- .. php:method:: getPost([$index = null[, $filter = null[, $flags = null]]])
-
- :param array|string $index: The name of the variable/key to look for, or an array of names.
- :param int $filter: The type of filter to apply. A list of filters can be
- found `here `__.
- :param int $flags: Flags to apply. A list of flags can be found
- `here `__.
- :returns: ``$_POST`` if no parameters supplied, otherwise the POST value if found, or null if not
- :rtype: array|bool|float|int|object|string|null
-
- This method is identical to ``getGet()``, only it fetches POST data.
-
- .. php:method:: getPostGet([$index = null[, $filter = null[, $flags = null]]])
-
- :param array|string $index: The name of the variable/key to look for, or an array of names.
- :param int $filter: The type of filter to apply. A list of filters can be found in
- `Types of filters `__.
- :param int $flags: Flags to apply. A list of flags can be found in
- `Filter flags `__.
- :returns: ``$_POST`` and ``$_GET`` combined if no parameters specified (prefer POST value on conflict),
- otherwise looks for POST value, if nothing found looks for GET value, if no value found returns null
- :rtype: array|bool|float|int|object|string|null
-
- This method works pretty much the same way as ``getPost()`` and ``getGet()``, only combined. It will search
- through both POST and GET streams for data, looking first in POST, and then in GET:
-
- .. literalinclude:: incomingrequest/032.php
-
- If an array of indexes is specified, the method returns an associative array and applies the POST-then-GET
- lookup order to each index.
-
- If no index is specified, it will return both POST and GET streams combined, although POST data will be
- preferred in case of a name conflict.
-
- .. php:method:: getGetPost([$index = null[, $filter = null[, $flags = null]]])
-
- :param array|string $index: The name of the variable/key to look for, or an array of names.
- :param int $filter: The type of filter to apply. A list of filters can be found in
- `Types of filters `__.
- :param int $flags: Flags to apply. A list of flags can be found in
- `Filter flags `__.
- :returns: ``$_GET`` and ``$_POST`` combined if no parameters specified (prefer GET value on conflict),
- otherwise looks for GET value, if nothing found looks for POST value, if no value found returns null
- :rtype: array|bool|float|int|object|string|null
-
- This method works pretty much the same way as ``getPost()`` and ``getGet()``, only combined. It will search
- through both GET and POST streams for data, looking first in GET, and then in POST:
-
- .. literalinclude:: incomingrequest/033.php
-
- If an array of indexes is specified, the method returns an associative array and applies the GET-then-POST
- lookup order to each index.
-
- If no index is specified, it will return both GET and POST streams combined, although GET data will be preferred
- in case of a name conflict.
-
- .. php:method:: getCookie([$index = null[, $filter = null[, $flags = null]]])
-
- :param array|string|null $index: COOKIE name
- :param int $filter: The type of filter to apply. A list of filters can be found in
- `Types of filters `__.
- :param int $flags: Flags to apply. A list of flags can be found in
- `Filter flags `__.
- :returns: ``$_COOKIE`` if no parameters supplied, otherwise the COOKIE value if found or null if not
- :rtype: array|bool|float|int|object|string|null
-
- This method is identical to ``getPost()`` and ``getGet()``, only it fetches cookie data:
-
- .. literalinclude:: incomingrequest/034.php
-
- To return an array of multiple cookie values, pass all the required keys as an array:
-
- .. literalinclude:: incomingrequest/035.php
-
- .. note:: Unlike the :doc:`Cookie Helper <../helpers/cookie_helper>` function :php:func:`get_cookie()`, this
- method does NOT prepend your configured ``Config\Cookie::$prefix`` value.
-
- .. php:method:: getServer([$index = null[, $filter = null[, $flags = null]]])
-
- :param array|string|null $index: Value name
- :param int $filter: The type of filter to apply. A list of filters can be found in
- `Types of filters `__.
- :param int $flags: Flags to apply. A list of flags can be found in
- `Filter flags `__.
- :returns: ``$_SERVER`` item value if found, null if not
- :rtype: array|bool|float|int|object|string|null
-
- This method is identical to the ``getPost()``, ``getGet()`` and ``getCookie()`` methods, only it fetches Server
- data (``$_SERVER``):
-
- .. literalinclude:: incomingrequest/036.php
-
- To return an array of multiple ``$_SERVER`` values, pass all the required keys as an array.
-
- .. literalinclude:: incomingrequest/037.php
-
- .. php:method:: getUserAgent()
-
- :returns: The UserAgent object for the request.
- :rtype: CodeIgniter\\HTTP\\UserAgent
-
- This method returns the User Agent instance from the SERVER data:
-
- .. literalinclude:: incomingrequest/038.php
-
- .. php:method:: getPath()
-
- :returns: The current URI path relative to baseURL
- :rtype: string
-
- This method returns the current URI path relative to baseURL.
-
- .. note:: Prior to v4.4.0, this was the safest method to determine the "current URI", since
- ``IncomingRequest::$uri`` might not be aware of the complete App configuration for base URLs.
diff --git a/user_guide_src/source/incoming/incomingrequest/001.php b/user_guide_src/source/incoming/incomingrequest/001.php
deleted file mode 100644
index 5513e012fb0e..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/001.php
+++ /dev/null
@@ -1,15 +0,0 @@
-request->isAJAX()) {
- // ...
- }
- }
-}
diff --git a/user_guide_src/source/incoming/incomingrequest/002.php b/user_guide_src/source/incoming/incomingrequest/002.php
deleted file mode 100644
index ec5839354911..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/002.php
+++ /dev/null
@@ -1,3 +0,0 @@
-request = $request;
- }
-}
-
-$someClass = new SomeClass(service('request'));
diff --git a/user_guide_src/source/incoming/incomingrequest/004.php b/user_guide_src/source/incoming/incomingrequest/004.php
deleted file mode 100644
index 9f54a85874cb..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/004.php
+++ /dev/null
@@ -1,11 +0,0 @@
-isAJAX()) {
- // ...
-}
-
-// Check for CLI Request
-if ($request->isCLI()) {
- // ...
-}
diff --git a/user_guide_src/source/incoming/incomingrequest/005.php b/user_guide_src/source/incoming/incomingrequest/005.php
deleted file mode 100644
index 37e6f490ef85..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/005.php
+++ /dev/null
@@ -1,4 +0,0 @@
-getMethod();
diff --git a/user_guide_src/source/incoming/incomingrequest/006.php b/user_guide_src/source/incoming/incomingrequest/006.php
deleted file mode 100644
index d2956fab66d4..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/006.php
+++ /dev/null
@@ -1,5 +0,0 @@
-isSecure()) {
- force_https();
-}
diff --git a/user_guide_src/source/incoming/incomingrequest/007.php b/user_guide_src/source/incoming/incomingrequest/007.php
deleted file mode 100644
index 922f9228c358..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/007.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getPost('foo');
diff --git a/user_guide_src/source/incoming/incomingrequest/009.php b/user_guide_src/source/incoming/incomingrequest/009.php
deleted file mode 100644
index f9c2c4a22fa1..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/009.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getJSON();
diff --git a/user_guide_src/source/incoming/incomingrequest/010.php b/user_guide_src/source/incoming/incomingrequest/010.php
deleted file mode 100644
index cf9824d8cd6e..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/010.php
+++ /dev/null
@@ -1,17 +0,0 @@
-getJsonVar('foo');
-// $data = "bar"
-
-$data = $request->getJsonVar('fizz.buzz');
-// $data = "baz"
diff --git a/user_guide_src/source/incoming/incomingrequest/011.php b/user_guide_src/source/incoming/incomingrequest/011.php
deleted file mode 100644
index a4ca2686f6e8..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/011.php
+++ /dev/null
@@ -1,8 +0,0 @@
-getJsonVar('fizz');
-// $data->buzz = "baz"
-
-$data = $request->getJsonVar('fizz', true);
-// $data = ["buzz" => "baz"]
diff --git a/user_guide_src/source/incoming/incomingrequest/012.php b/user_guide_src/source/incoming/incomingrequest/012.php
deleted file mode 100644
index 8a46e0d01114..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/012.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getRawInput();
diff --git a/user_guide_src/source/incoming/incomingrequest/013.php b/user_guide_src/source/incoming/incomingrequest/013.php
deleted file mode 100644
index 483662cbfaf7..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/013.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getRawInput());
-
-/*
- * Outputs:
- * [
- * 'Param1' => 'Value1',
- * 'Param2' => 'Value2',
- * ]
- */
diff --git a/user_guide_src/source/incoming/incomingrequest/014.php b/user_guide_src/source/incoming/incomingrequest/014.php
deleted file mode 100644
index 8455402e59b9..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/014.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getPost('email', FILTER_SANITIZE_EMAIL);
diff --git a/user_guide_src/source/incoming/incomingrequest/015.php b/user_guide_src/source/incoming/incomingrequest/015.php
deleted file mode 100644
index 81043ae80587..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/015.php
+++ /dev/null
@@ -1,12 +0,0 @@
-headers());
-
-/*
- * Outputs:
- * [
- * 'Host' => CodeIgniter\HTTP\Header,
- * 'Cache-Control' => CodeIgniter\HTTP\Header,
- * 'Accept' => CodeIgniter\HTTP\Header,
- * ]
- */
diff --git a/user_guide_src/source/incoming/incomingrequest/016.php b/user_guide_src/source/incoming/incomingrequest/016.php
deleted file mode 100644
index 3fd3b6d81ff2..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/016.php
+++ /dev/null
@@ -1,6 +0,0 @@
-header('host');
-$host = $request->header('Host');
-$host = $request->header('HOST');
diff --git a/user_guide_src/source/incoming/incomingrequest/017.php b/user_guide_src/source/incoming/incomingrequest/017.php
deleted file mode 100644
index a557845e482e..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/017.php
+++ /dev/null
@@ -1,5 +0,0 @@
-hasHeader('DNT')) {
- // Don't track something...
-}
diff --git a/user_guide_src/source/incoming/incomingrequest/018.php b/user_guide_src/source/incoming/incomingrequest/018.php
deleted file mode 100644
index feee76d3c226..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/018.php
+++ /dev/null
@@ -1,4 +0,0 @@
-getHeaderLine('accept-encoding');
diff --git a/user_guide_src/source/incoming/incomingrequest/019.php b/user_guide_src/source/incoming/incomingrequest/019.php
deleted file mode 100644
index a31ffd384853..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/019.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getUri();
diff --git a/user_guide_src/source/incoming/incomingrequest/021.php b/user_guide_src/source/incoming/incomingrequest/021.php
deleted file mode 100644
index 9a1b8601b07c..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/021.php
+++ /dev/null
@@ -1,15 +0,0 @@
-getUri();
-
-echo $uri->getScheme(); // http
-echo $uri->getAuthority(); // snoopy:password@example.com:88
-echo $uri->getUserInfo(); // snoopy:password
-echo $uri->getHost(); // example.com
-echo $uri->getPort(); // 88
-echo $uri->getPath(); // /path/to/page
-echo $uri->getRoutePath(); // path/to/page
-echo $uri->getQuery(); // foo=bar&bar=baz
-print_r($uri->getSegments()); // Array ( [0] => path [1] => to [2] => page )
-echo $uri->getSegment(1); // path
-echo $uri->getTotalSegments(); // 3
diff --git a/user_guide_src/source/incoming/incomingrequest/023.php b/user_guide_src/source/incoming/incomingrequest/023.php
deleted file mode 100644
index de3c1601647d..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/023.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getFiles();
diff --git a/user_guide_src/source/incoming/incomingrequest/024.php b/user_guide_src/source/incoming/incomingrequest/024.php
deleted file mode 100644
index cfa3525255ae..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/024.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getFile('userfile');
diff --git a/user_guide_src/source/incoming/incomingrequest/025.php b/user_guide_src/source/incoming/incomingrequest/025.php
deleted file mode 100644
index 912a709d2729..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/025.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getFileMultiple('userfile');
diff --git a/user_guide_src/source/incoming/incomingrequest/026.php b/user_guide_src/source/incoming/incomingrequest/026.php
deleted file mode 100644
index f5d9b96f3315..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/026.php
+++ /dev/null
@@ -1,7 +0,0 @@
-negotiate('language', ['en-US', 'en-GB', 'fr', 'es-mx']);
-$imageType = $request->negotiate('media', ['image/png', 'image/jpg']);
-$charset = $request->negotiate('charset', ['UTF-8', 'UTF-16']);
-$contentType = $request->negotiate('media', ['text/html', 'text/xml']);
-$encoding = $request->negotiate('encoding', ['gzip', 'compress']);
diff --git a/user_guide_src/source/incoming/incomingrequest/032.php b/user_guide_src/source/incoming/incomingrequest/032.php
deleted file mode 100644
index 27d669d99406..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/032.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getPostGet('field1');
diff --git a/user_guide_src/source/incoming/incomingrequest/033.php b/user_guide_src/source/incoming/incomingrequest/033.php
deleted file mode 100644
index 837ca9c26b40..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/033.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getGetPost('field1');
diff --git a/user_guide_src/source/incoming/incomingrequest/034.php b/user_guide_src/source/incoming/incomingrequest/034.php
deleted file mode 100644
index befc56fd551f..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/034.php
+++ /dev/null
@@ -1,4 +0,0 @@
-getCookie('some_cookie');
-$request->getCookie('some_cookie', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // with filter
diff --git a/user_guide_src/source/incoming/incomingrequest/035.php b/user_guide_src/source/incoming/incomingrequest/035.php
deleted file mode 100644
index e0c3b50803d6..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/035.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getCookie(['some_cookie', 'some_cookie2']);
diff --git a/user_guide_src/source/incoming/incomingrequest/036.php b/user_guide_src/source/incoming/incomingrequest/036.php
deleted file mode 100644
index e05381317b95..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/036.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getServer('some_data');
diff --git a/user_guide_src/source/incoming/incomingrequest/037.php b/user_guide_src/source/incoming/incomingrequest/037.php
deleted file mode 100644
index 0dabcaa7d528..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/037.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getServer(['SERVER_PROTOCOL', 'REQUEST_URI']);
diff --git a/user_guide_src/source/incoming/incomingrequest/038.php b/user_guide_src/source/incoming/incomingrequest/038.php
deleted file mode 100644
index bbb5fcc909e7..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/038.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getUserAgent();
diff --git a/user_guide_src/source/incoming/incomingrequest/039.php b/user_guide_src/source/incoming/incomingrequest/039.php
deleted file mode 100644
index 84e603fd80bc..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/039.php
+++ /dev/null
@@ -1,29 +0,0 @@
-getRawInputVar('bar'));
-// Outputs: two
-
-// foo=one&bar=two&baz[]=10&baz[]=20
-var_dump($request->getRawInputVar(['foo', 'bar']));
-/*
- * Outputs:
- * [
- * 'foo' => 'one',
- * 'bar' => 'two'
- * ]
- */
-
-// foo=one&bar=two&baz[]=10&baz[]=20
-var_dump($request->getRawInputVar('baz'));
-/*
- * Outputs:
- * [
- * '10',
- * '20'
- * ]
- */
-
-// foo=one&bar=two&baz[]=10&baz[]=20
-var_dump($request->getRawInputVar('baz.0'));
-// Outputs: 10
diff --git a/user_guide_src/source/incoming/incomingrequest/040.php b/user_guide_src/source/incoming/incomingrequest/040.php
deleted file mode 100644
index ee8639a01fdd..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/040.php
+++ /dev/null
@@ -1,16 +0,0 @@
-is('get');
-$request->is('post');
-$request->is('put');
-$request->is('delete');
-$request->is('head');
-$request->is('patch');
-$request->is('options');
-
-// Checks if it is an AJAX request. The same as `$request->isAJAX()`.
-$request->is('ajax');
-
-// Checks if it is a JSON request.
-$request->is('json');
diff --git a/user_guide_src/source/incoming/incomingrequest/041.php b/user_guide_src/source/incoming/incomingrequest/041.php
deleted file mode 100644
index b05ea2336c45..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/041.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getGet('some_data');
diff --git a/user_guide_src/source/incoming/incomingrequest/042.php b/user_guide_src/source/incoming/incomingrequest/042.php
deleted file mode 100644
index 567b26454336..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/042.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getGet('some_data', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
diff --git a/user_guide_src/source/incoming/incomingrequest/043.php b/user_guide_src/source/incoming/incomingrequest/043.php
deleted file mode 100644
index 4bd67d42046c..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/043.php
+++ /dev/null
@@ -1,4 +0,0 @@
-getGet(null, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
-// returns all GET items with string sanitation
diff --git a/user_guide_src/source/incoming/incomingrequest/044.php b/user_guide_src/source/incoming/incomingrequest/044.php
deleted file mode 100644
index 3e482e7a8ad4..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/044.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getGet(['field1', 'field2']);
diff --git a/user_guide_src/source/incoming/incomingrequest/045.php b/user_guide_src/source/incoming/incomingrequest/045.php
deleted file mode 100644
index b0b0de81e1cd..000000000000
--- a/user_guide_src/source/incoming/incomingrequest/045.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getGet(['field1', 'field2'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
diff --git a/user_guide_src/source/incoming/index.rst b/user_guide_src/source/incoming/index.rst
deleted file mode 100644
index ebcc316e10ee..000000000000
--- a/user_guide_src/source/incoming/index.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-#######################
-Controllers and Routing
-#######################
-
-Controllers handle incoming requests.
-
-.. toctree::
- :titlesonly:
-
- routing
- controllers
- filters
- controller_attributes
- auto_routing_improved
- message
- request
- incomingrequest
- content_negotiation
- methodspoofing
- restful
diff --git a/user_guide_src/source/incoming/message.rst b/user_guide_src/source/incoming/message.rst
deleted file mode 100644
index a761cd467221..000000000000
--- a/user_guide_src/source/incoming/message.rst
+++ /dev/null
@@ -1,177 +0,0 @@
-#############
-HTTP Messages
-#############
-
-The Message class provides an interface to the portions of an HTTP message that are common to both requests and
-responses, including the message body, protocol version, utilities for working with the headers, and methods for
-handling content negotiation.
-
-This class is the parent class that both the :doc:`Request Class <../incoming/request>` and the
-:doc:`Response Class <../outgoing/response>` extend from, and it is not used directly.
-
-***************
-Class Reference
-***************
-
-.. php:namespace:: CodeIgniter\HTTP
-
-.. php:class:: Message
-
- .. php:method:: getBody()
-
- :returns: The current message body
- :rtype: mixed
-
- Returns the current message body, if any has been set. If no body exists, returns null:
-
- .. literalinclude:: message/001.php
-
- .. php:method:: setBody($data)
-
- :param mixed $data: The body of the message.
- :returns: The Message|Response instance to allow methods to be chained together.
- :rtype: CodeIgniter\\HTTP\\Message|CodeIgniter\\HTTP\\Response
-
- Sets the body of the current request.
-
- .. php:method:: appendBody($data)
-
- :param mixed $data: The body of the message.
- :returns: The Message|Response instance to allow methods to be chained together.
- :rtype: CodeIgniter\\HTTP\\Message|CodeIgniter\\HTTP\\Response
-
- Appends data to the body of the current request.
-
- .. php:method:: populateHeaders()
-
- :returns: void
-
- Scans and parses the headers found in the SERVER data and stores them for later access. This is used by the
- :doc:`IncomingRequest Class <../incoming/incomingrequest>` to make the current request's headers available.
-
- The headers are any SERVER data that starts with ``HTTP_``, like ``HTTP_HOST``. Each message is converted from
- its standard uppercase and underscore format to a ucwords and dash format. The preceding ``HTTP_`` is removed
- from the string. So ``HTTP_ACCEPT_LANGUAGE`` becomes ``Accept-Language``.
-
- .. php:method:: headers()
-
- :returns: An array of all of the headers found.
- :rtype: array
-
- Returns an array of all headers found or previously set.
-
- .. php:method:: header($name)
-
- :param string $name: The name of the header you want to retrieve the value of.
- :returns: Returns a single header object. If multiple headers with the same name exist, it will return an array of header objects.
- :rtype: \CodeIgniter\\HTTP\\Header|array
-
- Allows you to retrieve the current value of a single message header. ``$name`` is the case-insensitive header
- name. While the header is converted internally as described above, you can access the header with any type of
- case:
-
- .. literalinclude:: message/002.php
-
- If the header has multiple values, ``getValue()`` will return an array of values. You can use the
- ``getValueLine()`` method to retrieve the values as a string:
-
- .. literalinclude:: message/003.php
-
- You can filter the header by passing a filter value in as the second parameter:
-
- .. literalinclude:: message/004.php
-
- .. php:method:: hasHeader($name)
-
- :param string $name: The name of the header to check.
- :returns: Returns true if it exists, false otherwise.
- :rtype: bool
-
- .. php:method:: getHeaderLine($name)
-
- :param string $name: The name of the header to retrieve.
- :returns: A string representing the header value.
- :rtype: string
-
- Returns the value(s) of the header as a string. This method allows you to easily get a string representation of
- the header values when the header has multiple values. The values are appropriately joined:
-
- .. literalinclude:: message/005.php
-
- .. php:method:: setHeader($name, $value)
-
- :param string $name: The name of the header to set the value for.
- :param mixed $value: The value to set the header to.
- :returns: The current Message|Response instance
- :rtype: CodeIgniter\\HTTP\\Message|CodeIgniter\\HTTP\\Response
-
- Sets the value of a single header. ``$name`` is the case-insensitive name of the header. If the header doesn't
- already exist in the collection, it will be created. The ``$value`` can be either a string or an array of
- strings:
-
- .. literalinclude:: message/006.php
-
- .. php:method:: removeHeader($name)
-
- :param string $name: The name of the header to remove.
- :returns: The current message instance
- :rtype: CodeIgniter\\HTTP\\Message
-
- Removes the header from the Message. ``$name`` is the case-insensitive name of the header:
-
- .. literalinclude:: message/007.php
-
- .. php:method:: appendHeader($name, $value)
-
- :param string $name: The name of the header to modify
- :param string $value: The value to add to the header.
- :returns: The current message instance
- :rtype: CodeIgniter\\HTTP\\Message
-
- Adds a value to an existing header. The header must already be an array of values instead of a single string. If
- it is a string then a LogicException will be thrown.
-
- .. literalinclude:: message/008.php
-
- .. php:method:: prependHeader($name, $value)
-
- :param string $name: The name of the header to modify
- :param string $value: The value to prepend to the header.
- :returns: The current message instance
- :rtype: CodeIgniter\\HTTP\\Message
-
- Prepends a value to an existing header. The header must already be an array of values instead of a single
- string. If it is a string then a LogicException will be thrown.
-
- .. literalinclude:: message/009.php
-
- .. php:method:: addHeader($name, $value)
-
- .. versionadded:: 4.5.0
-
- :param string $name: The name of the header to add.
- :param string $value: The value of the header.
- :returns: The current message instance
- :rtype: CodeIgniter\\HTTP\\Message
-
- Adds a header (not a header value) with the same name. Use this only when you set multiple headers with the same
- name:
-
- .. literalinclude:: message/011.php
-
- .. php:method:: getProtocolVersion()
-
- :returns: The current HTTP protocol version
- :rtype: string
-
- Returns the message's current HTTP protocol. If none has been set, it will return ``1.1``.
-
- .. php:method:: setProtocolVersion($version)
-
- :param string $version: The HTTP protocol version
- :returns: The current message instance
- :rtype: CodeIgniter\\HTTP\\Message
-
- Sets the HTTP protocol version this Message uses. Valid values are ``1.0``, ``1.1``, ``2.0`` and ``3.0``:
-
- .. literalinclude:: message/010.php
diff --git a/user_guide_src/source/incoming/message/001.php b/user_guide_src/source/incoming/message/001.php
deleted file mode 100644
index a54dc3212036..000000000000
--- a/user_guide_src/source/incoming/message/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getBody();
diff --git a/user_guide_src/source/incoming/message/002.php b/user_guide_src/source/incoming/message/002.php
deleted file mode 100644
index 0a55ae7824a9..000000000000
--- a/user_guide_src/source/incoming/message/002.php
+++ /dev/null
@@ -1,6 +0,0 @@
-header('HOST');
-$message->header('Host');
-$message->header('host');
diff --git a/user_guide_src/source/incoming/message/003.php b/user_guide_src/source/incoming/message/003.php
deleted file mode 100644
index 9d51f9a183ab..000000000000
--- a/user_guide_src/source/incoming/message/003.php
+++ /dev/null
@@ -1,22 +0,0 @@
-header('Accept-Language');
-/*
- * Outputs something like:
- * 'Accept-Language: en,en-US'
- */
-
-echo $message->header('Accept-Language')->getValue();
-/*
- * Outputs something like:
- * [
- * 'en',
- * 'en-US',
- * ]
- */
-
-echo $message->header('Accept-Language')->getValueLine();
-/*
- * Outputs something like:
- * en,en-US'
- */
diff --git a/user_guide_src/source/incoming/message/004.php b/user_guide_src/source/incoming/message/004.php
deleted file mode 100644
index 534bbcf93349..000000000000
--- a/user_guide_src/source/incoming/message/004.php
+++ /dev/null
@@ -1,3 +0,0 @@
-header('Document-URI', FILTER_SANITIZE_URL);
diff --git a/user_guide_src/source/incoming/message/005.php b/user_guide_src/source/incoming/message/005.php
deleted file mode 100644
index 5c450073a340..000000000000
--- a/user_guide_src/source/incoming/message/005.php
+++ /dev/null
@@ -1,7 +0,0 @@
-getHeaderLine('Accept-Language');
-/*
- * Outputs:
- * 'en,en-US'
- */
diff --git a/user_guide_src/source/incoming/message/006.php b/user_guide_src/source/incoming/message/006.php
deleted file mode 100644
index 74f6cde18eb0..000000000000
--- a/user_guide_src/source/incoming/message/006.php
+++ /dev/null
@@ -1,3 +0,0 @@
-setHeader('Host', 'codeigniter.com');
diff --git a/user_guide_src/source/incoming/message/007.php b/user_guide_src/source/incoming/message/007.php
deleted file mode 100644
index bd7a4f9052ce..000000000000
--- a/user_guide_src/source/incoming/message/007.php
+++ /dev/null
@@ -1,3 +0,0 @@
-removeHeader('Host');
diff --git a/user_guide_src/source/incoming/message/008.php b/user_guide_src/source/incoming/message/008.php
deleted file mode 100644
index e14ed62b3636..000000000000
--- a/user_guide_src/source/incoming/message/008.php
+++ /dev/null
@@ -1,3 +0,0 @@
-appendHeader('Accept-Language', 'en-US; q=0.8');
diff --git a/user_guide_src/source/incoming/message/009.php b/user_guide_src/source/incoming/message/009.php
deleted file mode 100644
index c6cdd1ca6d05..000000000000
--- a/user_guide_src/source/incoming/message/009.php
+++ /dev/null
@@ -1,3 +0,0 @@
-prependHeader('Accept-Language', 'en,');
diff --git a/user_guide_src/source/incoming/message/010.php b/user_guide_src/source/incoming/message/010.php
deleted file mode 100644
index b5e056ab447d..000000000000
--- a/user_guide_src/source/incoming/message/010.php
+++ /dev/null
@@ -1,3 +0,0 @@
-setProtocolVersion('1.1');
diff --git a/user_guide_src/source/incoming/message/011.php b/user_guide_src/source/incoming/message/011.php
deleted file mode 100644
index b5b2c323c513..000000000000
--- a/user_guide_src/source/incoming/message/011.php
+++ /dev/null
@@ -1,4 +0,0 @@
-addHeader('Set-Cookie', 'logged_in=no; Path=/');
-$message->addHeader('Set-Cookie', 'sessid=123456; Path=/');
diff --git a/user_guide_src/source/incoming/methodspoofing.rst b/user_guide_src/source/incoming/methodspoofing.rst
deleted file mode 100644
index c73ab0ab717b..000000000000
--- a/user_guide_src/source/incoming/methodspoofing.rst
+++ /dev/null
@@ -1,23 +0,0 @@
-####################
-HTTP Method Spoofing
-####################
-
-When working with HTML forms, you can only use GET or POST HTTP verbs. In most cases, this is just fine. However, to
-support RESTful routing, you need to support other, more correct, verbs, like DELETE or PUT. Since browsers don't
-support this, CodeIgniter provides you with a way to spoof the method that is being used. This allows you to make a POST
-request, but tell the application that it should be treated as a different request type.
-
-To spoof the method, a hidden input is added to the form with the name of ``_method``. Its value is the HTTP verb that
-you want the request to be::
-
-
-
-This form is converted into a PUT request and is a true PUT request as far as the routing and the IncomingRequest class
-are concerned.
-
-The form that you are using must be a POST request. GET requests cannot be spoofed.
-
-.. note:: Be sure to check your web server's configuration as some servers do not support all HTTP verbs with the
- default configuration, and must have additional packages enabled to work.
diff --git a/user_guide_src/source/incoming/request.rst b/user_guide_src/source/incoming/request.rst
deleted file mode 100644
index 8448ef578010..000000000000
--- a/user_guide_src/source/incoming/request.rst
+++ /dev/null
@@ -1,138 +0,0 @@
-#############
-Request Class
-#############
-
-The request class is an object-oriented representation of an HTTP request. This is meant to work for both incoming, such
-as a request to the application from a browser, and outgoing requests, like those used to send a request from the
-application to a third-party application.
-
-This class provides the common functionality they both need, but both cases have custom classes that extend from the
-Request class to add specific functionality. In practice, you will need to use these classes.
-
-See the documentation for the :doc:`IncomingRequest Class <./incomingrequest>` and
-:doc:`CURLRequest Class <../libraries/curlrequest>` for more usage details.
-
-***************
-Class Reference
-***************
-
-.. php:namespace:: CodeIgniter\HTTP
-
-.. php:class:: Request
-
- .. php:method:: getIPAddress()
-
- :returns: The user's IP address, if it can be detected. If the IP address
- is not a valid IP address, it will return ``0.0.0.0``.
- :rtype: string
-
- Returns the IP address for the current user. If the IP address is not valid, the method will return ``0.0.0.0``:
-
- .. literalinclude:: request/001.php
-
- .. important:: This method takes into account the ``Config\App::$proxyIPs`` setting and will return the client
- IP address reported by the HTTP header for the allowed IP address.
-
- .. php:method:: isValidIP($ip[, $which = ''])
-
- .. deprecated:: 4.0.5
- Use :doc:`../libraries/validation` instead.
-
- .. important:: This method is deprecated. It will be removed in future releases.
-
- :param string $ip: IP address
- :param string $which: IP protocol (``ipv4`` or ``ipv6``)
- :returns: true if the address is valid, false if not
- :rtype: bool
-
- Takes an IP address as input and returns true or false (boolean) depending on whether it is valid or not.
-
- .. note:: The ``$request->getIPAddress()`` method above automatically validates the IP address.
-
- .. literalinclude:: request/002.php
-
- Accepts an optional second string parameter of ``ipv4`` or ``ipv6`` to specify an IP format. The default checks
- for both formats.
-
- .. php:method:: getMethod()
-
- :returns: HTTP request method
- :rtype: string
-
- Returns the ``$_SERVER['REQUEST_METHOD']``.
-
- .. literalinclude:: request/003.php
-
- .. php:method:: setMethod($method)
-
- .. deprecated:: 4.0.5
- Use :php:meth:`CodeIgniter\\HTTP\\Request::withMethod()` instead.
-
- :param string $method: Sets the request method. Used when spoofing the request.
- :returns: This request
- :rtype: Request
-
- .. php:method:: withMethod($method)
-
- .. versionadded:: 4.0.5
-
- :param string $method: Sets the request method.
- :returns: New request instance
- :rtype: Request
-
- .. php:method:: getServer([$index = null[, $filter = null[, $flags = null]]])
-
- :param mixed $index: Value name
- :param int $filter: The type of filter to apply. A list of filters can be found in the `PHP manual `__.
- :param int|array $flags: Flags to apply. A list of flags can be found in the `PHP manual `__.
- :returns: ``$_SERVER`` item value if found, null if not
- :rtype: mixed
-
- This method is identical to the ``getPost()``, ``getGet()`` and ``getCookie()`` methods from the
- :doc:`IncomingRequest Class <./incomingrequest>`, only it fetches server data (``$_SERVER``):
-
- .. literalinclude:: request/004.php
-
- To return an array of multiple ``$_SERVER`` values, pass all the required keys as an array.
-
- .. literalinclude:: request/005.php
-
- .. php:method:: getEnv([$index = null[, $filter = null[, $flags = null]]])
-
- .. deprecated:: 4.4.4 This method has never worked. Use
- :php:func:`env()` instead.
-
- :param mixed $index: Value name
- :param int $filter: The type of filter to apply. A list of filters can be found in the `PHP manual `__.
- :param int|array $flags: Flags to apply. A list of flags can be found in the `PHP manual `__.
- :returns: ``$_ENV`` item value if found, null if not
- :rtype: mixed
-
- This method is identical to the ``getPost()``, ``getGet()`` and ``getCookie()`` methods from the
- :doc:`IncomingRequest Class <./incomingrequest>`, only it fetches env data (``$_ENV``):
-
- .. literalinclude:: request/006.php
-
- To return an array of multiple ``$_ENV`` values, pass all the required keys as an array.
-
- .. literalinclude:: request/007.php
-
- .. php:method:: setGlobal($method, $value)
-
- :param string $method: Method name
- :param mixed $value: Data to be added
- :returns: This request
- :rtype: Request
-
- Allows manually setting the value of a PHP global, like ``$_GET``, ``$_POST``, etc.
-
- .. php:method:: fetchGlobal($method [, $index = null[, $filter = null[, $flags = null]]])
-
- :param string $method: Input filter constant
- :param mixed $index: Value name
- :param int $filter: The type of filter to apply. A list of filters can be found in the `PHP manual `__.
- :param int|array $flags: Flags to apply. A list of flags can be found in the `PHP manual `__.
- :rtype: mixed
-
- Fetches one or more items from a global, like cookies, get, post, etc. Can optionally filter the input when you
- retrieve it by passing in a filter.
diff --git a/user_guide_src/source/incoming/request/001.php b/user_guide_src/source/incoming/request/001.php
deleted file mode 100644
index 09c19433908f..000000000000
--- a/user_guide_src/source/incoming/request/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getIPAddress();
diff --git a/user_guide_src/source/incoming/request/002.php b/user_guide_src/source/incoming/request/002.php
deleted file mode 100644
index 4b2e39489f72..000000000000
--- a/user_guide_src/source/incoming/request/002.php
+++ /dev/null
@@ -1,7 +0,0 @@
-isValidIP($ip)) {
- echo 'Not Valid';
-} else {
- echo 'Valid';
-}
diff --git a/user_guide_src/source/incoming/request/003.php b/user_guide_src/source/incoming/request/003.php
deleted file mode 100644
index d448962cb55a..000000000000
--- a/user_guide_src/source/incoming/request/003.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getMethod(); // Outputs: POST
diff --git a/user_guide_src/source/incoming/request/004.php b/user_guide_src/source/incoming/request/004.php
deleted file mode 100644
index e05381317b95..000000000000
--- a/user_guide_src/source/incoming/request/004.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getServer('some_data');
diff --git a/user_guide_src/source/incoming/request/005.php b/user_guide_src/source/incoming/request/005.php
deleted file mode 100644
index 0dabcaa7d528..000000000000
--- a/user_guide_src/source/incoming/request/005.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getServer(['SERVER_PROTOCOL', 'REQUEST_URI']);
diff --git a/user_guide_src/source/incoming/request/006.php b/user_guide_src/source/incoming/request/006.php
deleted file mode 100644
index b503574b79cc..000000000000
--- a/user_guide_src/source/incoming/request/006.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getEnv('some_data');
diff --git a/user_guide_src/source/incoming/request/007.php b/user_guide_src/source/incoming/request/007.php
deleted file mode 100644
index aa1ad285e0bd..000000000000
--- a/user_guide_src/source/incoming/request/007.php
+++ /dev/null
@@ -1,3 +0,0 @@
-getEnv(['CI_ENVIRONMENT', 'S3_BUCKET']);
diff --git a/user_guide_src/source/incoming/restful.rst b/user_guide_src/source/incoming/restful.rst
deleted file mode 100644
index 74bf80edf0a3..000000000000
--- a/user_guide_src/source/incoming/restful.rst
+++ /dev/null
@@ -1,197 +0,0 @@
-#########################
-RESTful Resource Handling
-#########################
-
-.. contents::
- :local:
- :depth: 2
-
-Representational State Transfer (REST) is an architectural style for distributed applications, first described by Roy
-Fielding in his 2000 PhD dissertation,
-`Architectural Styles and the Design of Network-based Software Architectures `_.
-That might be a bit of a dry read, and you might find Martin Fowler's
-`Richardson Maturity Model `_ a gentler introduction.
-
-REST has been interpreted, and misinterpreted, in more ways than most software architectures, and it might be easier to
-say that the more of Roy Fielding's principles that you embrace in an architecture, the more "RESTful" your application
-would be considered.
-
-CodeIgniter makes it easy to create RESTful APIs for your resources, with its resource routes and
-``ResourceController``.
-
-***************
-Resource Routes
-***************
-
-You can quickly create a handful of RESTful routes for a single resource with the ``resource()`` method. This creates
-the five most common routes needed for full CRUD of a resource: create a new resource, update an existing one, list all
-of that resource, show a single resource, and delete a single resource. The first parameter is the resource name:
-
-.. literalinclude:: restful/001.php
-
-.. note:: The ordering above is for clarity, whereas the actual order in which RouteCollection creates the routes
- ensures proper route resolution.
-
-.. important:: The routes are matched in the order they are specified, so if you have a ``photos`` resource above a GET
- route for ``photos/poll``, the ``show`` action's route from the resource line will be matched before the GET line.
- To fix this, move the GET line above the resource line so that it is matched first.
-
-The second parameter accepts an array of options that can be used to modify the routes that are generated. While these
-routes are geared toward API usage, where more methods are allowed, you can pass in the ``websafe`` option to have it
-generate update and delete methods that work with HTML forms:
-
-.. literalinclude:: restful/002.php
-
-Change the Controller Used
-==========================
-
-You can specify the controller that should be used by passing in the ``controller`` option with the name of the
-controller that should be used:
-
-.. literalinclude:: restful/003.php
-
-.. literalinclude:: restful/017.php
-
-.. literalinclude:: restful/018.php
-
-See also :ref:`controllers-namespace`.
-
-Change the Placeholder Used
-===========================
-
-By default, the ``(:segment)`` placeholder is used when a resource ID is needed. You can change this by passing in the
-``placeholder`` option with the new string to use:
-
-.. literalinclude:: restful/004.php
-
-Limit the Routes Made
-=====================
-
-You can restrict the routes generated with the ``only`` option. This should be **an array** or **comma-separated list**
-of method names that should be created. Only routes that match one of these methods will be created. The rest will be
-ignored:
-
-.. literalinclude:: restful/005.php
-
-Otherwise you can remove unused routes with the ``except`` option. This should also be **an array** or
-**comma-separated list** of method names. This option runs after ``only``:
-
-.. literalinclude:: restful/006.php
-
-Valid methods are: ``index``, ``show``, ``create``, ``update``, ``new``, ``edit`` and ``delete``.
-
-******************
-ResourceController
-******************
-
-The ``ResourceController`` provides a convenient starting point for your RESTful API, with methods that correspond to
-the resource routes above.
-
-Extend it, overriding the ``modelName`` and ``format`` properties, and then implement those methods that you want
-handled:
-
-.. literalinclude:: restful/007.php
-
-The routing for this would be:
-
-.. literalinclude:: restful/008.php
-
-****************
-Presenter Routes
-****************
-
-You can quickly create a presentation controller which aligns with a resource controller, using the ``presenter()``
-method. This creates routes for the controller methods that would return views for your resource, or process forms
-submitted from those views.
-
-It is not needed, since the presentation can be handled with a conventional controller - it is a convenience. Its usage
-is similar to the resource routing:
-
-.. literalinclude:: restful/009.php
-
-.. note:: The ordering above is for clarity, whereas the actual order in which RouteCollection creates the routes
- ensures proper route resolution.
-
-You would not have routes for ``photos`` for both a resource and a presenter controller. You need to distinguish them,
-for instance:
-
-.. literalinclude:: restful/010.php
-
-The second parameter accepts an array of options that can be used to modify the routes that are generated.
-
-Change the Controller Used
-==========================
-
-You can specify the controller that should be used by passing in the ``controller`` option with the name of the
-controller that should be used:
-
-.. literalinclude:: restful/011.php
-
-.. literalinclude:: restful/019.php
-
-.. literalinclude:: restful/020.php
-
-See also :ref:`controllers-namespace`.
-
-Change the Placeholder Used
-===========================
-
-By default, the ``(:segment)`` placeholder is used when a resource ID is needed. You can change this by passing in the
-``placeholder`` option with the new string to use:
-
-.. literalinclude:: restful/012.php
-
-Limit the Routes Made
-=====================
-
-You can restrict the routes generated with the ``only`` option. This should be **an array** or **comma-separated list**
-of method names that should be created. Only routes that match one of these methods will be created. The rest will be
-ignored:
-
-.. literalinclude:: restful/013.php
-
-Otherwise you can remove unused routes with the ``except`` option. This should also be **an array** or
-**comma-separated list** of method names. This option runs after ``only``:
-
-.. literalinclude:: restful/014.php
-
-Valid methods are: ``index``, ``show``, ``new``, ``create``, ``edit``, ``update``, ``remove`` and ``delete``.
-
-*****************
-ResourcePresenter
-*****************
-
-The ``ResourcePresenter`` provides a convenient starting point for presenting views of your resource, and processing
-data from forms in those views, with methods that align with the resource routes above.
-
-Extend it, overriding the ``modelName`` property, and then implement those methods that you want handled:
-
-.. literalinclude:: restful/015.php
-
-The routing for this would be:
-
-.. literalinclude:: restful/016.php
-
-*******************************
-Presenter/Controller Comparison
-*******************************
-
-This table presents a comparison of the default routes created by ``resource()`` and ``presenter()`` with their
-corresponding Controller functions.
-
-================ ========= ======================== ======================== ====================== ======================
-Operation Method Controller Route Presenter Route Controller Function Presenter Function
-================ ========= ======================== ======================== ====================== ======================
-**New** GET photos/new photos/new ``new()`` ``new()``
-**Create** POST photos photos ``create()`` ``create()``
-Create (alias) POST photos/create ``create()``
-**List** GET photos photos ``index()`` ``index()``
-**Show** GET photos/(:segment) photos/(:segment) ``show($id = null)`` ``show($id = null)``
-Show (alias) GET photos/show/(:segment) ``show($id = null)``
-**Edit** GET photos/(:segment)/edit photos/edit/(:segment) ``edit($id = null)`` ``edit($id = null)``
-**Update** PUT/PATCH photos/(:segment) ``update($id = null)``
-Update (websafe) POST photos/(:segment) photos/update/(:segment) ``update($id = null)`` ``update($id = null)``
-**Remove** GET photos/remove/(:segment) ``remove($id = null)``
-**Delete** DELETE photos/(:segment) ``delete($id = null)``
-Delete (websafe) POST photos/(:segment)/delete photos/delete/(:segment) ``delete($id = null)`` ``delete($id = null)``
-================ ========= ======================== ======================== ====================== ======================
diff --git a/user_guide_src/source/incoming/restful/001.php b/user_guide_src/source/incoming/restful/001.php
deleted file mode 100644
index 3244b799ff91..000000000000
--- a/user_guide_src/source/incoming/restful/001.php
+++ /dev/null
@@ -1,13 +0,0 @@
-resource('photos');
-
-// Equivalent to the following:
-$routes->get('photos/new', 'Photos::new');
-$routes->post('photos', 'Photos::create');
-$routes->get('photos', 'Photos::index');
-$routes->get('photos/(:segment)', 'Photos::show/$1');
-$routes->get('photos/(:segment)/edit', 'Photos::edit/$1');
-$routes->put('photos/(:segment)', 'Photos::update/$1');
-$routes->patch('photos/(:segment)', 'Photos::update/$1');
-$routes->delete('photos/(:segment)', 'Photos::delete/$1');
diff --git a/user_guide_src/source/incoming/restful/002.php b/user_guide_src/source/incoming/restful/002.php
deleted file mode 100644
index 67ce23393964..000000000000
--- a/user_guide_src/source/incoming/restful/002.php
+++ /dev/null
@@ -1,7 +0,0 @@
-resource('photos', ['websafe' => 1]);
-
-// The following equivalent routes are created:
-$routes->post('photos/(:segment)/delete', 'Photos::delete/$1');
-$routes->post('photos/(:segment)', 'Photos::update/$1');
diff --git a/user_guide_src/source/incoming/restful/003.php b/user_guide_src/source/incoming/restful/003.php
deleted file mode 100644
index 6f255282622d..000000000000
--- a/user_guide_src/source/incoming/restful/003.php
+++ /dev/null
@@ -1,5 +0,0 @@
-resource('photos', ['controller' => 'Gallery']);
-// Would create routes like:
-$routes->get('photos', '\App\Controllers\Gallery::index');
diff --git a/user_guide_src/source/incoming/restful/004.php b/user_guide_src/source/incoming/restful/004.php
deleted file mode 100644
index 540fbb84aeed..000000000000
--- a/user_guide_src/source/incoming/restful/004.php
+++ /dev/null
@@ -1,6 +0,0 @@
-resource('photos', ['placeholder' => '(:num)']);
-
-// Generates routes like:
-$routes->get('photos/(:num)', 'Photos::show/$1');
diff --git a/user_guide_src/source/incoming/restful/005.php b/user_guide_src/source/incoming/restful/005.php
deleted file mode 100644
index 4ac8480f8ca2..000000000000
--- a/user_guide_src/source/incoming/restful/005.php
+++ /dev/null
@@ -1,3 +0,0 @@
-resource('photos', ['only' => ['index', 'show']]);
diff --git a/user_guide_src/source/incoming/restful/006.php b/user_guide_src/source/incoming/restful/006.php
deleted file mode 100644
index a1a98809adc1..000000000000
--- a/user_guide_src/source/incoming/restful/006.php
+++ /dev/null
@@ -1,3 +0,0 @@
-resource('photos', ['except' => 'new,edit']);
diff --git a/user_guide_src/source/incoming/restful/007.php b/user_guide_src/source/incoming/restful/007.php
deleted file mode 100644
index 930c61f28e8c..000000000000
--- a/user_guide_src/source/incoming/restful/007.php
+++ /dev/null
@@ -1,18 +0,0 @@
-respond($this->model->findAll());
- }
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/restful/008.php b/user_guide_src/source/incoming/restful/008.php
deleted file mode 100644
index d1a6c08dd03c..000000000000
--- a/user_guide_src/source/incoming/restful/008.php
+++ /dev/null
@@ -1,3 +0,0 @@
-resource('photos');
diff --git a/user_guide_src/source/incoming/restful/009.php b/user_guide_src/source/incoming/restful/009.php
deleted file mode 100644
index 25e069258781..000000000000
--- a/user_guide_src/source/incoming/restful/009.php
+++ /dev/null
@@ -1,15 +0,0 @@
-presenter('photos');
-
-// Equivalent to the following:
-$routes->get('photos/new', 'Photos::new');
-$routes->post('photos/create', 'Photos::create');
-$routes->post('photos', 'Photos::create'); // alias
-$routes->get('photos', 'Photos::index');
-$routes->get('photos/show/(:segment)', 'Photos::show/$1');
-$routes->get('photos/(:segment)', 'Photos::show/$1'); // alias
-$routes->get('photos/edit/(:segment)', 'Photos::edit/$1');
-$routes->post('photos/update/(:segment)', 'Photos::update/$1');
-$routes->get('photos/remove/(:segment)', 'Photos::remove/$1');
-$routes->post('photos/delete/(:segment)', 'Photos::delete/$1');
diff --git a/user_guide_src/source/incoming/restful/010.php b/user_guide_src/source/incoming/restful/010.php
deleted file mode 100644
index b36c7ed8973e..000000000000
--- a/user_guide_src/source/incoming/restful/010.php
+++ /dev/null
@@ -1,4 +0,0 @@
-resource('api/photo');
-$routes->presenter('admin/photos');
diff --git a/user_guide_src/source/incoming/restful/011.php b/user_guide_src/source/incoming/restful/011.php
deleted file mode 100644
index e08078d47e31..000000000000
--- a/user_guide_src/source/incoming/restful/011.php
+++ /dev/null
@@ -1,5 +0,0 @@
-presenter('photos', ['controller' => 'Gallery']);
-// Would create routes like:
-$routes->get('photos', '\App\Controllers\Gallery::index');
diff --git a/user_guide_src/source/incoming/restful/012.php b/user_guide_src/source/incoming/restful/012.php
deleted file mode 100644
index 0bd42b5120f0..000000000000
--- a/user_guide_src/source/incoming/restful/012.php
+++ /dev/null
@@ -1,6 +0,0 @@
-presenter('photos', ['placeholder' => '(:num)']);
-
-// Generates routes like:
-$routes->get('photos/(:num)', 'Photos::show/$1');
diff --git a/user_guide_src/source/incoming/restful/013.php b/user_guide_src/source/incoming/restful/013.php
deleted file mode 100644
index 1a3cc23a9004..000000000000
--- a/user_guide_src/source/incoming/restful/013.php
+++ /dev/null
@@ -1,3 +0,0 @@
-presenter('photos', ['only' => ['index', 'show']]);
diff --git a/user_guide_src/source/incoming/restful/014.php b/user_guide_src/source/incoming/restful/014.php
deleted file mode 100644
index 0d88d4ba5cdc..000000000000
--- a/user_guide_src/source/incoming/restful/014.php
+++ /dev/null
@@ -1,3 +0,0 @@
-presenter('photos', ['except' => 'new,edit']);
diff --git a/user_guide_src/source/incoming/restful/015.php b/user_guide_src/source/incoming/restful/015.php
deleted file mode 100644
index 0600f7c686ef..000000000000
--- a/user_guide_src/source/incoming/restful/015.php
+++ /dev/null
@@ -1,17 +0,0 @@
-model->findAll());
- }
-
- // ...
-}
diff --git a/user_guide_src/source/incoming/restful/016.php b/user_guide_src/source/incoming/restful/016.php
deleted file mode 100644
index d0511180ee22..000000000000
--- a/user_guide_src/source/incoming/restful/016.php
+++ /dev/null
@@ -1,3 +0,0 @@
-presenter('photos');
diff --git a/user_guide_src/source/incoming/restful/017.php b/user_guide_src/source/incoming/restful/017.php
deleted file mode 100644
index 853748f84527..000000000000
--- a/user_guide_src/source/incoming/restful/017.php
+++ /dev/null
@@ -1,5 +0,0 @@
-resource('photos', ['controller' => '\App\Gallery']);
-// Would create routes like:
-$routes->get('photos', '\App\Gallery::index');
diff --git a/user_guide_src/source/incoming/restful/018.php b/user_guide_src/source/incoming/restful/018.php
deleted file mode 100644
index 6951d07b07b3..000000000000
--- a/user_guide_src/source/incoming/restful/018.php
+++ /dev/null
@@ -1,7 +0,0 @@
-resource('photos', ['namespace' => '', 'controller' => Gallery::class]);
-// Would create routes like:
-$routes->get('photos', '\App\Controllers\Gallery::index');
diff --git a/user_guide_src/source/incoming/restful/019.php b/user_guide_src/source/incoming/restful/019.php
deleted file mode 100644
index 09885e7f0039..000000000000
--- a/user_guide_src/source/incoming/restful/019.php
+++ /dev/null
@@ -1,5 +0,0 @@
-presenter('photos', ['controller' => '\App\Gallery']);
-// Would create routes like:
-$routes->get('photos', '\App\Gallery::index');
diff --git a/user_guide_src/source/incoming/restful/020.php b/user_guide_src/source/incoming/restful/020.php
deleted file mode 100644
index ddd67cc22d93..000000000000
--- a/user_guide_src/source/incoming/restful/020.php
+++ /dev/null
@@ -1,7 +0,0 @@
-presenter('photos', ['namespace' => '', 'controller' => Gallery::class]);
-// Would create routes like:
-$routes->get('photos', '\App\Controllers\Gallery::index');
diff --git a/user_guide_src/source/incoming/routing.rst b/user_guide_src/source/incoming/routing.rst
deleted file mode 100644
index ef79e9ee12dd..000000000000
--- a/user_guide_src/source/incoming/routing.rst
+++ /dev/null
@@ -1,1041 +0,0 @@
-###########
-URI Routing
-###########
-
-.. contents::
- :local:
- :depth: 3
-
-What is URI Routing?
-********************
-
-URI Routing associates a URI with a controller's method.
-
-CodeIgniter has two kinds of routing. One is **Defined Route Routing**, and the other is **Auto Routing**. With Defined
-Route Routing, you can define routes manually. It allows flexible URLs. Auto Routing automatically routes HTTP requests
-based on conventions and executes the corresponding controller methods. There is no need to define routes manually.
-
-First, let's look at Defined Route Routing. If you want to use Auto Routing, see :ref:`auto-routing-improved`.
-
-.. _defined-route-routing:
-
-Setting Routing Rules
-*********************
-
-Routing rules are defined in the **app/Config/Routes.php** file. In it you'll see that it creates an instance of the
-RouteCollection class (``$routes``) that permits you to specify your own routing criteria. Routes can be specified using
-placeholders or Regular Expressions.
-
-When you specify a route, you choose a method corresponding to HTTP verbs (request method). If you expect a GET request,
-you use the ``get()`` method:
-
-.. literalinclude:: routing/001.php
-
-A route takes the **Route Path** (the URI path relative to the BaseURL, here ``/``) on the left, and maps it to the
-**Route Handler** (the controller and method, here ``Home::index``) on the right, along with any parameters that should
-be passed to the controller.
-
-The controller and method should be listed in the same way that you would use a static method, by separating the class
-and its method with a double-colon, like ``Users::list``.
-
-If that method requires parameters to be passed to it, then they would be listed after the method name, separated by
-forward slashes:
-
-.. literalinclude:: routing/002.php
-
-Examples
-========
-
-Here are a few basic routing examples.
-
-A URL containing the word **journals** in the first segment will be mapped to the ``\App\Controllers\Blogs`` class, and
-the :ref:`default method `, which is usually ``index()``:
-
-.. literalinclude:: routing/006.php
-
-A URL containing the segments **blog/joe** will be mapped to the ``\App\Controllers\Blogs`` class and the ``users()``
-method. The ID will be set to ``34``:
-
-.. literalinclude:: routing/007.php
-
-A URL with **product** as the first segment and anything in the second will be mapped to the
-``\App\Controllers\Catalog`` class and the ``productLookup()`` method:
-
-.. literalinclude:: routing/008.php
-
-A URL with **product** as the first segment and a number in the second will be mapped to the
-``\App\Controllers\Catalog`` class and the ``productLookupByID()`` method, passing in the match as a variable to the
-method:
-
-.. literalinclude:: routing/009.php
-
-.. _routing-http-verb-routes:
-
-HTTP verb Routes
-================
-
-You can use any standard HTTP verb (GET, POST, PUT, DELETE, OPTIONS, etc.):
-
-.. literalinclude:: routing/003.php
-
-You can supply multiple verbs that a route should match by passing them in as an array to the ``match()`` method:
-
-.. literalinclude:: routing/004.php
-
-Specifying Route Handlers
-=========================
-
-.. _controllers-namespace:
-
-Controller's Namespace
-----------------------
-
-When you specify a controller and method name as a string, if a controller is written without a leading ``\``, the
-:ref:`routing-default-namespace` will be prepended:
-
-.. literalinclude:: routing/063.php
-
-If you put ``\`` at the beginning, it is treated as a fully qualified class name:
-
-.. literalinclude:: routing/064.php
-
-You can also specify the namespace with the ``namespace`` option:
-
-.. literalinclude:: routing/038.php
-
-See :ref:`assigning-namespace` for details.
-
-Array Callable Syntax
----------------------
-
-.. versionadded:: 4.2.0
-
-Since v4.2.0, you can use array callable syntax to specify the controller:
-
-.. literalinclude:: routing/013.php
- :lines: 2-
-
-Or using the ``use`` keyword:
-
-.. literalinclude:: routing/014.php
- :lines: 2-
-
-If you forget to add ``use App\Controllers\Home;``, the controller classname is interpreted as ``\Home``, not
-``App\Controllers\Home``.
-
-.. note:: When you use Array Callable Syntax, the classname is always interpreted as a fully qualified classname. So
- :ref:`routing-default-namespace` and :ref:`namespace option ` have no effect.
-
-Array Callable Syntax and Placeholders
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-If there are placeholders, it will automatically set the parameters in the specified order:
-
-.. literalinclude:: routing/015.php
- :lines: 2-
-
-But the auto-configured parameters may not be correct if you use regular expressions in routes. In such a case, you can
-specify the parameters manually:
-
-.. literalinclude:: routing/016.php
- :lines: 2-
-
-Using Closures
---------------
-
-You can use an anonymous function, or Closure, as the destination that a route maps to. This function will be executed
-when the user visits that URI. This is handy for quickly executing small tasks, or even just showing a simple view:
-
-.. literalinclude:: routing/020.php
-
-Specifying Route Paths
-======================
-
-Placeholders
-------------
-
-A typical route might look something like this:
-
-.. literalinclude:: routing/005.php
-
-In a route, the first parameter contains the URI to be matched, while the second parameter contains the destination it
-should be routed to. In the above example, if the literal word "product" is found in the first segment of the URL path,
-and a number is found in the second segment, the ``Catalog`` class and the ``productLookup`` method are used instead.
-
-Placeholders are simply strings that represent a Regular Expression pattern. During the routing process, these
-placeholders are replaced with the value of the Regular Expression. They are primarily used for readability.
-
-The following placeholders are available for you to use in your routes:
-
-============ ===========================================================================================================
-Placeholders Description
-============ ===========================================================================================================
-(:any) will match all characters from that point to the end of the URI. This may include multiple URI segments.
-(:segment) will match any character except for a forward slash (``/``) restricting the result to a single segment.
-(:num) will match any positive integer.
-(:alpha) will match any string of alphabetic characters.
-(:alphanum) will match any string of alphabetic characters or integers, or any combination of the two.
-(:hash) is the same as ``(:segment)``, but can be used to easily see which routes use hashed ids.
-============ ===========================================================================================================
-
-.. note:: ``{locale}`` cannot be used as a placeholder or other part of the route, as it is reserved for use in
- :doc:`localization `.
-
-.. _routing-placeholder-any:
-
-The Behavior of (:any)
-^^^^^^^^^^^^^^^^^^^^^^
-
-Note that a single ``(:any)`` will match multiple segments in the URL if present.
-
-For example, the route:
-
-.. literalinclude:: routing/010.php
-
-will match **product/123**, **product/123/456**, **product/123/456/789** and so on.
-
-By default, in the above example, if the ``$1`` placeholder contains a slash (``/``), it will still be split into
-multiple parameters when passed to ``Catalog::productLookup()``.
-
-.. note:: Since v4.5.0, you can change the behavior with the config option. See
- :ref:`multiple-uri-segments-as-one-parameter` for details.
-
-The implementation in the Controller should take into account the maximum parameters:
-
-.. literalinclude:: routing/011.php
-
-Or you can use
-`variable-length argument lists `_:
-
-.. literalinclude:: routing/068.php
-
-.. important:: Do not put any placeholder after ``(:any)``, because the number of parameters passed to the controller
- method may change.
-
-If matching multiple segments is not the intended behavior, ``(:segment)`` should be used when defining the routes. With
-the example URLs from above:
-
-.. literalinclude:: routing/012.php
-
-will only match **product/123** and generate 404 errors for the other examples.
-
-Custom Placeholders
--------------------
-
-You can create your own placeholders that can be used in your routes file to fully customize the experience and
-readability.
-
-You add new placeholders with the ``addPlaceholder()`` method. The first parameter is the string to be used as the
-placeholder. The second parameter is the Regular Expression pattern it should be replaced with. This must be called
-before you add the route:
-
-.. literalinclude:: routing/017.php
-
-Regular Expressions
--------------------
-
-If you prefer, you can use regular expressions to define your routing rules. Any valid regular expression is allowed, as
-are back-references.
-
-.. important:: If you use back-references, you must use the dollar syntax rather than the double backslash syntax. A
- typical RegEx route might look something like this:
-
- .. literalinclude:: routing/018.php
-
-In the above example, a URI similar to **products/shirts/123** would instead call the ``show()`` method of the
-``Products`` controller class, with the original first and second segments passed as arguments to it.
-
-With regular expressions, you can also catch a segment containing a forward slash (``/``), which would usually represent
-the delimiter between multiple segments.
-
-For example, if a user accesses a password-protected area of your web application and you wish to be able to redirect
-them back to the same page after they log in, you may find this example useful:
-
-.. literalinclude:: routing/019.php
-
-By default, in the above example, if the ``$1`` placeholder contains a slash (``/``), it will still be split into
-multiple parameters when passed to ``Auth::login()``.
-
-.. note:: Since v4.5.0, you can change the behavior with the config option. See
- :ref:`multiple-uri-segments-as-one-parameter` for details.
-
-For those of you who don't know regular expressions and want to learn more about them,
-`regular-expressions.info `_ might be a good starting point.
-
-.. note:: You can also mix and match placeholders with regular expressions.
-
-.. _view-routes:
-
-View Routes
-===========
-
-.. versionadded:: 4.3.0
-
-If you just want to render a view that has no logic associated with it, you can use the ``view()`` method. This is
-always treated as a GET request. This method accepts the name of the view to load as the second parameter.
-
-.. literalinclude:: routing/065.php
-
-If you use placeholders within your route, you can access them within the view in a special variable, ``$segments``.
-They are available as an array, indexed in the order they appear in the route.
-
-.. literalinclude:: routing/066.php
-
-.. _redirecting-routes:
-
-Redirecting Routes
-==================
-
-Any site that lives long enough is bound to have pages that move. You can specify routes that should redirect to other
-routes with the ``addRedirect()`` method. The first parameter is the URI pattern for the old route. The second parameter
-is either the new URI to redirect to, or the name of a named route. The third parameter is the HTTP status code that
-should be sent along with the redirect. The default value is ``302``, which is a temporary redirect and is recommended
-in most cases:
-
-.. literalinclude:: routing/022.php
-
-.. note:: Since v4.2.0, ``addRedirect()`` can use placeholders.
-
-If a redirect route is matched during a page load, the user will be immediately redirected to the new page before a
-controller can be loaded.
-
-Environment Restrictions
-========================
-
-You can create a set of routes that will only be viewable in a certain environment. This allows you to create tools that
-only the developer can use on their local machines that are not reachable on testing or production servers. This can be
-done with the ``environment()`` method. The first parameter is the name of the environment. Any routes defined within
-this closure are only accessible from the given environment:
-
-.. literalinclude:: routing/028.php
-
-Routes with any HTTP verbs
-==========================
-
-.. important:: This method exists only for backward compatibility. Do not use it in new projects. Even if you are
- already using it, we recommend that you use another, more appropriate method.
-
-.. warning:: While the ``add()`` method seems to be convenient, it is recommended to always use the HTTP-verb-based
- routes, described above, as it is more secure. If you use the :doc:`CSRF protection `, it does
- not protect **GET** requests. If the URI specified in the ``add()`` method is accessible by the GET method, the CSRF
- protection will not work.
-
-It is possible to define a route with any HTTP verb. You can use the ``add()`` method:
-
-.. literalinclude:: routing/031.php
-
-.. note:: Using the HTTP-verb-based routes will also provide a slight performance increase, since only routes that match
- the current request method are stored, resulting in fewer routes to scan through when trying to find a match.
-
-Mapping Multiple Routes
-=======================
-
-.. important:: This method exists only for backward compatibility. Do not use it in new projects. Even if you are
- already using it, we recommend that you use another, more appropriate method.
-
-.. warning:: Like ``add()``, the ``map()`` method is not recommended because it calls ``add()`` internally.
-
-While the ``add()`` method is simple to use, it is often handier to work with multiple routes at once, using the
-``map()`` method. Instead of calling the ``add()`` method for each route that you need to add, you can define an array
-of routes and then pass it as the first parameter to the ``map()`` method:
-
-.. literalinclude:: routing/021.php
-
-.. _command-line-only-routes:
-
-Command-Line Only Routes
-========================
-
-.. note:: It is recommended to use Spark Commands for CLI scripts instead of calling controllers via CLI. See the
- :doc:`../cli/cli_commands` page for detailed information.
-
-Any route created by any of the HTTP-verb-based route methods will also be inaccessible from the CLI, but routes created
-by the ``add()`` method will still be available from the command line.
-
-You can create routes that work only from the command line, and are inaccessible from the web browser, with the
-``cli()`` method:
-
-.. literalinclude:: routing/032.php
-
-.. warning:: If you enable :ref:`auto-routing-legacy` and place the command file in **app/Controllers**, anyone could
- access the command with the help of Auto Routing (Legacy) via HTTP.
-
-Global Options
-**************
-
-All of the methods for creating a route (``get()``, ``post()``, :doc:`resource() `, etc.) can take an array of
-options that can modify the generated routes, or further restrict them. The ``$options`` array is always the last
-parameter:
-
-.. literalinclude:: routing/033.php
-
-.. _applying-filters:
-
-Applying Filters
-================
-
-You can alter the behavior of specific routes by supplying filters to run before or after the controller. This is
-especially handy during authentication or API logging.
-
-The value for the filter can be a string or an array of strings:
-
-* matching the aliases defined in **app/Config/Filters.php**.
-* filter classnames
-
-See :ref:`Controller Filters ` for more information on defining aliases.
-
-.. Warning:: If you set filters to routes in **app/Config/Routes.php**
- (not in **app/Config/Filters.php**), it is recommended to disable Auto Routing (Legacy). When
- :ref:`auto-routing-legacy` is enabled, it may be possible that a controller can be accessed via a different URL than
- the configured route, in which case the filter you specified for the route will not be applied. See
- :ref:`use-defined-routes-only` to disable auto-routing.
-
-Alias Filter
-------------
-
-You specify an alias :ref:`defined in app/Config/Filters.php ` for the filter value:
-
-.. literalinclude:: routing/034.php
-
-You may also supply arguments to be passed to the alias filter's ``before()`` and ``after()`` methods:
-
-.. literalinclude:: routing/035.php
-
-Classname Filter
-----------------
-
-.. versionadded:: 4.1.5
-
-You can specify a filter classname for the filter value:
-
-.. literalinclude:: routing/036.php
-
-.. _multiple-filters:
-
-Multiple Filters
-----------------
-
-.. versionadded:: 4.1.5
-
-.. important:: Since v4.5.0, *Multiple Filters* are always enabled. Prior to v4.5.0, *Multiple Filters* were disabled by
- default. If you want to use them prior to v4.5.0, see
- :ref:`Upgrading from 4.1.4 to 4.1.5 ` for the details.
-
-You can specify an array for the filter value:
-
-.. literalinclude:: routing/037.php
-
-Filter Arguments
-^^^^^^^^^^^^^^^^
-
-Additional arguments may be passed to a filter:
-
-.. literalinclude:: routing/067.php
-
-In this example, the array ``['dual', 'noreturn']`` will be passed in ``$arguments`` to the filter's ``before()`` and
-``after()`` implementation methods.
-
-.. _assigning-namespace:
-
-Assigning Namespace
-===================
-
-While a :ref:`routing-default-namespace` will be prepended to the generated controllers, you can also specify a
-different namespace to be used in any options array, with the ``namespace`` option. The value should be the namespace
-you want modified:
-
-.. literalinclude:: routing/038.php
-
-The new namespace is only applied during that call for any methods that create a single route, like get, post, etc. For
-any methods that create multiple routes, the new namespace is attached to all routes generated by that function or, in
-the case of ``group()``, all routes generated while in the closure.
-
-Limit to Hostname
-=================
-
-You can restrict groups of routes to function only in certain domains or sub-domains of your application by passing the
-"hostname" option along with the desired domain to allow it on as part of the options array:
-
-.. literalinclude:: routing/039.php
-
-This example would only allow the specified hosts to work if the domain exactly matched **accounts.example.com**. It
-would not work under the main site at **example.com**.
-
-.. note::
-
- The ``hostname`` option is compared against the full ``HTTP_HOST`` value of the request, including the port when one
- is present. When your application is served on a non-standard port (for example ``localhost:8080``, behind Docker,
- or when using ``php spark serve``), you must include the port in the ``hostname`` option for the routes to match.
- For example, ``['hostname' => 'localhost:8080']`` matches only requests to ``localhost:8080``.
-
-Restrict by Multiple Hostnames
-------------------------------
-
-.. versionadded:: 4.6.0
-
-You can also restrict by multiple hostnames, e.g.:
-
-.. literalinclude:: routing/073.php
-
-Limit to Subdomains
-===================
-
-When the ``subdomain`` option is present, the system will restrict the routes to only be available on that sub-domain.
-The route will only be matched if the subdomain is the one the application is being viewed through:
-
-.. literalinclude:: routing/040.php
-
-You can restrict it to any subdomain by setting the value to an asterisk (``*``). If you are viewing from a URL that
-does not have any subdomain present, this will not be matched:
-
-.. literalinclude:: routing/041.php
-
-.. important:: The system is not perfect and should be tested for your specific domain before being used in production.
- Most domains should work fine, but some edge cases, especially with a period in the domain itself (not used to
- separate suffixes or www) can potentially lead to false positives.
-
-Offsetting the Matched Parameters
-=================================
-
-You can offset the matched parameters in your route by any numeric value with the ``offset`` option, with the value
-being the number of segments to offset.
-
-This can be beneficial when developing APIs with the first URI segment being the version number. It can also be used
-when the first parameter is a language string:
-
-.. literalinclude:: routing/042.php
-
-.. _reverse-routing:
-
-Reverse Routing
-***************
-
-Reverse routing allows you to define the controller and method, as well as any parameters, that a link should go to, and
-have the router look up the current route to it. This allows route definitions to change without you having to update
-your application code. This is typically used within views to create links.
-
-For example, if you have a route to a photo gallery that you want to link to, you can use the :php:func:`url_to()`
-helper function to get the route that should be used. The first parameter is the fully qualified Controller and method,
-separated by a double colon (``::``), much like you would use when writing the initial route itself. Any parameters that
-should be passed to the route are passed in next:
-
-.. literalinclude:: routing/029.php
-
-.. _using-named-routes:
-
-Named Routes
-************
-
-You can name routes to make your application less fragile. This applies a name to a route that can be called later, and
-even if the route definition changes, all of the links in your application built with :php:func:`url_to()` will still
-work without you having to make any changes. A route is named by passing in the ``as`` option with the name of the
-route:
-
-.. literalinclude:: routing/030.php
-
-This has the added benefit of making the views more readable, too.
-
-.. note:: By default, all defined routes have names matching their paths, with placeholders replaced by their
- corresponding regular expressions. For example, if you define a route like
- ``$routes->get('edit/(:num)', 'PostController::edit/$1');``, you can generate the corresponding URL using
- ``route_to('edit/([0-9]+)', 12)``.
-
-.. warning:: According to :ref:`routing-priority`, if an unnamed route is defined first (e.g.,
- ``$routes->get('edit', 'PostController::edit');``) and another named route is defined later with the same name as
- the path of the first route (e.g., ``$routes->get('edit/(:num)', 'PostController::edit/$1', ['as' => 'edit']);``),
- the second route will not be registered because its name will conflict with the automatically assigned name of the
- first route.
-
-Grouping Routes
-***************
-
-You can group your routes under a common name with the ``group()`` method. The group name becomes a segment that appears
-prior to the routes defined inside of the group. This allows you to reduce the typing needed to build out an extensive
-set of routes that all share the opening string, like when building an admin area:
-
-.. literalinclude:: routing/023.php
-
-This would prefix the **users** and **blog** URIs with **admin**, handling URLs like **admin/users** and **admin/blog**.
-
-Setting Namespace
-=================
-
-If you need to assign options to a group, like :ref:`assigning-namespace`, do it before the callback:
-
-.. literalinclude:: routing/024.php
-
-This would handle a resource route to the ``App\API\v1\Users`` controller with the **api/users** URI.
-
-Setting Filters
-===============
-
-You can also use a specific :doc:`filter ` for a group of routes. This will always run the filter before or
-after the controller. This is especially handy during authentication or API logging:
-
-.. literalinclude:: routing/025.php
-
-The value for the filter must match one of the aliases defined within **app/Config/Filters.php**.
-
-.. note:: Prior to v4.5.4, due to a bug, filters passed to the ``group()`` were not merged into the filters passed to
- the inner routes.
-
-Setting Other Options
-=====================
-
-At some point, you may want to group routes for the purpose of applying filters or other route config options like
-namespace, subdomain, etc. Without necessarily needing to add a prefix to the group, you can pass an empty string in
-place of the prefix and the routes in the group will be routed as though the group never existed but with the given
-route config options:
-
-.. literalinclude:: routing/027.php
-
-.. _routing-nesting-groups:
-
-Nesting Groups
-==============
-
-It is possible to nest groups within groups for finer organization if you need it:
-
-.. literalinclude:: routing/026.php
-
-This would handle the URL at **admin/users/list**.
-
-The ``filter`` option passed to the outer ``group()`` is merged with the inner ``group()`` filter option. The above code
-runs ``myfilter1:config`` for the route ``admin``, and ``myfilter1:config`` and ``myfilter2:region`` for the route
-``admin/users/list``.
-
-.. note:: Prior to v4.6.0, the same filter could not be run multiple times with different arguments.
-
-Any other overlapping options passed to the inner ``group()`` will overwrite their values.
-
-.. note:: Prior to v4.5.0, due to a bug, options passed to the outer ``group()`` were not merged with the inner
- ``group()`` options.
-
-.. _routing-priority:
-
-Route Priority
-**************
-
-Routes are registered in the routing table in the order in which they are defined. This means that when a URI is
-accessed, the first matching route will be executed.
-
-.. warning:: If a route path is defined more than once with different handlers, only the first defined route is
- registered.
-
-You can check registered routes in the routing table by running the :ref:`spark routes ` command.
-
-Changing Route Priority
-=======================
-
-When working with modules, it can be a problem if the routes in the application contain wildcards. Then the module
-routes will not be processed correctly. You can solve this problem by lowering the priority of route processing using
-the ``priority`` option. The parameter accepts positive integers and zero. The higher the number specified in the
-``priority``, the lower the route priority in the processing queue:
-
-.. literalinclude:: routing/043.php
-
-To disable this functionality, you must call the method with the parameter ``false``:
-
-.. literalinclude:: routing/044.php
-
-.. note:: By default, all routes have a priority of 0. Negative integers will be cast to the absolute value.
-
-.. _routes-configuration-options:
-
-Routes Configuration Options
-****************************
-
-The RouteCollection class provides several options that affect all routes, and can be modified to meet your
-application's needs. These options are available in **app/Config/Routing.php**.
-
-.. note:: The config file **app/Config/Routing.php** was added in v4.4.0. In previous versions, the setter methods were
- used in **app/Config/Routes.php** to change settings.
-
-.. _routing-default-namespace:
-
-Default Namespace
-=================
-
-When matching a controller to a route, the router will add the default namespace value to the front of the controller
-specified by the route. By default, this value is ``App\Controllers``.
-
-If you set the value to an empty string (``''``), it leaves each route to specify the fully namespaced controller:
-
-.. literalinclude:: routing/045.php
-
-If your controllers are not explicitly namespaced, there is no need to change this. If you namespace your controllers,
-then you can change this value to save typing:
-
-.. literalinclude:: routing/046.php
-
-.. _routing-default-method:
-
-Default Method
-==============
-
-This setting is used when the route handler only has the controller name and no method name listed. The default value is
-``index``. ::
-
- // In app/Config/Routing.php
- public string $defaultMethod = 'index';
-
-.. note:: The ``$defaultMethod`` is also common with Auto Routing. See
- :ref:`Auto Routing (Improved) ` or
- :ref:`Auto Routing (Legacy) `.
-
-If you define the following route::
-
- $routes->get('/', 'Home');
-
-the ``index()`` method of the ``App\Controllers\Home`` controller is executed when the route matches.
-
-.. note:: Method names beginning with ``_`` cannot be used as the default method. However, starting with v4.5.0, the
- ``__invoke`` method is allowed.
-
-Translate URI Dashes
-====================
-
-This option enables you to automatically replace dashes (``-``) with underscores in the controller and method URI
-segments when used in Auto Routing, thus saving you additional route entries if you need to do that. This is required
-because the dash isn't a valid class or method name character and would cause a fatal error if you try to use it:
-
-.. literalinclude:: routing/049.php
-
-.. note:: When using Auto Routing (Improved), prior to v4.4.0, if ``$translateURIDashes`` is true, two URIs correspond
- to a single controller method, one URI for dashes (e.g., **foo-bar**) and one URI for underscores (e.g.,
- **foo_bar**). This was incorrect behavior. Since v4.4.0, the URI for underscores (**foo_bar**) is not accessible.
-
-.. _use-defined-routes-only:
-
-Use Defined Routes Only
-=======================
-
-Since v4.2.0, auto-routing is disabled by default.
-
-When no defined route is found that matches the URI, the system will attempt to match that URI against the controllers
-and methods when Auto Routing is enabled.
-
-You can disable this automatic matching, and restrict routes to only those defined by you, by setting the ``$autoRoute``
-property to false:
-
-.. literalinclude:: routing/050.php
-
-.. warning:: If you use the :doc:`CSRF protection `, it does not protect **GET** requests. If the
- URI is accessible by the GET method, the CSRF protection will not work.
-
-.. _404-override:
-
-404 Override
-============
-
-When a page is not found that matches the current URI, the system will show a generic 404 view. Using the
-``$override404`` property within the routing config file, you can define a controller class/method for 404 routes.
-
-.. literalinclude:: routing/051.php
-
-You can also change what happens by specifying an action to happen with the ``set404Override()`` method in the Routes
-config file. The value can be either a valid class/method pair, or a Closure:
-
-.. literalinclude:: routing/069.php
-
-.. note:: Starting with v4.5.0, the 404 Override feature sets the Response status code to ``404`` by default. In
- previous versions, the code was ``200``. If you want to change the status code in the controller, see
- :php:meth:`CodeIgniter\\HTTP\\Response::setStatusCode()` for information on how to set the status code.
-
-Route Processing by Priority
-============================
-
-Enables or disables processing of the routes queue by priority. Lowering the priority is defined in the route option.
-Disabled by default. This functionality affects all routes. For an example use of lowering the priority, see
-:ref:`routing-priority`:
-
-.. literalinclude:: routing/052.php
-
-.. _multiple-uri-segments-as-one-parameter:
-
-Multiple URI Segments as One Parameter
-======================================
-
-.. versionadded:: 4.5.0
-
-When this option is enabled, a placeholder that matches multiple segments, such as ``(:any)``, will be passed directly
-as it is to one parameter, even if it contains multiple segments.
-
-.. literalinclude:: routing/070.php
-
-For example, the route:
-
-.. literalinclude:: routing/010.php
-
-will match **product/123**, **product/123/456**, **product/123/456/789** and so on. And if the URI is
-**product/123/456**, ``123/456`` will be passed to the first parameter of the ``Catalog::productLookup()`` method.
-
-Auto Routing (Improved)
-***********************
-
-.. versionadded:: 4.2.0
-
-Auto Routing (Improved) is a new, more secure automatic routing system.
-
-See :doc:`auto_routing_improved` for details.
-
-.. _auto-routing-legacy:
-
-Auto Routing (Legacy)
-*********************
-
-.. important:: This feature exists only for backward compatibility. Do not use it in new projects. Even if you are
- already using it, we recommend that you use the :ref:`auto-routing-improved` instead.
-
-Auto Routing (Legacy) is a routing system from CodeIgniter 3. It can automatically route HTTP requests based on
-conventions and execute the corresponding controller methods.
-
-It is recommended to define all routes in the **app/Config/Routes.php** file, or to use :ref:`auto-routing-improved`.
-
-.. warning:: To prevent misconfiguration and miscoding, we recommend that you do not use the Auto Routing (Legacy)
- feature. It is easy to create vulnerable apps where controller filters or CSRF protection are bypassed.
-
-.. important:: Auto Routing (Legacy) routes an HTTP request with **any** HTTP method to a controller method.
-
-Enable Auto Routing (Legacy)
-============================
-
-Since v4.2.0, auto-routing is disabled by default.
-
-To use it, you need to set the ``$autoRoute`` option to ``true`` in **app/Config/Routing.php**::
-
- public bool $autoRoute = true;
-
-And set the property ``$autoRoutesImproved`` to ``false`` in **app/Config/Feature.php**::
-
- public bool $autoRoutesImproved = false;
-
-URI Segments (Legacy)
-=====================
-
-The segments in the URL, following the Model-View-Controller approach, usually represent::
-
- example.com/class/method/ID
-
-1. The first segment represents the controller **class** that should be invoked.
-2. The second segment represents the class **method** that should be called.
-3. The third, and any additional segments, represent the ID and any variables that will be passed to the controller.
-
-Consider this URI::
-
- example.com/index.php/helloworld/index/1
-
-In the above example, CodeIgniter would attempt to find a controller named **Helloworld.php** and execute the
-``index()`` method, passing ``'1'`` as the first argument.
-
-See :ref:`Auto Routing (Legacy) in Controllers ` for more info.
-
-.. _routing-auto-routing-legacy-configuration-options:
-
-Configuration Options (Legacy)
-==============================
-
-These options are available in the **app/Config/Routing.php** file.
-
-Default Controller (Legacy)
----------------------------
-
-For Site Root URI (Legacy)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-When a user visits the root of your site (i.e., **example.com**), the controller to use is determined by the value set
-to the ``$defaultController`` property, unless a route exists for it explicitly.
-
-The default value for this is ``Home``, which matches the controller at **app/Controllers/Home.php**::
-
- public string $defaultController = 'Home';
-
-For Directory URI (Legacy)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-The default controller is also used when no matching route has been found, and the URI would point to a directory in the
-controllers directory. For example, if the user visits **example.com/admin**, and a controller was found at
-**app/Controllers/Admin/Home.php**, it would be used.
-
-See :ref:`Auto Routing (Legacy) in Controllers ` for more info.
-
-.. _routing-auto-routing-legacy-default-method:
-
-Default Method (Legacy)
------------------------
-
-This works similarly to the default controller setting, but is used to determine the default method that is used when a
-controller is found that matches the URI, but no segment exists for the method. The default value is ``index``.
-
-In this example, if the user were to visit **example.com/products**, and a ``Products`` controller existed, the
-``Products::listAll()`` method would be executed::
-
- public string $defaultMethod = 'listAll';
-
-Confirming Routes
-*****************
-
-CodeIgniter has the following :doc:`command ` to display all routes.
-
-.. _routing-spark-routes:
-
-spark routes
-============
-
-Displays all routes and filters:
-
-.. code-block:: console
-
- php spark routes
-
-The output is like the following:
-
-.. code-block:: none
-
- +---------+---------+---------------+-------------------------------+----------------+---------------+
- | Method | Route | Name | Handler | Before Filters | After Filters |
- +---------+---------+---------------+-------------------------------+----------------+---------------+
- | GET | / | » | \App\Controllers\Home::index | | toolbar |
- | GET | feed | » | (Closure) | | toolbar |
- +---------+---------+---------------+-------------------------------+----------------+---------------+
-
-The *Method* column shows the HTTP method that the route is listening for.
-
-The *Route* column shows the route path to match. The route of a defined route is expressed as a regular expression.
-
-Since v4.3.0, the *Name* column shows the route name. ``»`` indicates the name is the same as the route path.
-
-.. important:: The system is not perfect. For routes containing regular expression patterns like ``([^/]+)`` or
- ``{locale}``, the *Filters* displayed might not be correct (if you set a complicated URI pattern for the filters in
- **app/Config/Filters.php**), or they are displayed as ````.
-
- The :ref:`spark filter:check ` command can be used to check for 100% accurate filters.
-
-Auto Routing (Improved)
------------------------
-
-When you use Auto Routing (Improved), the output is like the following:
-
-.. code-block:: none
-
- +-----------+-------------------------+---------------+-----------------------------------+----------------+---------------+
- | Method | Route | Name | Handler | Before Filters | After Filters |
- +-----------+-------------------------+---------------+-----------------------------------+----------------+---------------+
- | GET(auto) | product/list/../..[/..] | | \App\Controllers\Product::getList | | toolbar |
- +-----------+-------------------------+---------------+-----------------------------------+----------------+---------------+
-
-The *Method* will be like ``GET(auto)``.
-
-``/..`` in the *Route* column indicates one segment. ``[/..]`` indicates it is optional.
-
-.. note:: When auto-routing is enabled and you have the route ``home``, it can also be accessed by ``Home``, or maybe by
- ``hOme``, ``hoMe``, ``HOME``, etc., but the command will show only ``home``.
-
-If you see a route starting with ``x`` like the following, it indicates an invalid route that won't be routed, but the
-controller has a public method for routing.
-
-.. code-block:: none
-
- +-----------+----------------+------+-------------------------------------+----------------+---------------+
- | Method | Route | Name | Handler | Before Filters | After Filters |
- +-----------+----------------+------+-------------------------------------+----------------+---------------+
- | GET(auto) | x home/foo | | \App\Controllers\Home::getFoo | | |
- +-----------+----------------+------+-------------------------------------+----------------+---------------+
-
-The above example shows that you have the ``\App\Controllers\Home::getFoo()`` method, but it is not routed because it is
-the default controller (``Home`` by default) and the default controller name must be omitted in the URI. You should
-delete the ``getFoo()`` method.
-
-.. note:: Prior to v4.3.4, the invalid route was displayed as a normal route due to a bug.
-
-Auto Routing (Legacy)
----------------------
-
-When you use Auto Routing (Legacy), the output is like the following:
-
-.. code-block:: none
-
- +--------+--------------------+---------------+-----------------------------------+----------------+---------------+
- | Method | Route | Name | Handler | Before Filters | After Filters |
- +--------+--------------------+---------------+-----------------------------------+----------------+---------------+
- | auto | product/list[/...] | | \App\Controllers\Product::getList | | toolbar |
- +--------+--------------------+---------------+-----------------------------------+----------------+---------------+
-
-The *Method* will be ``auto``.
-
-``[/...]`` in the *Route* column indicates any number of segments.
-
-.. note:: When auto-routing is enabled and you have the route ``home``, it can also be accessed by ``Home``, or maybe by
- ``hOme``, ``hoMe``, ``HOME``, etc., but the command will show only ``home``.
-
-.. _routing-spark-routes-sort-by-handler:
-
-Sort by Handler
----------------
-
-.. versionadded:: 4.3.0
-
-You can sort the routes by *handler*:
-
-.. code-block:: console
-
- php spark routes --sort-by-handler
-
-.. _routing-spark-routes-specify-host:
-
-Specify Host
-------------
-
-.. versionadded:: 4.4.0
-
-You can specify the host in the request URL with the ``--host`` option:
-
-.. code-block:: console
-
- php spark routes --host accounts.example.com
-
-Getting Routing Information
-***************************
-
-In CodeIgniter 4, understanding and managing routing information is crucial for handling HTTP requests effectively. This
-involves retrieving details about the active controller and method, as well as the filters applied to a specific route.
-Below, we explore how to access this routing information to assist in tasks such as logging, debugging, or implementing
-conditional logic.
-
-Retrieving the Current Controller/Method Names
-==============================================
-
-In some cases, you might need to determine which controller and method have been triggered by the current HTTP request.
-This can be useful for logging, debugging, or conditional logic based on the active controller method.
-
-CodeIgniter 4 provides a simple way to access the current route's controller and method names using the ``Router``
-class. Here is an example:
-
-.. literalinclude:: routing/071.php
-
-This functionality is particularly useful when you need to dynamically interact with your controller or log which method
-is handling a particular request.
-
-Getting Active Filters for the Current Route
-============================================
-
-:doc:`Filters ` are a powerful feature that enables you to perform operations such as authentication, logging,
-and security checks before or after processing HTTP requests. To access the active filters for a specific route, you can
-use the :php:meth:`CodeIgniter\\Router\\Router::getFilters()` method from the ``Router`` class.
-
-This method returns a list of filters that are currently active for the route being processed:
-
-.. literalinclude:: routing/072.php
-
-.. note:: The ``getFilters()`` method returns only the filters defined for the specific route. It does not include
- global filters or those specified in the **app/Config/Filters.php** file.
-
-Getting Matched Route Options for the Current Route
-===================================================
-
-When we're defining routes, they may have optional parameters: ``filter``, ``namespace``, ``hostname``, ``subdomain``,
-``offset``, ``priority``, ``as``. All of them are described above. Additionally, if we use ``addRedirect()`` we can also
-expect the ``redirect`` key. To access the values of these parameters, we can call ``Router::getMatchedRouteOptions()``.
-Here is an example of the returned array:
-
-.. literalinclude:: routing/074.php
diff --git a/user_guide_src/source/incoming/routing/001.php b/user_guide_src/source/incoming/routing/001.php
deleted file mode 100644
index d799d1cf0fb5..000000000000
--- a/user_guide_src/source/incoming/routing/001.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('/', 'Home::index');
diff --git a/user_guide_src/source/incoming/routing/002.php b/user_guide_src/source/incoming/routing/002.php
deleted file mode 100644
index 030ac6d25045..000000000000
--- a/user_guide_src/source/incoming/routing/002.php
+++ /dev/null
@@ -1,7 +0,0 @@
-list()
-$routes->get('users', 'Users::list');
-
-// Calls $Users->list(1, 23)
-$routes->get('users/1/23', 'Users::list/1/23');
diff --git a/user_guide_src/source/incoming/routing/003.php b/user_guide_src/source/incoming/routing/003.php
deleted file mode 100644
index 7351142dea77..000000000000
--- a/user_guide_src/source/incoming/routing/003.php
+++ /dev/null
@@ -1,5 +0,0 @@
-post('products', 'Product::feature');
-$routes->put('products/1', 'Product::feature');
-$routes->delete('products/1', 'Product::feature');
diff --git a/user_guide_src/source/incoming/routing/004.php b/user_guide_src/source/incoming/routing/004.php
deleted file mode 100644
index d7b211c8d81b..000000000000
--- a/user_guide_src/source/incoming/routing/004.php
+++ /dev/null
@@ -1,3 +0,0 @@
-match(['GET', 'PUT'], 'products', 'Product::feature');
diff --git a/user_guide_src/source/incoming/routing/005.php b/user_guide_src/source/incoming/routing/005.php
deleted file mode 100644
index ba4d8d98a28a..000000000000
--- a/user_guide_src/source/incoming/routing/005.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('product/(:num)', 'Catalog::productLookup');
diff --git a/user_guide_src/source/incoming/routing/006.php b/user_guide_src/source/incoming/routing/006.php
deleted file mode 100644
index 7a9075b57b2f..000000000000
--- a/user_guide_src/source/incoming/routing/006.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('journals', 'Blogs');
diff --git a/user_guide_src/source/incoming/routing/007.php b/user_guide_src/source/incoming/routing/007.php
deleted file mode 100644
index 4ee87c0af53a..000000000000
--- a/user_guide_src/source/incoming/routing/007.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('blog/joe', 'Blogs::users/34');
diff --git a/user_guide_src/source/incoming/routing/008.php b/user_guide_src/source/incoming/routing/008.php
deleted file mode 100644
index 0e9c3afdafa7..000000000000
--- a/user_guide_src/source/incoming/routing/008.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('product/(:segment)', 'Catalog::productLookup');
diff --git a/user_guide_src/source/incoming/routing/009.php b/user_guide_src/source/incoming/routing/009.php
deleted file mode 100644
index 638ed4492220..000000000000
--- a/user_guide_src/source/incoming/routing/009.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('product/(:num)', 'Catalog::productLookupByID/$1');
diff --git a/user_guide_src/source/incoming/routing/010.php b/user_guide_src/source/incoming/routing/010.php
deleted file mode 100644
index c88bc65573a3..000000000000
--- a/user_guide_src/source/incoming/routing/010.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('product/(:any)', 'Catalog::productLookup/$1');
diff --git a/user_guide_src/source/incoming/routing/011.php b/user_guide_src/source/incoming/routing/011.php
deleted file mode 100644
index 1aa779af3494..000000000000
--- a/user_guide_src/source/incoming/routing/011.php
+++ /dev/null
@@ -1,13 +0,0 @@
-get('product/(:segment)', 'Catalog::productLookup/$1');
diff --git a/user_guide_src/source/incoming/routing/013.php b/user_guide_src/source/incoming/routing/013.php
deleted file mode 100644
index b562d01ba3b2..000000000000
--- a/user_guide_src/source/incoming/routing/013.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('/', [\App\Controllers\Home::class, 'index']);
diff --git a/user_guide_src/source/incoming/routing/014.php b/user_guide_src/source/incoming/routing/014.php
deleted file mode 100644
index 6105564b13f3..000000000000
--- a/user_guide_src/source/incoming/routing/014.php
+++ /dev/null
@@ -1,5 +0,0 @@
-get('/', [Home::class, 'index']);
diff --git a/user_guide_src/source/incoming/routing/015.php b/user_guide_src/source/incoming/routing/015.php
deleted file mode 100644
index cd98314d8fe8..000000000000
--- a/user_guide_src/source/incoming/routing/015.php
+++ /dev/null
@@ -1,8 +0,0 @@
-get('product/(:num)/(:num)', [Product::class, 'index']);
-
-// The above code is the same as the following:
-$routes->get('product/(:num)/(:num)', 'Product::index/$1/$2');
diff --git a/user_guide_src/source/incoming/routing/016.php b/user_guide_src/source/incoming/routing/016.php
deleted file mode 100644
index aed6cc5176df..000000000000
--- a/user_guide_src/source/incoming/routing/016.php
+++ /dev/null
@@ -1,8 +0,0 @@
-get('product/(:num)/(:num)', [[Product::class, 'index'], '$2/$1']);
-
-// The above code is the same as the following:
-$routes->get('product/(:num)/(:num)', 'Product::index/$2/$1');
diff --git a/user_guide_src/source/incoming/routing/017.php b/user_guide_src/source/incoming/routing/017.php
deleted file mode 100644
index cb1cdda7c78c..000000000000
--- a/user_guide_src/source/incoming/routing/017.php
+++ /dev/null
@@ -1,4 +0,0 @@
-addPlaceholder('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}');
-$routes->get('users/(:uuid)', 'Users::show/$1');
diff --git a/user_guide_src/source/incoming/routing/018.php b/user_guide_src/source/incoming/routing/018.php
deleted file mode 100644
index a1619a4bf080..000000000000
--- a/user_guide_src/source/incoming/routing/018.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('products/([a-z]+)/(\d+)', 'Products::show/$1/id_$2');
diff --git a/user_guide_src/source/incoming/routing/019.php b/user_guide_src/source/incoming/routing/019.php
deleted file mode 100644
index c9ddfae73610..000000000000
--- a/user_guide_src/source/incoming/routing/019.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('login/(.+)', 'Auth::login/$1');
diff --git a/user_guide_src/source/incoming/routing/020.php b/user_guide_src/source/incoming/routing/020.php
deleted file mode 100644
index 450d3dd499d5..000000000000
--- a/user_guide_src/source/incoming/routing/020.php
+++ /dev/null
@@ -1,9 +0,0 @@
-get('feed', static function () {
- $rss = new RSSFeeder();
-
- return $rss->feed('general');
-});
diff --git a/user_guide_src/source/incoming/routing/021.php b/user_guide_src/source/incoming/routing/021.php
deleted file mode 100644
index 8ebc27e3f9f5..000000000000
--- a/user_guide_src/source/incoming/routing/021.php
+++ /dev/null
@@ -1,8 +0,0 @@
- 'Catalog::productLookupById',
- 'product/(:alphanum)' => 'Catalog::productLookupByName',
-];
-
-$routes->map($multipleRoutes);
diff --git a/user_guide_src/source/incoming/routing/022.php b/user_guide_src/source/incoming/routing/022.php
deleted file mode 100644
index c4da46bdd431..000000000000
--- a/user_guide_src/source/incoming/routing/022.php
+++ /dev/null
@@ -1,16 +0,0 @@
-get('users/profile', 'Users::profile', ['as' => 'profile']);
-
-// Redirect to a named route
-$routes->addRedirect('users/about', 'profile');
-// Redirect to a URI
-$routes->addRedirect('users/about', 'users/profile');
-
-// Redirect with placeholder
-$routes->get('post/(:num)/comment/(:num)', 'PostsComments::index', ['as' => 'post.comment']);
-
-// Redirect to a URI
-$routes->addRedirect('article/(:num)/(:num)', 'post/$1/comment/$2');
-// Redirect to a named route
-$routes->addRedirect('article/(:num)/(:num)', 'post.comment');
diff --git a/user_guide_src/source/incoming/routing/023.php b/user_guide_src/source/incoming/routing/023.php
deleted file mode 100644
index 6f08c319c551..000000000000
--- a/user_guide_src/source/incoming/routing/023.php
+++ /dev/null
@@ -1,6 +0,0 @@
-group('admin', static function ($routes) {
- $routes->get('users', 'Admin\Users::index');
- $routes->get('blog', 'Admin\Blog::index');
-});
diff --git a/user_guide_src/source/incoming/routing/024.php b/user_guide_src/source/incoming/routing/024.php
deleted file mode 100644
index 7c66c3b693dd..000000000000
--- a/user_guide_src/source/incoming/routing/024.php
+++ /dev/null
@@ -1,5 +0,0 @@
-group('api', ['namespace' => 'App\API\v1'], static function ($routes) {
- $routes->resource('users');
-});
diff --git a/user_guide_src/source/incoming/routing/025.php b/user_guide_src/source/incoming/routing/025.php
deleted file mode 100644
index 75cec09100cb..000000000000
--- a/user_guide_src/source/incoming/routing/025.php
+++ /dev/null
@@ -1,5 +0,0 @@
-group('api', ['filter' => 'api-auth'], static function ($routes) {
- $routes->resource('users');
-});
diff --git a/user_guide_src/source/incoming/routing/026.php b/user_guide_src/source/incoming/routing/026.php
deleted file mode 100644
index c45b22d2b58f..000000000000
--- a/user_guide_src/source/incoming/routing/026.php
+++ /dev/null
@@ -1,9 +0,0 @@
-group('admin', ['filter' => 'myfilter1:config'], static function ($routes) {
- $routes->get('/', 'Admin\Admin::index');
-
- $routes->group('users', ['filter' => 'myfilter2:region'], static function ($routes) {
- $routes->get('list', 'Admin\Users::list');
- });
-});
diff --git a/user_guide_src/source/incoming/routing/027.php b/user_guide_src/source/incoming/routing/027.php
deleted file mode 100644
index d7624ddc6d5c..000000000000
--- a/user_guide_src/source/incoming/routing/027.php
+++ /dev/null
@@ -1,7 +0,0 @@
-group('', ['namespace' => 'Myth\Auth\Controllers'], static function ($routes) {
- $routes->get('login', 'AuthController::login', ['as' => 'login']);
- $routes->post('login', 'AuthController::attemptLogin');
- $routes->get('logout', 'AuthController::logout');
-});
diff --git a/user_guide_src/source/incoming/routing/028.php b/user_guide_src/source/incoming/routing/028.php
deleted file mode 100644
index 53921b33f5eb..000000000000
--- a/user_guide_src/source/incoming/routing/028.php
+++ /dev/null
@@ -1,5 +0,0 @@
-environment('development', static function ($routes) {
- $routes->get('builder', 'Tools\Builder::index');
-});
diff --git a/user_guide_src/source/incoming/routing/029.php b/user_guide_src/source/incoming/routing/029.php
deleted file mode 100644
index 793a93588475..000000000000
--- a/user_guide_src/source/incoming/routing/029.php
+++ /dev/null
@@ -1,10 +0,0 @@
-get('users/(:num)/gallery/(:num)', 'Galleries::showUserGallery/$1/$2');
-
-?>
-
-
-View Gallery
-
diff --git a/user_guide_src/source/incoming/routing/030.php b/user_guide_src/source/incoming/routing/030.php
deleted file mode 100644
index 1e0eb5baa451..000000000000
--- a/user_guide_src/source/incoming/routing/030.php
+++ /dev/null
@@ -1,10 +0,0 @@
-get('users/(:num)/gallery/(:num)', 'Galleries::showUserGallery/$1/$2', ['as' => 'user_gallery']);
-
-?>
-
-
-View Gallery
-
diff --git a/user_guide_src/source/incoming/routing/031.php b/user_guide_src/source/incoming/routing/031.php
deleted file mode 100644
index e2a3784f335f..000000000000
--- a/user_guide_src/source/incoming/routing/031.php
+++ /dev/null
@@ -1,3 +0,0 @@
-add('products', 'Product::feature');
diff --git a/user_guide_src/source/incoming/routing/032.php b/user_guide_src/source/incoming/routing/032.php
deleted file mode 100644
index a82d57ebc5c7..000000000000
--- a/user_guide_src/source/incoming/routing/032.php
+++ /dev/null
@@ -1,3 +0,0 @@
-cli('migrate', 'App\Database::migrate');
diff --git a/user_guide_src/source/incoming/routing/033.php b/user_guide_src/source/incoming/routing/033.php
deleted file mode 100644
index 1f2892fc3f0f..000000000000
--- a/user_guide_src/source/incoming/routing/033.php
+++ /dev/null
@@ -1,14 +0,0 @@
-add('from', 'to', $options);
-$routes->get('from', 'to', $options);
-$routes->post('from', 'to', $options);
-$routes->put('from', 'to', $options);
-$routes->head('from', 'to', $options);
-$routes->options('from', 'to', $options);
-$routes->delete('from', 'to', $options);
-$routes->patch('from', 'to', $options);
-$routes->match(['GET', 'PUT'], 'from', 'to', $options);
-$routes->resource('photos', $options);
-$routes->map($array, $options);
-$routes->group('name', $options, static function () {});
diff --git a/user_guide_src/source/incoming/routing/034.php b/user_guide_src/source/incoming/routing/034.php
deleted file mode 100644
index 2515937bb02a..000000000000
--- a/user_guide_src/source/incoming/routing/034.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('admin', ' AdminController::index', ['filter' => 'admin-auth']);
diff --git a/user_guide_src/source/incoming/routing/035.php b/user_guide_src/source/incoming/routing/035.php
deleted file mode 100644
index b50db49bd962..000000000000
--- a/user_guide_src/source/incoming/routing/035.php
+++ /dev/null
@@ -1,3 +0,0 @@
-post('users/delete/(:segment)', 'AdminController::index', ['filter' => 'admin-auth:dual,noreturn']);
diff --git a/user_guide_src/source/incoming/routing/036.php b/user_guide_src/source/incoming/routing/036.php
deleted file mode 100644
index dd6cd63ba61d..000000000000
--- a/user_guide_src/source/incoming/routing/036.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('admin', ' AdminController::index', ['filter' => \App\Filters\SomeFilter::class]);
diff --git a/user_guide_src/source/incoming/routing/037.php b/user_guide_src/source/incoming/routing/037.php
deleted file mode 100644
index 94ae43246897..000000000000
--- a/user_guide_src/source/incoming/routing/037.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('admin', ' AdminController::index', ['filter' => ['admin-auth', \App\Filters\SomeFilter::class]]);
diff --git a/user_guide_src/source/incoming/routing/038.php b/user_guide_src/source/incoming/routing/038.php
deleted file mode 100644
index b992deb96ecf..000000000000
--- a/user_guide_src/source/incoming/routing/038.php
+++ /dev/null
@@ -1,4 +0,0 @@
-get('admin/users', 'Users::index', ['namespace' => 'Admin']);
diff --git a/user_guide_src/source/incoming/routing/039.php b/user_guide_src/source/incoming/routing/039.php
deleted file mode 100644
index 5b415a50138b..000000000000
--- a/user_guide_src/source/incoming/routing/039.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('from', 'to', ['hostname' => 'accounts.example.com']);
diff --git a/user_guide_src/source/incoming/routing/040.php b/user_guide_src/source/incoming/routing/040.php
deleted file mode 100644
index 32a74934eb3a..000000000000
--- a/user_guide_src/source/incoming/routing/040.php
+++ /dev/null
@@ -1,4 +0,0 @@
-get('from', 'to', ['subdomain' => 'media']);
diff --git a/user_guide_src/source/incoming/routing/041.php b/user_guide_src/source/incoming/routing/041.php
deleted file mode 100644
index 0d0fd0e67fb4..000000000000
--- a/user_guide_src/source/incoming/routing/041.php
+++ /dev/null
@@ -1,4 +0,0 @@
-get('from', 'to', ['subdomain' => '*']);
diff --git a/user_guide_src/source/incoming/routing/042.php b/user_guide_src/source/incoming/routing/042.php
deleted file mode 100644
index ec7fa680f65e..000000000000
--- a/user_guide_src/source/incoming/routing/042.php
+++ /dev/null
@@ -1,6 +0,0 @@
-get('users/(:num)', 'users/show/$1', ['offset' => 1]);
-
-// Creates:
-$routes['users/(:num)'] = 'users/show/$2';
diff --git a/user_guide_src/source/incoming/routing/043.php b/user_guide_src/source/incoming/routing/043.php
deleted file mode 100644
index 7abc130305b9..000000000000
--- a/user_guide_src/source/incoming/routing/043.php
+++ /dev/null
@@ -1,12 +0,0 @@
-setPrioritize();
-
-// Config\Routes
-$routes->get('(.*)', 'Posts::index', ['priority' => 1]);
-
-// Modules\Acme\Config\Routes
-$routes->get('admin', 'Admin::index');
-
-// The "admin" route will now be processed before the wildcard route.
diff --git a/user_guide_src/source/incoming/routing/044.php b/user_guide_src/source/incoming/routing/044.php
deleted file mode 100644
index 9465f4147e2c..000000000000
--- a/user_guide_src/source/incoming/routing/044.php
+++ /dev/null
@@ -1,3 +0,0 @@
-setPrioritize(false);
diff --git a/user_guide_src/source/incoming/routing/045.php b/user_guide_src/source/incoming/routing/045.php
deleted file mode 100644
index d3d5e66dbd7c..000000000000
--- a/user_guide_src/source/incoming/routing/045.php
+++ /dev/null
@@ -1,19 +0,0 @@
-get('users', 'Users::index');
-
-// Controller is \Admin\Users
-$routes->get('users', 'Admin\Users::index');
diff --git a/user_guide_src/source/incoming/routing/046.php b/user_guide_src/source/incoming/routing/046.php
deleted file mode 100644
index 78768c76044a..000000000000
--- a/user_guide_src/source/incoming/routing/046.php
+++ /dev/null
@@ -1,10 +0,0 @@
-setDefaultNamespace('App');
-
-// Controller is \App\Users
-$routes->get('users', 'Users::index');
-
-// Controller is \App\Admin\Users
-$routes->get('users', 'Admin\Users::index');
diff --git a/user_guide_src/source/incoming/routing/049.php b/user_guide_src/source/incoming/routing/049.php
deleted file mode 100644
index 303fff95304a..000000000000
--- a/user_guide_src/source/incoming/routing/049.php
+++ /dev/null
@@ -1,15 +0,0 @@
-setTranslateURIDashes(true);
diff --git a/user_guide_src/source/incoming/routing/050.php b/user_guide_src/source/incoming/routing/050.php
deleted file mode 100644
index f11fabf834f9..000000000000
--- a/user_guide_src/source/incoming/routing/050.php
+++ /dev/null
@@ -1,15 +0,0 @@
-setAutoRoute(false);
diff --git a/user_guide_src/source/incoming/routing/051.php b/user_guide_src/source/incoming/routing/051.php
deleted file mode 100644
index 33852c87e021..000000000000
--- a/user_guide_src/source/incoming/routing/051.php
+++ /dev/null
@@ -1,12 +0,0 @@
-setPrioritize();
-
-// to disable
-$routes->setPrioritize(false);
diff --git a/user_guide_src/source/incoming/routing/063.php b/user_guide_src/source/incoming/routing/063.php
deleted file mode 100644
index 4996345ed7ae..000000000000
--- a/user_guide_src/source/incoming/routing/063.php
+++ /dev/null
@@ -1,4 +0,0 @@
-post('api/users', 'Api\Users::update');
diff --git a/user_guide_src/source/incoming/routing/064.php b/user_guide_src/source/incoming/routing/064.php
deleted file mode 100644
index 8d6df0548e30..000000000000
--- a/user_guide_src/source/incoming/routing/064.php
+++ /dev/null
@@ -1,4 +0,0 @@
-get('blog', '\Acme\Blog\Controllers\Home::list');
diff --git a/user_guide_src/source/incoming/routing/065.php b/user_guide_src/source/incoming/routing/065.php
deleted file mode 100644
index ad3c10094075..000000000000
--- a/user_guide_src/source/incoming/routing/065.php
+++ /dev/null
@@ -1,4 +0,0 @@
-view('about', 'pages/about');
diff --git a/user_guide_src/source/incoming/routing/066.php b/user_guide_src/source/incoming/routing/066.php
deleted file mode 100644
index 10f867f186fc..000000000000
--- a/user_guide_src/source/incoming/routing/066.php
+++ /dev/null
@@ -1,7 +0,0 @@
-view('map/(:segment)/(:segment)', 'map');
-
-// Within the view, you can access the segments with
-// $segments[0] and $segments[1] respectively.
diff --git a/user_guide_src/source/incoming/routing/067.php b/user_guide_src/source/incoming/routing/067.php
deleted file mode 100644
index 7a486fb1d7c3..000000000000
--- a/user_guide_src/source/incoming/routing/067.php
+++ /dev/null
@@ -1,3 +0,0 @@
-add('users/delete/(:segment)', 'AdminController::index', ['filter' => 'admin-auth:dual,noreturn']);
diff --git a/user_guide_src/source/incoming/routing/068.php b/user_guide_src/source/incoming/routing/068.php
deleted file mode 100644
index 50b0891ce928..000000000000
--- a/user_guide_src/source/incoming/routing/068.php
+++ /dev/null
@@ -1,13 +0,0 @@
-set404Override('App\Errors::show404');
-
-// Will display a custom view.
-$routes->set404Override(static function () {
- // If you want to get the URI segments.
- $segments = request()->getUri()->getSegments();
-
- return view('my_errors/not_found.html');
-});
diff --git a/user_guide_src/source/incoming/routing/070.php b/user_guide_src/source/incoming/routing/070.php
deleted file mode 100644
index f62961f1bcf6..000000000000
--- a/user_guide_src/source/incoming/routing/070.php
+++ /dev/null
@@ -1,11 +0,0 @@
-controllerName();
-
-// Retrieve the method name being executed in the controller for the current request.
-$method = $router->methodName();
-
-echo 'Current Controller: ' . $controller . ' ';
-echo 'Current Method: ' . $method;
diff --git a/user_guide_src/source/incoming/routing/072.php b/user_guide_src/source/incoming/routing/072.php
deleted file mode 100644
index dbf695c57d86..000000000000
--- a/user_guide_src/source/incoming/routing/072.php
+++ /dev/null
@@ -1,8 +0,0 @@
-getFilters();
-
-echo 'Active Filters for the Route: ' . implode(', ', $filters);
diff --git a/user_guide_src/source/incoming/routing/073.php b/user_guide_src/source/incoming/routing/073.php
deleted file mode 100644
index b8c42b0ad7d5..000000000000
--- a/user_guide_src/source/incoming/routing/073.php
+++ /dev/null
@@ -1,3 +0,0 @@
-get('from', 'to', ['hostname' => ['s1.example.com', 's2.example.com']]);
diff --git a/user_guide_src/source/incoming/routing/074.php b/user_guide_src/source/incoming/routing/074.php
deleted file mode 100644
index 74eaeaf7e353..000000000000
--- a/user_guide_src/source/incoming/routing/074.php
+++ /dev/null
@@ -1,23 +0,0 @@
-getMatchedRouteOptions();
-
-echo 'Route name: ' . $options['as'];
-
-print_r($options);
-
-// Route name: api:auth
-//
-// Array
-// (
-// [filter] => api-auth
-// [namespace] => App\API\v1
-// [hostname] => example.com
-// [subdomain] => api
-// [offset] => 1
-// [priority] => 1
-// [as] => api:auth
-// )
diff --git a/user_guide_src/source/index.rst b/user_guide_src/source/index.rst
deleted file mode 100644
index cf781b282018..000000000000
--- a/user_guide_src/source/index.rst
+++ /dev/null
@@ -1,124 +0,0 @@
-#######################
-CodeIgniter4 User Guide
-#######################
-
-.. toctree::
- :includehidden:
- :titlesonly:
-
- intro/index
-
-***************
-Getting Started
-***************
-
-.. toctree::
- :maxdepth: 2
- :titlesonly:
-
- installation/index
-
-******
-Guides
-******
-
-.. toctree::
- :includehidden:
- :titlesonly:
-
- guides/index
-
-*************************
-Overview & General Topics
-*************************
-
-.. toctree::
- :titlesonly:
-
- concepts/index
-
-.. toctree::
- :titlesonly:
-
- general/index
-
-****************
-Request Handling
-****************
-
-.. toctree::
- :titlesonly:
-
- incoming/index
-
-.. toctree::
- :titlesonly:
-
- outgoing/index
-
-******************
-Handling Databases
-******************
-
-.. toctree::
- :titlesonly:
-
- database/index
-
-.. toctree::
- :titlesonly:
-
- models/index
-
-.. toctree::
- :titlesonly:
-
- dbmgmt/index
-
-*******************
-Libraries & Helpers
-*******************
-
-.. toctree::
- :titlesonly:
-
- libraries/index
-
-.. toctree::
- :titlesonly:
-
- helpers/index
-
-***************
-Advanced Topics
-***************
-
-.. toctree::
- :titlesonly:
-
- testing/index
-
-.. toctree::
- :titlesonly:
-
- cli/index
-
-.. toctree::
- :titlesonly:
-
- extending/index
-
-.. toctree::
- :hidden:
-
- license
- changelogs/index
-
-*****************
-Official Packages
-*****************
-
-.. toctree::
- :titlesonly:
-
- libraries/official_packages
diff --git a/user_guide_src/source/installation/backward_compatibility_notes.rst b/user_guide_src/source/installation/backward_compatibility_notes.rst
deleted file mode 100644
index 5d404ddf31c8..000000000000
--- a/user_guide_src/source/installation/backward_compatibility_notes.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-############################
-Backward Compatibility Notes
-############################
-
-We try to develop our products to be as backward compatible (BC) as possible.
-
-Only major releases (such as 4.0, 5.0 etc.) are allowed to break backward compatibility. Minor releases (such as 4.2,
-4.3 etc.) may introduce new features, but must do so without breaking the existing API.
-
-However, the code is not mature and bug fixes may break compatibility in minor releases, or even in patch releases (such
-as 4.2.5). In that case, all the breaking changes are described in the :doc:`../changelogs/index`.
-
-*****************************
-What are not Breaking Changes
-*****************************
-
-- Deprecated items are not covered by the backward compatibility (BC) promise. They may be removed in the second
- subsequent **minor** version or later. For example, if an item has been deprecated since 4.3.x, it may be removed in
- 4.5.0.
-- System messages defined in **system/Language/en/** are strictly for internal framework use and are not covered by the
- backward compatibility (BC) promise. If developers are relying on language string output, they should be checking it
- against the function call (``lang('...')``), not the content.
-- `Named arguments `_ are not covered
- by the backward compatibility (BC) promise. We may choose to rename method/function parameter names when necessary in
- order to improve the codebase.
diff --git a/user_guide_src/source/installation/deployment.rst b/user_guide_src/source/installation/deployment.rst
deleted file mode 100644
index 1336e2a3a335..000000000000
--- a/user_guide_src/source/installation/deployment.rst
+++ /dev/null
@@ -1,207 +0,0 @@
-##########
-Deployment
-##########
-
-.. contents::
- :local:
- :depth: 3
-
-************
-Optimization
-************
-
-Before deploying your CodeIgniter application to production, there are several things you can do to make your
-application run more efficiently.
-
-This section describes the optimization features that CodeIgniter provides.
-
-.. _spark_optimize:
-
-spark optimize
-==============
-
-.. versionadded:: 4.5.0
-
-The ``spark optimize`` command performs the following optimizations:
-
-- `Removing Dev Packages`_
-- Enabling `Config Caching`_
-- Enabling `FileLocator Caching`_
-
-.. warning:: Do not use ``spark optimize`` when running the app in the :doc:`worker_mode`.
-
-Composer Optimization
-=====================
-
-Removing Dev Packages
----------------------
-
-When you deploy, don't forget to run the following command:
-
-.. code-block:: console
-
- composer install --no-dev
-
-The above command will remove the development-only Composer packages that are not needed in the production environment.
-This will greatly reduce the vendor folder size.
-
-Specifying Packages to Discover
--------------------------------
-
-If Composer Package Auto-Discovery is enabled, all Composer packages are scanned when needed. But there is no need to
-scan packages that are not CodeIgniter packages, so specifying the packages to be scanned prevents unnecessary scanning.
-
-See :ref:`modules-specify-composer-packages`.
-
-Config Caching
-==============
-
-.. important:: Once cached, configuration values are never changed until the cache is deleted, even if the configuration
- file or **.env** is changed.
-
-Caching the Config objects can improve performance. However, the cache must be manually deleted when changing Config
-values.
-
-See :ref:`factories-config-caching`.
-
-FileLocator Caching
-===================
-
-Caching the file paths that FileLocator found can improve performance. However, the cache must be manually deleted when
-adding/deleting/changing file paths.
-
-See :ref:`file-locator-caching`.
-
-PHP Preloading
-==============
-
-With PHP preloading, you can instruct the server to load essential files like functions and classes into memory during
-startup. This means these elements are readily available for all requests, skipping the usual loading process and
-boosting your application's performance. However, this comes at the cost of increased memory usage and requires
-restarting the PHP engine for changes to take effect.
-
-.. note:: If you want to use `Preloading `_, we provide a
- `preload script `_.
-
-Requirement
------------
-
-Using preloading requires one dedicated PHP handler. Normally, web servers are configured to use one PHP handler, so one
-app requires a dedicated web server. If you want to use preloading for multiple apps on one web server, configure your
-server to use virtual hosts with multiple PHP handlers like multiple PHP-FPMs, with each virtual host using one PHP
-handler. Preloading keeps the relevant definitions in memory by reading the files specified in ``opcache.preload``.
-
-.. note:: See :ref:`running-multiple-app` to make one core CodeIgniter4 handle your multiple apps.
-
-Configuration
--------------
-
-Open ``php.ini``, or ``xx-opcache.ini`` if you have split INI configuration in PHP. We recommend setting
-``opcache.preload=/path/to/preload.php`` and ``opcache.preload_user=myuser``.
-
-.. note:: ``myuser`` is the user running your web server. If you want to find the location of the split INI
- configuration, just run ``php --ini`` or open a ``phpinfo()`` page and search for *Additional .ini files parsed*.
-
-Make sure you use the appstarter installation. If using manual installation, you must change the directory in the
-``include`` path.
-
-.. literalinclude:: preloading/001.php
-
-.. _deployment-to-shared-hosting-services:
-
-*************************************
-Deployment to Shared Hosting Services
-*************************************
-
-.. important::
- **index.php** is no longer in the root of the project! It has been moved inside the **public** folder, for better
- security and separation of components.
-
- This means that you should configure your web server to "point" to your project's **public** folder, and not to the
- project root.
-
-Specifying the Document Root
-============================
-
-The best way is to set the document root to the **public** folder in the server configuration::
-
- └── example.com/ (project folder)
- └── public/ (document root)
-
-Check with your hosting service provider to see if you can change the document root. Unfortunately, if you cannot change
-the document root, go to the next way.
-
-Using Two Directories
-=====================
-
-The second way is to use two directories, and adjust the path. One is for the application and the other is the default
-document root.
-
-Upload the contents of the **public** folder to **public_html** (the default document root) and the other files to the
-directory for the application::
-
- ├── example.com/ (for the application)
- │ ├── app/
- │ ├── vendor/ (or system/)
- │ └── writable/
- └── public_html/ (the default document root)
- ├── .htaccess
- ├── favicon.ico
- ├── index.php
- └── robots.txt
-
-See `Install CodeIgniter 4 on Shared Hosting (cPanel) `_ for
-details.
-
-Adding .htaccess
-================
-
-The last resort is to add **.htaccess** to the project root.
-
-It is not recommended that you place the project folder in the document root. However, if you have no other choice, you
-can use this.
-
-Place your project folder as follows, where **public_html** is the document root, and create the **.htaccess** file::
-
- └── public_html/ (the default document root)
- └── example.com/ (project folder)
- ├── .htaccess
- └── public/
-
-And edit **.htaccess** as follows:
-
-.. code-block:: apache
-
-
- RewriteEngine On
- RewriteRule ^(.*)$ public/$1 [L]
-
-
-
- Require all denied
- Satisfy All
-
-
-And remove the redirect settings in **public/.htaccess**:
-
-.. code-block:: diff
-
- --- a/public/.htaccess
- +++ b/public/.htaccess
- @@ -16,16 +16,6 @@ Options -Indexes
- # http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
- # RewriteBase /
-
- - # Redirect Trailing Slashes...
- - RewriteCond %{REQUEST_FILENAME} !-d
- - RewriteCond %{REQUEST_URI} (.+)/$
- - RewriteRule ^ %1 [L,R=301]
- -
- - # Rewrite "www.example.com -> example.com"
- - RewriteCond %{HTTPS} !=on
- - RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
- - RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
- -
- # Checks to see if the user is attempting to access a valid file,
- # such as an image or css document, if this isn't true it sends the
- # request to the front controller, index.php
diff --git a/user_guide_src/source/installation/index.rst b/user_guide_src/source/installation/index.rst
deleted file mode 100644
index 8769d4bf9ca5..000000000000
--- a/user_guide_src/source/installation/index.rst
+++ /dev/null
@@ -1,30 +0,0 @@
-############
-Installation
-############
-
-CodeIgniter has two supported installation methods: manual download, or using `Composer `_.
-Which is right for you?
-
-- We recommend the Composer installation because it keeps CodeIgniter up to date easily.
-- If you would like the simple "download & go" install that CodeIgniter 3 is known for, choose the manual installation.
-
-However you choose to install and run CodeIgniter4, the latest `user guide `_ is
-accessible online. If you want to see previous versions, you can download them from the
-`codeigniter4/userguide `_ repository.
-
-.. note:: Before using CodeIgniter 4, make sure that your server meets the :doc:`requirements `, in
- particular the PHP version and the PHP extensions that are needed. You may find that you have to uncomment the
- ``php.ini`` "extension" lines to enable "curl" and "intl", for instance.
-
-.. toctree::
- :titlesonly:
-
- installing_composer
- installing_manual
- running
- worker_mode
- troubleshooting
- deployment
- ../changelogs/index
- upgrading
- repositories
diff --git a/user_guide_src/source/installation/installing_composer.rst b/user_guide_src/source/installation/installing_composer.rst
deleted file mode 100644
index e120d2463dcf..000000000000
--- a/user_guide_src/source/installation/installing_composer.rst
+++ /dev/null
@@ -1,306 +0,0 @@
-Composer Installation
-#####################
-
-.. contents::
- :local:
- :depth: 2
-
-Composer can be used in two ways to install CodeIgniter4 on your system.
-
-.. important:: CodeIgniter4 requires Composer 2.0.14 or later.
-
-.. note:: If you are not familiar with Composer, we recommend you read
- `Basic usage `_ first.
-
-The first technique describes creating a skeleton project (app starter) using CodeIgniter4, which you would then use as
-the base for a new webapp. The second technique described below lets you add CodeIgniter4 to an existing webapp.
-
-.. note:: If you are using a Git repository to store your code, or for collaboration with others, then the **vendor**
- folder would normally be "git ignored". In such a case, you will need to do a ``composer install`` (or
- ``composer update`` if you want to update all Composer dependencies) when you clone the repository to a new system.
-
-App Starter
-===========
-
-The `CodeIgniter 4 app starter `_ repository holds a skeleton application,
-with a composer dependency on the latest released version of the framework.
-
-This installation technique would suit a developer who wishes to start a new CodeIgniter4-based project.
-
-Installation
-------------
-
-In the folder above your project root:
-
-.. code-block:: console
-
- composer create-project codeigniter4/appstarter project-root
-
-The command above will create a **project-root** folder.
-
-If you omit the "project-root" argument, the command will create an "appstarter" folder, which can be renamed as
-appropriate.
-
-.. note:: Before v4.4.0, the CodeIgniter autoloader did not allow special characters that are illegal in filenames on
- certain operating systems. The symbols that can be used are ``/``, ``_``, ``.``, ``:``, ``\`` and space. So if you
- installed CodeIgniter under a folder that contains special characters like ``(``, ``)``, etc., CodeIgniter didn't
- work. Since v4.4.0, this restriction has been removed.
-
-.. important:: When you deploy to your production server, don't forget to run the following command:
-
- .. code-block:: console
-
- composer install --no-dev
-
- The above command will remove the development-only Composer packages that are not needed in the production
- environment. This will greatly reduce the vendor folder size.
-
-Installing Previous Versions
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-For example, you may want to install v4.4.8 after v4.5.0 has been released.
-
-In that case, specify the version in the command:
-
-.. code-block:: console
-
- composer create-project codeigniter4/appstarter:4.4.8 project-root
-
-Then, open **composer.json** in your project root folder, and specify the framework version:
-
-.. code-block:: text
-
- "require": {
- ...
- "codeigniter4/framework": "4.4.8"
- },
-
-Then, run the ``composer update`` command.
-
-.. note:: When you use a fixed version number like ``"codeigniter4/framework": "4.4.8"`` in your **composer.json**, the
- ``composer update`` command will not update the framework to the latest version. See `Writing Version Constraints`_
- for how to specify the version.
-
-.. _Writing Version Constraints: https://getcomposer.org/doc/articles/versions.md#writing-version-constraints
-
-Initial Configuration
----------------------
-
-After installation, a few initial configurations are required. See :ref:`initial-configuration` for the details.
-
-.. _app-starter-upgrading:
-
-Upgrading
----------
-
-Whenever there is a new release, run this from the command line in your project root:
-
-.. code-block:: console
-
- composer update
-
-Read the :doc:`upgrade instructions ` and :doc:`change log <../changelogs/index>`, and check Breaking Changes
-and Enhancements.
-
-Upgrading to a Specified Version
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-For example, you may want to upgrade from v4.4.7 to v4.4.8 after v4.5.0 has been released.
-
-In that case, open **composer.json** in your project root folder, and specify the framework version:
-
-.. code-block:: text
-
- "require": {
- ...
- "codeigniter4/framework": "4.4.8"
- },
-
-Then, run the ``composer update`` command.
-
-.. note:: When you use a fixed version number like ``"codeigniter4/framework": "4.4.8"`` in your **composer.json**, the
- ``composer update`` command will not update the framework to the latest version. See `Writing Version Constraints`_
- for how to specify the version.
-
-Pros
-----
-
-Simple installation; easy to update.
-
-Cons
-----
-
-You still need to check for file changes in the **project space** (root, app, public, writable) and merge them after
-updating.
-
-.. note:: There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
- `Explore on Packagist `_.
-
-Structure
----------
-
-Folders in your project after setup:
-
-- app, public, tests, writable
-- vendor/codeigniter4/framework/system
-
-.. _switch-to-dev-version:
-
-Latest Dev
-----------
-
-The App Starter repo comes with a **builds** script to switch Composer sources between the current stable release and
-the latest development branch of the framework. This script is for developers who are willing to live with the latest
-unreleased changes, which may be unstable. This way you can help find bugs and improve new features.
-
-The `development user guide `_ is accessible online. Note that this
-differs from the released user guide, and will pertain to the develop branch explicitly.
-
-Before running the script, check ``$files``, which is the list of files to be changed. This is useful if you have
-additional places in the code that mention the directory with the framework.
-
-.. note:: You should not rely on the version of the framework in your project because the development code may contain
- an incorrect number.
-
-Update for Latest Dev
-^^^^^^^^^^^^^^^^^^^^^
-
-In your project root:
-
-.. code-block:: console
-
- php builds development
-
-The command above will update **composer.json** to point to the ``develop`` branch of the working repository, and update
-the corresponding paths in config and XML files.
-
-After using the ``builds`` command, be sure to run ``composer update`` to sync your vendor folder with the latest target
-build. Then, check the :doc:`upgrading` and update project files if necessary.
-
-Next Minor Version
-^^^^^^^^^^^^^^^^^^
-
-If you want to use the next minor version branch:
-
-.. code-block:: console
-
- php builds next
-
-And run ``composer update`` to sync your vendor folder with the latest target build. Then, check the Upgrading Guide
-(**user_guide_src/source/installation/upgrade_{version}.rst**) and update project files if necessary.
-
-Revert to Stable Release
-^^^^^^^^^^^^^^^^^^^^^^^^
-
-To revert the changes, run:
-
-.. code-block:: console
-
- php builds release
-
-Adding CodeIgniter4 to an Existing Project
-==========================================
-
-The same `CodeIgniter 4 framework `_ repository described in "Manual
-Installation" can also be added to an existing project using Composer.
-
-Installation
-------------
-
-Develop your app inside the ``app`` folder, and the ``public`` folder will be your document root.
-
-In your project root:
-
-.. code-block:: console
-
- composer require codeigniter4/framework
-
-.. important:: When you deploy to your production server, don't forget to run the following command:
-
- .. code-block:: console
-
- composer install --no-dev
-
- The above command will remove the development-only Composer packages that are not needed in the production
- environment. This will greatly reduce the vendor folder size.
-
-Setting Up
-----------
-
-1. Copy the **app**, **public**, **tests** and **writable** folders from **vendor/codeigniter4/framework** to your
- project root.
-2. Copy the **env**, **phpunit.dist.xml** and **spark** files from **vendor/codeigniter4/framework** to your project
- root.
-3. You will have to adjust the ``$systemDirectory`` property in **app/Config/Paths.php** to refer to the vendor one,
- e.g., ``__DIR__ . '/../../vendor/codeigniter4/framework/system'``.
-
-Initial Configuration
----------------------
-
-A few initial configurations are required. See :ref:`initial-configuration` for the details.
-
-.. _adding-codeigniter4-upgrading:
-
-Upgrading
----------
-
-Whenever there is a new release, run this from the command line in your project root:
-
-.. code-block:: console
-
- composer update
-
-Read the :doc:`upgrade instructions ` and :doc:`change log <../changelogs/index>`, and check Breaking Changes
-and Enhancements.
-
-Upgrading to a Specified Version
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-For example, you may want to upgrade from v4.4.7 to v4.4.8 after v4.5.0 has been released.
-
-In that case, open **composer.json** in your project root folder, and specify the framework version:
-
-.. code-block:: text
-
- "require": {
- ...
- "codeigniter4/framework": "4.4.8"
- },
-
-Then, run the ``composer update`` command.
-
-Pros
-----
-
-Relatively simple installation; easy to update.
-
-Cons
-----
-
-You still need to check for file changes in the **project space** (root, app, public, writable) after updating.
-
-.. note:: There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
- `Explore on Packagist `_.
-
-Structure
----------
-
-Folders in your project after setup:
-
-- app, public, tests, writable
-- vendor/codeigniter4/framework/system
-
-Translations Installation
-=========================
-
-If you want to take advantage of the system message translations, they can be added to your project in a similar
-fashion.
-
-From the command line inside your project root:
-
-.. code-block:: console
-
- composer require codeigniter4/translations
-
-Copy the contents of the **vendor/codeigniter4/translations/Language** folder to your **app/Language** folder. These
-will be updated along with the framework whenever you do a ``composer update``.
diff --git a/user_guide_src/source/installation/installing_manual.rst b/user_guide_src/source/installation/installing_manual.rst
deleted file mode 100644
index d94f7bb9f781..000000000000
--- a/user_guide_src/source/installation/installing_manual.rst
+++ /dev/null
@@ -1,70 +0,0 @@
-Manual Installation
-###################
-
-.. contents::
- :local:
- :depth: 2
-
-The `CodeIgniter 4 framework `_ repository holds the released versions of the
-framework. It is intended for developers who do not wish to use Composer.
-
-Develop your app inside the **app** folder, and the **public** folder will be your public-facing document root. Do not
-change anything inside the **system** folder!
-
-.. note:: This is the installation technique closest to that described for
- `CodeIgniter 3 `_.
-
-Installation
-============
-
-Download the `latest version `_, and extract it to become
-your project root.
-
-.. note:: Before v4.4.0, the CodeIgniter autoloader did not allow special characters that are illegal in filenames on
- certain operating systems. The symbols that can be used are ``/``, ``_``, ``.``, ``:``, ``\`` and space. So if you
- installed CodeIgniter under a folder that contains special characters like ``(``, ``)``, etc., CodeIgniter didn't
- work. Since v4.4.0, this restriction has been removed.
-
-Initial Configuration
-=====================
-
-After installation, a few initial configurations are required. See :ref:`initial-configuration` for details.
-
-.. _installing-manual-upgrading:
-
-Upgrading
-=========
-
-Download a new copy of the framework, and then replace the **system** folder.
-
-Read the :doc:`upgrade instructions ` and :doc:`change log <../changelogs/index>`, and check Breaking Changes
-and Enhancements.
-
-Pros
-====
-
-Download and run.
-
-Cons
-====
-
-You need to check for file changes in the **project space** (root, app, public, tests, writable) and merge them by
-yourself.
-
-Structure
-=========
-
-Folders in your project after setup:
-
-- app, public, tests, writable, system
-
-Translations Installation
-=========================
-
-If you want to take advantage of the system message translations, they can be added to your project in a similar
-fashion.
-
-Download the `latest version of them `_. Extract the
-downloaded zip, and copy the contents of its **Language** folder to your **app/Language** folder.
-
-This would need to be repeated to incorporate any updates to the translations.
diff --git a/user_guide_src/source/installation/preloading/001.php b/user_guide_src/source/installation/preloading/001.php
deleted file mode 100644
index 059c6d846613..000000000000
--- a/user_guide_src/source/installation/preloading/001.php
+++ /dev/null
@@ -1,20 +0,0 @@
- __DIR__ . '/system', // <== change this line to where CI is installed
- // ...
- ],
- ];
-
- // ...
-}
-
-// ...
diff --git a/user_guide_src/source/installation/repositories.rst b/user_guide_src/source/installation/repositories.rst
deleted file mode 100644
index 101ad0058336..000000000000
--- a/user_guide_src/source/installation/repositories.rst
+++ /dev/null
@@ -1,103 +0,0 @@
-CodeIgniter Repositories
-########################
-
-.. contents::
- :local:
- :depth: 2
-
-codeigniter4 organization
-=========================
-
-The CodeIgniter 4 open source project has its own `GitHub organization `_.
-
-There are several development repositories of interest to potential contributors:
-
-+------------------+--------------+-----------------------------------------------------------------+
-| Repository | Audience | Description |
-+==================+==============+=================================================================+
-| CodeIgniter4_ | contributors | Project codebase, including tests & user guide sources |
-+------------------+--------------+-----------------------------------------------------------------+
-| translations_ | developers | System message translations |
-+------------------+--------------+-----------------------------------------------------------------+
-| coding-standard_ | contributors | Coding style conventions & rules |
-+------------------+--------------+-----------------------------------------------------------------+
-| devkit_ | developers | Development toolkit for CodeIgniter libraries and projects |
-+------------------+--------------+-----------------------------------------------------------------+
-| settings_ | developers | Settings Library for CodeIgniter 4 |
-+------------------+--------------+-----------------------------------------------------------------+
-| shield_ | developers | Authentication and Authorization Library for CodeIgniter 4 |
-+------------------+--------------+-----------------------------------------------------------------+
-| tasks_ | developers | Task Scheduler for CodeIgniter 4 |
-+------------------+--------------+-----------------------------------------------------------------+
-| cache_ | developers | PSR-6 and PSR-16 Cache Adapters for CodeIgniter 4 |
-+------------------+--------------+-----------------------------------------------------------------+
-| queue_ | developers | Job Queue for CodeIgniter 4 |
-+------------------+--------------+-----------------------------------------------------------------+
-
-.. _CodeIgniter4: https://github.com/codeigniter4/CodeIgniter4
-.. _translations: https://github.com/codeigniter4/translations
-.. _coding-standard: https://github.com/CodeIgniter/coding-standard
-.. _devkit: https://github.com/codeigniter4/devkit
-.. _settings: https://github.com/codeigniter4/settings
-.. _shield: https://codeigniter4.github.io/shield
-.. _tasks: https://github.com/codeigniter4/tasks
-.. _cache: https://github.com/codeigniter4/cache
-.. _queue: https://github.com/codeigniter4/queue
-
-There are also several deployment repositories, referenced in the installation directions. The deployment repositories
-are built automatically when a new version is released, and they are not directly contributed to.
-
-+------------------+--------------+-----------------------------------------------------------------+
-| Repository | Audience | Description |
-+==================+==============+=================================================================+
-| framework_ | developers | Released versions of the framework |
-+------------------+--------------+-----------------------------------------------------------------+
-| appstarter_ | developers | Starter project (app/public/writable). |
-| | | Dependent on "framework" |
-+------------------+--------------+-----------------------------------------------------------------+
-| userguide_ | anyone | Pre-built user guide |
-+------------------+--------------+-----------------------------------------------------------------+
-
-.. _framework: https://github.com/codeigniter4/framework
-.. _appstarter: https://github.com/codeigniter4/appstarter
-.. _userguide: https://github.com/codeigniter4/userguide
-
-In all the above, the latest version of a repository can be downloaded from the **Releases** section of its GitHub
-repository page. The current development version of each can be cloned or downloaded using the **Code** dropdown on the
-repository homepage.
-
-Composer Packages
-=================
-
-We also maintain composer-installable packages on `packagist.org `_.
-These correspond to the repositories mentioned above:
-
-- `codeigniter4/framework `_
-- `codeigniter4/appstarter `_
-- `codeigniter4/translations `_
-- `codeigniter/coding-standard `_
-- `codeigniter4/devkit `_
-- `codeigniter4/settings `_
-- `codeigniter4/shield `_
-- `codeigniter4/cache `_
-
-See the :doc:`Installation ` page for more information.
-
-CodeIgniter 4 Projects
-======================
-
-We maintain a `codeigniter4projects `_ organization on GitHub as well, with
-projects that are not part of the framework, but which showcase it or make it easier to work with!
-
-+------------------+--------------+-----------------------------------------------------------------+
-| Repository | Audience | Description |
-+==================+==============+=================================================================+
-| website_ | developers | The codeigniter.com website, written in CodeIgniter 4 |
-+------------------+--------------+-----------------------------------------------------------------+
-| playground_ | developers | Basic code examples in project form. Still growing. |
-+------------------+--------------+-----------------------------------------------------------------+
-
-.. _website: https://github.com/codeigniter4projects/website
-.. _playground: https://github.com/codeigniter4projects/playground
-
-These are not composer-installable repositories.
diff --git a/user_guide_src/source/installation/running.rst b/user_guide_src/source/installation/running.rst
deleted file mode 100644
index 993ce3d19a86..000000000000
--- a/user_guide_src/source/installation/running.rst
+++ /dev/null
@@ -1,541 +0,0 @@
-################
-Running Your App
-################
-
-.. contents::
- :local:
- :depth: 3
-
-A CodeIgniter 4 app can be run in a number of different ways: hosted on a web server, using virtualization, or using
-CodeIgniter's command line tool for testing. This section addresses how to use each technique, and explains some of the
-pros and cons of them.
-
-.. important:: You should always be careful about the case of filenames. Many developers develop on case-insensitive
- file systems on Windows or macOS. However, most server environments use case-sensitive file systems. If the file
- name case is incorrect, code that works locally will not work on the server.
-
-If you're new to CodeIgniter, please read the :doc:`Getting Started ` section of the User Guide to begin
-learning how to build dynamic PHP applications. Enjoy!
-
-.. _initial-configuration:
-
-*********************
-Initial Configuration
-*********************
-
-Configure for Your Site URIs
-============================
-
-Open the **app/Config/App.php** file with a text editor.
-
-#. ``$baseURL``
- Set your base URL in ``$baseURL``. If you need more flexibility, the baseURL may
- be set within the :ref:`.env ` file as ``app.baseURL = 'http://example.com/'``.
- **Always use a trailing slash on your base URL!**
-
- .. note:: If you don't set the ``$baseURL`` correctly, in development mode, the debug toolbar may not load properly
- and web pages may take considerably longer to display.
-
-#. ``$indexPage``
- If you don't want to include **index.php** in your site URIs, set ``$indexPage`` to ``''``.
- The setting will be used when the framework generates your site URIs.
-
- .. note:: You may need to configure your web server to access your site with a URL that does not contain
- **index.php**. See :ref:`CodeIgniter URLs `.
-
-Configure Database Connection Settings
-======================================
-
-If you intend to use a database, open the **app/Config/Database.php** file with a text editor and set your database
-settings. Alternatively, these could be set in your **.env** file. See
-:ref:`Database Configuration ` for details.
-
-Set to Development Mode
-=======================
-
-If the site is not on the production server, set ``CI_ENVIRONMENT`` to ``development`` in the **.env** file to take
-advantage of the debugging tools provided. See :ref:`setting-development-mode` for details.
-
-.. important:: In production environments, you should disable error display and any other development-only
- functionality. In CodeIgniter, this can be done by setting the environment to "production". By default, the
- application will run using the "production" environment. See also :ref:`environment-constant`.
-
-Set Writable Folder Permission
-==============================
-
-If you will be running your site using a web server (e.g., Apache or nginx), you will need to modify the permissions for
-the **writable** folder inside your project, so that it is writable by the user or account used by your web server.
-
-.. _spark-phpini-check:
-
-Checking PHP ini Settings
-=========================
-
-.. versionadded:: 4.5.0
-
-`PHP ini settings`_ change the behavior of PHP. CodeIgniter provides a command to check important PHP settings.
-
-.. _PHP ini settings: https://www.php.net/manual/en/ini.list.php
-
-.. code-block:: console
-
- php spark phpini:check
-
-The *Recommended* column shows the recommended values for production environments. They may differ in development
-environments.
-
-.. note::
- If you cannot use the spark command, you can use ``CheckPhpIni::run(false)`` in your controller.
-
- E.g.,
-
- .. code-block:: php
-
- `_
-
-2. Generate worker mode files:
-
- .. code-block:: console
-
- php spark worker:install
-
-3. Start the server:
-
- .. code-block:: console
-
- frankenphp run
-
-For detailed configuration, performance tuning, and important considerations about state management, see
-:doc:`worker_mode`.
-
-*******************
-Hosting with Apache
-*******************
-
-A CodeIgniter4 webapp is normally hosted on a web server. Apache HTTP Server is the "standard" platform, and is assumed
-in much of our documentation.
-
-Apache is bundled with many platforms, but can also be downloaded in a bundle with a database engine and PHP from
-`Bitnami `_.
-
-Configure Main Config File
-==========================
-
-Enabling mod_rewrite
---------------------
-
-The "mod_rewrite" module enables URLs without "**index.php**" in them, and is assumed in our user guide.
-
-Make sure that the rewrite module is enabled (uncommented) in the main configuration file, e.g.,
-**apache2/conf/httpd.conf**:
-
-.. code-block:: apache
-
- LoadModule rewrite_module modules/mod_rewrite.so
-
-Setting Document Root
----------------------
-
-Also make sure that the default document root's ```` element enables this too, in the ``AllowOverride``
-setting:
-
-.. code-block:: apache
-
-
- Options Indexes FollowSymLinks
- AllowOverride All
- Require all granted
-
-
-Hosting with VirtualHost
-========================
-
-We recommend using "virtual hosting" to run your apps. You can set up different aliases for each of the apps you work
-on.
-
-Enabling vhost_alias_module
----------------------------
-
-Make sure that the virtual hosting module is enabled (uncommented) in the main configuration file, e.g.,
-**apache2/conf/httpd.conf**:
-
-.. code-block:: apache
-
- LoadModule vhost_alias_module modules/mod_vhost_alias.so
-
-Adding Host Alias
------------------
-
-Add a host alias in your "hosts" file, typically **/etc/hosts** on unix-type platforms, or
-**c:\\Windows\\System32\\drivers\\etc\\hosts** on Windows.
-
-Add a line to the file. This could be ``myproject.local`` or ``myproject.test``, for instance::
-
- 127.0.0.1 myproject.local
-
-Setting VirtualHost
--------------------
-
-Add a ```` element for your webapp inside the virtual hosting configuration, e.g.,
-**apache2/conf/extra/httpd-vhost.conf**:
-
-.. code-block:: apache
-
-
- DocumentRoot "/opt/lamp/apache2/myproject/public"
- ServerName myproject.local
- ErrorLog "logs/myproject-error_log"
- CustomLog "logs/myproject-access_log" common
-
-
- AllowOverride All
- Require all granted
-
-
-
-The above configuration assumes the project folder is located as follows:
-
-.. code-block:: text
-
- apache2/
- ├── myproject/ (Project Folder)
- │ └── public/ (DocumentRoot for myproject.local)
- └── htdocs/
-
-Restart Apache.
-
-Testing
--------
-
-With the above configuration, your webapp would be accessed with the URL **http://myproject.local/** in your browser.
-
-Apache needs to be restarted whenever you change its configuration.
-
-Hosting with Subfolder
-======================
-
-If you want a baseURL like **http://localhost/myproject/** with a subfolder, there are three ways.
-
-Making Symlink
---------------
-
-Place your project folder as follows, where **htdocs** is the Apache document root::
-
- ├── myproject/ (project folder)
- │ └── public/
- └── htdocs/
-
-Navigate to the **htdocs** folder and create a symbolic link as follows:
-
-.. code-block:: console
-
- cd htdocs/
- ln -s ../myproject/public/ myproject
-
-Using Alias
------------
-
-Place your project folder as follows, where **htdocs** is the Apache document root::
-
- ├── myproject/ (project folder)
- │ └── public/
- └── htdocs/
-
-Add the following in the main configuration file, e.g., **apache2/conf/httpd.conf**:
-
-.. code-block:: apache
-
- Alias /myproject /opt/lamp/apache2/myproject/public
-
- AllowOverride All
- Require all granted
-
-
-Restart Apache.
-
-Adding .htaccess
-----------------
-
-The last resort is to add **.htaccess** to the project root.
-
-It is not recommended that you place the project folder in the document root. However, if you have no other choice, like
-on a shared server, you can use this.
-
-Place your project folder as follows, where **htdocs** is the Apache document root, and create the **.htaccess** file::
-
- └── htdocs/
- └── myproject/ (project folder)
- ├── .htaccess
- └── public/
-
-And edit **.htaccess** as follows:
-
-.. code-block:: apache
-
-
- RewriteEngine On
- RewriteRule ^(.*)$ public/$1 [L]
-
-
-
- Require all denied
- Satisfy All
-
-
-And remove the redirect settings in **public/.htaccess**:
-
-.. code-block:: diff
-
- --- a/public/.htaccess
- +++ b/public/.htaccess
- @@ -16,16 +16,6 @@ Options -Indexes
- # http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
- # RewriteBase /
-
- - # Redirect Trailing Slashes...
- - RewriteCond %{REQUEST_FILENAME} !-d
- - RewriteCond %{REQUEST_URI} (.+)/$
- - RewriteRule ^ %1 [L,R=301]
- -
- - # Rewrite "www.example.com -> example.com"
- - RewriteCond %{HTTPS} !=on
- - RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
- - RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
- -
- # Checks to see if the user is attempting to access a valid file,
- # such as an image or css document, if this isn't true it sends the
- # request to the front controller, index.php
-
-Hosting with mod_userdir (Shared Hosts)
-=======================================
-
-A common practice in shared hosting environments is to use the Apache module "mod_userdir" to enable per-user Virtual
-Hosts automatically. Additional configuration is required to allow CodeIgniter4 to be run from these per-user
-directories.
-
-The following assumes that the server is already configured for mod_userdir. A guide to enabling this module is
-available `in the Apache documentation `_.
-
-Because CodeIgniter4 expects the server to find the framework front controller at **public/index.php** by default, you
-must specify this location as an alternative to search for the request (even if CodeIgniter4 is installed within the
-per-user web directory).
-
-The default user web directory **~/public_html** is specified by the ``UserDir`` directive, typically in
-**apache2/mods-available/userdir.conf** or **apache2/conf/extra/httpd-userdir.conf**:
-
-.. code-block:: apache
-
- UserDir public_html
-
-So you will need to configure Apache to look for CodeIgniter's public directory first before trying to serve the
-default:
-
-.. code-block:: apache
-
- UserDir "public_html/public" "public_html"
-
-Be sure to specify options and permissions for the CodeIgniter public directory as well. A **userdir.conf** might look
-like:
-
-.. code-block:: apache
-
-
- UserDir "public_html/public" "public_html"
- UserDir disabled root
-
-
- AllowOverride All
- Options MultiViews Indexes FollowSymLinks
-
- # Apache <= 2.2:
- # Order allow,deny
- # Allow from all
-
- # Apache >= 2.4:
- Require all granted
-
-
- # Apache <= 2.2:
- # Order deny,allow
- # Deny from all
-
- # Apache >= 2.4:
- Require all denied
-
-
-
-
- AllowOverride All
- Options MultiViews Indexes FollowSymLinks
-
- # Apache <= 2.2:
- # Order allow,deny
- # Allow from all
-
- # Apache >= 2.4:
- Require all granted
-
-
- # Apache <= 2.2:
- # Order deny,allow
- # Deny from all
-
- # Apache >= 2.4:
- Require all denied
-
-
-
-
-Removing the index.php
-======================
-
-See :ref:`CodeIgniter URLs `.
-
-Setting Environment
-===================
-
-See :ref:`Handling Multiple Environments `.
-
-******************
-Hosting with nginx
-******************
-
-nginx is the second most widely used HTTP server for web hosting. Here you can find an example configuration using PHP
-8.2 FPM (unix sockets) under Ubuntu Server.
-
-default.conf
-============
-
-This configuration enables URLs without "**index.php**" in them and uses CodeIgniter's "404 - File Not Found" for URLs
-ending with ".php".
-
-.. code-block:: nginx
-
- server {
- listen 80;
- listen [::]:80;
-
- server_name example.com;
-
- root /var/www/example.com/public;
- index index.php index.html index.htm;
-
- location / {
- try_files $uri $uri/ /index.php$is_args$args;
- }
-
- location ~ \.php$ {
- include snippets/fastcgi-php.conf;
-
- # With php-fpm:
- fastcgi_pass unix:/run/php/php8.2-fpm.sock;
- # With php-cgi:
- # fastcgi_pass 127.0.0.1:9000;
- }
-
- error_page 404 /index.php;
-
- # deny access to hidden files such as .htaccess
- location ~ /\. {
- deny all;
- }
- }
-
-Setting Environment
-===================
-
-See :ref:`Handling Multiple Environments `.
-
-*************************************
-Deployment to Shared Hosting Services
-*************************************
-
-See :ref:`Deployment `.
-
-*********************
-Bootstrapping the App
-*********************
-
-In some scenarios, you will want to load the framework without actually running the whole application. This is
-particularly useful for unit testing your project, but may also be handy for using third-party tools to analyze and
-modify your code. The framework comes with two separate bootstrap scripts specifically for these scenarios:
-
-- **system/Test/bootstrap.php**: This script is used primarily for unit testing.
-- **system/util_bootstrap.php**: This script is used for other scripts that need access to the framework. It is
- recommended for use in scripts that are not part of testing, as this will NOT fail gracefully if an exception is
- thrown.
-
-Most of the paths to your project are defined during the bootstrap process. You may use pre-defined constants to
-override these, but when using the defaults be sure that your paths align with the expected directory structure for your
-installation method.
diff --git a/user_guide_src/source/installation/troubleshooting.rst b/user_guide_src/source/installation/troubleshooting.rst
deleted file mode 100644
index efa5ac01036f..000000000000
--- a/user_guide_src/source/installation/troubleshooting.rst
+++ /dev/null
@@ -1,98 +0,0 @@
-###############
-Troubleshooting
-###############
-
-Here are some common installation problems, and suggested workarounds.
-
-.. contents::
- :local:
- :depth: 2
-
-How do I know if my install is working?
----------------------------------------
-
-From the command line, at your project root:
-
-.. code-block:: console
-
- php spark serve
-
-``http://localhost:8080`` in your browser should then show the default welcome page:
-
-|CodeIgniter4 Welcome|
-
-I have to include index.php in my URL
--------------------------------------
-
-If a URL like ``/mypage/find/apple`` doesn't work, but the similar URL ``/index.php/mypage/find/apple`` does, that
-sounds like your **.htaccess** rules (for Apache) are not set up properly, or the ``mod_rewrite`` extension in Apache's
-**httpd.conf** is commented out. See :ref:`urls-remove-index-php`.
-
-Only the default page loads
----------------------------
-
-If you find that no matter what you put in your URL, only your default page is loading, it might be that your server
-does not support the REQUEST_URI variable needed to serve search-engine friendly URLs. As a first step, open your
-**app/Config/App.php** file and look for the URI Protocol information. It will recommend that you try a couple of
-alternate settings. If it still doesn't work after you've tried this, you'll need to force CodeIgniter to add a question
-mark (``?``) to your URLs. To do this, open your **app/Config/App.php** file and change this:
-
-.. literalinclude:: troubleshooting/001.php
-
-To this:
-
-.. literalinclude:: troubleshooting/002.php
-
-No input file specified
------------------------
-
-If you see "No input file specified", try changing the rewrite rule like the following (to add ``?`` after
-``index.php``):
-
-.. code-block:: apache
-
- RewriteRule ^([\s\S]*)$ index.php?/$1 [L,NC,QSA]
-
-My app works fine locally but not on the production server
-----------------------------------------------------------
-
-Make sure that the case of the folder and file names matches the code.
-
-Many developers develop on case-insensitive file systems on Windows or macOS. However, most server environments use
-case-sensitive file systems.
-
-For example, when you have **app/Controllers/Product.php**, you must use ``Product`` as the short classname, not
-``product``.
-
-If the file name case is incorrect, the file is not found on the server.
-
-The tutorial gives 404 errors everywhere :(
--------------------------------------------
-
-You can't follow the tutorial using PHP's built-in web server. It doesn't process the **.htaccess** file needed to route
-requests properly.
-
-The solution: use Apache to serve your site, or else the built-in CodeIgniter equivalent, ``php spark serve`` from your
-project root.
-
-.. |CodeIgniter4 Welcome| image:: ../images/welcome.png
-
-What's with an unhelpful "Whoops!" page?
-----------------------------------------
-
-You find that your app is displaying a page with "Whoops!" and then the text line "We seem to have hit a snag. Please
-try again later...".
-
-That is a sign that you are in production mode and have hit an unrecoverable error, which we don't want to show to the
-viewer of the webapp, for better security.
-
-You can see the error in the log file. See `CodeIgniter Error Logs`_ below.
-
-If you reach this page while developing, you should change your environment to "development" (in **.env**). See
-:ref:`setting-development-mode` for more details. After that, reload the page. You will see the error and the back
-trace.
-
-CodeIgniter Error Logs
-----------------------
-
-See :ref:`codeigniter-error-logs`.
diff --git a/user_guide_src/source/installation/troubleshooting/001.php b/user_guide_src/source/installation/troubleshooting/001.php
deleted file mode 100644
index 953d7b86bb82..000000000000
--- a/user_guide_src/source/installation/troubleshooting/001.php
+++ /dev/null
@@ -1,14 +0,0 @@
-`
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-CodeIgniter 4.0.4 fixes a bug in the implementation of :doc:`Controller Filters `, breaking code
-implementing the ``FilterInterface``.
-
-Breaking Changes
-****************
-
-Update FilterInterface Declarations
-===================================
-
-The method signatures for ``after()`` and ``before()`` must be updated to include ``$arguments``. The function
-definitions should be changed from::
-
- public function before(RequestInterface $request)
- public function after(RequestInterface $request, ResponseInterface $response)
-
-to::
-
- public function before(RequestInterface $request, $arguments = null)
- public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
diff --git a/user_guide_src/source/installation/upgrade_405.rst b/user_guide_src/source/installation/upgrade_405.rst
deleted file mode 100644
index 85a553afe75f..000000000000
--- a/user_guide_src/source/installation/upgrade_405.rst
+++ /dev/null
@@ -1,167 +0,0 @@
-#############################
-Upgrading from 4.0.4 to 4.0.5
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Enhancements
-*********************
-
-Cookie SameSite Support
-=======================
-
-CodeIgniter 4.0.5 introduces a setting for the cookie SameSite attribute. Prior versions did not set this attribute at
-all. The default setting for cookies is now ``Lax``. This will affect how cookies are handled in cross-domain contexts
-and you may need to adjust this setting in your projects. Separate settings in **app/Config/App.php** exist for Response
-cookies and for CSRF cookies.
-
-For additional information, see
-`MDN Web Docs `_. The SameSite
-specifications are described in `RFC 6265 `_ and the
-`RFC 6265bis revision `_.
-
-Message::getHeader(s)
-=====================
-
-The HTTP layer is moving towards `PSR-7 compliance `_. Towards this end,
-``Message::getHeader()`` and ``Message::getHeaders()`` are deprecated and should be replaced with ``Message::header()``
-and ``Message::headers()`` respectively. Note that this pertains to all classes that extend ``Message`` as well:
-``Request``, ``Response`` and their subclasses.
-
-Additional related deprecations from the HTTP layer:
-
-* ``Message::isJSON()``: Check the "Content-Type" header directly
-* ``Request[Interface]::isValidIP()``: Use the Validation class with ``valid_ip``
-* ``Request[Interface]::getMethod()``: The ``$upper`` parameter will be removed. Use ``strtoupper()``
-* ``Request[Trait]::$ipAddress``: This property will become private
-* ``Request::$proxyIPs``: This property will be removed; access ``config('App')->proxyIPs`` directly
-* ``Request::__construct()``: The constructor will no longer take ``Config\App`` and has been made nullable to aid
- transition
-* ``Response[Interface]::getReason()``: Use ``getReasonPhrase()`` instead
-* ``Response[Interface]::getStatusCode()``: The explicit ``int`` return type will be removed (no action required)
-
-ResponseInterface
-=================
-
-This interface intends to include the necessary methods for any framework-compatible response class. A number of methods
-expected by the framework were missing and have now been added. If you use any classes that implement
-``ResponseInterface`` directly, they will need to be compatible with the updated requirements. These methods are as
-follows:
-
-* ``setLastModified($date)``
-* ``setLink(PagerInterface $pager)``
-* ``setJSON($body, bool $unencoded = false)``
-* ``getJSON()``
-* ``setXML($body)``
-* ``getXML()``
-* ``send()``
-* ``sendHeaders()``
-* ``sendBody()``
-* ``setCookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = false, $httponly = false, $samesite = null)``
-* ``hasCookie(string $name, string $value = null, string $prefix = ''): bool``
-* ``getCookie(string $name = null, string $prefix = '')``
-* ``deleteCookie(string $name = '', string $domain = '', string $path = '/', string $prefix = '')``
-* ``getCookies()``
-* ``redirect(string $uri, string $method = 'auto', int $code = null)``
-* ``download(string $filename = '', $data = '', bool $setMime = false)``
-
-To facilitate use of this interface, these methods have been moved from the framework's ``Response`` into a
-``ResponseTrait`` which you may use, and ``DownloadResponse`` now extends ``Response`` directly to ensure maximum
-compatibility.
-
-Config\\Services
-================
-
-Service discovery has been updated to allow third-party services (when enabled via Modules) to take precedence over core
-services. Update **app/Config/Services.php** so the class extends ``CodeIgniter\Config\BaseService`` to allow proper
-discovery of third-party services.
-
-Project Files
-*************
-
-Numerous files in the project space (root, app, public, writable) received updates. Due to these files being outside of
-the system scope, they will not be changed without your intervention. There are some third-party CodeIgniter modules
-available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-.. note:: Except in very rare cases for bug fixes, no changes made to files for the project space will break your
- application. All changes noted here are optional until the next major version, and any mandatory changes will be
- covered in the sections above.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-* ``app/Views/*``
-* ``public/index.php``
-* ``public/.htaccess``
-* ``spark``
-* ``phpunit.xml.dist``
-* ``composer.json``
-
-All Changes
-===========
-
-This is a list of all files in the project space that received changes; many will be simple comments or formatting that
-have no effect on the runtime:
-
-* ``LICENSE``
-* ``README.md``
-* ``app/Config/App.php``
-* ``app/Config/Autoload.php``
-* ``app/Config/Boot/development.php``
-* ``app/Config/Boot/production.php``
-* ``app/Config/Boot/testing.php``
-* ``app/Config/Cache.php``
-* ``app/Config/Constants.php``
-* ``app/Config/ContentSecurityPolicy.php``
-* ``app/Config/Database.php``
-* ``app/Config/DocTypes.php``
-* ``app/Config/Email.php``
-* ``app/Config/Encryption.php``
-* ``app/Config/Events.php``
-* ``app/Config/Exceptions.php``
-* ``app/Config/Filters.php``
-* ``app/Config/ForeignCharacters.php``
-* ``app/Config/Format.php``
-* ``app/Config/Generators.php``
-* ``app/Config/Honeypot.php``
-* ``app/Config/Images.php``
-* ``app/Config/Kint.php``
-* ``app/Config/Logger.php``
-* ``app/Config/Migrations.php``
-* ``app/Config/Mimes.php``
-* ``app/Config/Modules.php``
-* ``app/Config/Pager.php``
-* ``app/Config/Paths.php``
-* ``app/Config/Routes.php``
-* ``app/Config/Security.php``
-* ``app/Config/Services.php``
-* ``app/Config/Toolbar.php``
-* ``app/Config/UserAgents.php``
-* ``app/Config/Validation.php``
-* ``app/Config/View.php``
-* ``app/Controllers/BaseController.php``
-* ``app/Controllers/Home.php``
-* ``app/Views/errors/cli/error_404.php``
-* ``app/Views/errors/cli/error_exception.php``
-* ``app/Views/errors/html/debug.css``
-* ``app/Views/errors/html/debug.js``
-* ``app/Views/errors/html/error_exception.php``
-* ``composer.json``
-* ``env``
-* ``license.txt``
-* ``phpunit.xml.dist``
-* ``public/.htaccess``
-* ``public/index.php``
-* ``spark``
diff --git a/user_guide_src/source/installation/upgrade_410.rst b/user_guide_src/source/installation/upgrade_410.rst
deleted file mode 100644
index 747b7e73e7fe..000000000000
--- a/user_guide_src/source/installation/upgrade_410.rst
+++ /dev/null
@@ -1,22 +0,0 @@
-######################################
-Upgrading from 4.0.5 to 4.1.0 or 4.1.1
-######################################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-Legacy Autoloading
-==================
-
-The ``Autoloader::loadLegacy()`` method was originally for the transition to CodeIgniter v4. Since v4.1.0, this support
-was removed. All classes must be namespaced.
diff --git a/user_guide_src/source/installation/upgrade_412.rst b/user_guide_src/source/installation/upgrade_412.rst
deleted file mode 100644
index 10d9242208ba..000000000000
--- a/user_guide_src/source/installation/upgrade_412.rst
+++ /dev/null
@@ -1,145 +0,0 @@
-#############################
-Upgrading from 4.1.1 to 4.1.2
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-current_url() and indexPage
-===========================
-
-Due to `a bug `_ in ``current_url()``, the resulting URIs
-could be incorrect for a project's configuration, most importantly: ``indexPage`` would *not* be included. Projects
-using ``App::$indexPage`` should expect altered values from ``current_url()`` and all its dependencies (including
-Response Testing, Pager, Form Helper, and View Parser). Update your projects accordingly.
-
-Cache Keys
-==========
-
-Cache handlers had wildly different compatibility for keys. The updated cache drivers now pass all keys through
-validation, roughly matching PSR-6's recommendations:
-
- A string of at least one character that uniquely identifies a cached item. Implementing libraries MUST support keys
- consisting of the characters A-Z, a-z, 0-9, _, and . in any order in UTF-8 encoding and a length of up to 64
- characters. Implementing libraries MAY support additional characters and encodings or longer lengths, but must
- support at least that minimum. Libraries are responsible for their own escaping of key strings as appropriate, but
- MUST be able to return the original unmodified key string. The following characters are reserved for future
- extensions and MUST NOT be supported by implementing libraries: ``{}()/\@:``
-
-Update your projects to remove any invalid cache keys.
-
-BaseConnection::query() Return Values
-=====================================
-
-The ``BaseConnection::query()`` method in prior versions was incorrectly returning BaseResult objects even if the query
-failed. This method will now return ``false`` for failed queries (or throw an Exception if ``DBDebug`` is ``true``) and
-will return booleans for write-type queries. Review any use of the ``query()`` method and assess whether the value might
-be boolean instead of a Result object. For a better idea of what queries are write-type queries, check
-``BaseConnection::isWriteType()`` and any DBMS-specific override ``isWriteType()`` in the relevant Connection class.
-
-Breaking Enhancements
-*********************
-
-ConnectionInterface::isWriteType() Declaration Added
-====================================================
-
-If you have written any classes that implement ConnectionInterface, these must now implement the ``isWriteType()``
-method, declared as ``public function isWriteType($sql): bool``. If your class extends BaseConnection, then that class
-will provide a basic ``isWriteType()`` method which you might want to override.
-
-Test Traits
-===========
-
-The ``CodeIgniter\Test`` namespace has had significant improvements to help developers with their own test cases. Most
-notably, test extensions have moved to Traits to make them easier to pick-and-choose across various test case needs. The
-``CIDatabaseTestCase`` and ``FeatureTestCase`` classes have been deprecated and their methods moved to
-``DatabaseTestTrait`` and ``FeatureTestTrait`` respectively. Update your test cases to extend the main test case and use
-any traits you need. For example:
-
-.. literalinclude:: upgrade_412/001.php
-
-... becomes:
-
-.. literalinclude:: upgrade_412/002.php
-
-Finally, ``ControllerTester`` has been superseded by ``ControllerTestTrait`` to standardize the approach and take
-advantage of the updated response testing (below).
-
-Test Responses
-==============
-
-The tools for testing responses have been consolidated and improved. A new ``TestResponse`` replaces
-``ControllerResponse`` and ``FeatureResponse`` with a complete set of methods and properties expected from both those
-classes. In most cases, these changes will be handled "behind the scenes" by ``ControllerTestTrait`` and
-``FeatureTestCase``, but there are two changes to be aware of:
-
-* ``TestResponse``'s ``$request`` and ``$response`` properties are protected and should only be accessed through their
- getter methods, ``request()`` and ``response()``
-* ``TestResponse`` does not have ``getBody()`` and ``setBody()`` methods, but rather uses the Response methods directly,
- e.g.: ``$body = $result->response()->getBody();``
-
-Project Files
-*************
-
-Numerous files in the project space (root, app, public, writable) received updates. Due to these files being outside of
-the system scope, they will not be changed without your intervention. There are some third-party CodeIgniter modules
-available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-.. note:: Except in very rare cases for bug fixes, no changes made to files for the project space will break your
- application. All changes noted here are optional until the next major version, and any mandatory changes will be
- covered in the sections above.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-* ``app/Config/App.php``
-* ``app/Config/Autoload.php``
-* ``app/Config/Cookie.php``
-* ``app/Config/Events.php``
-* ``app/Config/Exceptions.php``
-* ``app/Config/Security.php``
-* ``app/Views/errors/html/*``
-* ``env``
-* ``spark``
-
-All Changes
-===========
-
-This is a list of all files in the project space that received changes; many will be simple comments or formatting that
-have no effect on the runtime:
-
-* ``app/Config/App.php``
-* ``app/Config/Autoload.php``
-* ``app/Config/ContentSecurityPolicy.php``
-* ``app/Config/Cookie.php``
-* ``app/Config/Events.php``
-* ``app/Config/Exceptions.php``
-* ``app/Config/Logger.php``
-* ``app/Config/Mimes.php``
-* ``app/Config/Modules.php``
-* ``app/Config/Security.php``
-* ``app/Controllers/BaseController.php``
-* ``app/Views/errors/html/debug.css``
-* ``app/Views/errors/html/error_404.php``
-* ``app/Views/errors/html/error_exception.php``
-* ``app/Views/welcome_message.php``
-* ``composer.json``
-* ``contributing/guidelines.rst``
-* ``env``
-* ``public/.htaccess``
-* ``public/index.php``
-* ``spark``
diff --git a/user_guide_src/source/installation/upgrade_412/001.php b/user_guide_src/source/installation/upgrade_412/001.php
deleted file mode 100644
index 94fb395e8077..000000000000
--- a/user_guide_src/source/installation/upgrade_412/001.php
+++ /dev/null
@@ -1,11 +0,0 @@
-`
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Enhancements
-*********************
-
-Cache TTL
-=========
-
-There is a new value in **app/Config/Cache.php**: ``$ttl``. This is not used by framework handlers where 60 seconds is
-hard-coded, but may be useful to projects and modules. In a future release this value will replace the hard-coded
-version, so either leave this as ``60`` or stop relying on the hard-coded version.
-
-Project Files
-*************
-
-Only a few files in the project space (root, app, public, writable) received updates. Due to these files being outside
-of the system scope, they will not be changed without your intervention. The following files received changes and it is
-recommended that you merge the updated versions with your application:
-
-* ``app/Config/Cache.php``
-* ``spark``
diff --git a/user_guide_src/source/installation/upgrade_414.rst b/user_guide_src/source/installation/upgrade_414.rst
deleted file mode 100644
index 1107ecce6347..000000000000
--- a/user_guide_src/source/installation/upgrade_414.rst
+++ /dev/null
@@ -1,56 +0,0 @@
-#############################
-Upgrading from 4.1.3 to 4.1.4
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-This release focuses on code style. All changes (except those noted below) are cosmetic to bring the code in line with
-the new `CodeIgniter Coding Standard `_ (based on PSR-12).
-
-Breaking Changes
-****************
-
-Method Scope
-============
-
-The following methods were changed from ``public`` to ``protected`` to match their parent class methods and better align
-with their uses. If you relied on any of these methods being public (highly unlikely), adjust your code accordingly:
-
-* ``CodeIgniter\Database\MySQLi\Connection::execute()``
-* ``CodeIgniter\Database\MySQLi\Connection::_fieldData()``
-* ``CodeIgniter\Database\MySQLi\Connection::_indexData()``
-* ``CodeIgniter\Database\MySQLi\Connection::_foreignKeyData()``
-* ``CodeIgniter\Database\Postgre\Builder::_like_statement()``
-* ``CodeIgniter\Database\Postgre\Connection::execute()``
-* ``CodeIgniter\Database\Postgre\Connection::_fieldData()``
-* ``CodeIgniter\Database\Postgre\Connection::_indexData()``
-* ``CodeIgniter\Database\Postgre\Connection::_foreignKeyData()``
-* ``CodeIgniter\Database\SQLSRV\Connection::execute()``
-* ``CodeIgniter\Database\SQLSRV\Connection::_fieldData()``
-* ``CodeIgniter\Database\SQLSRV\Connection::_indexData()``
-* ``CodeIgniter\Database\SQLSRV\Connection::_foreignKeyData()``
-* ``CodeIgniter\Database\SQLite3\Connection::execute()``
-* ``CodeIgniter\Database\SQLite3\Connection::_fieldData()``
-* ``CodeIgniter\Database\SQLite3\Connection::_indexData()``
-* ``CodeIgniter\Database\SQLite3\Connection::_foreignKeyData()``
-* ``CodeIgniter\Images\Handlers\GDHandler::_flatten()``
-* ``CodeIgniter\Images\Handlers\GDHandler::_flip()``
-* ``CodeIgniter\Images\Handlers\ImageMagickHandler::_flatten()``
-* ``CodeIgniter\Images\Handlers\ImageMagickHandler::_flip()``
-* ``CodeIgniter\Test\Mock\MockIncomingRequest::detectURI()``
-* ``CodeIgniter\Test\Mock\MockSecurity::sendCookie()``
-
-Project Files
-*************
-
-All files in the project space were reformatted with the new coding style. This will not affect existing code but you
-may want to apply the updated coding style to your own projects to keep them in line with the framework's version of
-these files.
diff --git a/user_guide_src/source/installation/upgrade_415.rst b/user_guide_src/source/installation/upgrade_415.rst
deleted file mode 100644
index 82fe051ee575..000000000000
--- a/user_guide_src/source/installation/upgrade_415.rst
+++ /dev/null
@@ -1,163 +0,0 @@
-#############################
-Upgrading from 4.1.4 to 4.1.5
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-================
-
-Changes for set() method in BaseBuilder and Model class
--------------------------------------------------------
-
-The casting for the ``$value`` parameter has been removed to fix a bug where passing parameters as an array and as a
-string to the ``set()`` method was handled differently. If you extended the ``BaseBuilder`` class or ``Model`` class
-yourself and modified the ``set()`` method, then you need to change its definition from
-``public function set($key, ?string $value = '', ?bool $escape = null)`` to
-``public function set($key, $value = '', ?bool $escape = null)``.
-
-Session DatabaseHandler's Database Table Change
------------------------------------------------
-
-The types of the following columns in the session table have been changed for optimization.
-
-- MySQL
-
- - ``timestamp``
-
-- PostgreSQL
-
- - ``ip_address``
- - ``timestamp``
- - ``data``
-
-Update the definition of the session table. See the :doc:`/libraries/sessions` for the new definition.
-
-The change was introduced in v4.1.2. But due to `a bug `_, the
-DatabaseHandler Driver did not work properly.
-
-CSRF Protection
----------------
-
-Because of a bug fix, CSRF protection now works on not only **POST** but also **PUT/PATCH/DELETE** requests when the
-CSRF filter is applied.
-
-When you use **PUT/PATCH/DELETE** requests, you need to send the CSRF token. Or remove the CSRF filter for such requests
-if you don't need CSRF protection for them.
-
-If you want the same behavior as the previous version, set the CSRF filter like the following in
-**app/Config/Filters.php**:
-
-.. literalinclude:: upgrade_415/001.php
-
-Protecting the **GET** method is needed only when you use ``form_open()`` auto-generation of the CSRF field.
-
-.. warning:: In general, if you use ``$methods`` filters, you should
- :ref:`disable Auto Routing (Legacy) ` because :ref:`auto-routing-legacy` permits any HTTP
- method to access a controller. Accessing the controller with a method you don't expect could bypass the filter.
-
-CURLRequest Header Change
--------------------------
-
-In the previous version, if you didn't provide your own headers, ``CURLRequest`` would send the request-headers from the
-browser. The bug was fixed. If your requests depend on the headers, your requests might fail after upgrading. In this
-case, add the necessary headers manually. See :ref:`CURLRequest Class ` for how to
-add them.
-
-Query Builder Changes
----------------------
-
-For optimization and a bug fix, the following behaviors, mostly used in testing, have been changed.
-
-- When you use ``insertBatch()`` and ``updateBatch()``, the return value of ``$query->getOriginalQuery()`` has changed.
- It no longer returns the query with the bound parameters, but the actual query that was run.
-- If ``testMode`` is ``true``, ``insertBatch()`` will return an SQL string array instead of the number of affected rows.
- This change was made so that the returned data type is the same as the ``updateBatch()`` method.
-
-Breaking Enhancements
-=====================
-
-.. _upgrade-415-multiple-filters-for-a-route:
-
-Multiple Filters for a Route
-----------------------------
-
-A new feature has been added to set multiple filters for a route.
-
-.. important:: This feature is disabled by default because it breaks backward compatibility.
-
-If you want to use this, you need to set the property ``$multipleFilters`` to ``true`` in ``app/Config/Feature.php``. If
-you enable it:
-
-- ``CodeIgniter\CodeIgniter::handleRequest()`` uses
-
- - ``CodeIgniter\Filters\Filters::enableFilters()``, instead of ``enableFilter()``
-
-- ``CodeIgniter\CodeIgniter::tryToRouteIt()`` uses
-
- - ``CodeIgniter\Router\Router::getFilters()``, instead of ``getFilter()``
-
-- ``CodeIgniter\Router\Router::handle()`` uses
-
- - the property ``$filtersInfo``, instead of ``$filterInfo``
- - ``CodeIgniter\Router\RouteCollection::getFiltersForRoute()``, instead of ``getFilterForRoute()``
-
-If you extended the above classes, then you need to change them.
-
-The following methods and a property have been deprecated:
-
-- ``CodeIgniter\Filters\Filters::enableFilter()``
-- ``CodeIgniter\Router\Router::getFilter()``
-- ``CodeIgniter\Router\RouteCollection::getFilterForRoute()``
-- ``CodeIgniter\Router\RouteCollection``'s property ``$filterInfo``
-
-See :ref:`applying-filters` for the functionality.
-
-Project Files
-=============
-
-Numerous files in the project space (root, app, public, writable) received updates. Due to these files being outside of
-the system scope, they will not be changed without your intervention. There are some third-party CodeIgniter modules
-available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-.. note:: Except in very rare cases for bug fixes, no changes made to files for the project space will break your
- application. All changes noted here are optional until the next major version, and any mandatory changes will be
- covered in the sections above.
-
-Content Changes
----------------
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-* ``app/Config/CURLRequest.php``
-* ``app/Config/Cache.php``
-* ``app/Config/Feature.php``
-* ``app/Config/Generators.php``
-* ``app/Config/Publisher.php``
-* ``app/Config/Security.php``
-* ``app/Views/welcome_message.php``
-
-All Changes
------------
-
-This is a list of all files in the project space that received changes; many will be simple comments or formatting that
-have no effect on the runtime:
-
-* ``app/Config/CURLRequest.php``
-* ``app/Config/Cache.php``
-* ``app/Config/Feature.php``
-* ``app/Config/Generators.php``
-* ``app/Config/Kint.php``
-* ``app/Config/Publisher.php``
-* ``app/Config/Security.php``
-* ``app/Views/welcome_message.php``
diff --git a/user_guide_src/source/installation/upgrade_415/001.php b/user_guide_src/source/installation/upgrade_415/001.php
deleted file mode 100644
index 272f9e2f1fab..000000000000
--- a/user_guide_src/source/installation/upgrade_415/001.php
+++ /dev/null
@@ -1,16 +0,0 @@
- ['csrf'],
- 'POST' => ['csrf'],
- ];
- // ...
-}
diff --git a/user_guide_src/source/installation/upgrade_416.rst b/user_guide_src/source/installation/upgrade_416.rst
deleted file mode 100644
index 7acdeb9177a0..000000000000
--- a/user_guide_src/source/installation/upgrade_416.rst
+++ /dev/null
@@ -1,74 +0,0 @@
-#############################
-Upgrading from 4.1.5 to 4.1.6
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-Validation Result Changes
-=========================
-
-Due to a bug fix, Validation might now change the validation results when you validate an array item (see
-:ref:`Changelog `). So check the validation results for all the code that validates
-the array. Validating multiple fields like ``contacts.*.name`` is not affected.
-
-If you have the following form::
-
-
-
-
-And you have the validation rule like this::
-
- 'invoice_rule' => ['rules' => 'numeric', 'errors' => ['numeric' => 'Not numeric']]
-
-Change the rule key to ``invoice_rule.*`` and the validation will work.
-
-Breaking Enhancements
-*********************
-
-None.
-
-Project Files
-*************
-
-Numerous files in the **project space** (root, app, public, writable) received updates. Due to these files being outside
-of the **system** scope, they will not be changed without your intervention. There are some third-party CodeIgniter
-modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-.. note:: Except in very rare cases for bug fixes, no changes made to files for the project space will break your
- application. All changes noted here are optional until the next major version, and any mandatory changes will be
- covered in the sections above.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-* ``app/Config/Filters.php``
-* ``app/Config/Mimes.php``
-* ``app/Config/Security.php``
-* ``app/Config/Toolbar.php``
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* ``app/Config/Filters.php``
-* ``app/Config/Mimes.php``
-* ``app/Config/Security.php``
-* ``app/Config/Toolbar.php``
-* ``app/Views/errors/html/error_exception.php``
diff --git a/user_guide_src/source/installation/upgrade_417.rst b/user_guide_src/source/installation/upgrade_417.rst
deleted file mode 100644
index 39736332df07..000000000000
--- a/user_guide_src/source/installation/upgrade_417.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-#############################
-Upgrading from 4.1.6 to 4.1.7
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-- The output of ``get_cookie()`` when ``$xssClean`` is true has changed. Now it uses
- ``FILTER_SANITIZE_FULL_SPECIAL_CHARS``, not ``FILTER_SANITIZE_STRING``. Make sure the change is acceptable. Note that
- using XSS filtering is a bad practice. It does not prevent XSS attacks perfectly. Using ``esc()`` with the correct
- ``$context`` in the views is recommended.
diff --git a/user_guide_src/source/installation/upgrade_418.rst b/user_guide_src/source/installation/upgrade_418.rst
deleted file mode 100644
index c187ee5cd527..000000000000
--- a/user_guide_src/source/installation/upgrade_418.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-#############################
-Upgrading from 4.1.7 to 4.1.8
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-- Due to a security issue in the ``API\ResponseTrait``, all trait methods are now scoped to ``protected``. See the
- `Security advisory GHSA-7528-7jg5-6g62 `_
- for more information.
diff --git a/user_guide_src/source/installation/upgrade_420.rst b/user_guide_src/source/installation/upgrade_420.rst
deleted file mode 100644
index 22ffb8161546..000000000000
--- a/user_guide_src/source/installation/upgrade_420.rst
+++ /dev/null
@@ -1,137 +0,0 @@
-#############################
-Upgrading from 4.1.9 to 4.2.0
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Mandatory File Changes
-**********************
-
-index.php and spark
-===================
-
-The following files received significant changes and **you must merge the updated versions** with your application:
-
-* ``public/index.php``
-* ``spark``
-
-.. important:: If you don't update the above two files, CodeIgniter will not work at all after running
- ``composer update``.
-
- The upgrade procedure, for example, is as follows:
-
- .. code-block:: console
-
- composer update
- cp vendor/codeigniter4/framework/public/index.php public/index.php
- cp vendor/codeigniter4/framework/spark .
-
-Config/Constants.php
-====================
-
-The constants ``EVENT_PRIORITY_LOW``, ``EVENT_PRIORITY_NORMAL`` and ``EVENT_PRIORITY_HIGH`` are deprecated, and the
-definitions are moved to ``app/Config/Constants.php``. If you use these constants, define them in
-``app/Config/Constants.php``. Or use the new class constants ``CodeIgniter\Events\Events::PRIORITY_LOW``,
-``CodeIgniter\Events\Events::PRIORITY_NORMAL`` and ``CodeIgniter\Events\Events::PRIORITY_HIGH``.
-
-composer.json
-=============
-
-.. note:: This procedure is not required in v4.5.0 or later.
-
-If you use Composer, installed CodeIgniter v4.1.9 or earlier, and there are ``App\\`` and ``Config\\`` namespaces in
-your ``/composer.json``'s ``autoload.psr-4`` like the following, you need to remove these lines, and run
-``composer dump-autoload``.
-
-.. code-block:: text
-
- {
- ...
- "autoload": {
- "psr-4": {
- "App\\": "app", <-- Remove this line
- "Config\\": "app/Config" <-- Remove this line
- }
- },
- ...
- }
-
-Breaking Changes
-****************
-
-- The ``system/bootstrap.php`` file no longer returns a ``CodeIgniter`` instance, and does not load the ``.env`` file
- (now handled in ``index.php`` and ``spark``). If you have code that expects these behaviors, it will no longer work
- and must be modified. This has been changed to make
- `Preloading `_ easier to implement.
-
-Breaking Enhancements
-*********************
-
-- The method signature of ``Validation::setRule()`` has been changed. The ``string`` typehint on the ``$rules``
- parameter was removed. Extending classes should likewise remove the typehint so as not to break LSP.
-- The method signatures of ``CodeIgniter\Database\BaseBuilder::join()`` and ``CodeIgniter\Database\*\Builder::join()``
- have been changed. The ``string`` typehint on the ``$cond`` parameter was removed. Extending classes should likewise
- remove the typehint so as not to break LSP.
-
-Project Files
-*************
-
-Numerous files in the **project space** (root, app, public, writable) received updates. Due to these files being outside
-of the **system** scope, they will not be changed without your intervention. There are some third-party CodeIgniter
-modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-.. note:: Except in very rare cases for bug fixes, no changes made to files for the project space will break your
- application. All changes noted here are optional until the next major version, and any mandatory changes will be
- covered in the sections above.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-* ``app/Config/Routes.php``
-
- * To make the default configuration more secure, auto-routing has been changed to disabled by default.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* **app/Config/App.php**
-* **app/Config/Constants.php**
-* **app/Config/ContentSecurityPolicy.php**
-* **app/Config/Database.php**
-* **app/Config/Events.php**
-* **app/Config/Feature.php**
-* **app/Config/Filters.php**
-* **app/Config/Format.php**
-* **app/Config/Logger.php**
-* **app/Config/Mimes.php**
-* **app/Config/Publisher.php**
-* **app/Config/Routes.php**
-* **app/Config/Security.php**
-* **app/Config/Validation.php**
-* **app/Config/View.php**
-* **app/Controllers/BaseController.php**
-* **app/Views/errors/html/debug.css**
-* **app/Views/errors/html/debug.js**
-* **app/Views/errors/html/error_404.php**
-* **app/Views/errors/html/error_exception.php**
-* **app/Views/errors/html/production.php**
-* **app/Views/welcome_message.php**
-* **app/index.html**
-* **preload.php**
-* **public/index.php**
-* spark
diff --git a/user_guide_src/source/installation/upgrade_421.rst b/user_guide_src/source/installation/upgrade_421.rst
deleted file mode 100644
index b9a132204500..000000000000
--- a/user_guide_src/source/installation/upgrade_421.rst
+++ /dev/null
@@ -1,90 +0,0 @@
-#############################
-Upgrading from 4.2.0 to 4.2.1
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Mandatory File Changes
-**********************
-
-app/Config/Mimes.php
-====================
-
-- The mapping of file extensions to MIME types in **app/Config/Mimes.php** was updated to fix a bug. Also, the logic of
- ``Mimes::getExtensionFromType()`` was changed.
-
-Breaking Changes
-****************
-
-.. _upgrade-421-get_cookie:
-
-get_cookie()
-============
-
-If there is a cookie with a prefixed name and a cookie with the same name without a prefix, the previous
-``get_cookie()`` had the tricky behavior of returning the cookie without the prefix.
-
-For example, when ``Config\Cookie::$prefix`` is ``prefix_`` and there are two cookies, ``test`` and ``prefix_test``:
-
-.. code-block:: php
-
- $_COOKIES = [
- 'test' => 'Non CI Cookie',
- 'prefix_test' => 'CI Cookie',
- ];
-
-Previously, ``get_cookie()`` returned the following:
-
-.. code-block:: php
-
- get_cookie('test'); // returns "Non CI Cookie"
- get_cookie('prefix_test'); // returns "CI Cookie"
-
-Now this bug has been fixed, and the behavior has changed as follows:
-
-.. code-block:: php
-
- get_cookie('test'); // returns "CI Cookie"
- get_cookie('prefix_test'); // returns null
- get_cookie('test', false, null); // returns "Non CI Cookie"
-
-If you depend on the previous behavior, you need to change your code.
-
-.. note:: In the example above, if there is only one cookie ``prefix_test``, the previous ``get_cookie('test')`` also
- returned ``"CI Cookie"``.
-
-Breaking Enhancements
-*********************
-
-
-Project Files
-*************
-
-Numerous files in the **project space** (root, app, public, writable) received updates. Due to these files being outside
-of the **system** scope, they will not be changed without your intervention. There are some third-party CodeIgniter
-modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-.. note:: Except in very rare cases for bug fixes, no changes made to files for the project space will break your
- application. All changes noted here are optional until the next major version, and any mandatory changes will be
- covered in the sections above.
-
-Content Changes
-===============
-
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* **app/Config/Mimes.php**
diff --git a/user_guide_src/source/installation/upgrade_4210.rst b/user_guide_src/source/installation/upgrade_4210.rst
deleted file mode 100644
index f1c06fb5356b..000000000000
--- a/user_guide_src/source/installation/upgrade_4210.rst
+++ /dev/null
@@ -1,26 +0,0 @@
-##############################
-Upgrading from 4.2.9 to 4.2.10
-##############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Project Files
-*************
-
-Version 4.2.10 did not alter any executable code in project files.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* **composer.json**
diff --git a/user_guide_src/source/installation/upgrade_4211.rst b/user_guide_src/source/installation/upgrade_4211.rst
deleted file mode 100644
index 814f20579f88..000000000000
--- a/user_guide_src/source/installation/upgrade_4211.rst
+++ /dev/null
@@ -1,70 +0,0 @@
-###############################
-Upgrading from 4.2.10 to 4.2.11
-###############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-.. _upgrade-4211-proxyips:
-
-Config\\App::$proxyIPs
-======================
-
-The config value format has been changed. Now you must set your proxy IP address and the HTTP header name for the client
-IP address pair as an array::
-
- public $proxyIPs = [
- '10.0.1.200' => 'X-Forwarded-For',
- '192.168.5.0/24' => 'X-Forwarded-For',
- ];
-
-``ConfigException`` will be thrown for a config value in the old format.
-
-.. _upgrade-4211-session-key:
-
-Session Handler Key Changes
-===========================
-
-The key of the session data record for :ref:`sessions-databasehandler-driver`, :ref:`sessions-memcachedhandler-driver`
-and :ref:`sessions-redishandler-driver` has changed. Therefore, any existing session data will be invalidated after the
-upgrade if you are using these session handlers.
-
-- When using ``DatabaseHandler``, the ``id`` column value in the session table now contains the session cookie name
- (``Config\App::$sessionCookieName``).
-- When using ``MemcachedHandler`` or ``RedisHandler``, the key value contains the session cookie name
- (``Config\App::$sessionCookieName``).
-
-There is a maximum length for the ``id`` column and Memcached key (250 bytes). If the following values exceed those
-maximum lengths, the session will not work properly.
-
-- the session cookie name, delimiter, and session id (32 characters by default) when using ``DatabaseHandler``
-- the prefix (``ci_session``), session cookie name, delimiters, and session id when using ``MemcachedHandler``
-
-Project Files
-*************
-
-Version 4.2.11 did not alter any executable code in project files.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* **app/Config/App.php**
-* **app/Config/Autoload.php**
-* **app/Config/Logger.php**
-* **app/Config/Toolbar.php**
-* **app/Views/welcome_message.php**
-* **composer.json**
-* **phpunit.xml.dist**
diff --git a/user_guide_src/source/installation/upgrade_4212.rst b/user_guide_src/source/installation/upgrade_4212.rst
deleted file mode 100644
index 217dc26ef9ad..000000000000
--- a/user_guide_src/source/installation/upgrade_4212.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-###############################
-Upgrading from 4.2.11 to 4.2.12
-###############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Project Files
-*************
-
-Version 4.2.12 did not alter any executable code in project files.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* **app/Config/Cache.php**
-* **app/Config/Migrations.php**
-* **app/Controllers/BaseController.php**
-* **composer.json**
diff --git a/user_guide_src/source/installation/upgrade_422.rst b/user_guide_src/source/installation/upgrade_422.rst
deleted file mode 100644
index ea2d4cf5e760..000000000000
--- a/user_guide_src/source/installation/upgrade_422.rst
+++ /dev/null
@@ -1,73 +0,0 @@
-#############################
-Upgrading from 4.2.1 to 4.2.2
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-Web Page Caching Bug Fix
-========================
-
-- :doc:`../general/caching` now caches the Response data after :ref:`after-filters` are executed.
-- For example, if you enable :ref:`secureheaders`, the Response headers are now sent when the page comes from the cache.
-
-.. important:: If you have written **code based on this bug** that assumes changes to the Response in "after" filters
- are not cached then **sensitive information could be cached and compromised**. If this is the case, change your code
- to disable caching of the page.
-
-Others
-======
-
-- The method ``Forge::createTable()`` no longer executes a ``CREATE TABLE IF NOT EXISTS``. When ``$ifNotExists`` is
- true, if the table is not found in ``$db->tableExists($table)`` then ``CREATE TABLE`` is executed.
-- The second parameter ``$ifNotExists`` of ``Forge::_createTable()`` is deprecated. It is no longer used and will be
- removed in a future release.
-- When you use :php:func:`random_string()` with the first parameter ``'crypto'``, if you set the second parameter
- ``$len`` to an odd number, ``InvalidArgumentException`` will now be thrown. Change the parameter to an even number.
-
-Breaking Enhancements
-*********************
-
-
-Project Files
-*************
-
-Numerous files in the **project space** (root, app, public, writable) received updates. Due to these files being outside
-of the **system** scope, they will not be changed without your intervention. There are some third-party CodeIgniter
-modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-.. note:: Except in very rare cases for bug fixes, no changes made to files for the project space will break your
- application. All changes noted here are optional until the next major version, and any mandatory changes will be
- covered in the sections above.
-
-Content Changes
-===============
-
-* **app/Views/errors/html/error_404.php**
-* **app/Views/welcome_message.php**
-* **public/index.php**
-* spark
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* **app/Config/App.php**
-* **app/Config/Constants.php**
-* **app/Config/Logger.php**
-* **app/Config/Paths.php**
-* **app/Views/errors/html/error_404.php**
-* **app/Views/welcome_message.php**
diff --git a/user_guide_src/source/installation/upgrade_423.rst b/user_guide_src/source/installation/upgrade_423.rst
deleted file mode 100644
index c1066abbd761..000000000000
--- a/user_guide_src/source/installation/upgrade_423.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-#############################
-Upgrading from 4.2.2 to 4.2.3
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Project Files
-*************
-
-Version 4.2.3 is an internal change for security measures and requires no intervention in projects.
diff --git a/user_guide_src/source/installation/upgrade_425.rst b/user_guide_src/source/installation/upgrade_425.rst
deleted file mode 100644
index 02efbeb858b2..000000000000
--- a/user_guide_src/source/installation/upgrade_425.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-#############################
-Upgrading from 4.2.3 to 4.2.5
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Project Files
-*************
-
-Version 4.2.5 did not alter any project files.
diff --git a/user_guide_src/source/installation/upgrade_426.rst b/user_guide_src/source/installation/upgrade_426.rst
deleted file mode 100644
index c7d11d34b850..000000000000
--- a/user_guide_src/source/installation/upgrade_426.rst
+++ /dev/null
@@ -1,32 +0,0 @@
-#############################
-Upgrading from 4.2.5 to 4.2.6
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-
-Project Files
-*************
-
-A few files in the **project space** (root, app, public, writable) received cosmetic updates. You need not touch these
-files at all. There are some third-party CodeIgniter modules available to assist with merging changes to the project
-space: `Explore on Packagist `_.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* **app/Config/App.php**
-* **app/Config/ContentSecurityPolicy.php**
-* **app/Config/Routes.php**
-* **app/Config/Validation.php**
diff --git a/user_guide_src/source/installation/upgrade_427.rst b/user_guide_src/source/installation/upgrade_427.rst
deleted file mode 100644
index 215254d6cf5b..000000000000
--- a/user_guide_src/source/installation/upgrade_427.rst
+++ /dev/null
@@ -1,73 +0,0 @@
-#############################
-Upgrading from 4.2.6 to 4.2.7
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-set_cookie()
-============
-
-Due to a bug, :php:func:`set_cookie()` and :php:meth:`CodeIgniter\\HTTP\\Response::setCookie()` in the previous versions
-did not use the ``$secure`` and ``$httponly`` values in ``Config\Cookie``. The following code did not issue a cookie
-with the secure flag even if you set ``$secure = true`` in ``Config\Cookie``::
-
- helper('cookie');
-
- $cookie = [
- 'name' => $name,
- 'value' => $value,
- ];
- set_cookie($cookie);
- // or
- $this->response->setCookie($cookie);
-
-But now the values in ``Config\Cookie`` are used for the options that are not specified. The above code issues a cookie
-with the secure flag if you set ``$secure = true`` in ``Config\Cookie``.
-
-If your code depends on this bug, please change it to explicitly specify the necessary options::
-
- $cookie = [
- 'name' => $name,
- 'value' => $value,
- 'secure' => false, // Set explicitly
- 'httponly' => false, // Set explicitly
- ];
- set_cookie($cookie);
- // or
- $this->response->setCookie($cookie);
-
-Others
-======
-
-- ``Time::__toString()`` is now locale-independent. It returns database-compatible strings like '2022-09-07 12:00:00' in
- any locale. Most locales are not affected by this change. But in a few locales like ``ar``, ``fa``,
- ``Time::__toString()`` (or ``(string) $time`` or implicit casting to a string) no longer returns a localized datetime
- string. If you want to get a localized datetime string, use :ref:`Time::toDateTimeString() `
- instead.
-- The logic of Validation rule ``required_without`` has been changed to validate each array item separately when
- validating fields with asterisk (``*``), and the method signature of the rule method has also been changed. Extending
- classes should likewise update the parameters so as not to break LSP.
-
-Project Files
-*************
-
-Version 4.2.7 did not alter any executable code in project files.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* **app/Common.php**
diff --git a/user_guide_src/source/installation/upgrade_428.rst b/user_guide_src/source/installation/upgrade_428.rst
deleted file mode 100644
index d1f92962cdea..000000000000
--- a/user_guide_src/source/installation/upgrade_428.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-#############################
-Upgrading from 4.2.7 to 4.2.8
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Project Files
-*************
-
-The following files had changes to code or behavior that merit updating in your projects:
-
-* **app/Views/errors/html/error_exception.php**
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-* **app/Config/Logger.php**
-* **app/Views/errors/html/error_exception.php**
diff --git a/user_guide_src/source/installation/upgrade_430.rst b/user_guide_src/source/installation/upgrade_430.rst
deleted file mode 100644
index 0b6efe5708e1..000000000000
--- a/user_guide_src/source/installation/upgrade_430.rst
+++ /dev/null
@@ -1,445 +0,0 @@
-##############################
-Upgrading from 4.2.12 to 4.3.0
-##############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Composer Version
-****************
-
-.. important:: If you use Composer, CodeIgniter v4.3.0 requires Composer 2.0.14 or later.
-
-If you are using an older version of Composer, upgrade your ``composer`` tool, and delete the **vendor/** directory, and
-run ``composer update`` again.
-
-The procedure, for example, is as follows:
-
-.. code-block:: console
-
- composer self-update
- rm -rf vendor/
- composer update
-
-Mandatory File Changes
-**********************
-
-spark
-=====
-
-The following files received significant changes and **you must merge the updated versions** with your application:
-
-- ``spark``
-
-.. important:: If you do not update this file, Spark commands will not work at all after running ``composer update``.
-
- The upgrade procedure, for example, is as follows:
-
- .. code-block:: console
-
- composer update
- cp vendor/codeigniter4/framework/spark .
-
-Config Files
-============
-
-app/Config/Kint.php
--------------------
-
-- **app/Config/Kint.php** has been updated for Kint 5.0.
-- You need to replace:
-
- - ``Kint\Renderer\Renderer`` with ``Kint\Renderer\AbstractRenderer``
- - ``Renderer::SORT_FULL`` with ``AbstractRenderer::SORT_FULL``
-
-app/Config/Exceptions.php
--------------------------
-
-- If you are using PHP 8.2, you need to add new properties ``$logDeprecations`` and ``$deprecationLogLevel``.
-
-Mock Config Classes
--------------------
-
-- If you are using the following Mock Config classes in testing, you need to update the corresponding Config files in
- **app/Config**:
-
- - ``MockAppConfig`` (``Config\App``)
- - ``MockCLIConfig`` (``Config\App``)
- - ``MockSecurityConfig`` (``Config\Security``)
-
-- Add **types** to the properties in these Config classes. You may need to fix the property values to match the property
- types.
-
-composer.json
-=============
-
-If you installed CodeIgniter manually, and are using Composer, you need to remove the following lines, and run
-``composer update``.
-
-.. code-block:: text
-
- {
- ...
- "require": {
- ...
- "kint-php/kint": "^4.2", <-- Remove this line
- ...
- },
- ...
- "scripts": {
- "post-update-cmd": [
- "CodeIgniter\\ComposerScripts::postUpdate" <-- Remove this line
- ],
- "test": "phpunit"
- },
- ...
- }
-
-Breaking Changes
-****************
-
-Database Exception Changes
-==========================
-
-- The exception classes may be changed when database errors occur. If you catch the exceptions, you must confirm that
- your code can catch the exceptions.
-- Now a few exceptions will be thrown even if ``CI_DEBUG`` is false.
-- During transactions, exceptions are not thrown by default even if ``DBDebug`` is true. If you want exceptions to be
- thrown, you need to call ``transException(true)``. See :ref:`transactions-throwing-exceptions`.
-- See :ref:`exceptions-when-database-errors-occur` for details.
-
-HTTP Status Code and Exit Code of Uncaught Exceptions
-=====================================================
-
-- If you expect *Exception code* as *HTTP status code*, the HTTP status code will be changed. In that case, you need to
- implement ``HTTPExceptionInterface`` in the Exception. See :ref:`error-specify-http-status-code`.
-- If you expect *Exit code* based on *Exception code*, the Exit code will be changed. In that case, you need to
- implement ``HasExitCodeInterface`` in the Exception. See :ref:`error-specify-exit-code`.
-
-redirect()->withInput() and Validation Errors
-=============================================
-
-``redirect()->withInput()`` and Validation errors had an undocumented behavior. If you redirect with ``withInput()``,
-CodeIgniter stores the validation errors in the session, and you can get the errors in the redirected page from a
-validation object *before a new validation is run*::
-
- // In the controller
- if (! $this->validate($rules)) {
- return redirect()->back()->withInput();
- }
-
- // In the view of the redirected page
- = service('Validation')->listErrors() ?>
-
-This behavior was a bug and was fixed in v4.3.0.
-
-If you have code that depends on the bug, you need to change the code. Use the new Form helpers,
-:php:func:`validation_errors()`, :php:func:`validation_list_errors()` and :php:func:`validation_show_error()` to display
-Validation Errors, instead of the Validation object.
-
-Validation Changes
-==================
-
-- ``ValidationInterface`` has been changed. Implementing classes should likewise add the methods and the parameters so
- as not to break LSP. See :ref:`v430-validation-changes` for details.
-- The return value of ``Validation::loadRuleGroup()`` has been changed from ``null`` to ``[]`` when the ``$group`` is
- empty. Update the code if you depend on the behavior.
-
-Time Fixes
-==========
-
-- Due to bug fixes, some methods in :doc:`Time <../libraries/time>` have changed from mutable behavior to immutable;
- ``Time`` now extends ``DateTimeImmutable``. See :ref:`ChangeLog ` for details.
-- If you need the behavior of ``Time`` before the modification, a compatible ``TimeLegacy`` class has been added. Please
- replace all ``Time`` with ``TimeLegacy`` in your application code.
-- But ``TimeLegacy`` is deprecated. So we recommend you update your code.
-
-E.g.::
-
- // Before
- $time = Time::now();
- // ...
- if ($time instanceof DateTime) {
- // ...
- }
-
- // After
- $time = Time::now();
- // ...
- if ($time instanceof DateTimeInterface) {
- // ...
- }
-
-::
-
- // Before
- $time1 = new Time('2022-10-31 12:00');
- $time2 = $time1->modify('+1 day');
- echo $time1; // 2022-11-01 12:00:00
- echo $time2; // 2022-11-01 12:00:00
-
- // After
- $time1 = new Time('2022-10-31 12:00');
- $time2 = $time1->modify('+1 day');
- echo $time1; // 2022-10-31 12:00:00
- echo $time2; // 2022-11-01 12:00:00
-
-.. _upgrade-430-stream-filter:
-
-Capturing STDERR and STDOUT streams in Tests
-============================================
-
-The way error and output streams are captured has changed. Now instead of::
-
- use CodeIgniter\Test\Filters\CITestStreamFilter;
-
- protected function setUp(): void
- {
- CITestStreamFilter::$buffer = '';
- $this->streamFilter = stream_filter_append(STDOUT, 'CITestStreamFilter');
- $this->streamFilter = stream_filter_append(STDERR, 'CITestStreamFilter');
- }
-
- protected function tearDown(): void
- {
- stream_filter_remove($this->streamFilter);
- }
-
-you need to use::
-
- use CodeIgniter\Test\Filters\CITestStreamFilter;
-
- protected function setUp(): void
- {
- CITestStreamFilter::registration();
- CITestStreamFilter::addOutputFilter();
- CITestStreamFilter::addErrorFilter();
- }
-
- protected function tearDown(): void
- {
- CITestStreamFilter::removeOutputFilter();
- CITestStreamFilter::removeErrorFilter();
- }
-
-Or use the trait ``CodeIgniter\Test\StreamFilterTrait``. See :ref:`testing-cli-output`.
-
-Interface Changes
-=================
-
-Some interfaces have been fixed. See :ref:`v430-interface-changes` for details.
-
-Foreign Key Data
-================
-
-- The data structure returned by ``BaseConnection::getForeignKeyData()`` has been changed. You will need to adjust any
- code depending on this method to use the new structure.
-
-Example: ``tableprefix_table_column1_column2_foreign``
-
-The data returned has the following structure::
-
- /**
- * @return array[
- * {constraint_name} =>
- * stdClass[
- * 'constraint_name' => string,
- * 'table_name' => string,
- * 'column_name' => string[],
- * 'foreign_table_name' => string,
- * 'foreign_column_name' => string[],
- * 'on_delete' => string,
- * 'on_update' => string,
- * 'match' => string
- * ]
- * ]
- */
-
-Breaking Enhancements
-*********************
-
-Multiple Domain Support
-=======================
-
-- If you set ``Config\App::$allowedHostnames``, URL-related functions such as :php:func:`base_url()`,
- :php:func:`current_url()`, :php:func:`site_url()` will return the URL with the hostname set in
- ``Config\App::$allowedHostnames`` if the current URL matches.
-
-Database
-========
-
-- The return type of ``CodeIgniter\Database\Database::loadForge()`` has been changed to ``Forge``. Extending classes
- should likewise change the type.
-- The return type of ``CodeIgniter\Database\Database::loadUtils()`` has been changed to ``BaseUtils``. Extending classes
- should likewise change the type.
-- The second parameter ``$index`` of ``BaseBuilder::updateBatch()`` has changed to ``$constraints``. It now accepts
- types array, string, or ``RawSql``. Extending classes should likewise change types.
-- The ``$set`` parameter of ``BaseBuilder::insertBatch()`` and ``BaseBuilder::updateBatch()`` now accepts an object of a
- single row of data. Extending classes should likewise change the type.
-- The third parameter ``$index`` of ``BaseBuilder::_updateBatch()`` has changed to ``$values``, and the parameter type
- has changed to ``array``. Extending classes should likewise change the type.
-- The ``Model::update()`` method now raises a ``DatabaseException`` if it generates an SQL statement without a WHERE
- clause. If you need to update all records in a table, use Query Builder instead. E.g.,
- ``$model->builder()->update($data)``.
-
-.. _upgrade-430-honeypot-and-csp:
-
-Honeypot and CSP
-================
-
-When CSP is enabled, the id attribute ``id="hpc"`` will be injected into the container tag for the Honeypot field to
-hide the field. If the id is already used in your views, you need to change it with ``Config\Honeypot::$containerId``.
-And you can remove ``style="display:none"`` in ``Config\Honeypot::$container``.
-
-Others
-======
-
-- **Helper:** Since void HTML elements (e.g. `` ``) in ``html_helper``, ``form_helper`` or common functions have
- been changed to be HTML5-compatible by default, if you need to be compatible with XHTML, you must set the ``$html5``
- property in **app/Config/DocTypes.php** to ``false``.
-- **CLI:** Since the launch of Spark Commands was extracted from ``CodeIgniter\CodeIgniter``, there may be problems
- running these commands if the ``Services::codeigniter()`` service has been overridden.
-
-Project Files
-*************
-
-Numerous files in the **project space** (root, app, public, writable) received updates. Due to these files being outside
-of the **system** scope, they will not be changed without your intervention. There are some third-party CodeIgniter
-modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-.. _upgrade_430_config:
-
-Config
-------
-
-- **app/Config/App.php**
-
- - The new property ``$allowedHostnames`` is added to set allowed hostnames in the site URL other than the hostname in
- the ``$baseURL``. See :ref:`v430-multiple-domain-support`.
- - The property ``$appTimezone`` has been changed to ``UTC`` to avoid being affected by daylight saving time.
-
-- **app/Config/Autoload.php**
-
- - The new property ``$helpers`` is added to autoload helpers.
-
-- **app/Config/Database.php**
-
- - ``$default['DBDebug']`` and ``$test['DBDebug']`` are changed to ``true`` by default. See
- :ref:`exceptions-when-database-errors-occur`.
-
-- **app/Config/DocTypes.php**
-
- - The property ``$html5`` to determine whether to remove the solidus (``/``) character for void HTML elements (e.g.
- `` ``) is added, and set to ``true`` by default for HTML5 compatibility.
-
-- **app/Config/Encryption.php**
-
- - The new properties ``$rawData``, ``$encryptKeyInfo``, and ``$authKeyInfo`` are added for CI3 Encryption
- compatibility. See :ref:`encryption-compatible-with-ci3`.
-
-- **app/Config/Exceptions.php**
-
- - Two additional public properties were added: ``$logDeprecations`` and ``$deprecationLogLevel``. See
- :ref:`logging_deprecation_warnings` for details.
-
-- **app/Config/Honeypot.php**
-
- - The new property ``$containerId`` is added to set the id attribute value for the container tag when CSP is enabled.
- - The ``input`` tag in the property ``$template`` value has been changed to be HTML5-compatible.
-
-- **app/Config/Logger.php**
-
- - The property ``$threshold`` has been changed to ``9`` in environments other than ``production``.
-
-- **app/Config/Modules.php**
-
- - The new property ``$composerPackages`` is added to limit Composer package Auto-Discovery for better performance.
-
-- **app/Config/Routes.php**
-
- - Due to the fact that the approach to running Spark Commands has changed, there is no longer a need to load the
- internal routes of the framework (``SYSTEMPATH . 'Config/Routes.php'``).
-
-- **app/Config/Security.php**
-
- - Changed the value of the property ``$redirect`` to ``false`` to prevent redirection when a CSRF check fails. This is
- to make it easier to recognize that it is a CSRF error.
-
-- **app/Config/Session.php**
-
- - Added to handle session configuration.
-
-- **app/Config/Validation.php**
-
- - The default Validation Rules have been changed to Strict Rules for better security. See
- :ref:`validation-traditional-and-strict-rules`.
-
-View Files
-----------
-
-The following view files have been changed to HTML5-compatible tags. Also, error messages are now defined in the
-**Errors** language file.
-
-- **app/Views/errors/html/error_404.php**
-- **app/Views/errors/html/error_exception.php**
-- **app/Views/errors/html/production.php**
-- **app/Views/welcome_message.php**
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime. All atomic type properties in ``Config`` classes have been typed:
-
-* **app/Config/App.php**
-* **app/Config/Autoload.php**
-* **app/Config/CURLRequest.php**
-* **app/Config/Cache.php**
-* **app/Config/ContentSecurityPolicy.php**
-* **app/Config/Cookie.php**
-* **app/Config/Database.php**
-* **app/Config/DocTypes.php**
-* **app/Config/Email.php**
-* **app/Config/Encryption.php**
-* **app/Config/Exceptions.php**
-* **app/Config/Feature.php**
-* **app/Config/Filters.php**
-* **app/Config/Format.php**
-* **app/Config/Generators.php**
-* **app/Config/Honeypot.php**
-* **app/Config/Images.php**
-* **app/Config/Kint.php**
-* **app/Config/Logger.php**
-* **app/Config/Migrations.php**
-* **app/Config/Mimes.php**
-* **app/Config/Modules.php**
-* **app/Config/Pager.php**
-* **app/Config/Paths.php**
-* **app/Config/Routes.php**
-* **app/Config/Security.php**
-* **app/Config/Session.php**
-* **app/Config/Toolbar.php**
-* **app/Config/UserAgents.php**
-* **app/Config/Validation.php**
-* **app/Views/errors/html/error_404.php**
-* **app/Views/errors/html/error_exception.php**
-* **app/Views/errors/html/production.php**
-* **app/Views/welcome_message.php**
-* **composer.json**
-* env
-* **phpunit.xml.dist**
-* spark
diff --git a/user_guide_src/source/installation/upgrade_431.rst b/user_guide_src/source/installation/upgrade_431.rst
deleted file mode 100644
index ae5a0090378c..000000000000
--- a/user_guide_src/source/installation/upgrade_431.rst
+++ /dev/null
@@ -1,80 +0,0 @@
-#############################
-Upgrading from 4.3.0 to 4.3.1
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Composer Version
-****************
-
-.. important:: If you use Composer, CodeIgniter v4.3 requires Composer 2.0.14 or later.
-
-If you are using an older version of Composer, upgrade your ``composer`` tool, and delete the **vendor/** directory, and
-run ``composer update`` again.
-
-The procedure, for example, is as follows:
-
-.. code-block:: console
-
- composer self-update
- rm -rf vendor/
- composer update
-
-Mandatory File Changes
-**********************
-
-Config Files
-============
-
-app/Config/Email.php
---------------------
-
-- If you updated **app/Config/Email.php** when upgrading to v4.3.0, you must set the default values to ``$fromEmail``,
- ``$fromName``, ``$recipients``, ``$SMTPHost``, ``$SMTPUser`` and ``$SMTPPass`` to apply environment variable
- (**.env**) values.
-- If no default values are set, setting environment variables for them will not be reflected in the Config object.
-
-app/Config/Exceptions.php
--------------------------
-
-- If you are using PHP 8.2, you need to add new properties ``$logDeprecations`` and ``$deprecationLogLevel``.
-
-Project Files
-*************
-
-Some files in the **project space** (root, app, public, writable) received updates. Due to these files being outside of
-the **system** scope, they will not be changed without your intervention.
-
-There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-Config
-------
-
-- **app/Config/Email.php**
-
- - Set the default value ``''`` to ``$fromEmail``, ``$fromName``, ``$recipients``, ``$SMTPHost``, ``$SMTPUser`` and
- ``$SMTPPass`` to apply environment variable (**.env**) values.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-- **app/Config/Email.php**
-- **composer.json**
diff --git a/user_guide_src/source/installation/upgrade_432.rst b/user_guide_src/source/installation/upgrade_432.rst
deleted file mode 100644
index 25b0e4ca3c7d..000000000000
--- a/user_guide_src/source/installation/upgrade_432.rst
+++ /dev/null
@@ -1,95 +0,0 @@
-#############################
-Upgrading from 4.3.1 to 4.3.2
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-base_url()
-==========
-
-The :php:func:`base_url()` behavior has been fixed. In previous versions, when you called ``base_url()``
-**without an argument**, it returned baseURL without a trailing slash (``/``). Now it returns baseURL with a trailing
-slash. For example:
-
-- before: ``http://example.com``
-- after: ``http://example.com/``
-
-If you have code that calls ``base_url()`` without an argument, you may need to adjust the URLs.
-
-.. _upgrade-432-uri-string:
-
-uri_string()
-============
-
-The :php:func:`uri_string()` behavior has been fixed. In previous versions, when you navigated to the baseURL, it
-returned ``/``. Now it returns an empty string (``''``).
-
-If you have code that calls ``uri_string()``, you may need to adjust it.
-
-.. note:: :php:func:`uri_string()` returns a URI path relative to baseURL. It is not a full URI path if the baseURL
- contains subfolders. If you use it for HTML links, it is better to use it with :php:func:`site_url()` like
- ``site_url(uri_string())``.
-
-Mandatory File Changes
-**********************
-
-composer.json
-=============
-
-If you have installed CodeIgniter manually and are using or planning to use Composer, remove the following line:
-
-.. code-block:: text
-
- {
- ...
- "scripts": {
- "post-update-cmd": [
- "CodeIgniter\\ComposerScripts::postUpdate" <-- Remove this line
- ],
- "test": "phpunit"
- },
- ...
- }
-
-Project Files
-*************
-
-Some files in the **project space** (root, app, public, writable) received updates. Due to these files being outside of
-the **system** scope, they will not be changed without your intervention.
-
-There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-- **app/Config/Mimes.php**
-- **app/Views/errors/html/error_exception.php**
-- **composer.json**
-- **public/.htaccess**
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-- **app/Config/App.php**
-- **app/Config/Mimes.php**
-- **app/Views/errors/html/error_exception.php**
-- **composer.json**
-- **public/.htaccess**
diff --git a/user_guide_src/source/installation/upgrade_433.rst b/user_guide_src/source/installation/upgrade_433.rst
deleted file mode 100644
index 1164badc439e..000000000000
--- a/user_guide_src/source/installation/upgrade_433.rst
+++ /dev/null
@@ -1,46 +0,0 @@
-#############################
-Upgrading from 4.3.2 to 4.3.3
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Project Files
-*************
-
-Some files in the **project space** (root, app, public, writable) received updates. Due to these files being outside of
-the **system** scope, they will not be changed without your intervention.
-
-There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-Config
-------
-
-- **app/Config/Encryption.php**
-
- - The missing property ``$cipher`` is added for CI3 Encryption compatibility. See
- :ref:`encryption-compatible-with-ci3`.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-- **app/Common.php**
-- **app/Config/Encryption.php**
-- **composer.json**
diff --git a/user_guide_src/source/installation/upgrade_434.rst b/user_guide_src/source/installation/upgrade_434.rst
deleted file mode 100644
index 2da1b9f9e38d..000000000000
--- a/user_guide_src/source/installation/upgrade_434.rst
+++ /dev/null
@@ -1,63 +0,0 @@
-#############################
-Upgrading from 4.3.3 to 4.3.4
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-Redirect Status Code
-====================
-
-- Due to a bug fix, the status codes of redirects may be changed. See
- :ref:`ChangeLog v4.3.4 ` and if the code is not what you want,
- :ref:`specify status codes `.
-
-Forge::modifyColumn() and NULL
-==============================
-
-A bug fix may have changed the NULL constraint in the result of :ref:`$forge->modifyColumn() `.
-See :ref:`Change Log `. To set the desired NULL constraint, change ``Forge::modifyColumn()`` to
-always specify the ``null`` key.
-
-Note that the bug may have changed unexpected NULL constraints in previous versions.
-
-Project Files
-*************
-
-Some files in the **project space** (root, app, public, writable) received updates. Due to these files being outside of
-the **system** scope, they will not be changed without your intervention.
-
-There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-Config
-------
-
-- **app/Config/Generators.php**
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-- **app/Config/App.php**
-- **app/Config/Generators.php**
-- **composer.json**
-- **public/index.php**
diff --git a/user_guide_src/source/installation/upgrade_435.rst b/user_guide_src/source/installation/upgrade_435.rst
deleted file mode 100644
index e1db39c8648c..000000000000
--- a/user_guide_src/source/installation/upgrade_435.rst
+++ /dev/null
@@ -1,74 +0,0 @@
-#############################
-Upgrading from 4.3.4 to 4.3.5
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-Validation Placeholders
-=======================
-
-To use :ref:`validation-placeholders` securely, please remember to create a validation rule for the field you will use
-as a placeholder.
-
-E.g., if you have the following code::
-
- $validation->setRules([
- 'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,{id}]',
- ]);
-
-You need to add the rules for ``{id}``::
-
- $validation->setRules([
- 'id' => 'max_length[19]|is_natural_no_zero', // Add this
- 'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,{id}]',
- ]);
-
-Session::stop()
-===============
-
-Prior to v4.3.5, the ``Session::stop()`` method did not destroy the session due to a bug. This method has been modified
-to destroy the session, and is now deprecated because it is exactly the same as the ``Session::destroy()`` method. So
-use the :ref:`Session::destroy ` method instead.
-
-If you have code that depends on the bug, replace it with ``session_regenerate_id(true)``.
-
-Project Files
-*************
-
-Some files in the **project space** (root, app, public, writable) received updates. Due to these files being outside of
-the **system** scope, they will not be changed without your intervention.
-
-There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-Config
-------
-
-- **app/Config/Generators.php**
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-- **app/Config/App.php**
-- **app/Config/Generators.php**
-- **composer.json**
diff --git a/user_guide_src/source/installation/upgrade_436.rst b/user_guide_src/source/installation/upgrade_436.rst
deleted file mode 100644
index 7f69ba6cc4ec..000000000000
--- a/user_guide_src/source/installation/upgrade_436.rst
+++ /dev/null
@@ -1,38 +0,0 @@
-#############################
-Upgrading from 4.3.5 to 4.3.6
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-- ``AutoRouterInterface::getRoute()`` has a new second parameter ``string $httpVerb``. If you implement it, add the
- parameter.
-
-Breaking Enhancements
-*********************
-
-- The method signatures of ``ValidationInterface::check()`` and ``Validation::check()`` have been changed. If you
- implement or extend them, update the signatures.
-
-Project Files
-*************
-
-Version 4.3.6 did not alter any executable code in project files.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-- **composer.json**
diff --git a/user_guide_src/source/installation/upgrade_437.rst b/user_guide_src/source/installation/upgrade_437.rst
deleted file mode 100644
index bbea3ef2efc4..000000000000
--- a/user_guide_src/source/installation/upgrade_437.rst
+++ /dev/null
@@ -1,88 +0,0 @@
-#############################
-Upgrading from 4.3.6 to 4.3.7
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Breaking Changes
-****************
-
-.. _upgrade-437-feature-testing:
-
-Feature Testing Request Body
-============================
-
-If you call:
-
-1. :ref:`withBody() `
-2. and :ref:`withBodyFormat() `
-3. and pass the ``$params`` to :ref:`call() ` (or shorthand methods)
-
-the priority for a Request body has been changed. In the unlikely event that you have test code affected by this change,
-modify it.
-
-For example, now the ``$params`` is used to build the request body, and the ``$body`` is not used::
-
- $this->withBody($body)->withBodyFormat('json')->call('post', $params)
-
-Previously, the ``$body`` was used for the request body.
-
-Return value of Validation::loadRuleGroup()
-===========================================
-
-The return value of ``Validation::loadRuleGroup()`` has been changed from "**rules array**" to "**array** of
-**rules array** and **customErrors array**" (``[rules, customErrors]``).
-
-If you use the method, update the code like the following::
-
- $rules = $this->validation->loadRuleGroup($rules);
- ↓
- [$rules, $customErrors] = $this->validation->loadRuleGroup($rules);
-
-Project Files
-*************
-
-Some files in the **project space** (root, app, public, writable) received updates. Due to these files being outside of
-the **system** scope, they will not be changed without your intervention.
-
-There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-Config
-------
-
-- **app/Config/Kint.php**
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-- **app/Config/App.php**
-- **app/Config/Autoload.php**
-- **app/Config/Cache.php**
-- **app/Config/ContentSecurityPolicy.php**
-- **app/Config/Filters.php**
-- **app/Config/Kint.php**
-- **app/Config/Logger.php**
-- **app/Config/Migrations.php**
-- **app/Config/Modules.php**
-- **app/Config/Paths.php**
-- **app/Controllers/BaseController.php**
-- **app/Controllers/Home.php**
-- **composer.json**
diff --git a/user_guide_src/source/installation/upgrade_438.rst b/user_guide_src/source/installation/upgrade_438.rst
deleted file mode 100644
index 93c59a50cb98..000000000000
--- a/user_guide_src/source/installation/upgrade_438.rst
+++ /dev/null
@@ -1,41 +0,0 @@
-#############################
-Upgrading from 4.3.7 to 4.3.8
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-Project Files
-*************
-
-Some files in the **project space** (root, app, public, writable) received updates. Due to these files being outside of
-the **system** scope, they will not be changed without your intervention.
-
-There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-Config
-------
-
-- **composer.json**
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-- **composer.json**
diff --git a/user_guide_src/source/installation/upgrade_440.rst b/user_guide_src/source/installation/upgrade_440.rst
deleted file mode 100644
index 6dd03327c0cc..000000000000
--- a/user_guide_src/source/installation/upgrade_440.rst
+++ /dev/null
@@ -1,313 +0,0 @@
-#############################
-Upgrading from 4.3.8 to 4.4.0
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading `
-- :ref:`Manual Installation Upgrading `
-
-.. contents::
- :local:
- :depth: 2
-
-SECURITY
-********
-
-When Using $this->validate()
-============================
-
-There was a known potential vulnerability in :ref:`$this->validate() ` in the Controller to bypass
-validation. The attack could allow developers to misinterpret unvalidated empty data as validated and proceed with
-processing.
-
-The :ref:`Validation::getValidated() ` method has been added to ensure that validated
-data is obtained.
-
-Therefore, when you use ``$this->validate()`` in your Controllers, you should use the new ``Validation::getValidated()``
-method to get the validated data.
-
-.. literalinclude:: ../libraries/validation/045.php
- :lines: 2-
-
-Breaking Changes
-****************
-
-.. _upgrade-440-uri-setsegment:
-
-URI::setSegment() Change
-========================
-
-Due to a bug, in previous versions an exception was not thrown if the last segment ``+2`` was specified. This bug has
-been fixed.
-
-If your code depends on this bug, fix the segment number.
-
-.. literalinclude:: upgrade_440/002.php
- :lines: 2-
-
-Site URI Changes
-================
-
-- Because of the rework for the current URI determination, the framework may return site URIs or the URI paths slightly
- differently than in previous versions. It may break your test code. Update assertions if the existing tests fail.
-- When your baseURL has sub-directories and you get the relative path to baseURL of the current URI by the
- ``URI::getPath()`` method, you must use the new ``SiteURI::getRoutePath()`` method instead.
-
-See :ref:`v440-site-uri-changes` for details.
-
-When You Extend Exceptions
-==========================
-
-If you are extending ``CodeIgniter\Debug\Exceptions`` and have not overridden the ``exceptionHandler()`` method,
-defining the new ``Config\Exceptions::handler()`` method in your **app/Config/Exceptions.php** will cause the specified
-Exception Handler to be executed.
-
-Your overridden code will no longer be executed, so make any necessary changes by defining your own exception handler.
-
-See :ref:`custom-exception-handlers` for details.
-
-Auto Routing (Improved) and translateURIDashes
-==============================================
-
-When using Auto Routing (Improved) and ``$translateURIDashes`` is true (``$routes->setTranslateURIDashes(true)``), in
-previous versions due to a bug two URIs corresponded to a single controller method, one URI for dashes (e.g.,
-**foo-bar**) and one URI for underscores (e.g., **foo_bar**).
-
-This bug was fixed and now URIs for underscores (**foo_bar**) are not accessible.
-
-If you have links to URIs for underscores (**foo_bar**), update them with URIs for dashes (**foo-bar**).
-
-When Passing Classname with Namespace to Factories
-==================================================
-
-The behavior of passing a classname with a namespace to Factories has been changed. See
-:ref:`ChangeLog ` for details.
-
-If you have code like ``model(\Myth\Auth\Models\UserModel::class)`` or ``model('Myth\Auth\Models\UserModel')`` (the code
-may be in the third-party packages), and you expect to load your ``App\Models\UserModel``, you need to define the
-classname to be loaded before the first loading of that class::
-
- Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel');
-
-See :ref:`factories-defining-classname-to-be-loaded` for details.
-
-Interface Changes
-=================
-
-Some interface changes have been made. Classes that implement them should update their APIs to reflect the changes. See
-:ref:`v440-interface-changes` for details.
-
-Method Signature Changes
-========================
-
-Some method signature changes have been made. Classes that extend them should update their APIs to reflect the changes.
-See :ref:`v440-method-signature-changes` for details.
-
-Also, the parameter types of some constructors and ``Services::security()`` have changed. If you call them with the
-parameters, change the parameter values. See :ref:`v440-parameter-type-changes` for details.
-
-RouteCollection::$routes
-========================
-
-The array structure of the protected property ``$routes`` has been modified for performance.
-
-If you extend ``RouteCollection`` and use the ``$routes``, update your code to match the new array structure.
-
-Mandatory File Changes
-**********************
-
-index.php and spark
-===================
-
-The following files received significant changes and **you must merge the updated versions** with your application:
-
-- ``public/index.php`` (see also :ref:`v440-codeigniter-and-exit`)
-- ``spark``
-
-.. important:: If you don't update the above files, CodeIgniter will not work properly after running
- ``composer update``.
-
- The upgrade procedure, for example, is as follows:
-
- .. code-block:: console
-
- composer update
- cp vendor/codeigniter4/framework/public/index.php public/index.php
- cp vendor/codeigniter4/framework/spark spark
-
-Config Files
-============
-
-app/Config/App.php
-------------------
-
-The property ``$proxyIPs`` must be an array. If you don't use proxy servers, it must be
-``public array $proxyIPs = [];``.
-
-.. _upgrade-440-config-routing:
-
-app/Config/Routing.php
-----------------------
-
-To clean up the routing system, the following changes were made:
-
-- New **app/Config/Routing.php** file that holds the settings that used to be in the Routes file.
-- The **app/Config/Routes.php** file was simplified so that it only contains the routes without settings and verbiage to
- clutter the file.
-- The environment-specific routes files are no longer loaded automatically.
-
-So you need to do the following:
-
-1. Copy **app/Config/Routing.php** from the new framework to your **app/Config** directory, and configure it.
-2. Remove all settings in **app/Config/Routes.php** that are no longer needed.
-3. If you use the environment-specific routes files, add them to the ``$routeFiles`` property in
- **app/Config/Routing.php**.
-
-app/Config/Toolbar.php
-----------------------
-
-You need to add the new properties ``$watchedDirectories`` and ``$watchedExtensions`` for
-:ref:`debug-toolbar-hot-reload`::
-
- --- a/app/Config/Toolbar.php
- +++ b/app/Config/Toolbar.php
- @@ -88,4 +88,31 @@ class Toolbar extends BaseConfig
- * `$maxQueries` defines the maximum amount of queries that will be stored.
- */
- public int $maxQueries = 100;
- +
- + /**
- + * --------------------------------------------------------------------------
- + * Watched Directories
- + * --------------------------------------------------------------------------
- + *
- + * Contains an array of directories that will be watched for changes and
- + * used to determine if the hot-reload feature should reload the page or not.
- + * We restrict the values to keep performance as high as possible.
- + *
- + * NOTE: The ROOTPATH will be prepended to all values.
- + */
- + public array $watchedDirectories = [
- + 'app',
- + ];
- +
- + /**
- + * --------------------------------------------------------------------------
- + * Watched File Extensions
- + * --------------------------------------------------------------------------
- + *
- + * Contains an array of file extensions that will be watched for changes and
- + * used to determine if the hot-reload feature should reload the page or not.
- + */
- + public array $watchedExtensions = [
- + 'php', 'css', 'js', 'html', 'svg', 'json', 'env',
- + ];
- }
-
-
-app/Config/Events.php
----------------------
-
-You need to add the code to add a route for :ref:`debug-toolbar-hot-reload`::
-
- --- a/app/Config/Events.php
- +++ b/app/Config/Events.php
- @@ -4,6 +4,7 @@ namespace Config;
-
- use CodeIgniter\Events\Events;
- use CodeIgniter\Exceptions\FrameworkException;
- +use CodeIgniter\HotReloader\HotReloader;
-
- /*
- * --------------------------------------------------------------------
- @@ -44,5 +45,11 @@ Events::on('pre_system', static function () {
- if (CI_DEBUG && ! is_cli()) {
- Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect');
- Services::toolbar()->respond();
- + // Hot Reload route - for framework use on the hot reloader.
- + if (ENVIRONMENT === 'development') {
- + Services::routes()->get('__hot-reload', static function () {
- + (new HotReloader())->run();
- + });
- + }
- }
- });
-
-app/Config/Cookie.php
----------------------
-
-The Cookie config items in **app/Config/App.php** are no longer used.
-
-1. Copy **app/Config/Cookie.php** from the new framework to your **app/Config** directory, and configure it.
-2. Remove the properties (from ``$cookiePrefix`` to ``$cookieSameSite``) in **app/Config/App.php**.
-
-app/Config/Security.php
------------------------
-
-The CSRF config items in **app/Config/App.php** are no longer used.
-
-1. Copy **app/Config/Security.php** from the new framework to your **app/Config** directory, and configure it.
-2. Remove the properties (from ``$CSRFTokenName`` to ``$CSRFSameSite``) in **app/Config/App.php**.
-
-app/Config/Session.php
-----------------------
-
-The Session config items in **app/Config/App.php** are no longer used.
-
-1. Copy **app/Config/Session.php** from the new framework to your **app/Config** directory, and configure it.
-2. Remove the properties (from ``$sessionDriver`` to ``$sessionDBGroup``) in **app/Config/App.php**.
-
-Breaking Enhancements
-*********************
-
-- **Routing:** The method signature of ``RouteCollection::__construct()`` has been changed. The third parameter
- ``Routing $routing`` has been added. Extending classes should likewise add the parameter so as not to break LSP.
-- **Validation:** The method signature of ``Validation::check()`` has been changed. The ``string`` typehint on the
- ``$rule`` parameter was removed. Extending classes should likewise remove the typehint so as not to break LSP.
-
-Project Files
-*************
-
-Some files in the **project space** (root, app, public, writable) received updates. Due to these files being outside of
-the **system** scope, they will not be changed without your intervention.
-
-There are some third-party CodeIgniter modules available to assist with merging changes to the project space:
-`Explore on Packagist `_.
-
-Content Changes
-===============
-
-The following files received significant changes (including deprecations or visual adjustments) and it is recommended
-that you merge the updated versions with your application:
-
-Config
-------
-
-- **app/Config/CURLRequest.php**
-
- - The default value of :ref:`$shareOptions ` has been changed to ``false``.
-
-- **app/Config/Exceptions.php**
-
- - Added the new method ``handler()`` that defines custom Exception Handlers. See :ref:`custom-exception-handlers`.
-
-All Changes
-===========
-
-This is a list of all files in the **project space** that received changes; many will be simple comments or formatting
-that have no effect on the runtime:
-
-- **app/Config/App.php**
-- **app/Config/CURLRequest.php**
-- **app/Config/Cookie.php**
-- **app/Config/Database.php**
-- **app/Config/Events.php**
-- **app/Config/Exceptions.php**
-- **app/Config/Filters.php**
-- **app/Config/Routes.php**
-- **app/Config/Routing.php**
-- **app/Config/Toolbar.php**
-- **public/index.php**
-- spark
diff --git a/user_guide_src/source/installation/upgrade_440/002.php b/user_guide_src/source/installation/upgrade_440/002.php
deleted file mode 100644
index 9cabdfcfcff3..000000000000
--- a/user_guide_src/source/installation/upgrade_440/002.php
+++ /dev/null
@@ -1,12 +0,0 @@
-setSegment(4, 'three');
-// The URI will be http://example.com/one/two/three
-
-// After:
-$uri->setSegment(4, 'three'); // Will throw Exception
-$uri->setSegment(3, 'three');
-// The URI will be http://example.com/one/two/three
diff --git a/user_guide_src/source/installation/upgrade_441.rst b/user_guide_src/source/installation/upgrade_441.rst
deleted file mode 100644
index 003be47a208e..000000000000
--- a/user_guide_src/source/installation/upgrade_441.rst
+++ /dev/null
@@ -1,41 +0,0 @@
-#############################
-Upgrading from 4.4.0 to 4.4.1
-#############################
-
-Please refer to the upgrade instructions corresponding to your installation method.
-
-- :ref:`Composer Installation App Starter Upgrading `
-- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading