# 版本 4.0.0-beta.2

发布日期：2019 年 4 月 4 日

## 亮点

- 大量修复和改进,尤其是针对 Model 和测试类

- Model 现在需要主键

- 生成的 API 文档可在 https://codeigniter4.github.io/api/ 访问

- 验证规则得到增强

- .htaccess 加强

## 新消息

- Database.noPrimaryKey、forFindColumnHaveMultipleColumns、Database.forEmptyInputGiven

## 应用变更

- 更新了 app/Config/Events

- 添加了 app/Controllers/BaseController

- 添加了测试文件夹用于单元测试

- 添加了 phpunit.xml.dist 用于单元测试配置

## 变更的文件

变更文件的列表如下,带有 PR 编号:

- .htaccess #1900

- app/
    - Config/

        - Events #1856

    - Controllers/

        - BaseController #1847

        - Home #1847

- contributing/

    - README.rst #1846

    - styleguide #1872

- contributing.md #1846

- phpdoc.dist.xml #1872

- system/
    - Autoloader/

        - FileLocator #1860

    - Cache/Handlers/

        - FileHandler #1895

        - MemcachedHandler #1895

        - PredisHandler #1895

        - RedisHandler #1863, #1895

        - WincacheHandler #1895

    - CLI/

        - CLI #1891, #1910

    - Commands/

        - Server/Serve #1893

        - Utilities/Routes #1859

    - Config/

        - BaseConfig #1811

        - Routes #1847, #1850

    - Database/

        - BaseBuilder $1776, #1902

        - BaseConnection #1899

        - Forge #1844, #1899

        - MigrationRunner #1860, #1865

        - MySQLi/Connection #1896

        - MySQLi/Forge #1899

        - Postgre/Builder #1902

        - Postgre/Forge #1899

        - Query #1805, #1771

        - SQLite3/Builder #1902

        - SQLite3/Forge #1899

    - Debug/

        - Toolbar/Collectors/History #1869

        - Toolbar #1897

    - Events/

        - Events #1867

    - Exceptions/

        - ModelException #1829

        - PageNotFoundException #1844

    - Files/

        - File #1809, #1854

    - Helpers/

        - date_helper #d08b68

        - form_helper #1803

        - html_helper #1803

        - number_helper #d08b68, #1803

        - security_helper #d08b68

        - text_helper #d08b68, #1803

        - url_helper #d08b68, #1803

        - xml_helper #1803

    - Honeypot/

        - Honeypot #1894

    - HTTP/

        - Header #1769

        - IncomingRequest #1831

    - Language/en/

        - Database #1829, #1861, #1902

    - Router/

        - RouteCollection #1769

        - Router #1839, #1882

    - Session/

        - Session #1769

    - Test/

        - ControllerTester #1769, #1848, #1855

        - DOMParser #1848

    - Validation/

        - FormatRules #1762, #1863

        - Rules #1791, #1814, #1818, #1862

        - Validation #1769

        - Views/list #1828

    - View/

        - Filters #1769

        - Parser #1769

        - View #1769, #1827

    - CodeIgniter #1769, #1804, #1590

    - Common #1802, #895ae0

    - ComposerScripts #1804

    - Controller #1769, #1850

    - Entity #1769, #1804

    - Model #1793, #1769, #1804, #1808, #1812, #1813, #1817, #1829, #1746, #1861

- tests/system/
    - Cache/
        - Handlers/

            - FileHandlerTest #1796, #1895

            - MemcachedHandlerTest #1895

            - RedisHandlerTest #1895

        - CacheFactoryTest #1796

    - CLI/

        - CLITest #1910

    - Config/

        - BaseConfigTest #1811

        - ConfigTest #1811

    - Database/

        - Builder/EmptyTest #1902

        - Builder/SelectTest #1902

        - Live/ModelTest #1817, #1829, #1861

        - Live/WhereTest #1906

    - Events/

        - EventsTest #1867

    - HTTP/

        - ContentSecurityPolicyTest #1848

    - Router/

        - RouteCollectionTest #1822, #1912, #1913

    - Test/

        - ControllerTesterTest #1848, #1855

        - DOMParserTest #1848

    - Validation/

        - FormatRulesTest #1762

        - RulesTest #1791

    - View/

        - ViewTest #1827, #1836

    - ControllerTest #1850

- user_guide_src/
    - cli/

        - cli_commands #1777

        - cli_library #1892, #1910

    - concepts/

        - services #1811

    - database/

        - examples #1794

    - dbmgmt/

        - forge #1844, #1899

        - migration #1860, #1865

    - extending/

        - basecontroller #1847

        - core_classes #1847

    - general/

        - common_functions #1802, #1895

    - helpers/

        - number_helper #d08b68

        - url_helper #1803

    - incoming/

        - routing #1908

    - libraries/

        - caching #1895

        - files #1790, #1854

        - pagination #1823

        - sessions #1843

        - validation #1814, #1828, #1862

    - models/

        - models #1817, #1820, #1829, #1746, #1861

    - outgoing/

        - view_layouts #1827

    - testing/

        - controllers #1848

