diff --git a/.gitattributes b/.gitattributes
index 29621a714026..1a7b3deb77e8 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -5,19 +5,27 @@
# git files
.gitattributes export-ignore
-# .gitignore
+.gitignore export-ignore
-# helper config files
-.travis.yml export-ignore
-phpdoc.dist.xml export-ignore
-
-# Misc other files
-readme.rst
+# Don't give admin files
+.github/ export-ignore
+admin/ export-ignore
+contributing/ export-ignore
+.editorconfig export-ignore
+.nojekyll export-ignore export-ignore
+CODE_OF_CONDUCT.md export-ignore
+DCO.txt export-ignore
+PULL_REQUEST_TEMPLATE.md export-ignore
+stale.yml export-ignore
+Vagrantfile.dist export-ignore
-# They don't want all of our tests...
-tests/bin/ export-ignore
-tests/codeigniter/ export-ignore
-tests/travis/ export-ignore
+# They don't want our test files
+tests/system/ export-ignore
+utils/ export-ignore
+rector.php export-ignore
+phpunit.xml.dist export-ignore
+phpstan.neon.dist export-ignore
-# User Guide Source Files
-user_guide_src
+# The source user guide, either
+user_guide_src/ export-ignore
+phpdoc.dist.xml export-ignore
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000000..6532121074ad
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,13 @@
+version: 2
+updates:
+- package-ecosystem: composer
+ directory: "/"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+
+- package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ # Check for updates to GitHub Actions every weekday
+ interval: "daily"
diff --git a/.github/scripts/deploy-appstarter b/.github/scripts/deploy-appstarter
index 28f463c1cab1..870f24760d6d 100644
--- a/.github/scripts/deploy-appstarter
+++ b/.github/scripts/deploy-appstarter
@@ -20,14 +20,15 @@ git checkout master
rm -rf *
# Copy common files
-releasable='app public writable env license.txt spark'
-for fff in $releasable ; do
+releasable='app public writable env LICENSE spark'
+for fff in $releasable;
+do
cp -Rf ${SOURCE}/$fff ./
done
# Copy repo-specific files
cp -Rf ${SOURCE}/admin/starter/. ./
-
+
# Commit the changes
git add .
git commit -m "Release ${RELEASE}"
diff --git a/.github/scripts/deploy-framework b/.github/scripts/deploy-framework
index 90b94ed5629f..c3f7e39fa1b7 100644
--- a/.github/scripts/deploy-framework
+++ b/.github/scripts/deploy-framework
@@ -20,14 +20,15 @@ git checkout master
rm -rf *
# Copy common files
-releasable='app public writable env license.txt spark system'
-for fff in $releasable ; do
+releasable='app public writable env LICENSE spark system'
+for fff in $releasable;
+do
cp -Rf ${SOURCE}/$fff ./
done
# Copy repo-specific files
cp -Rf ${SOURCE}/admin/framework/. ./
-
+
# Commit the changes
git add .
git commit -m "Release ${RELEASE}"
diff --git a/.github/workflows/apidocs-action.yml b/.github/workflows/deploy-apidocs.yml
similarity index 75%
rename from .github/workflows/apidocs-action.yml
rename to .github/workflows/deploy-apidocs.yml
index ecad14f2399c..393adaf7c277 100644
--- a/.github/workflows/apidocs-action.yml
+++ b/.github/workflows/deploy-apidocs.yml
@@ -1,4 +1,7 @@
-name: API Documentation
+# When changes are pushed to the develop branch,
+# build the current version of the API documentation
+# with phpDocumentor and deploy it to the api branch.
+name: Deploy API Documentation
on:
push:
@@ -10,10 +13,9 @@ on:
jobs:
build:
- name: Generate API Docs
+ name: Deploy to api
if: (github.repository == 'codeigniter4/CodeIgniter4')
runs-on: ubuntu-latest
-
steps:
- name: Setup credentials
run: |
@@ -25,7 +27,7 @@ jobs:
with:
path: source
- - name: Checkout api
+ - name: Checkout target
uses: actions/checkout@v2
with:
repository: codeigniter4/api
@@ -35,13 +37,12 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
- php-version: '7.2'
- extensions: intl, json, mbstring, mysqlnd, xdebug, xml, sqlite3
- coverage: xdebug
+ php-version: '7.4'
+ extensions: intl
- - name: Download GraphViz for phpDocumentor
+ - name: Install GraphViz for phpDocumentor
run: |
- sudo apt-get install -yq graphviz
+ sudo apt install -yq graphviz
- name: Download phpDocumentor
run: |
@@ -50,21 +51,21 @@ jobs:
-L https://github.com/phpDocumentor/phpDocumentor/releases/download/v2.9.1/phpDocumentor.phar \
-o admin/phpDocumentor.phar
- - name: Prepare API
+ - name: Prepare
run: |
cd ./api
rm -rf ./api/docs*
mkdir -p ./api/docs
git reset --hard master
- - name: Make the new API docs
+ - name: Build
run: |
cd ./source
chmod +x admin/phpDocumentor.phar
admin/phpDocumentor.phar
cp -R ${GITHUB_WORKSPACE}/source/api/build/* ${GITHUB_WORKSPACE}/api/docs
- - name: Deploy API
+ - name: Deploy
run: |
cd ./api
git add .
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy-framework.yml
similarity index 87%
rename from .github/workflows/deploy.yml
rename to .github/workflows/deploy-framework.yml
index b7bc1892ea37..ce925ed66639 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy-framework.yml
@@ -1,4 +1,6 @@
-name: Deploy
+# When a new Release is created, deploy relevant
+# files to each of the generated repos.
+name: Deploy Framework
on:
release:
@@ -6,8 +8,9 @@ on:
jobs:
framework:
+ name: Deploy to framework
+ if: (github.repository == 'codeigniter4/CodeIgniter4')
runs-on: ubuntu-latest
-
steps:
- name: Identify
run: |
@@ -33,7 +36,7 @@ jobs:
run: ./source/.github/scripts/deploy-framework ${GITHUB_WORKSPACE}/source ${GITHUB_WORKSPACE}/framework ${GITHUB_REF##*/}
- name: Release
- uses: actions/github-script@0.8.0
+ uses: actions/github-script@v3
with:
github-token: ${{secrets.ACCESS_TOKEN}}
script: |
@@ -50,8 +53,9 @@ jobs:
})
appstarter:
+ name: Deploy to appstarter
+ if: (github.repository == 'codeigniter4/CodeIgniter4')
runs-on: ubuntu-latest
-
steps:
- name: Identify
run: |
@@ -77,7 +81,7 @@ jobs:
run: ./source/.github/scripts/deploy-appstarter ${GITHUB_WORKSPACE}/source ${GITHUB_WORKSPACE}/appstarter ${GITHUB_REF##*/}
- name: Release
- uses: actions/github-script@0.8.0
+ uses: actions/github-script@v3
with:
github-token: ${{secrets.ACCESS_TOKEN}}
script: |
diff --git a/.github/workflows/deploy-userguide-latest.yml b/.github/workflows/deploy-userguide-latest.yml
new file mode 100644
index 000000000000..22e6eed4db4f
--- /dev/null
+++ b/.github/workflows/deploy-userguide-latest.yml
@@ -0,0 +1,54 @@
+# When changes are pushed to the develop branch,
+# build the current version of the User Guide
+# with Sphinx and deploy it to the gh-pages branch.
+#
+# @todo Consolidate checkouts
+name: Deploy User Guide (latest)
+
+on:
+ push:
+ branches:
+ - 'develop'
+ paths:
+ - 'user_guide_src/**'
+
+jobs:
+ build:
+ name: Deploy to gh-pages
+ if: (github.repository == 'codeigniter4/CodeIgniter4')
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ # Build the latest User Guide
+ - name: Build with Sphinx
+ uses: ammaraskar/sphinx-action@0.4
+ with:
+ docs-folder: user_guide_src/
+
+ # Create an artifact of the html output
+ - name: Upload artifact
+ uses: actions/upload-artifact@v2
+ with:
+ name: HTML Documentation
+ path: user_guide_src/build/html/
+
+ # Commit changes to the gh-pages branch
+ - name: Commit changes
+ run: |
+ git clone https://github.com/codeigniter4/CodeIgniter4.git --branch gh-pages --single-branch gh-pages
+ cp -r user_guide_src/build/html/* gh-pages/
+ cd gh-pages
+ git config --local user.email "action@github.com"
+ git config --local user.name "${GITHUB_ACTOR}"
+ git add .
+ # Ignore failures due to lack of changes
+ git commit -m "Update User Guide" -a || true
+
+ - name: Push changes
+ uses: ad-m/github-push-action@v0.6.0
+ with:
+ branch: gh-pages
+ directory: gh-pages
+ github_token: ${{ secrets.ACCESS_TOKEN }}
diff --git a/.github/workflows/docs_nightly.yml b/.github/workflows/docs_nightly.yml
deleted file mode 100644
index 0093e9fbdd1c..000000000000
--- a/.github/workflows/docs_nightly.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-# When changes are pushed to the develop branch,
-# build the current version of the docs and
-# deploy to gh-pages so that our development
-# docs are always up to date.
-name: "Update development docs"
-
-on:
- push:
- branches:
- - 'develop'
- paths:
- - 'user_guide_src/**'
-
-jobs:
- build:
- if: (github.repository == 'codeigniter4/CodeIgniter4')
-
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v2
-
- # Build the current docs
- - uses: ammaraskar/sphinx-action@master
- with:
- docs-folder: "user_guide_src/"
-
- # Create an artifact of the html output
- - uses: actions/upload-artifact@v2
- with:
- name: HTML Documentation
- path: user_guide_src/build/html/
-
- # Commit changes to the gh-pages branch
- - name: Commit documentation changes
- run: |
- git clone https://github.com/codeigniter4/CodeIgniter4.git --branch gh-pages --single-branch gh-pages
- cp -r user_guide_src/build/html/* gh-pages/
- cd gh-pages
- git config --local user.email "action@github.com"
- git config --local user.name "${GITHUB_ACTOR}"
- git add .
- git commit -m "Update documentation" -a || true
- # The above command will fail if no changes were present, so we ignore
- # that.
-
- - name: Push changes
- uses: ad-m/github-push-action@master
- with:
- branch: gh-pages
- directory: gh-pages
- github_token: ${{ secrets.ACCESS_TOKEN }}
diff --git a/.github/workflows/test-phpstan.yml b/.github/workflows/test-phpstan.yml
new file mode 100644
index 000000000000..dab66768d8e1
--- /dev/null
+++ b/.github/workflows/test-phpstan.yml
@@ -0,0 +1,77 @@
+# When a PR is opened or a push is made, perform
+# a static analysis check on the code using PHPStan.
+name: PHPStan
+
+on:
+ pull_request:
+ branches:
+ - 'develop'
+ - '4.*'
+ paths:
+ - 'app/**'
+ - 'system/**'
+ - composer.json
+ - phpstan.neon.dist
+ push:
+ branches:
+ - 'develop'
+ - '4.*'
+ paths:
+ - 'app/**'
+ - 'system/**'
+ - composer.json
+ - phpstan.neon.dist
+
+jobs:
+ build:
+ name: PHP ${{ matrix.php-versions }} Static Analysis
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ php-versions: ['7.4', '8.0']
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php-versions }}
+ extensions: intl
+
+ - name: Use latest Composer
+ run: composer self-update
+
+ - name: Validate composer.json
+ run: composer validate --strict
+
+ - name: Get composer cache directory
+ id: composer-cache
+ run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+ - name: Create composer cache directory
+ run: mkdir -p ${{ steps.composer-cache.outputs.dir }}
+
+ - name: Cache composer dependencies
+ uses: actions/cache@v2
+ with:
+ path: ${{ steps.composer-cache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
+ restore-keys: ${{ runner.os }}-composer-
+
+ - name: Create PHPStan result cache directory
+ run: mkdir -p build/phpstan
+
+ - name: Cache PHPStan result cache directory
+ uses: actions/cache@v2
+ with:
+ path: build/phpstan
+ key: ${{ runner.os }}-phpstan-${{ github.sha }}
+ restore-keys: ${{ runner.os }}-phpstan-
+
+ - name: Install dependencies
+ run: composer update --ansi --no-interaction
+
+ - name: Run static analysis
+ run: vendor/bin/phpstan analyse
diff --git a/.github/workflows/test-phpunit.yml b/.github/workflows/test-phpunit.yml
new file mode 100644
index 000000000000..eb15d0a4dd1f
--- /dev/null
+++ b/.github/workflows/test-phpunit.yml
@@ -0,0 +1,142 @@
+name: PHPUnit
+
+on:
+ push:
+ branches:
+ - develop
+ - '4.*'
+ paths:
+ - 'app/**'
+ - 'public/**'
+ - 'system/**'
+ - 'tests/**'
+ - composer.json
+ - spark
+ - '**.php'
+ - phpunit.xml.dist
+ - .github/workflows/test-phpunit.yml
+ pull_request:
+ branches:
+ - develop
+ - '4.*'
+ paths:
+ - 'app/**'
+ - 'public/**'
+ - 'system/**'
+ - 'tests/**'
+ - composer.json
+ - spark
+ - '**.php'
+ - phpunit.xml.dist
+ - .github/workflows/test-phpunit.yml
+
+jobs:
+
+ tests:
+ runs-on: ubuntu-latest
+ if: "!contains(github.event.head_commit.message, '[ci skip]')"
+ name: PHP ${{ matrix.php-versions }} - ${{ matrix.db-platforms }}
+
+ strategy:
+ fail-fast: false
+ matrix:
+ php-versions: ['7.2', '7.3', '7.4', '8.0']
+ db-platforms: ['MySQLi', 'Postgre', 'SQLite3', 'SQLSRV']
+
+ services:
+ mysql:
+ image: mysql:5.7
+ env:
+ MYSQL_ALLOW_EMPTY_PASSWORD: yes
+ MYSQL_DATABASE: test
+ ports:
+ - 3306:3306
+ options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
+ postgres:
+ image: postgres
+ env:
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ POSTGRES_DB: test
+ ports:
+ - 5432:5432
+ options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3
+ mssql:
+ image: microsoft/mssql-server-linux:2017-latest
+ env:
+ SA_PASSWORD: 1Secure*Password1
+ ACCEPT_EULA: Y
+ MSSQL_PID: Developer
+ ports:
+ - 1433:1433
+ redis:
+ image: redis
+ ports:
+ - 6379:6379
+ options: --health-cmd "redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3
+
+ steps:
+ - name: Create database for MSSQL Server
+ if: ${{ matrix.db-platforms == 'SQLSRV'}}
+ run: sqlcmd -S localhost -U sa -P 1Secure*Password1 -Q "CREATE DATABASE test"
+
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Setup PHP, with composer and extensions
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php-versions }}
+ tools: composer, pecl
+ extensions: imagick, sqlsrv-beta
+ coverage: xdebug
+ env:
+ update: true
+
+ - name: Install Memcached
+ uses: niden/actions-memcached@v7
+
+ - name: Get composer cache directory
+ id: composercache
+ run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+ - name: Cache dependencies
+ uses: actions/cache@v2
+ with:
+ path: ${{ steps.composercache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+ restore-keys: ${{ runner.os }}-composer-
+
+ - name: Install dependencies
+ run: |
+ composer update --ansi --no-interaction
+ composer remove --ansi --dev --unused rector/rector phpstan/phpstan codeigniter4/codeigniter4-standard squizlabs/php_codesniffer
+ php -r 'file_put_contents("vendor/laminas/laminas-zendframework-bridge/src/autoload.php", "");'
+ env:
+ COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
+
+ - name: Test with PHPUnit
+ run: script -e -c "vendor/bin/phpunit -v"
+ env:
+ DB: ${{ matrix.db-platforms }}
+ TERM: xterm-256color
+
+ - if: matrix.php-versions == '7.4'
+ name: Run Coveralls
+ run: |
+ composer global require php-coveralls/php-coveralls:^2.4
+ php-coveralls --coverage_clover=build/logs/clover.xml -v
+ env:
+ COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ COVERALLS_PARALLEL: true
+ COVERALLS_FLAG_NAME: PHP ${{ matrix.php-versions }} - ${{ matrix.db-platforms }}
+
+ coveralls-finish:
+ needs: [tests]
+ runs-on: ubuntu-latest
+ steps:
+ - name: Coveralls Finished
+ uses: coverallsapp/github-action@master
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ parallel-finished: true
diff --git a/.github/workflows/test-rector.yml b/.github/workflows/test-rector.yml
new file mode 100644
index 000000000000..8278046f402b
--- /dev/null
+++ b/.github/workflows/test-rector.yml
@@ -0,0 +1,65 @@
+# When a PR is opened or a push is made, perform
+# a static analysis check on the code using Rector.
+name: Rector
+
+on:
+ pull_request:
+ branches:
+ - 'develop'
+ - '4.*'
+ paths:
+ - 'app/**'
+ - 'system/**'
+ - '.github/workflows/test-rector.yml'
+ - composer.json
+ - 'rector.php'
+ push:
+ branches:
+ - 'develop'
+ - '4.*'
+ paths:
+ - 'app/**'
+ - 'system/**'
+ - '.github/workflows/test-rector.yml'
+ - composer.json
+ - 'rector.php'
+
+jobs:
+ build:
+ name: Analyze code (Rector)
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: '7.4'
+ extensions: intl
+
+ - name: Use latest Composer
+ run: composer self-update
+
+ - name: Validate composer.json
+ run: composer validate --strict
+
+ - name: Get composer cache directory
+ id: composer-cache
+ run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+ - name: Create composer cache directory
+ run: mkdir -p ${{ steps.composer-cache.outputs.dir }}
+
+ - name: Cache composer dependencies
+ uses: actions/cache@v2
+ with:
+ path: ${{ steps.composer-cache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
+ restore-keys: ${{ runner.os }}-composer-
+
+ - name: Install dependencies
+ run: composer update --ansi --no-interaction
+
+ - name: Run static analysis
+ run: vendor/bin/rector process --dry-run
diff --git a/.github/workflows/test-userguide.yml b/.github/workflows/test-userguide.yml
new file mode 100644
index 000000000000..75e6f4dc2524
--- /dev/null
+++ b/.github/workflows/test-userguide.yml
@@ -0,0 +1,23 @@
+# When a Pull Request is opened that modifies
+# the User Guide source, build the User Guide
+# with Sphinx and let the contributor know of
+# any errors.
+name: Test User Guide
+
+on:
+ pull_request:
+ branches:
+ - 'develop'
+ - '4.*'
+ paths:
+ - 'user_guide_src/**'
+
+jobs:
+ syntax_check:
+ name: Check User Guide syntax
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: ammaraskar/sphinx-action@0.4
+ with:
+ docs-folder: user_guide_src
diff --git a/.github/workflows/userguide_ci.yml b/.github/workflows/userguide_ci.yml
deleted file mode 100644
index c00d4c56e921..000000000000
--- a/.github/workflows/userguide_ci.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-# Builds the user guide and lets the contributor know of
-# any user guide build errors.
-name: UserGuide CI
-
-on:
- pull_request:
- paths:
- - 'user_guide_src/**'
-
-jobs:
- syntax_check:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - uses: ammaraskar/sphinx-action@master
- with:
- docs-folder: user_guide_src
diff --git a/.gitignore b/.gitignore
index 8da9861a617d..b769053b4a4b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -61,6 +61,7 @@ writable/uploads/*
!writable/uploads/index.html
writable/debugbar/*
+!writable/debugbar/.gitkeep
writable/**/*.db
writable/**/*.sqlite
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 310972ae4121..000000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-language: php
-
-php:
- - 7.2
- - 7.3
- - 7.4
- - nightly
-
-matrix:
- fast_finish: true
- allow_failures:
- - php: nightly
-
-global:
- - CI=true
- - CI_ENVIRONMENT=testing
-
-# Recommended by Travis support
-sudo: required
-dist: xenial
-group: edge
-
-env:
- - DB=mysqli
- - DB=postgres
- - DB=sqlite
-
-services:
- - memcached
- - mysql
- - postgresql
- - redis-server
-
-cache:
- directories:
- - vendor
-
-script:
- - php vendor/bin/phpunit -v
-
-before_install:
- - mysql -e "CREATE DATABASE IF NOT EXISTS test;" -uroot;
- - mysql -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'test';" -uroot
- - psql -c 'CREATE DATABASE test;' -U postgres
- - sudo apt-get install ghostscript
- - yes | pecl install imagick
-
-before_script:
- - echo 'extension = memcached.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
- - echo 'extension = redis.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
- - composer install --prefer-source
-
-after_success:
- - travis_retry php tests/bin/php-coveralls.phar -v
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4af9afd83fc2..2c0ac036c5a5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,369 @@
# Changelog
+## [Unreleased](https://github.com/codeigniter4/CodeIgniter4/tree/HEAD)
+
+[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.0.5...HEAD)
+
+## [v4.0.5](https://github.com/codeigniter4/CodeIgniter4/tree/v4.0.5) (2021-01-31)
+
+[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.0.4...v4.0.5)
+
+**Deprecations:**
+
+- `CodeIgniter\Database\ModelFactory` is now deprecated in favor of `CodeIgniter\Config\Factories::models()`
+- `CodeIgniter\Config\Config` is now deprecated in favor of `CodeIgniter\Config\Factories::config()`
+- HTTP Layer Refactor: Numerous deprecations have been made towards a transition to a PSR-compliant HTTP layer. [See the User Guide](user_guide_src/source/installation/upgrade_405.rst)
+
+**Mime Type Detection**
+
+- `Config\Mimes::guessExtensionFromType` now only reverse searches the `$mimes` array if no extension is proposed (i.e., usually not for uploaded files).
+- The fallback values of `UploadedFile->getExtension()` and `UploadedFile->guessExtension()` have been changed. `UploadedFile->getExtension()` now returns `$this->getClientExtension()` instead of `''`; `UploadedFile->guessExtension()` now returns `''` instead of `$this->getClientExtension()`.
+These changes increase security when handling uploaded files as the client can no longer force a wrong mime type on the application. However, these might affect how file extensions are detected in your application.
+
+**Implemented enhancements:**
+
+- Bug: controller routing on modules not working [\#3927](https://github.com/codeigniter4/CodeIgniter4/issues/3927)
+- CLI: method prompt should accept array validation rules [\#3766](https://github.com/codeigniter4/CodeIgniter4/issues/3766)
+- Validation: permit\_empty, optional arguments [\#3670](https://github.com/codeigniter4/CodeIgniter4/issues/3670)
+- php 8 support [\#3498](https://github.com/codeigniter4/CodeIgniter4/issues/3498)
+- getRoutesOptions should return the controller and method if available [\#3445](https://github.com/codeigniter4/CodeIgniter4/issues/3445)
+- before function in FilterInterface is missing response param [\#2085](https://github.com/codeigniter4/CodeIgniter4/issues/2085)
+- Feature Request: Centralized loggedInUser before RC [\#2055](https://github.com/codeigniter4/CodeIgniter4/issues/2055)
+
+**Fixed bugs:**
+
+- Bug: UploadedFile::store\(\) can't return null [\#4183](https://github.com/codeigniter4/CodeIgniter4/issues/4183)
+- Bug: BaseBuilder::getCompiledDelete\(\) runs real query [\#4180](https://github.com/codeigniter4/CodeIgniter4/issues/4180)
+- Bug: Deprecated: Required parameter $userAgent follows optional parameter $body in /opt/lampp/htdocs/framework-4.0.4/system/HTTP/IncomingRequest.php on line 161 [\#4172](https://github.com/codeigniter4/CodeIgniter4/issues/4172)
+- Bug: table template closes tbody after tfoot [\#4155](https://github.com/codeigniter4/CodeIgniter4/issues/4155)
+- Bug: delete\_cookie\(\) helper not working [\#4149](https://github.com/codeigniter4/CodeIgniter4/issues/4149)
+- Bug: Required parameter $userAgent follows optional parameter $body in [\#4148](https://github.com/codeigniter4/CodeIgniter4/issues/4148)
+- Bug: spark issue [\#4144](https://github.com/codeigniter4/CodeIgniter4/issues/4144)
+- Bug: PostgreSQL driver issues [\#4142](https://github.com/codeigniter4/CodeIgniter4/issues/4142)
+- Bug: phpunit coverage report causes `Cannot declare class Config\App, because the name is already in use` [\#4114](https://github.com/codeigniter4/CodeIgniter4/issues/4114)
+- Bug: Wrong file/line in exceptions created by "factory" methods [\#4110](https://github.com/codeigniter4/CodeIgniter4/issues/4110)
+- Bug: Request::withMethod\(\) uses deprecated code [\#4109](https://github.com/codeigniter4/CodeIgniter4/issues/4109)
+- Bug: View rendering, extracted variables overwrites existed variables\(arguments and etc.\) [\#4108](https://github.com/codeigniter4/CodeIgniter4/issues/4108)
+- Bug: Loss of escape value and data in the model [\#4087](https://github.com/codeigniter4/CodeIgniter4/issues/4087)
+- Bug: classes overwrites parameter defaults, phpDoc's defined in interfaces [\#4086](https://github.com/codeigniter4/CodeIgniter4/issues/4086)
+- Bug: getRandomName Return file extension .csv when upload docx or xlsx becouse mimetype application/octet-stream are set [\#4084](https://github.com/codeigniter4/CodeIgniter4/issues/4084)
+- Bug: Required parameter $from follows optional parameter $verbs [\#4076](https://github.com/codeigniter4/CodeIgniter4/issues/4076)
+- Bug: username input form shows root as a default value [\#4062](https://github.com/codeigniter4/CodeIgniter4/issues/4062)
+- Bug: Issue with pagination [\#4045](https://github.com/codeigniter4/CodeIgniter4/issues/4045)
+- Bug: Model calls builder before initializing [\#4036](https://github.com/codeigniter4/CodeIgniter4/issues/4036)
+- Bug: can't run migrations when CI\_ENVIRONMENT = testing [\#4033](https://github.com/codeigniter4/CodeIgniter4/issues/4033)
+- Bug: can't get environment variable with dot [\#4026](https://github.com/codeigniter4/CodeIgniter4/issues/4026)
+- Bug: CodeIgniter model not recognizing custom deletedField in find queries [\#3999](https://github.com/codeigniter4/CodeIgniter4/issues/3999)
+- Bug: assertSee\(\) can not assert title tag. [\#3984](https://github.com/codeigniter4/CodeIgniter4/issues/3984)
+- Bug: RAR file detected as CSV [\#3979](https://github.com/codeigniter4/CodeIgniter4/issues/3979)
+- Bug: Session Initialization via DatabaseHandler [\#3978](https://github.com/codeigniter4/CodeIgniter4/issues/3978)
+- Bug: required\_with validation rule does not work with arrays [\#3965](https://github.com/codeigniter4/CodeIgniter4/issues/3965)
+- Bug: helper cookie not working [\#3939](https://github.com/codeigniter4/CodeIgniter4/issues/3939)
+- Bug: Uploaded SRT files are saved as CSV [\#3921](https://github.com/codeigniter4/CodeIgniter4/issues/3921)
+- Bug: Pre-commit hook for Phpstan and sniffer stop working after e111f04d74569e413c5aede3ed9bd9fa1ce7dca2 [\#3920](https://github.com/codeigniter4/CodeIgniter4/issues/3920)
+- Bug: Documentation Example Leads to Bug [\#3914](https://github.com/codeigniter4/CodeIgniter4/issues/3914)
+- Bug: Route filter runs twice [\#3902](https://github.com/codeigniter4/CodeIgniter4/issues/3902)
+- Bug: Premature empty check in Model-\>update function. [\#3896](https://github.com/codeigniter4/CodeIgniter4/issues/3896)
+- Bug: Sqldrv problems to insert when change DBPrefix [\#3881](https://github.com/codeigniter4/CodeIgniter4/issues/3881)
+- Bug: CI4 won't recognise current namespace for language files [\#3867](https://github.com/codeigniter4/CodeIgniter4/issues/3867)
+- Unexpected validation bug [\#3859](https://github.com/codeigniter4/CodeIgniter4/issues/3859)
+- Bug: single\_service does not set service's arguments correctly [\#3854](https://github.com/codeigniter4/CodeIgniter4/issues/3854)
+- Bug: debugbar should not insert code in code tag [\#3847](https://github.com/codeigniter4/CodeIgniter4/issues/3847)
+- Parser won't properly parse tags that have a similar name [\#3841](https://github.com/codeigniter4/CodeIgniter4/issues/3841)
+- Bug: insertBatch not generating createdField [\#3838](https://github.com/codeigniter4/CodeIgniter4/issues/3838)
+- Bug: Parser - Replacements happening even if key does not fully matches { value } [\#3825](https://github.com/codeigniter4/CodeIgniter4/issues/3825)
+- Bug: Parser preg\_replace\_callback exception if template has \# [\#3824](https://github.com/codeigniter4/CodeIgniter4/issues/3824)
+- Translation function 'lang' does not work as described [\#3822](https://github.com/codeigniter4/CodeIgniter4/issues/3822)
+- Bug: File rewrite.php is always lost in large-request unhandled error [\#3818](https://github.com/codeigniter4/CodeIgniter4/issues/3818)
+- Bug: Model::builder\(\) ignores parameter [\#3793](https://github.com/codeigniter4/CodeIgniter4/issues/3793)
+- Bug: Warning no tests found in CodeIgiter\Tests\... [\#3788](https://github.com/codeigniter4/CodeIgniter4/issues/3788)
+- Bug: Class '\CodeIgniter\Database\pdo\Connection' not found [\#3785](https://github.com/codeigniter4/CodeIgniter4/issues/3785)
+- Bug: Composer php spark migrate error [\#3771](https://github.com/codeigniter4/CodeIgniter4/issues/3771)
+- Bug: ORDER BY RANDOM ON SQLite3 [\#3768](https://github.com/codeigniter4/CodeIgniter4/issues/3768)
+- Bug: CLI: generateDimensions fails with a uncaught exception when exec is disabled [\#3762](https://github.com/codeigniter4/CodeIgniter4/issues/3762)
+- Bug: createTable if not exists not working [\#3757](https://github.com/codeigniter4/CodeIgniter4/issues/3757)
+- Bug: SQLite drop column corrupts table cache [\#3752](https://github.com/codeigniter4/CodeIgniter4/issues/3752)
+- Bug: route filters don't apply for different methods [\#3733](https://github.com/codeigniter4/CodeIgniter4/issues/3733)
+- /system/Images/Image.php image\(\)-\>copy\(\) mkdir [\#3732](https://github.com/codeigniter4/CodeIgniter4/issues/3732)
+- Bug: route bug [\#3731](https://github.com/codeigniter4/CodeIgniter4/issues/3731)
+- page not redirecting. when i redirecting by calling function [\#3729](https://github.com/codeigniter4/CodeIgniter4/issues/3729)
+- Bug: \Config\Services::image\(\)-\>flatten\(\) [\#3728](https://github.com/codeigniter4/CodeIgniter4/issues/3728)
+- Bug: Parser will overwrite the value if the initial variable is same [\#3726](https://github.com/codeigniter4/CodeIgniter4/issues/3726)
+- Bug: Validating Json Requests [\#3719](https://github.com/codeigniter4/CodeIgniter4/issues/3719)
+- Bug: view caching not work on windows [\#3711](https://github.com/codeigniter4/CodeIgniter4/issues/3711)
+- Bug: getRoutesOptions return wrong when I have \>2 routes has same name, but different method \(HTTPVerb\) [\#3700](https://github.com/codeigniter4/CodeIgniter4/issues/3700)
+- Bug: Validation with request raw body. [\#3694](https://github.com/codeigniter4/CodeIgniter4/issues/3694)
+- Image format webp is not preserve transparent [\#3690](https://github.com/codeigniter4/CodeIgniter4/issues/3690)
+- problem: [\#3686](https://github.com/codeigniter4/CodeIgniter4/issues/3686)
+- Documentation Error [\#3668](https://github.com/codeigniter4/CodeIgniter4/issues/3668)
+- Bug: BaseBuilder's query is wrong [\#3659](https://github.com/codeigniter4/CodeIgniter4/issues/3659)
+- Bug: The lifetime of the CSRF check cookie cannot be set to 0 \(Session\). [\#3655](https://github.com/codeigniter4/CodeIgniter4/issues/3655)
+- Bug: isRedirect does not respond depending on how redirects are set up. [\#3654](https://github.com/codeigniter4/CodeIgniter4/issues/3654)
+- Bug: SQL Error when countAllResults, groupBy and DBPrefix used together [\#3651](https://github.com/codeigniter4/CodeIgniter4/issues/3651)
+- Bug: helper current\_url\(\) return wrong protocol [\#3648](https://github.com/codeigniter4/CodeIgniter4/issues/3648)
+- Bug: IncomingRequest::setLocale\(\) [\#3640](https://github.com/codeigniter4/CodeIgniter4/issues/3640)
+- CodeIgniter\Database\Exceptions\DatabaseException \#8 Unable to connect to the database. [\#3639](https://github.com/codeigniter4/CodeIgniter4/issues/3639)
+- Bug: Cannot use view filter on array values [\#3630](https://github.com/codeigniter4/CodeIgniter4/issues/3630)
+- Bug: Changelog navigation is not working properly [\#3625](https://github.com/codeigniter4/CodeIgniter4/issues/3625)
+- Bug: Routing 404 Override confusion under route group [\#3623](https://github.com/codeigniter4/CodeIgniter4/issues/3623)
+- Bug: Target batch not found when running `php spark migrate:rollback` [\#3620](https://github.com/codeigniter4/CodeIgniter4/issues/3620)
+- Bug: getHeaders returns Array with no values [\#3616](https://github.com/codeigniter4/CodeIgniter4/issues/3616)
+- Ignore this, was a false report [\#3611](https://github.com/codeigniter4/CodeIgniter4/issues/3611)
+- Bug: Incorrect type that fails strict\_types=1 [\#3610](https://github.com/codeigniter4/CodeIgniter4/issues/3610)
+- The isAJAX method does not exist in filters [\#3604](https://github.com/codeigniter4/CodeIgniter4/issues/3604)
+- Bug: `current\_url\(\)` helper returns wrong url with slash between host and port [\#3603](https://github.com/codeigniter4/CodeIgniter4/issues/3603)
+- Bug: Connection ID unknown immediately after connection [\#3601](https://github.com/codeigniter4/CodeIgniter4/issues/3601)
+- Bug: Join Query is not working in Library [\#3600](https://github.com/codeigniter4/CodeIgniter4/issues/3600)
+- Bug: Database cache not working [\#3597](https://github.com/codeigniter4/CodeIgniter4/issues/3597)
+- Bug: Issue in the route, redirect to parent domain, if you put / at the end of url [\#3595](https://github.com/codeigniter4/CodeIgniter4/issues/3595)
+- Bug: Segments Also Include The Segments In BASE\_URL [\#3594](https://github.com/codeigniter4/CodeIgniter4/issues/3594)
+- Bug: Route Filters doesn't restart in FeatureTestCase. [\#3591](https://github.com/codeigniter4/CodeIgniter4/issues/3591)
+- Bug: CURL call returns always code 200 in case de server uses HTTP/2 [\#3586](https://github.com/codeigniter4/CodeIgniter4/issues/3586)
+- Bug: Language folders inside locale folders NOT Working ! [\#3582](https://github.com/codeigniter4/CodeIgniter4/issues/3582)
+- Bug: Uninitialized string offset: 1 CI 4 [\#3573](https://github.com/codeigniter4/CodeIgniter4/issues/3573)
+- Deprecated assertArraySubset in PHPUnit8 used in FeatureResponse::assertJSONFragment [\#3562](https://github.com/codeigniter4/CodeIgniter4/issues/3562)
+- Wrong HTTP status code [\#3558](https://github.com/codeigniter4/CodeIgniter4/issues/3558)
+- Bug: Invalid serialization data for DateTime object [\#3553](https://github.com/codeigniter4/CodeIgniter4/issues/3553)
+- Bug: Setting session expires parameter via $this-\>sessionExpiration [\#3543](https://github.com/codeigniter4/CodeIgniter4/issues/3543)
+- Bug: Upload file validation, $model-\>validate return true if failed [\#3532](https://github.com/codeigniter4/CodeIgniter4/issues/3532)
+- Bug: Inconsistent behavior of view renderer on Windows and Linux [\#3529](https://github.com/codeigniter4/CodeIgniter4/issues/3529)
+- Bug: Add dash to parser plugin regex [\#3523](https://github.com/codeigniter4/CodeIgniter4/issues/3523)
+- Bug: When Cronjob run the ip address of the request is 0.0.0.0 [\#3512](https://github.com/codeigniter4/CodeIgniter4/issues/3512)
+- Bug: Inconsistency in replace\(\) method [\#3510](https://github.com/codeigniter4/CodeIgniter4/issues/3510)
+- Bug: setPath function in UploadedFile.php is writing the index.html wrong [\#3506](https://github.com/codeigniter4/CodeIgniter4/issues/3506)
+- Bug: Cannot get session data after server redirecting [\#3503](https://github.com/codeigniter4/CodeIgniter4/issues/3503)
+- Bug: Database group defined in .env doesn't work [\#3497](https://github.com/codeigniter4/CodeIgniter4/issues/3497)
+- Bug: I cant upload mp4 files [\#3494](https://github.com/codeigniter4/CodeIgniter4/issues/3494)
+- Bug: Error message for matches rule doesn't support nested params [\#3492](https://github.com/codeigniter4/CodeIgniter4/issues/3492)
+- CI\_VERSION = '4.0.0-beta.4'; session 文件file缓存问题失效问题;session\_start\(\): Failed to decode session object. Session has been destroyed [\#3485](https://github.com/codeigniter4/CodeIgniter4/issues/3485)
+- Bug: onlyDeleted\(\) conflicts to paginate\(\) [\#3482](https://github.com/codeigniter4/CodeIgniter4/issues/3482)
+- Bug: Unable to connect to the database [\#3477](https://github.com/codeigniter4/CodeIgniter4/issues/3477)
+- Bug: Argument 1 passed to CodeIgniter\Config\Services::request\(\) must be an instance of Config\App or null, instance of BackEnd\Config\App [\#3475](https://github.com/codeigniter4/CodeIgniter4/issues/3475)
+- Bug: Fatal error running [\#3473](https://github.com/codeigniter4/CodeIgniter4/issues/3473)
+- Bug: set\(\) doesn't work on DateTime database field types [\#3471](https://github.com/codeigniter4/CodeIgniter4/issues/3471)
+- before\(\) Filters that are executed are missing from codeigniter debug toolbar. [\#3470](https://github.com/codeigniter4/CodeIgniter4/issues/3470)
+- Bug: Model insert method always insert with current datetime on updatedField [\#3469](https://github.com/codeigniter4/CodeIgniter4/issues/3469)
+- Bug: The search function in the documentation is not working [\#3458](https://github.com/codeigniter4/CodeIgniter4/issues/3458)
+- Bug: env variable database.default.dsn not working for mysqli [\#3456](https://github.com/codeigniter4/CodeIgniter4/issues/3456)
+- Bug: [\#3453](https://github.com/codeigniter4/CodeIgniter4/issues/3453)
+- Bug: form\_textarea in form\_helper does not create specified 'rows' [\#3452](https://github.com/codeigniter4/CodeIgniter4/issues/3452)
+- Bug: afterUpdate event return array instead of key value [\#3450](https://github.com/codeigniter4/CodeIgniter4/issues/3450)
+- Using Cronjob with php line argument while using Crontab redirects the script and never executes [\#3444](https://github.com/codeigniter4/CodeIgniter4/issues/3444)
+- Bug: Support for SameSite cookie setting missing [\#3442](https://github.com/codeigniter4/CodeIgniter4/issues/3442)
+- Bug: Validation mime\_in SVG files not working correctly [\#3439](https://github.com/codeigniter4/CodeIgniter4/issues/3439)
+- Bug: Cannot declare class Config\Paths, because the name is already in use [\#3434](https://github.com/codeigniter4/CodeIgniter4/issues/3434)
+- Bug: delete\_cookie\(\) helper function not working [\#3433](https://github.com/codeigniter4/CodeIgniter4/issues/3433)
+- Bug: insertBatch not working correctly [\#3432](https://github.com/codeigniter4/CodeIgniter4/issues/3432)
+- Feature request : CodeIgniter\File with SplFileInfo does not have a method to rewrite parts of the file only to append an CSV style row [\#3431](https://github.com/codeigniter4/CodeIgniter4/issues/3431)
+- Bug: SMTP to port 465 should use TLS from the start [\#3429](https://github.com/codeigniter4/CodeIgniter4/issues/3429)
+- Bug: Form data and file is not receiving well formed with PUT Method [\#3417](https://github.com/codeigniter4/CodeIgniter4/issues/3417)
+- Bug: form\_textarea helper row and col defaults not overwriting when defined as $extra [\#3412](https://github.com/codeigniter4/CodeIgniter4/issues/3412)
+- Encryption Class does not allow to change digest parameter from SHA512 to SHA256 or others [\#3404](https://github.com/codeigniter4/CodeIgniter4/issues/3404)
+- Bug: table.Array in first\(\) ... - and complex primary keys! ;-\) [\#3394](https://github.com/codeigniter4/CodeIgniter4/issues/3394)
+- Error: Email SMTP configured wrong gives error [\#3390](https://github.com/codeigniter4/CodeIgniter4/issues/3390)
+- Bug: CodeIgniter\Router\Router hasLocale returns true even if {locale} is absent [\#3386](https://github.com/codeigniter4/CodeIgniter4/issues/3386)
+- Bug: Logs Collector isn't collecting logs for Debug Toolbar [\#3376](https://github.com/codeigniter4/CodeIgniter4/issues/3376)
+- Bug: Entity's original is not set [\#3370](https://github.com/codeigniter4/CodeIgniter4/issues/3370)
+- Bug: warning in Routes.php [\#3369](https://github.com/codeigniter4/CodeIgniter4/issues/3369)
+- Bug: Model can not insert Entity [\#3368](https://github.com/codeigniter4/CodeIgniter4/issues/3368)
+- Bug: stringify\_attributes\(\) looks unfinished. [\#3363](https://github.com/codeigniter4/CodeIgniter4/issues/3363)
+- Bug: php spark migrate throws wrongful CodeIgniter\Database\Exceptions\DatabaseException Unable to connect to the database [\#3359](https://github.com/codeigniter4/CodeIgniter4/issues/3359)
+- Bug: Image watermark after save.. text not align in center middle when resolution lower and higher. [\#3356](https://github.com/codeigniter4/CodeIgniter4/issues/3356)
+- Bug: SQL Lite driver with Builder -\> InsertBatch has intermittend lastError reporting issues [\#3350](https://github.com/codeigniter4/CodeIgniter4/issues/3350)
+- Bug: isCLI error when calling a controller from a Command Line [\#3342](https://github.com/codeigniter4/CodeIgniter4/issues/3342)
+- Bug: missing clear upgrade instructions [\#3332](https://github.com/codeigniter4/CodeIgniter4/issues/3332)
+- Bug: API requests with a trailing forward slash [\#3330](https://github.com/codeigniter4/CodeIgniter4/issues/3330)
+- Bug: Pager pagination \( page value in url \) [\#3328](https://github.com/codeigniter4/CodeIgniter4/issues/3328)
+- Bug: View layout name hierarchy is not displaying correctly on Debugbar Views [\#3327](https://github.com/codeigniter4/CodeIgniter4/issues/3327)
+- Bug: php spark migrate on testing environment doesn't work [\#3309](https://github.com/codeigniter4/CodeIgniter4/issues/3309)
+- Bug: Empty Entity date attributes receive current timestamp when accessed [\#3251](https://github.com/codeigniter4/CodeIgniter4/issues/3251)
+- Bug: no Filter arguments passed [\#3216](https://github.com/codeigniter4/CodeIgniter4/issues/3216)
+- Bug: Url Helper have a bug [\#3180](https://github.com/codeigniter4/CodeIgniter4/issues/3180)
+- $pager-\>links\(\) not working inside view layouts [\#3164](https://github.com/codeigniter4/CodeIgniter4/issues/3164)
+- Bug: AH01075: Error dispatching request on Basic CI4 [\#3110](https://github.com/codeigniter4/CodeIgniter4/issues/3110)
+- Bug: Using assertJSONFragment with respond\(\) in ResponseTrait [\#3079](https://github.com/codeigniter4/CodeIgniter4/issues/3079)
+- Bug: Filters 'except' option not removing DebugToolbar comment for view [\#3002](https://github.com/codeigniter4/CodeIgniter4/issues/3002)
+- Bug: useSoftDeletes with like function [\#2380](https://github.com/codeigniter4/CodeIgniter4/issues/2380)
+
+**Closed issues:**
+
+- Seed Command in document Not found [\#4154](https://github.com/codeigniter4/CodeIgniter4/issues/4154)
+- I18n/L10n: auto update translations [\#4151](https://github.com/codeigniter4/CodeIgniter4/issues/4151)
+- Calling update\(\) with an Entity throws an error [\#4143](https://github.com/codeigniter4/CodeIgniter4/issues/4143)
+- BaseConfig property issue [\#4140](https://github.com/codeigniter4/CodeIgniter4/issues/4140)
+- Bug: [\#4126](https://github.com/codeigniter4/CodeIgniter4/issues/4126)
+- Bug: a new installation of codeignitor 4.0.4 show 404 error Sorry! Cannot seem to find the page you were looking for. [\#4111](https://github.com/codeigniter4/CodeIgniter4/issues/4111)
+- Bug PHP SPARK MIGRATE [\#4101](https://github.com/codeigniter4/CodeIgniter4/issues/4101)
+- Pagination work in local, but error in server [\#4096](https://github.com/codeigniter4/CodeIgniter4/issues/4096)
+- updated\_at field is filled with the current timestamp when inserting new data along with created\_at [\#4038](https://github.com/codeigniter4/CodeIgniter4/issues/4038)
+- Config for pager [\#4030](https://github.com/codeigniter4/CodeIgniter4/issues/4030)
+- setUpdateBatch [\#4025](https://github.com/codeigniter4/CodeIgniter4/issues/4025)
+- Empty html-file created when moving uploaded files with $img-\>move\(\) [\#4020](https://github.com/codeigniter4/CodeIgniter4/issues/4020)
+- php spark serve error on php 8 [\#3980](https://github.com/codeigniter4/CodeIgniter4/issues/3980)
+- Bug: PHP8 session flush data is not deleted [\#3974](https://github.com/codeigniter4/CodeIgniter4/issues/3974)
+- PHP8: Deprecate required param after optional [\#3957](https://github.com/codeigniter4/CodeIgniter4/issues/3957)
+- Undefined function [\#3954](https://github.com/codeigniter4/CodeIgniter4/issues/3954)
+- Missing function locale\_set\_default\(...\) in Codeigniter 4 [\#3953](https://github.com/codeigniter4/CodeIgniter4/issues/3953)
+- Language\en\Language.php is only used in testing [\#3948](https://github.com/codeigniter4/CodeIgniter4/issues/3948)
+- Bug: locale\_set\_default causing "Whoops" failure in MacOS PHP 7.3.9 on develop branch [\#3933](https://github.com/codeigniter4/CodeIgniter4/issues/3933)
+- Pdo driver not found [\#3922](https://github.com/codeigniter4/CodeIgniter4/issues/3922)
+- Mysqli Backup utility? [\#3906](https://github.com/codeigniter4/CodeIgniter4/issues/3906)
+- Relationships - Many to many [\#3885](https://github.com/codeigniter4/CodeIgniter4/issues/3885)
+- Bug: How can remove Codeinatore default icon [\#3883](https://github.com/codeigniter4/CodeIgniter4/issues/3883)
+- How Can remove CodeIgniter4 icon [\#3882](https://github.com/codeigniter4/CodeIgniter4/issues/3882)
+- Codeigniter review 2021 [\#3880](https://github.com/codeigniter4/CodeIgniter4/issues/3880)
+- url\_title doesn't work with decimal number in title [\#3878](https://github.com/codeigniter4/CodeIgniter4/issues/3878)
+- IncomingRequest Class "hasFile" function does not exist as described in the documentation. [\#3852](https://github.com/codeigniter4/CodeIgniter4/issues/3852)
+- Dynamically changing supported languages [\#3844](https://github.com/codeigniter4/CodeIgniter4/issues/3844)
+- CodeIgniter\Database\Exceptions\DatabaseException \#8 [\#3826](https://github.com/codeigniter4/CodeIgniter4/issues/3826)
+- Blank page show [\#3812](https://github.com/codeigniter4/CodeIgniter4/issues/3812)
+- Bug: folder tests not found [\#3807](https://github.com/codeigniter4/CodeIgniter4/issues/3807)
+- Typo in the doc: cache\_info\(\) [\#3800](https://github.com/codeigniter4/CodeIgniter4/issues/3800)
+- only\_full\_group\_by - mysqli\_sql\_exception \#1055 - MySql 5.7.24 [\#3795](https://github.com/codeigniter4/CodeIgniter4/issues/3795)
+- Dev: Split ModelTest [\#3792](https://github.com/codeigniter4/CodeIgniter4/issues/3792)
+- The formatMessage function of the Language class works intermittently [\#3784](https://github.com/codeigniter4/CodeIgniter4/issues/3784)
+- .htaccess problem with syntax [\#3778](https://github.com/codeigniter4/CodeIgniter4/issues/3778)
+- The page does not open correctly:\( [\#3770](https://github.com/codeigniter4/CodeIgniter4/issues/3770)
+- Restore method for CodeIgniter Model. [\#3767](https://github.com/codeigniter4/CodeIgniter4/issues/3767)
+- Bug: Model update\(\) only set first array value [\#3764](https://github.com/codeigniter4/CodeIgniter4/issues/3764)
+- Bug: CLI: Exception view shows full path [\#3763](https://github.com/codeigniter4/CodeIgniter4/issues/3763)
+- Bug: Maximum execution time exceeds while handling IPv6 Reverse Proxy IPs [\#3760](https://github.com/codeigniter4/CodeIgniter4/issues/3760)
+- Fabricators documentation error [\#3743](https://github.com/codeigniter4/CodeIgniter4/issues/3743)
+- `is\_unique` is not considering the db prefix in checking for unique values in db [\#3741](https://github.com/codeigniter4/CodeIgniter4/issues/3741)
+- Grouping routes should let me pass additional variables within the closure function [\#3691](https://github.com/codeigniter4/CodeIgniter4/issues/3691)
+- cannot find Ftp library. [\#3679](https://github.com/codeigniter4/CodeIgniter4/issues/3679)
+- Make sessions never expire with $config\['sess\_expiration'\] = -1 [\#3677](https://github.com/codeigniter4/CodeIgniter4/issues/3677)
+- Migration trouble [\#3624](https://github.com/codeigniter4/CodeIgniter4/issues/3624)
+- Files as optional in validation rules [\#3619](https://github.com/codeigniter4/CodeIgniter4/issues/3619)
+- $\_SERVER should not have .env file info [\#3615](https://github.com/codeigniter4/CodeIgniter4/issues/3615)
+- Bug pars xml [\#3588](https://github.com/codeigniter4/CodeIgniter4/issues/3588)
+- Bug: When have multi filter class, and "before" function return true,other filters after this filter not working [\#3579](https://github.com/codeigniter4/CodeIgniter4/issues/3579)
+- can not install on linux os [\#3572](https://github.com/codeigniter4/CodeIgniter4/issues/3572)
+- Incorrect grouping function names in documentation [\#3551](https://github.com/codeigniter4/CodeIgniter4/issues/3551)
+- New Edge Browser missing from user agents config [\#3513](https://github.com/codeigniter4/CodeIgniter4/issues/3513)
+- Form validation does not have a rule to validate if field value differs from a string [\#3462](https://github.com/codeigniter4/CodeIgniter4/issues/3462)
+- updateBatch does not accept entities [\#3451](https://github.com/codeigniter4/CodeIgniter4/issues/3451)
+- Support PSR4 [\#3405](https://github.com/codeigniter4/CodeIgniter4/issues/3405)
+- CodeIgniter4 is ready to work with PHP 7.4? [\#3389](https://github.com/codeigniter4/CodeIgniter4/issues/3389)
+- Using CodeIgniter4 with Oracle Database [\#3388](https://github.com/codeigniter4/CodeIgniter4/issues/3388)
+- Can't get Controllers subfolder working [\#3347](https://github.com/codeigniter4/CodeIgniter4/issues/3347)
+- Why redirect\(\)-\>to\(\) doesn't work inside events Model? [\#3346](https://github.com/codeigniter4/CodeIgniter4/issues/3346)
+- Bug: requests PUT type without segment redirects to index method instead update method [\#3343](https://github.com/codeigniter4/CodeIgniter4/issues/3343)
+- Migrations not working [\#3317](https://github.com/codeigniter4/CodeIgniter4/issues/3317)
+- CURL Error htts SSL [\#3314](https://github.com/codeigniter4/CodeIgniter4/issues/3314)
+- codeigniter composer global installer [\#3266](https://github.com/codeigniter4/CodeIgniter4/issues/3266)
+- Bug: Migrations Deprecated [\#3195](https://github.com/codeigniter4/CodeIgniter4/issues/3195)
+- Managed to reproduce this issue. Was uploading an image with jquery.dm-uploader.min.js, and trying to do some image manipulation, but when I got this error: [\#3174](https://github.com/codeigniter4/CodeIgniter4/issues/3174)
+- Make the Model work without auto\_increment primary key [\#3134](https://github.com/codeigniter4/CodeIgniter4/issues/3134)
+- Call to undefined function CodeIgniter\Debug\current\_url\(\) [\#3106](https://github.com/codeigniter4/CodeIgniter4/issues/3106)
+- Bug: select\(\) & selectSum\(\) not consistent / aligned with docs [\#3019](https://github.com/codeigniter4/CodeIgniter4/issues/3019)
+- Remove /public in URL not working if using localhost [\#2930](https://github.com/codeigniter4/CodeIgniter4/issues/2930)
+- The problem is in getting the file sharing by Mime [\#2732](https://github.com/codeigniter4/CodeIgniter4/issues/2732)
+- Migration on PostgreSQL failes for tables with foreign keys [\#2575](https://github.com/codeigniter4/CodeIgniter4/issues/2575)
+- Automatic Entity cast for Parser [\#2317](https://github.com/codeigniter4/CodeIgniter4/issues/2317)
+- Feature: Cache Driver - Serialize/Unserialize Objects [\#2111](https://github.com/codeigniter4/CodeIgniter4/issues/2111)
+- Model set $escape problem [\#1929](https://github.com/codeigniter4/CodeIgniter4/issues/1929)
+- \I18n\Time setTimezone does not work as expected [\#1807](https://github.com/codeigniter4/CodeIgniter4/issues/1807)
+- TODO Database utility backup builder [\#1257](https://github.com/codeigniter4/CodeIgniter4/issues/1257)
+- Port FTP library from CI3 [\#506](https://github.com/codeigniter4/CodeIgniter4/issues/506)
+- Port MSSql Database driver from CI3 [\#503](https://github.com/codeigniter4/CodeIgniter4/issues/503)
+
+**Merged pull requests:**
+
+- Finishing touches to generator refactor [\#4197](https://github.com/codeigniter4/CodeIgniter4/pull/4197) ([paulbalandan](https://github.com/paulbalandan))
+- Add additional empty checks after field protection for update/insert. [\#4195](https://github.com/codeigniter4/CodeIgniter4/pull/4195) ([sfadschm](https://github.com/sfadschm))
+- Minor fixes in Common.php [\#4192](https://github.com/codeigniter4/CodeIgniter4/pull/4192) ([kenjis](https://github.com/kenjis))
+- Fix Parser file path in ViewException message is empty [\#4191](https://github.com/codeigniter4/CodeIgniter4/pull/4191) ([kenjis](https://github.com/kenjis))
+- docs: Fix double "the" [\#4190](https://github.com/codeigniter4/CodeIgniter4/pull/4190) ([kenjis](https://github.com/kenjis))
+- Fix typo in IncomingRequestTest [\#4189](https://github.com/codeigniter4/CodeIgniter4/pull/4189) ([kenjis](https://github.com/kenjis))
+- feat: add methods to get page numbers in PagerRenderer [\#4188](https://github.com/codeigniter4/CodeIgniter4/pull/4188) ([kenjis](https://github.com/kenjis))
+- fix: UploadedFile::store\(\) return type inconsistancy [\#4187](https://github.com/codeigniter4/CodeIgniter4/pull/4187) ([kenjis](https://github.com/kenjis))
+- Add STL mime support [\#4186](https://github.com/codeigniter4/CodeIgniter4/pull/4186) ([MGatner](https://github.com/MGatner))
+- \[Rector\] Run Rector when composer.json updated [\#4185](https://github.com/codeigniter4/CodeIgniter4/pull/4185) ([samsonasik](https://github.com/samsonasik))
+- new array helper: array\_flatten\_with\_dots [\#4184](https://github.com/codeigniter4/CodeIgniter4/pull/4184) ([paulbalandan](https://github.com/paulbalandan))
+- fix: BaseBuilder::getCompiledDelete\(\) runs real query [\#4181](https://github.com/codeigniter4/CodeIgniter4/pull/4181) ([kenjis](https://github.com/kenjis))
+- fix the missing / hidden userguide [\#4175](https://github.com/codeigniter4/CodeIgniter4/pull/4175) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Revert "Update phpstan/phpstan requirement from 0.12.69 to 0.12.70" [\#4173](https://github.com/codeigniter4/CodeIgniter4/pull/4173) ([samsonasik](https://github.com/samsonasik))
+- Add missing escaping in error\_exception.php [\#4171](https://github.com/codeigniter4/CodeIgniter4/pull/4171) ([kenjis](https://github.com/kenjis))
+- Update phpstan/phpstan requirement from 0.12.69 to 0.12.70 [\#4170](https://github.com/codeigniter4/CodeIgniter4/pull/4170) ([dependabot[bot]](https://github.com/apps/dependabot))
+- add phpunit.xml.dist to .gitattributes for admin/framework [\#4163](https://github.com/codeigniter4/CodeIgniter4/pull/4163) ([samsonasik](https://github.com/samsonasik))
+- Fix strict checking for SQLite3 memory filename [\#4161](https://github.com/codeigniter4/CodeIgniter4/pull/4161) ([paulbalandan](https://github.com/paulbalandan))
+- Discuss dbcreate in userguide [\#4160](https://github.com/codeigniter4/CodeIgniter4/pull/4160) ([paulbalandan](https://github.com/paulbalandan))
+- Fix misplaced closing tbody [\#4159](https://github.com/codeigniter4/CodeIgniter4/pull/4159) ([paulbalandan](https://github.com/paulbalandan))
+- \[Develop\] Fixes \#4114 Cannot declare class Config\App error on running PHPUnit [\#4157](https://github.com/codeigniter4/CodeIgniter4/pull/4157) ([samsonasik](https://github.com/samsonasik))
+- Specifically exclude migrations from class mapping [\#4156](https://github.com/codeigniter4/CodeIgniter4/pull/4156) ([paulbalandan](https://github.com/paulbalandan))
+- config: add logger.threshold in env as comment [\#4153](https://github.com/codeigniter4/CodeIgniter4/pull/4153) ([kenjis](https://github.com/kenjis))
+- Update phpstan/phpstan requirement from 0.12.68 to 0.12.69 [\#4152](https://github.com/codeigniter4/CodeIgniter4/pull/4152) ([dependabot[bot]](https://github.com/apps/dependabot))
+- convert indentation from tabs to spaces & update code-block \[changelogs, database\] [\#4150](https://github.com/codeigniter4/CodeIgniter4/pull/4150) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Fix for retrieving migration history [\#4147](https://github.com/codeigniter4/CodeIgniter4/pull/4147) ([michalsn](https://github.com/michalsn))
+- Fix phpstan notice [\#4146](https://github.com/codeigniter4/CodeIgniter4/pull/4146) ([samsonasik](https://github.com/samsonasik))
+- Update docs for Entity [\#4145](https://github.com/codeigniter4/CodeIgniter4/pull/4145) ([michalsn](https://github.com/michalsn))
+- update faker [\#4139](https://github.com/codeigniter4/CodeIgniter4/pull/4139) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- docs: add table of contents in 2 libs [\#4138](https://github.com/codeigniter4/CodeIgniter4/pull/4138) ([kenjis](https://github.com/kenjis))
+- PHPStan Fixes [\#4136](https://github.com/codeigniter4/CodeIgniter4/pull/4136) ([MGatner](https://github.com/MGatner))
+- prep\_url\(\) with https:// [\#4135](https://github.com/codeigniter4/CodeIgniter4/pull/4135) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Update phpstan/phpstan requirement from 0.12.65 to 0.12.68 [\#4134](https://github.com/codeigniter4/CodeIgniter4/pull/4134) ([dependabot[bot]](https://github.com/apps/dependabot))
+- set uppercase [\#4132](https://github.com/codeigniter4/CodeIgniter4/pull/4132) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- remove useless "raw html" [\#4131](https://github.com/codeigniter4/CodeIgniter4/pull/4131) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Fix errors/html/error\_exception.php [\#4128](https://github.com/codeigniter4/CodeIgniter4/pull/4128) ([kenjis](https://github.com/kenjis))
+- set note-block for some notes [\#4127](https://github.com/codeigniter4/CodeIgniter4/pull/4127) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Fix `@var` in SessionTestCase. [\#4124](https://github.com/codeigniter4/CodeIgniter4/pull/4124) ([kenjis](https://github.com/kenjis))
+- Fix Session phpdoc [\#4123](https://github.com/codeigniter4/CodeIgniter4/pull/4123) ([kenjis](https://github.com/kenjis))
+- Refactor Generators [\#4121](https://github.com/codeigniter4/CodeIgniter4/pull/4121) ([mostafakhudair](https://github.com/mostafakhudair))
+- Fix few typos. [\#4119](https://github.com/codeigniter4/CodeIgniter4/pull/4119) ([npwsamarasinghe](https://github.com/npwsamarasinghe))
+- Precise exception trace [\#4118](https://github.com/codeigniter4/CodeIgniter4/pull/4118) ([paulbalandan](https://github.com/paulbalandan))
+- Wrap extract calls in IIFEs in View [\#4113](https://github.com/codeigniter4/CodeIgniter4/pull/4113) ([paulbalandan](https://github.com/paulbalandan))
+- Fix Request::withMethod\(\) [\#4112](https://github.com/codeigniter4/CodeIgniter4/pull/4112) ([paulbalandan](https://github.com/paulbalandan))
+- Cache remember [\#4107](https://github.com/codeigniter4/CodeIgniter4/pull/4107) ([agungsugiarto](https://github.com/agungsugiarto))
+- docs: change sample code of redirect\(\) to be more common [\#4106](https://github.com/codeigniter4/CodeIgniter4/pull/4106) ([kenjis](https://github.com/kenjis))
+- Add Cache File mode [\#4103](https://github.com/codeigniter4/CodeIgniter4/pull/4103) ([MGatner](https://github.com/MGatner))
+- Clarify Renderer discrepancy [\#4102](https://github.com/codeigniter4/CodeIgniter4/pull/4102) ([MGatner](https://github.com/MGatner))
+- Catch DateTime failure [\#4097](https://github.com/codeigniter4/CodeIgniter4/pull/4097) ([MGatner](https://github.com/MGatner))
+- Fix URL type. [\#4095](https://github.com/codeigniter4/CodeIgniter4/pull/4095) ([npwsamarasinghe](https://github.com/npwsamarasinghe))
+- Fixed a bug where a newline was treated as a valid value even if it was included at the end. [\#4094](https://github.com/codeigniter4/CodeIgniter4/pull/4094) ([ytetsuro](https://github.com/ytetsuro))
+- BaseModel/Model - Removed $escape from doUpdate [\#4090](https://github.com/codeigniter4/CodeIgniter4/pull/4090) ([najdanovicivan](https://github.com/najdanovicivan))
+- BaseConnection - Added automatic handling of query class for 3rd party drivers [\#4089](https://github.com/codeigniter4/CodeIgniter4/pull/4089) ([najdanovicivan](https://github.com/najdanovicivan))
+- Fix loss of escape value and data in the model [\#4088](https://github.com/codeigniter4/CodeIgniter4/pull/4088) ([michalsn](https://github.com/michalsn))
+- Use getMimeType instead of getClientMimeType. [\#4085](https://github.com/codeigniter4/CodeIgniter4/pull/4085) ([sfadschm](https://github.com/sfadschm))
+- fix codeblock in installing\_composer.rst [\#4083](https://github.com/codeigniter4/CodeIgniter4/pull/4083) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Fixing a bug in Message::isJSON [\#4081](https://github.com/codeigniter4/CodeIgniter4/pull/4081) ([caswell-wc](https://github.com/caswell-wc))
+- Get JSON Variable [\#4080](https://github.com/codeigniter4/CodeIgniter4/pull/4080) ([caswell-wc](https://github.com/caswell-wc))
+- Fix userguide indent [\#4078](https://github.com/codeigniter4/CodeIgniter4/pull/4078) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- DebugToolbar - Handle Query display in Query class [\#4077](https://github.com/codeigniter4/CodeIgniter4/pull/4077) ([najdanovicivan](https://github.com/najdanovicivan))
+- Update userguide indentation [\#4075](https://github.com/codeigniter4/CodeIgniter4/pull/4075) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- docs: fix models indentation [\#4073](https://github.com/codeigniter4/CodeIgniter4/pull/4073) ([kenjis](https://github.com/kenjis))
+- BaseModel/Model - Attempt to rework escape parameter [\#4072](https://github.com/codeigniter4/CodeIgniter4/pull/4072) ([najdanovicivan](https://github.com/najdanovicivan))
+- Model/BaseModel - Fix primary key and add @throws for builder method [\#4071](https://github.com/codeigniter4/CodeIgniter4/pull/4071) ([najdanovicivan](https://github.com/najdanovicivan))
+- Fix DOMParser rules to search also outside the body tag [\#4070](https://github.com/codeigniter4/CodeIgniter4/pull/4070) ([michalsn](https://github.com/michalsn))
+- Warn users on system messages being for internal use [\#4068](https://github.com/codeigniter4/CodeIgniter4/pull/4068) ([paulbalandan](https://github.com/paulbalandan))
+- Remove discussion on LoggerAwareTrait [\#4067](https://github.com/codeigniter4/CodeIgniter4/pull/4067) ([paulbalandan](https://github.com/paulbalandan))
+- PHPStan Ignore File [\#4065](https://github.com/codeigniter4/CodeIgniter4/pull/4065) ([MGatner](https://github.com/MGatner))
+- site\_url tests [\#4063](https://github.com/codeigniter4/CodeIgniter4/pull/4063) ([MGatner](https://github.com/MGatner))
+- Use full table name with schema for SQLSRV [\#4058](https://github.com/codeigniter4/CodeIgniter4/pull/4058) ([michalsn](https://github.com/michalsn))
+- fix userguide config path [\#4057](https://github.com/codeigniter4/CodeIgniter4/pull/4057) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Solidate mime type guessing. [\#4056](https://github.com/codeigniter4/CodeIgniter4/pull/4056) ([sfadschm](https://github.com/sfadschm))
+- Add mime type for rar files [\#4054](https://github.com/codeigniter4/CodeIgniter4/pull/4054) ([michalsn](https://github.com/michalsn))
+- Fix for deleting session flash data in php8 [\#4053](https://github.com/codeigniter4/CodeIgniter4/pull/4053) ([michalsn](https://github.com/michalsn))
+- Added omitted function parameter description. [\#4052](https://github.com/codeigniter4/CodeIgniter4/pull/4052) ([francis94c](https://github.com/francis94c))
+- New Year 2021 [\#4051](https://github.com/codeigniter4/CodeIgniter4/pull/4051) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Fix countAll\(\) docs [\#4050](https://github.com/codeigniter4/CodeIgniter4/pull/4050) ([kenjis](https://github.com/kenjis))
+- adds BaseResult::getNumRows\(\). adds getNumRows to various DBMS Result classes [\#4049](https://github.com/codeigniter4/CodeIgniter4/pull/4049) ([sneakyimp](https://github.com/sneakyimp))
+- \[UG\] a comma after use: i.e., and e.g., [\#4042](https://github.com/codeigniter4/CodeIgniter4/pull/4042) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Fix database test case test [\#4041](https://github.com/codeigniter4/CodeIgniter4/pull/4041) ([kenjis](https://github.com/kenjis))
+- Add initDriver Method [\#4040](https://github.com/codeigniter4/CodeIgniter4/pull/4040) ([mostafakhudair](https://github.com/mostafakhudair))
+- docs: fix general indentation [\#4039](https://github.com/codeigniter4/CodeIgniter4/pull/4039) ([kenjis](https://github.com/kenjis))
+- fix codeblock [\#4037](https://github.com/codeigniter4/CodeIgniter4/pull/4037) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Remove 'tests' [\#4034](https://github.com/codeigniter4/CodeIgniter4/pull/4034) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Alias Forge with use operator [\#4032](https://github.com/codeigniter4/CodeIgniter4/pull/4032) ([mostafakhudair](https://github.com/mostafakhudair))
+- New line for License copyright [\#4029](https://github.com/codeigniter4/CodeIgniter4/pull/4029) ([totoprayogo1916](https://github.com/totoprayogo1916))
+- Rename Sqlsrv driver [\#4023](https://github.com/codeigniter4/CodeIgniter4/pull/4023) ([mostafakhudair](https://github.com/mostafakhudair))
+- PHP 8 Actions [\#4012](https://github.com/codeigniter4/CodeIgniter4/pull/4012) ([MGatner](https://github.com/MGatner))
+- feat: make migration/seed settings flexible on database testing [\#3993](https://github.com/codeigniter4/CodeIgniter4/pull/3993) ([kenjis](https://github.com/kenjis))
+- Deprecate redundant HTTP keys [\#3973](https://github.com/codeigniter4/CodeIgniter4/pull/3973) ([paulbalandan](https://github.com/paulbalandan))
+- Replace Core Services [\#3943](https://github.com/codeigniter4/CodeIgniter4/pull/3943) ([MGatner](https://github.com/MGatner))
+- Handling requests sent back from filters [\#3900](https://github.com/codeigniter4/CodeIgniter4/pull/3900) ([caswell-wc](https://github.com/caswell-wc))
+- DX: Split Model testing into several subunits [\#3891](https://github.com/codeigniter4/CodeIgniter4/pull/3891) ([paulbalandan](https://github.com/paulbalandan))
+
## [v4.0.4](https://github.com/codeigniter4/CodeIgniter4/tree/v4.0.4) (2020-07-15)
[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.0.3...v4.0.4)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e9a4067168a2..16ce17f31a96 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,13 +1,19 @@
# Contributing to CodeIgniter4
-
## Contributions
-We expect all contributions to conform to our [style guide](https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/styleguide.rst), be commented (inside the PHP source files),
-be documented (in the [user guide](https://codeigniter4.github.io/userguide/)), and unit tested (in the [test folder](https://github.com/codeigniter4/CodeIgniter4/tree/develop/tests)).
+We expect all contributions to conform to our
+[style guide](https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/styleguide.rst),
+be commented (inside the PHP source files), be documented (in the
+[user guide](https://codeigniter4.github.io/userguide/)), and unit tested (in
+the [test folder](https://github.com/codeigniter4/CodeIgniter4/tree/develop/tests)).
There is a [Contributing to CodeIgniter](./contributing/README.rst) section in the repository which describes the contribution process; this page is an overview.
-Note, we expect all code changes or bug-fixes to be accompanied by one or more tests added to our test suite to prove the code works. If pull requests are not accompanied by relevant tests, they will likely be closed. Since we are a team of volunteers, we don't have any more time to work on the framework than you do. Please make it as painless for your contributions to be included as possible. If you need help with getting tests running on your local machines, ask for help on the forums. We would be happy to help out.
+Note, we expect all code changes or bug-fixes to be accompanied by one or more tests added to our test suite
+to prove the code works. If pull requests are not accompanied by relevant tests, they will likely be closed.
+Since we are a team of volunteers, we don't have any more time to work on the framework than you do. Please
+make it as painless for your contributions to be included as possible. If you need help with getting tests
+running on your local machines, ask for help on the forums. We would be happy to help out.
The [Open Source Guide](https://opensource.guide/) is a good first read for those new to contributing to open source!
## Issues
@@ -18,14 +24,17 @@ Issues are a quick way to point out a bug. If you find a bug or documentation er
2. The Issue has not already been fixed (check the develop branch or look for [closed Issues](https://github.com/codeigniter4/CodeIgniter4/issues?q=is%3Aissue+is%3Aclosed))
3. It's not something really obvious that you can fix yourself
-Reporting Issues is helpful, but an even [better approach](./contributing/workflow.rst) is to send a [Pull Request](https://help.github.com/en/articles/creating-a-pull-request), which is done by [Forking](https://help.github.com/en/articles/fork-a-repo) the main repository and making a [Commit](https://help.github.com/en/desktop/contributing-to-projects/committing-and-reviewing-changes-to-your-project) to your own copy of the project. This will require you to use the version control system called [Git](https://git-scm.com/).
+Reporting Issues is helpful, but an even [better approach](./contributing/workflow.rst) is to send a
+[Pull Request](https://help.github.com/en/articles/creating-a-pull-request), which is done by
+[Forking](https://help.github.com/en/articles/fork-a-repo) the main repository and making
+a [Commit](https://help.github.com/en/desktop/contributing-to-projects/committing-and-reviewing-changes-to-your-project)
+to your own copy of the project. This will require you to use the version control system called [Git](https://git-scm.com/).
## Guidelines
Before we look into how to contribute to CodeIgniter4, here are some guidelines. If your Pull Requests fail
-to pass these guidelines, they will be declined, and you will need to re-submit
-when you’ve made the changes. This might sound a bit tough, but it is required
-for us to maintain the quality of the codebase.
+to pass these guidelines, they will be declined, and you will need to re-submit when you’ve made the changes.
+This might sound a bit tough, but it is required for us to maintain the quality of the codebase.
### PHP Style
@@ -42,26 +51,59 @@ CodeIgniter4 requires [PHP 7.2](https://php.net/releases/7_2_0.php).
### Branching
-CodeIgniter4 uses the [Git-Flow](http://nvie.com/posts/a-successful-git-branching-model/) branching model which requires all
-Pull Requests to be sent to the "develop" branch; this is where the next planned version will be developed.
-The "master" branch will always contain the latest stable version and is kept clean so a "hotfix" (e.g. an
-emergency security patch) can be applied to the "master" branch to create a new version, without worrying
-about other features holding it up. For this reason, all commits need to be made to the "develop" branch,
-and any sent to the "master" branch will be closed automatically. If you have multiple changes to submit,
+CodeIgniter4 uses the [Git-Flow](http://nvie.com/posts/a-successful-git-branching-model/) branching model
+which requires all Pull Requests to be sent to the __"develop"__ branch; this is where the next planned version will be developed.
+
+The __"master"__ branch will always contain the latest stable version and is kept clean so a "hotfix" (e.g. an
+emergency security patch) can be applied to the "master" branch to create a new version, without worrying
+about other features holding it up. For this reason, all commits need to be made to the "develop" branch,
+and any sent to the "master" branch will be closed automatically. If you have multiple changes to submit,
please place all changes into their own branch on your fork.
-**One thing at a time:** A pull request should only contain one change. That does not mean only one commit,
-but one change - however many commits it took. The reason for this is that if you change X and Y,
-but send a pull request for both at the same time, we might really want X but disagree with Y,
-meaning we cannot merge the request. Using the Git-Flow branching model you can create new
+**One thing at a time:** A pull request should only contain one change. That does not mean only one commit,
+but one change - however many commits it took. The reason for this is that if you change X and Y,
+but send a pull request for both at the same time, we might really want X but disagree with Y,
+meaning we cannot merge the request. Using the Git-Flow branching model you can create new
branches for both of these features and send two requests.
-A reminder: **please use separate branches for each of your PRs** - it will make it easier for you to keep changes separate from
-each other and from whatever else you are doing with your repository!
+A reminder: **please use separate branches for each of your PRs** - it will make it easier for you to keep
+changes separate from each other and from whatever else you are doing with your repository!
### Signing
-You must [GPG-sign](./contributing/signing.rst) your work, certifying that you either wrote the work or otherwise have the right to pass it on to an open-source project. This is *not* just a "signed-off-by" commit, but instead, a digitally signed one.
+You must [GPG-sign](./contributing/signing.rst) your work, certifying that you either wrote the work or
+otherwise have the right to pass it on to an open-source project. This is *not* just a "signed-off-by"
+commit, but instead, a digitally signed one.
+
+### Static Analysis on PHP code
+
+We cannot, at all times, guarantee that all PHP code submitted on pull requests to be working well without
+actually running the code. For this reason, we make use of two static analysis tools, [PHPStan][1]
+and [Rector][2] to do the analysis for us.
+
+These tools have already been integrated into our CI/CD workflow to minimize unannounced bugs. Pull requests
+are expected that their code will pass these two. In your local machine, you can manually run these tools
+so that you can fix whatever errors that pop up with your submission.
+
+PHPStan is expected to scan the entire framework by running this command in your terminal:
+
+ vendor/bin/phpstan analyse
+
+Rector, on the other hand, can be run on the specific files you modified or added:
+
+ vendor/bin/rector process --dry-run path/to/file
+
+[1]: https://github.com/phpstan/phpstan-src
+[2]: https://github.com/rector/rector
+
+### Breaking Changes
+
+In general, any change that would disrupt existing uses of the framework is considered a "breaking change" and will not be favorably considered. A few specific examples to pay attention to:
+
+1. New classes/properties/constants in `system` are acceptable, but anything in the `app` directory that will be used in `system` should be backwards-compatible.
+2. Any changes to non-private methods must be backwards-compatible with the original definition.
+3. Deleting non-private properties or methods without prior deprecation notices is frowned upon and will likely be closed.
+4. Deleting or renaming public classes and interfaces, as well as those not marked as `@internal`, without prior deprecation notices or not providing fallback solutions will also not be favorably considered.
## How-to Guide
@@ -74,12 +116,18 @@ The best way to contribute is to fork the CodeIgniter4 repository, and "clone" t
5. Create a new [branch](https://help.github.com/en/articles/about-branches) in your project for each set of changes you want to make.
6. Fix existing bugs on the [Issue tracker](https://github.com/codeigniter4/CodeIgniter4/issues) after confirming that no one else is working on them.
7. [Commit](https://help.github.com/en/desktop/contributing-to-projects/committing-and-reviewing-changes-to-your-project) the changed files in your contribution branch.
-8. [Push](https://help.github.com/en/articles/pushing-to-a-remote) your contribution branch to your fork.
-9. Send a [pull request](http://help.github.com/send-pull-requests/).
+8. Commit messages are expected to be descriptive of what you changed specifically. Commit messages like
+"Fixes #1234" would be asked by the reviewer to be revised.
+9. If there are intermediate commits that are not meaningful to the overall PR, such as "Fixed error on style guide", "Fixed phpstan error", "Fixing mistake in code", and other related commits, it is advised to squash your commits so that we can have a clean commit history.
+10. If you have touched PHP code, run static analysis.
+11. Run unit tests on the specific file you modified. If there are no existing tests yet, please create one.
+12. Make sure the tests pass to have a higher chance of merging.
+13. [Push](https://docs.github.com/en/github/using-git/pushing-commits-to-a-remote-repository) your contribution branch to your fork.
+14. Send a [pull request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork).
The codebase maintainers will now be alerted to the submission and someone from the team will respond. If your change fails to meet the guidelines, it will be rejected or feedback will be provided to help you improve it.
-Once the maintainer handling your pull request is satisfied with it they will approve the pull request and merge it into the "develop" branch; your patch will now be part of the next release!
+Once the maintainer handling your pull request is satisfied with it they will approve the pull request and merge it into the "develop" branch. Your patch will now be part of the next release!
### Keeping your fork up-to-date
@@ -96,7 +144,7 @@ Your fork is now up to date. This should be done regularly and, at the least, be
## Translations Installation
If you wish to contribute to the system message translations,
-then fork and clone the [translations repository](https://github.com/codeigniter4/translations)
-separately from the codebase.
+then fork and clone the [translations repository](https://github.com/codeigniter4/translations)
+separately from the codebase.
These are two independent repositories!
diff --git a/license.txt b/LICENSE
similarity index 95%
rename from license.txt
rename to LICENSE
index 2fb1bdd44e15..daac9e5bb4f5 100644
--- a/license.txt
+++ b/LICENSE
@@ -1,7 +1,7 @@
The MIT License (MIT)
Copyright (c) 2014-2019 British Columbia Institute of Technology
-Copyright (c) 2019-2020 CodeIgniter Foundation
+Copyright (c) 2019-2021 CodeIgniter Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index a4319ced0345..eb143b09d407 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,17 @@
# CodeIgniter 4 Development
-[![Build Status](https://travis-ci.org/codeigniter4/CodeIgniter4.svg?branch=develop)](https://travis-ci.org/codeigniter4/CodeIgniter4)
+[![Build Status](https://github.com/codeigniter4/CodeIgniter4/workflows/PHPUnit/badge.svg)](https://github.com/codeigniter4/CodeIgniter4/actions?query=workflow%3A%22PHPUnit%22)
[![Coverage Status](https://coveralls.io/repos/github/codeigniter4/CodeIgniter4/badge.svg?branch=develop)](https://coveralls.io/github/codeigniter4/CodeIgniter4?branch=develop)
[![Downloads](https://poser.pugx.org/codeigniter4/framework/downloads)](https://packagist.org/packages/codeigniter4/framework)
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/codeigniter4/CodeIgniter4)](https://packagist.org/packages/codeigniter4/framework)
[![GitHub stars](https://img.shields.io/github/stars/codeigniter4/CodeIgniter4)](https://packagist.org/packages/codeigniter4/framework)
-[![GitHub license](https://img.shields.io/github/license/codeigniter4/CodeIgniter4)](https://github.com/codeigniter4/CodeIgniter4/blob/develop/license.txt)
+[![GitHub license](https://img.shields.io/github/license/codeigniter4/CodeIgniter4)](https://github.com/codeigniter4/CodeIgniter4/blob/develop/LICENSE)
[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/codeigniter4/CodeIgniter4/pulls)
## What is CodeIgniter?
-CodeIgniter is a PHP full-stack web framework that is light, fast, flexible, and secure.
+CodeIgniter is a PHP full-stack web framework that is light, fast, flexible and secure.
More information can be found at the [official site](http://codeigniter.com).
This repository holds the source code for CodeIgniter 4 only.
@@ -39,7 +39,6 @@ not to the project root. A better practice would be to configure a virtual host
framework are exposed.
**Please** read the user guide for a better explanation of how CI4 works!
-The user guide updating and deployment is a bit awkward at the moment, but we are working on it!
## Repository Management
diff --git a/admin/README.md b/admin/README.md
index 5d9ab2d6d106..52747ca3eeaa 100644
--- a/admin/README.md
+++ b/admin/README.md
@@ -53,6 +53,8 @@ This folder contains tools or docs useful for project maintainers.
## Release Building Scripts
+*Do not use these scripts! They are left here for reference only.*
+
The release workflow is detailed in its own writeup; these are the main
scripts used by the release manager:
diff --git a/admin/css/debug-toolbar/toolbar.scss b/admin/css/debug-toolbar/toolbar.scss
index 50ba55afd097..8669d0ac12ff 100644
--- a/admin/css/debug-toolbar/toolbar.scss
+++ b/admin/css/debug-toolbar/toolbar.scss
@@ -1,13 +1,11 @@
-/* CodeIgniter 4 - Debug bar
- ============================================================================ */
-
-/* Forum: https://forum.codeigniter.com
+/*! CodeIgniter 4 - Debug bar
+ * ============================================================================
+ * Forum: https://forum.codeigniter.com
* Github: https://github.com/codeigniter4/codeigniter4
* Slack: https://codeigniterchat.slack.com
* Website: https://codeigniter.com
*/
-
// IMPORTS
// ========================================================================== */
@@ -36,15 +34,18 @@
// Content
clear: both;
text-align: center;
+
a svg {
margin: 8px;
max-width: 20px;
max-height: 20px;
}
+
&.fixed-top {
bottom: auto;
top: 0;
}
+
.debug-bar-ndisplay {
display: none;
}
@@ -85,15 +86,23 @@
right: 30px;
text-align: left;
top: 0;
+
+ svg {
+ width: 16px;
+ margin-right: 5px;
+ }
}
+
h2 {
font-size: $base-size;
margin: 0;
padding: 5px 0 10px 0;
+
span {
font-size: 13px;
}
}
+
h3 {
font-size: $base-size - 4;
font-weight: 200;
@@ -101,51 +110,63 @@
padding: 0;
text-transform: uppercase;
}
+
p {
font-size: $base-size - 4;
margin: 0 0 0 15px;
padding: 0;
}
+
a {
text-decoration: none;
+
&:hover {
text-decoration: underline;
}
}
+
button {
border: 1px solid;
@include border-radius(4px);
cursor: pointer;
line-height: 15px;
+
&:hover {
text-decoration: underline;
}
}
+
table {
border-collapse: collapse;
font-size: $base-size - 2;
line-height: normal;
margin: 5px 10px 15px 10px; // Tables indentation
width: calc(100% - 10px); // Make sure it still fits the container, even with the margins
+
strong {
font-weight: 500;
}
+
th {
display: table-cell;
font-weight: 600;
padding-bottom: 0.7em;
text-align: left;
}
+
tr {
border: none;
}
+
td {
border: none;
display: table-cell;
margin: 0;
text-align: left;
+
&:first-child {
max-width: 20%;
+
&.narrow {
width: 7em;
}
@@ -153,12 +174,33 @@
}
}
+ td[data-debugbar-route] {
+ form {
+ display: none;
+ }
+
+ &:hover {
+ form {
+ display: block;
+ }
+
+ &>div {
+ display: none;
+ }
+ }
+
+ input[type=text] {
+ padding: 2px;
+ }
+ }
+
// The toolbar
.toolbar {
- display: block;
+ display: flex;
overflow: hidden;
overflow-y: auto;
- padding: 0 12px 0 12px; /* give room for OS X scrollbar */
+ padding: 0 12px 0 12px;
+ /* give room for OS X scrollbar */
white-space: nowrap;
z-index: 10000;
}
@@ -167,6 +209,7 @@
&.fixed-top {
bottom: auto;
top: 0;
+
.tab {
bottom: auto;
top: 36px;
@@ -177,8 +220,11 @@
#toolbar-position,
#toolbar-theme {
a {
- float: left;
+ // float: left;
padding: 0 6px;
+ display: inline-flex;
+ vertical-align: top;
+
&:hover {
text-decoration: none;
}
@@ -200,26 +246,30 @@
// The toolbar menus
.ci-label {
- display: inline-block;
+ display: inline-flex;
font-size: $base-size - 2;
- vertical-align: baseline;
+ // vertical-align: baseline;
+
&:hover {
cursor: pointer;
}
+
a {
color: inherit;
- display: block;
+ display: flex;
letter-spacing: normal;
padding: 0 10px;
text-decoration: none;
+ align-items: center;
}
// The toolbar icons
img {
- clear: left;
- display: inline-block;
- float: left;
+ // clear: left;
+ // display: inline-block;
+ // float: left;
margin: 6px 3px 6px 0;
+ width: 16px !important;
}
// The toolbar notification badges
@@ -255,6 +305,7 @@
.timeline {
margin-left: 0;
width: 100%;
+
th {
border-left: 1px solid;
font-size: $base-size - 4;
@@ -262,18 +313,22 @@
padding: 5px 5px 10px 5px;
position: relative;
text-align: left;
+
&:first-child {
border-left: 0;
}
}
+
td {
border-left: 1px solid;
padding: 5px;
position: relative;
+
&:first-child {
border-left: 0;
}
}
+
.timer {
@include border-radius(4px);
display: inline-block;
@@ -323,6 +378,14 @@
// ========================================================================== */
@media screen and (max-width: 1024px) {
+ #debug-bar {
+ .ci-label {
+ img {
+ margin: unset
+ }
+ }
+ }
+
.hide-sm {
display: none !important;
}
@@ -343,6 +406,11 @@
// If we force the "Dark" theme
#toolbarContainer.dark {
@import '_theme-dark';
+
+ td[data-debugbar-route] input[type=text] {
+ background: #000;
+ color: #fff;
+ }
}
// If we force the "Light" theme
@@ -357,30 +425,39 @@
.debug-bar-width30 {
width: 30%;
}
+
.debug-bar-width10 {
width: 10%;
}
+
.debug-bar-width70p {
width: 70px;
}
+
.debug-bar-width140p {
width: 140px;
}
+
.debug-bar-width20e {
width: 20em;
}
+
.debug-bar-width6r {
width: 6rem;
}
+
.debug-bar-ndisplay {
display: none;
}
+
.debug-bar-alignRight {
text-align: right;
}
+
.debug-bar-alignLeft {
text-align: left;
}
+
.debug-bar-noverflow {
overflow: hidden;
-}
+}
\ No newline at end of file
diff --git a/admin/framework/.gitattributes b/admin/framework/.gitattributes
new file mode 100644
index 000000000000..6b089e0392a4
--- /dev/null
+++ b/admin/framework/.gitattributes
@@ -0,0 +1,9 @@
+/.gitattributes export-ignore
+/.gitignore export-ignore
+/env export-ignore
+/phpunit.xml.dist export-ignore
+/spark export-ignore
+/app export-ignore
+/public export-ignore
+/writable export-ignore
+/phpunit.xml.dist export-ignore
diff --git a/admin/framework/README.md b/admin/framework/README.md
index 275f01536660..6692596bd02e 100644
--- a/admin/framework/README.md
+++ b/admin/framework/README.md
@@ -2,17 +2,17 @@
## What is CodeIgniter?
-CodeIgniter is a PHP full-stack web framework that is light, fast, flexible, and secure.
+CodeIgniter is a PHP full-stack web framework that is light, fast, flexible and secure.
More information can be found at the [official site](http://codeigniter.com).
This repository holds the distributable version of the framework,
-including the user guide. It has been built from the
+including the user guide. It has been built from the
[development repository](https://github.com/codeigniter4/CodeIgniter4).
More information about the plans for version 4 can be found in [the announcement](http://forum.codeigniter.com/thread-62615.html) on the forums.
The user guide corresponding to this version of the framework can be found
-[here](https://codeigniter4.github.io/userguide/).
+[here](https://codeigniter4.github.io/userguide/).
## Important Change with index.php
@@ -25,7 +25,6 @@ not to the project root. A better practice would be to configure a virtual host
framework are exposed.
**Please** read the user guide for a better explanation of how CI4 works!
-The user guide updating and deployment is a bit awkward at the moment, but we are working on it!
## Repository Management
@@ -33,7 +32,7 @@ We use Github issues, in our main repository, to track **BUGS** and to track app
We use our [forum](http://forum.codeigniter.com) to provide SUPPORT and to discuss
FEATURE REQUESTS.
-This repository is a "distribution" one, built by our release preparation script.
+This repository is a "distribution" one, built by our release preparation script.
Problems with it can be raised on our forum, or as issues in the main repository.
## Contributing
@@ -44,7 +43,7 @@ Please read the [*Contributing to CodeIgniter*](https://github.com/codeigniter4/
## Server Requirements
-PHP version 7.2 or higher is required, with the following extensions installed:
+PHP version 7.2 or higher is required, with the following extensions installed:
- [intl](http://php.net/manual/en/intl.requirements.php)
- [libcurl](http://php.net/manual/en/curl.requirements.php) if you plan to use the HTTP\CURLRequest library
diff --git a/admin/framework/composer.json b/admin/framework/composer.json
index 3f3b9d5fa77d..df3468dba72a 100644
--- a/admin/framework/composer.json
+++ b/admin/framework/composer.json
@@ -5,7 +5,7 @@
"homepage": "https://codeigniter.com",
"license": "MIT",
"require": {
- "php": ">=7.2",
+ "php": "^7.2 || ^8.0",
"ext-curl": "*",
"ext-intl": "*",
"ext-json": "*",
@@ -16,20 +16,25 @@
},
"require-dev": {
"codeigniter4/codeigniter4-standard": "^1.0",
- "fzaninotto/faker": "^1.9@dev",
- "mikey179/vfsstream": "1.6.*",
+ "fakerphp/faker": "^1.9",
+ "mikey179/vfsstream": "^1.6",
"phpunit/phpunit": "^8.5",
"predis/predis": "^1.1",
"squizlabs/php_codesniffer": "^3.3"
},
+ "suggest": {
+ "ext-fileinfo": "Improves mime type detection for files"
+ },
"autoload": {
"psr-4": {
"CodeIgniter\\": "system/"
- }
+ },
+ "exclude-from-classmap": [
+ "**/Database/Migrations/**"
+ ]
},
"scripts": {
"post-update-cmd": [
- "@composer dump-autoload",
"CodeIgniter\\ComposerScripts::postUpdate"
],
"test": "phpunit"
diff --git a/admin/framework/phpunit.xml.dist b/admin/framework/phpunit.xml.dist
index 88aca1fb5c29..446ae80a291f 100644
--- a/admin/framework/phpunit.xml.dist
+++ b/admin/framework/phpunit.xml.dist
@@ -10,7 +10,7 @@
stopOnIncomplete="false"
stopOnSkipped="false">
-
+
./tests
@@ -36,7 +36,7 @@
-
+
diff --git a/admin/module/composer.json b/admin/module/composer.json
index 5b64794602f2..e2f0eee8dd25 100644
--- a/admin/module/composer.json
+++ b/admin/module/composer.json
@@ -4,14 +4,17 @@
"homepage": "https://codeigniter.com",
"license": "MIT",
"require": {
- "php": ">=7.2"
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
"codeigniter4/codeigniter4": "dev-develop",
- "fzaninotto/faker": "^1.9@dev",
- "mikey179/vfsstream": "1.6.*",
+ "fakerphp/faker": "^1.9",
+ "mikey179/vfsstream": "^1.6",
"phpunit/phpunit": "^8.5"
},
+ "suggest": {
+ "ext-fileinfo": "Improves mime type detection for files"
+ },
"autoload-dev": {
"psr-4": {
"Tests\\Support\\": "tests/_support"
@@ -25,9 +28,6 @@
],
"minimum-stability": "dev",
"scripts": {
- "post-update-cmd": [
- "@composer dump-autoload"
- ],
"test": "phpunit"
},
"support": {
diff --git a/admin/module/phpunit.xml.dist b/admin/module/phpunit.xml.dist
index 4d872910916e..dd9ca6e55753 100644
--- a/admin/module/phpunit.xml.dist
+++ b/admin/module/phpunit.xml.dist
@@ -10,7 +10,7 @@
stopOnIncomplete="false"
stopOnSkipped="false">
-
+
./tests
@@ -36,7 +36,7 @@
-
+
diff --git a/admin/module/tests/README.md b/admin/module/tests/README.md
index 21d099cc3a4c..3c5868b74fec 100644
--- a/admin/module/tests/README.md
+++ b/admin/module/tests/README.md
@@ -7,12 +7,12 @@ use to test your module. Those details can be found in the documentation.
## Resources
* [CodeIgniter 4 User Guide on Testing](https://codeigniter4.github.io/userguide/testing/index.html)
-* [PHPUnit docs](https://phpunit.readthedocs.io/en/8.3/index.html)
+* [PHPUnit docs](https://phpunit.readthedocs.io/en/8.5/index.html)
## Requirements
It is recommended to use the latest version of PHPUnit. At the time of this
-writing we are running version 8.5.2. Support for this has been built into the
+writing we are running version 8.5.13. Support for this has been built into the
**composer.json** file that ships with CodeIgniter and can easily be installed
via [Composer](https://getcomposer.org/) if you don't already have it installed globally.
diff --git a/admin/module/tests/_support/Libraries/ConfigReader.php b/admin/module/tests/_support/Libraries/ConfigReader.php
index d5323709642c..600d6c3a3c29 100644
--- a/admin/module/tests/_support/Libraries/ConfigReader.php
+++ b/admin/module/tests/_support/Libraries/ConfigReader.php
@@ -9,7 +9,7 @@
* This content is released under the MIT License (MIT)
*
* Copyright (c) 2014-2019 British Columbia Institute of Technology
- * Copyright (c) 2019-2020 CodeIgniter Foundation
+ * Copyright (c) 2019-2021 CodeIgniter Foundation
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -31,7 +31,7 @@
*
* @package CodeIgniter
* @author CodeIgniter Dev Team
- * @copyright 2019-2020 CodeIgniter Foundation
+ * @copyright 2019-2021 CodeIgniter Foundation
* @license https://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
* @since Version 4.0.0
diff --git a/admin/module/tests/_support/SessionTestCase.php b/admin/module/tests/_support/SessionTestCase.php
index 9694e3fe01f6..d3a5b43bccfa 100644
--- a/admin/module/tests/_support/SessionTestCase.php
+++ b/admin/module/tests/_support/SessionTestCase.php
@@ -1,13 +1,14 @@
=7.2",
+ "php": "^7.2 || ^8.0",
"codeigniter4/framework": "^4"
},
"require-dev": {
- "fzaninotto/faker": "^1.9@dev",
- "mikey179/vfsstream": "1.6.*",
+ "fakerphp/faker": "^1.9",
+ "mikey179/vfsstream": "^1.6",
"phpunit/phpunit": "^8.5"
},
+ "suggest": {
+ "ext-fileinfo": "Improves mime type detection for files"
+ },
+ "autoload": {
+ "psr-4": {
+ "App\\": "app",
+ "Config\\": "app/Config"
+ },
+ "exclude-from-classmap": [
+ "**/Database/Migrations/**"
+ ]
+ },
"autoload-dev": {
"psr-4": {
"Tests\\Support\\": "tests/_support"
}
},
"scripts": {
- "post-update-cmd": [
- "@composer dump-autoload"
- ],
"test": "phpunit"
},
"support": {
diff --git a/admin/starter/phpunit.xml.dist b/admin/starter/phpunit.xml.dist
index 96947df5a615..eee842937bdb 100644
--- a/admin/starter/phpunit.xml.dist
+++ b/admin/starter/phpunit.xml.dist
@@ -10,7 +10,7 @@
stopOnIncomplete="false"
stopOnSkipped="false">
-
+
./tests
@@ -36,7 +36,7 @@
-
+
diff --git a/admin/starter/tests/README.md b/admin/starter/tests/README.md
index 545ccfed6ee2..7484c31cabeb 100644
--- a/admin/starter/tests/README.md
+++ b/admin/starter/tests/README.md
@@ -7,12 +7,12 @@ use to test your application. Those details can be found in the documentation.
## Resources
* [CodeIgniter 4 User Guide on Testing](https://codeigniter4.github.io/userguide/testing/index.html)
-* [PHPUnit docs](https://phpunit.readthedocs.io/en/8.3/index.html)
+* [PHPUnit docs](https://phpunit.readthedocs.io/en/8.5/index.html)
## Requirements
It is recommended to use the latest version of PHPUnit. At the time of this
-writing we are running version 8.5.2. Support for this has been built into the
+writing we are running version 8.5.13. Support for this has been built into the
**composer.json** file that ships with CodeIgniter and can easily be installed
via [Composer](https://getcomposer.org/) if you don't already have it installed globally.
diff --git a/admin/starter/tests/_support/Libraries/ConfigReader.php b/admin/starter/tests/_support/Libraries/ConfigReader.php
index a62d09fd04a1..16765acbf2ba 100644
--- a/admin/starter/tests/_support/Libraries/ConfigReader.php
+++ b/admin/starter/tests/_support/Libraries/ConfigReader.php
@@ -9,7 +9,7 @@
* This content is released under the MIT License (MIT)
*
* Copyright (c) 2014-2019 British Columbia Institute of Technology
- * Copyright (c) 2019-2020 CodeIgniter Foundation
+ * Copyright (c) 2019-2021 CodeIgniter Foundation
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -31,7 +31,7 @@
*
* @package CodeIgniter
* @author CodeIgniter Dev Team
- * @copyright 2019-2020 CodeIgniter Foundation
+ * @copyright 2019-2021 CodeIgniter Foundation
* @license https://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
* @since Version 4.0.0
diff --git a/admin/starter/tests/_support/SessionTestCase.php b/admin/starter/tests/_support/SessionTestCase.php
index 9694e3fe01f6..d3a5b43bccfa 100644
--- a/admin/starter/tests/_support/SessionTestCase.php
+++ b/admin/starter/tests/_support/SessionTestCase.php
@@ -1,13 +1,14 @@
baseUrl);
+ $config = ! empty($reader->baseURL);
$this->assertTrue($env || $config);
}
diff --git a/admin/userguide/README.md b/admin/userguide/README.md
index 67162bb9616d..10d85692bc38 100644
--- a/admin/userguide/README.md
+++ b/admin/userguide/README.md
@@ -2,7 +2,7 @@
## What is CodeIgniter?
-CodeIgniter is a PHP full-stack web framework that is light, fast, flexible, and secure.
+CodeIgniter is a PHP full-stack web framework that is light, fast, flexible and secure.
More information can be found at the [official site](http://codeigniter.com).
This repository holds a composer-installable pre-built user guide for the framework.
diff --git a/admin/userguide/composer.json b/admin/userguide/composer.json
index 62ed362a81f8..3562f47a2abb 100644
--- a/admin/userguide/composer.json
+++ b/admin/userguide/composer.json
@@ -5,7 +5,7 @@
"homepage": "https://codeigniter.com",
"license": "MIT",
"require": {
- "php": ">=7.2",
+ "php": "^7.2 || ^8.0",
"codeigniter4/framework": "^4"
},
"support": {
diff --git a/app/Config/App.php b/app/Config/App.php
index b91c058e951f..933b5c8ac744 100644
--- a/app/Config/App.php
+++ b/app/Config/App.php
@@ -1,268 +1,448 @@
- APPPATH
* ];
*
- * @var array
+ * @var array
*/
public $psr4 = [
APP_NAMESPACE => APPPATH, // For custom app namespace
@@ -60,7 +60,7 @@ class Autoload extends AutoloadConfig
* 'MyClass' => '/path/to/class/file.php'
* ];
*
- * @var array
+ * @var array
*/
public $classmap = [];
}
diff --git a/app/Config/Boot/development.php b/app/Config/Boot/development.php
index 63fdd88be55d..05a861258fc9 100644
--- a/app/Config/Boot/development.php
+++ b/app/Config/Boot/development.php
@@ -1,32 +1,32 @@
+ */
+ public $file = [
+ 'storePath' => WRITEPATH . 'cache/',
+ 'mode' => 0640,
+ ];
+
+ /**
+ * -------------------------------------------------------------------------
+ * Memcached settings
+ * -------------------------------------------------------------------------
+ * Your Memcached servers can be specified below, if you are using
+ * the Memcached drivers.
+ *
+ * @see https://codeigniter.com/user_guide/libraries/caching.html#memcached
+ *
+ * @var array
+ */
public $memcached = [
'host' => '127.0.0.1',
'port' => 11211,
@@ -84,14 +114,15 @@ class Cache extends BaseConfig
'raw' => false,
];
- /*
- | -------------------------------------------------------------------------
- | Redis settings
- | -------------------------------------------------------------------------
- | Your Redis server can be specified below, if you are using
- | the Redis or Predis drivers.
- |
- */
+ /**
+ * -------------------------------------------------------------------------
+ * Redis settings
+ * -------------------------------------------------------------------------
+ * Your Redis server can be specified below, if you are using
+ * the Redis or Predis drivers.
+ *
+ * @var array
+ */
public $redis = [
'host' => '127.0.0.1',
'password' => null,
@@ -100,21 +131,22 @@ class Cache extends BaseConfig
'database' => 0,
];
- /*
- |--------------------------------------------------------------------------
- | Available Cache Handlers
- |--------------------------------------------------------------------------
- |
- | This is an array of cache engine alias' and class names. Only engines
- | that are listed here are allowed to be used.
- |
- */
+ /**
+ * --------------------------------------------------------------------------
+ * Available Cache Handlers
+ * --------------------------------------------------------------------------
+ *
+ * This is an array of cache engine alias' and class names. Only engines
+ * that are listed here are allowed to be used.
+ *
+ * @var array
+ */
public $validHandlers = [
- 'dummy' => \CodeIgniter\Cache\Handlers\DummyHandler::class,
- 'file' => \CodeIgniter\Cache\Handlers\FileHandler::class,
- 'memcached' => \CodeIgniter\Cache\Handlers\MemcachedHandler::class,
- 'predis' => \CodeIgniter\Cache\Handlers\PredisHandler::class,
- 'redis' => \CodeIgniter\Cache\Handlers\RedisHandler::class,
- 'wincache' => \CodeIgniter\Cache\Handlers\WincacheHandler::class,
+ 'dummy' => DummyHandler::class,
+ 'file' => FileHandler::class,
+ 'memcached' => MemcachedHandler::class,
+ 'predis' => PredisHandler::class,
+ 'redis' => RedisHandler::class,
+ 'wincache' => WincacheHandler::class,
];
}
diff --git a/app/Config/Constants.php b/app/Config/Constants.php
index b25f71cdcc26..8f8498a58a0a 100644
--- a/app/Config/Constants.php
+++ b/app/Config/Constants.php
@@ -1,36 +1,38 @@
` element.
+ *
+ * Will default to self if not overridden
+ *
+ * @var string|string[]|null
+ */
+ public $baseURI = null;
- public $defaultSrc = null; // will default to self if not over-ridden
- public $scriptSrc = 'self';
- public $styleSrc = 'self';
- public $imageSrc = 'self';
- public $baseURI = null; // will default to self if not over-ridden
- public $childSrc = 'self';
- public $connectSrc = 'self';
- public $fontSrc = null;
- public $formAction = 'self';
+ /**
+ * Lists the URLs for workers and embedded frame contents
+ *
+ * @var string|string[]
+ */
+ public $childSrc = 'self';
+
+ /**
+ * Limits the origins that you can connect to (via XHR,
+ * WebSockets, and EventSource).
+ *
+ * @var string|string[]
+ */
+ public $connectSrc = 'self';
+
+ /**
+ * Specifies the origins that can serve web fonts.
+ *
+ * @var string|string[]
+ */
+ public $fontSrc = null;
+
+ /**
+ * Lists valid endpoints for submission from `