## 合并的 PR

- #1913 更多覆盖重写的 RouteCollection 测试。关闭 #1692

- #1912 额外的 RouteCollectionTests

- #1910 为 CLI 库添加了 print 方法,以便在同一行上多次打印

- #1908 在用户指南中添加过滤器参数

- #1906 与 #1775 相关的子查询测试用例

- #1902 BaseBuilder 修正

- #1900 为更好的安全性和缓存更新 .htaccess

- #1899 数据库 Forge 修正

- #1897 针对 #1779 的工具栏修复

- #1896 Mysql 连接使用 SSL 证书的问题 (#1219)

- #1894 修正拼写错误

- #1893 用 remove escapeshellarg() 修复 spark serve

- #1892 在用户指南中添加 CLI 背景颜色列表

- #1891 允许 CLI::strlen 为空参数

- #1886 修复问题 #1880,修复了一些拼写错误和更新了代码风格

- #1882 与 #1541 相关的路由器更改

- #1873-1889 文档:移动命名空间声明和添加缺失的类 docblocks

- #1872 文档:修复 phpdoc 配置

- #1871 不匹配的缓存库 get() 返回 null

- #1869 History::SetFiles 检查 #1778

- #1863 按模块进行拼写更改

- #1861 新的 Find Column 方法 与 #1619 相关

- #1860 Migrationrunner 使用自动加载程序

- #1867 事件现在应该可以与任何可调用项一起使用了。修复 #1835

- #1865 解决定义中的 MigrationRunner 问题

- #1862 required_with 和 required_without 定义更改

- #1859 在路由列表中忽略回调

- #1858 DB 模块中的拼写更正

- #1856 在 pre_system 事件上确保 ob_get_level() > 0 时 ob_end_flush()

- #1855 修复:ControllerTester::execute。修复 #1834

- #1854 File::move 现在会为重定位的文件返回新的文件实例。修复 #1782

- #1851 用根 CI4 版本替换旧的 CI3 .gitignore

- #1850 安全可路由的控制器方法

- #1848 测试:修复和测试 Test/ControllerTest,已测试

- #1847 默认将 Controller 扩展到 BaseController

- #1846 修复贡献链接

- #1844 Model 修复

- #1843 替换 CI3 $this->input 引用

- #1842 异常 'forPageNotFound' 缺少默认值

- #1839 不要在 to 路由中将斜杠替换为反斜杠

- #1836 测试:改进 ViewView 覆盖率

- #1831 修复一些 PHPDoc 注释错误

- #1829 改进:Model 现在需要主键。这部分是为了保持代码...

- #1828 修复:从验证视图中删除引导样式。

- #1827 修复:向视图库添加 include 方法来渲染视图片段... 视图。

- #1823 文档:在 Pagination 类中删除遗留的 Bootstrap 引用

- #1822 测试:增强 RouteCollection 覆盖率

- #1820 修复:在 model.rst 中正确的 sphinx 错误

- #1819 改进:使用 phpDocumentor 添加 apibot 用于 API 文档

- #1818 改进:在 exact_length 规则中改进代码

- #1817 改进:引入 Model setValidationMessage 函数

- #895ae0 修复:每当使用旧命令时都启动会话

- #1814 增强:extended exact_length[1,3,5]

- #1813 修复:Model::save 对于早期 PR 的修复

- #1812 测试:改进 Filters 覆盖率

- #1811 测试:改进 Config 模块覆盖率

- #1809 修复文件移动失败。修复 #1785

- #1808 修复:修复 save 方法的返回值

- #1805 文档:Query 类更改

- #1804 文档:一些基本功能更改

- #1803 文档:一些辅助函数更改

- #1802 文档:通用函数更正

- #1796 测试:改进 Cache 覆盖率

- #1794 替换不存在的 “getAffectedRows”

- #1793 设置 Model->chunk 返回类型

- #1791 修复:在 ValidationRules 中删除 is_numeric 测试

- #d08b68 在缺少 UserAgent 的 ControllerTester 中修复

- #1790 根据问题 #1781 中提到的修正文档中的拼写错误

- #1777 向示例添加 CLI 命名空间

- #1776 修复:仅替换字段名称中的最后一个操作符

- #1771 修复:matchSimpleBinds 中的拼写错误

- #1769 方法和拼写更正

- #1762 修复:decimal 规则。它不应该接受整数吗?

- #1746 改进:更新 Model,选择性更新 created_at/updated_at 字段。

- #1590 改进:增强 404Override