From 093e5dc2d327780680b0ecab2620fd589646e857 Mon Sep 17 00:00:00 2001 From: Hex Date: Tue, 24 Oct 2023 17:40:46 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=88=B0=204.4.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/_static/css/citheme.css | 4 + source/_static/css/citheme_dark.css | 4 + source/changelogs/v4.3.7.rst | 42 ++ source/changelogs/v4.3.8.rst | 23 ++ source/changelogs/v4.4.0.rst | 365 ++++++++++++++++++ source/changelogs/v4.4.1.rst | 22 ++ source/changelogs/v4.4.2.rst | 50 +++ source/cli/cli_library/001.php | 11 +- source/concepts/factories/002.php | 2 + source/concepts/factories/014.php | 3 + source/concepts/factories/015.php | 3 + source/conf.py | 4 +- source/database/configuration/008.php | 6 + source/dbmgmt/migration/005.php | 20 - source/extending/composer_packages.rst | 201 ++++++++++ source/extending/core_classes/003.php | 4 +- source/general/common_functions/002.php | 3 +- source/general/configuration/007.php | 2 + source/general/configuration/008.php | 2 + source/general/configuration/009.php | 4 +- source/general/configuration/010.php | 2 +- source/general/errors/010.php | 2 +- source/general/errors/011.php | 2 +- source/general/errors/015.php | 27 ++ source/general/errors/016.php | 18 + source/general/errors/017.php | 26 ++ source/general/errors/018.php | 8 + source/general/modules/015.php | 22 ++ source/helpers/array_helper/012.php | 94 +++++ source/helpers/array_helper/013.php | 81 ++++ source/helpers/array_helper/014.php | 114 ++++++ source/helpers/number_helper/009.php | 4 +- source/images/debugbar.png | Bin 81068 -> 23357 bytes source/images/tutorial3.png | Bin 47293 -> 39569 bytes source/images/tutorial4.png | Bin 30520 -> 25486 bytes source/images/welcome.png | Bin 176104 -> 146354 bytes source/incoming/controllers/004.php | 8 +- source/incoming/controllers/005.php | 8 +- source/incoming/controllers/024.php | 11 + source/incoming/controllers/025.php | 13 + source/incoming/filters/008.php | 4 +- source/incoming/filters/012.php | 17 + source/incoming/incomingrequest/021.php | 3 +- source/incoming/incomingrequest/022.php | 15 - source/incoming/routing/045.php | 8 +- source/incoming/routing/046.php | 1 + source/incoming/routing/049.php | 9 + source/incoming/routing/050.php | 9 + source/incoming/routing/051.php | 8 + .../{filters/010.php => routing/067.php} | 0 source/installation/upgrade_437.rst | 90 +++++ source/installation/upgrade_438.rst | 41 ++ source/installation/upgrade_440.rst | 330 ++++++++++++++++ source/installation/upgrade_440/002.php | 12 + source/installation/upgrade_441.rst | 41 ++ source/installation/upgrade_442.rst | 32 ++ source/libraries/cookies/004.php | 24 +- source/libraries/cookies/006.php | 6 +- source/libraries/cookies/017.php | 16 + source/libraries/cookies/018.php | 15 + source/libraries/curlrequest/001.php | 3 +- source/libraries/curlrequest/026.php | 9 +- source/libraries/curlrequest/035.php | 7 + source/libraries/pagination/002.php | 4 +- source/libraries/pagination/003.php | 19 +- source/libraries/pagination/004.php | 4 +- source/libraries/pagination/015.php | 4 +- source/libraries/pagination/016.php | 24 ++ source/libraries/pagination/017.php | 17 + source/libraries/pagination/018.php | 9 + source/libraries/publisher/009.php | 2 +- source/libraries/sessions/003.php | 2 +- source/libraries/sessions/037.php | 2 - source/libraries/sessions/044.php | 3 + source/libraries/uploaded_files/023.php | 4 + source/libraries/uri/001.php | 2 +- source/libraries/uri/002.php | 2 +- source/libraries/uri/003.php | 1 - source/libraries/uri/005.php | 2 +- source/libraries/validation/001.php | 5 +- source/libraries/validation/002.php | 8 +- source/libraries/validation/003.php | 4 +- source/libraries/validation/005.php | 4 +- source/libraries/validation/006.php | 8 +- source/libraries/validation/007.php | 8 +- source/libraries/validation/008.php | 10 +- source/libraries/validation/009.php | 4 +- source/libraries/validation/010.php | 2 +- source/libraries/validation/011.php | 2 +- source/libraries/validation/012.php | 4 +- source/libraries/validation/013.php | 16 +- source/libraries/validation/015.php | 18 +- source/libraries/validation/016.php | 13 +- source/libraries/validation/020.php | 4 +- source/libraries/validation/022.php | 4 +- source/libraries/validation/023.php | 4 +- source/libraries/validation/024.php | 4 +- source/libraries/validation/025.php | 4 +- source/libraries/validation/032.php | 8 +- source/libraries/validation/033.php | 3 +- source/libraries/validation/036.php | 2 +- source/libraries/validation/038.php | 8 +- source/libraries/validation/044.php | 21 + source/libraries/validation/045.php | 18 + source/models/model/027.php | 8 +- source/models/model/028.php | 2 +- source/models/model/029.php | 4 +- source/models/model/038.php | 3 +- source/models/model/040.php | 3 +- source/outgoing/response/003.php | 1 + source/outgoing/response/033.php | 6 + source/outgoing/table/019.php | 40 ++ source/outgoing/table/020.php | 24 ++ source/outgoing/view_cells/001.php | 2 + source/outgoing/view_cells/002.php | 2 + source/outgoing/view_cells/003.php | 2 + source/outgoing/view_cells/004.php | 11 + source/outgoing/view_cells/005.php | 2 + source/outgoing/view_cells/006.php | 2 + source/outgoing/view_cells/007.php | 20 + source/outgoing/view_cells/008.php | 13 + source/outgoing/view_cells/009.php | 4 + source/outgoing/view_cells/010.php | 2 + source/outgoing/view_cells/011.php | 13 + source/outgoing/view_cells/012.php | 16 + source/outgoing/view_cells/013.php | 2 + source/outgoing/view_cells/014.php | 34 ++ source/outgoing/view_cells/015.php | 6 + source/outgoing/view_cells/016.php | 17 + source/outgoing/view_cells/017.php | 6 + source/outgoing/view_cells/018.php | 15 + source/outgoing/view_cells/019.php | 23 ++ source/outgoing/view_cells/020.php | 2 + source/outgoing/view_cells/021.php | 2 + source/outgoing/view_cells/022.php | 2 + source/outgoing/view_parser/012.php | 4 +- source/outgoing/view_parser/023.php | 2 +- source/testing/response/018.php | 19 +- source/testing/response/019.php | 9 +- source/testing/response/020.php | 14 +- source/testing/response/021.php | 9 +- source/testing/response/022.php | 9 +- source/testing/response/023.php | 9 +- source/testing/response/024.php | 11 +- source/testing/response/025.php | 9 +- source/testing/response/026.php | 9 +- source/testing/response/027.php | 2 +- source/testing/response/028.php | 9 +- source/testing/response/029.php | 5 +- source/tutorial/create_news_items/002.php | 34 +- source/tutorial/create_news_items/004.php | 8 +- source/tutorial/create_news_items/005.php | 40 ++ source/tutorial/create_news_items/006.php | 18 + source/tutorial/news_section/003.php | 2 +- source/tutorial/news_section/006.php | 2 +- source/tutorial/news_section/008.php | 9 +- source/tutorial/static_pages/003.php | 9 +- 157 files changed, 2469 insertions(+), 264 deletions(-) create mode 100644 source/changelogs/v4.3.7.rst create mode 100644 source/changelogs/v4.3.8.rst create mode 100644 source/changelogs/v4.4.0.rst create mode 100644 source/changelogs/v4.4.1.rst create mode 100644 source/changelogs/v4.4.2.rst create mode 100644 source/concepts/factories/014.php create mode 100644 source/concepts/factories/015.php delete mode 100644 source/dbmgmt/migration/005.php create mode 100644 source/extending/composer_packages.rst create mode 100644 source/general/errors/015.php create mode 100644 source/general/errors/016.php create mode 100644 source/general/errors/017.php create mode 100644 source/general/errors/018.php create mode 100644 source/general/modules/015.php create mode 100644 source/helpers/array_helper/012.php create mode 100644 source/helpers/array_helper/013.php create mode 100644 source/helpers/array_helper/014.php create mode 100644 source/incoming/controllers/024.php create mode 100644 source/incoming/controllers/025.php create mode 100644 source/incoming/filters/012.php delete mode 100644 source/incoming/incomingrequest/022.php rename source/incoming/{filters/010.php => routing/067.php} (100%) create mode 100644 source/installation/upgrade_437.rst create mode 100644 source/installation/upgrade_438.rst create mode 100644 source/installation/upgrade_440.rst create mode 100644 source/installation/upgrade_440/002.php create mode 100644 source/installation/upgrade_441.rst create mode 100644 source/installation/upgrade_442.rst create mode 100644 source/libraries/cookies/017.php create mode 100644 source/libraries/cookies/018.php create mode 100644 source/libraries/curlrequest/035.php create mode 100644 source/libraries/pagination/016.php create mode 100644 source/libraries/pagination/017.php create mode 100644 source/libraries/pagination/018.php create mode 100644 source/libraries/sessions/044.php create mode 100644 source/libraries/uploaded_files/023.php create mode 100644 source/libraries/validation/044.php create mode 100644 source/libraries/validation/045.php create mode 100644 source/outgoing/response/033.php create mode 100644 source/outgoing/table/019.php create mode 100644 source/outgoing/table/020.php create mode 100644 source/outgoing/view_cells/001.php create mode 100644 source/outgoing/view_cells/002.php create mode 100644 source/outgoing/view_cells/003.php create mode 100644 source/outgoing/view_cells/004.php create mode 100644 source/outgoing/view_cells/005.php create mode 100644 source/outgoing/view_cells/006.php create mode 100644 source/outgoing/view_cells/007.php create mode 100644 source/outgoing/view_cells/008.php create mode 100644 source/outgoing/view_cells/009.php create mode 100644 source/outgoing/view_cells/010.php create mode 100644 source/outgoing/view_cells/011.php create mode 100644 source/outgoing/view_cells/012.php create mode 100644 source/outgoing/view_cells/013.php create mode 100644 source/outgoing/view_cells/014.php create mode 100644 source/outgoing/view_cells/015.php create mode 100644 source/outgoing/view_cells/016.php create mode 100644 source/outgoing/view_cells/017.php create mode 100644 source/outgoing/view_cells/018.php create mode 100644 source/outgoing/view_cells/019.php create mode 100644 source/outgoing/view_cells/020.php create mode 100644 source/outgoing/view_cells/021.php create mode 100644 source/outgoing/view_cells/022.php create mode 100644 source/tutorial/create_news_items/005.php create mode 100644 source/tutorial/create_news_items/006.php diff --git a/source/_static/css/citheme.css b/source/_static/css/citheme.css index 642a98613..58de483c3 100644 --- a/source/_static/css/citheme.css +++ b/source/_static/css/citheme.css @@ -241,6 +241,10 @@ html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not( margin-top: 2rem; } +.highlight-console .highlight { + background-color: #fffff0; +} + /* Messages ----------------------------------------------------------------- */ .rst-content .success { diff --git a/source/_static/css/citheme_dark.css b/source/_static/css/citheme_dark.css index bb8442d21..649625a6b 100644 --- a/source/_static/css/citheme_dark.css +++ b/source/_static/css/citheme_dark.css @@ -343,4 +343,8 @@ .highlight .ni { color: #b780b7; } + + .highlight-console .highlight pre { + background: #434343; + } } diff --git a/source/changelogs/v4.3.7.rst b/source/changelogs/v4.3.7.rst new file mode 100644 index 000000000..789acbd75 --- /dev/null +++ b/source/changelogs/v4.3.7.rst @@ -0,0 +1,42 @@ +Version 4.3.7 +############# + +Release Date: July 30, 2023 + +**4.3.7 release of CodeIgniter4** + +.. contents:: + :local: + :depth: 3 + +BREAKING +******** + +- **RouteCollection:** The second parameter ``bool $includeWildcard = true`` has + been added to the ``RouteCollection::getRoutes()`` method. +- **AutoRouting Legacy:** The first parameter of the ``AutoRouter::__construct()`` + has been changed from ``$protectedControllers`` to ``$cliRoutes``. +- **FeatureTestTrait:** When using :ref:`withBodyFormat() `, + the priority of the request body has been changed. + See :ref:`Upgrading Guide ` for details. +- **Validation:** The return value of ``Validation::loadRuleGroup()`` has been + changed from "**rules array**" to "**array** of **rules array** and **customErrors array**" + (``[rules, customErrors]``). + +Changes +******* + +- The number helper function :php:func:`number_to_amount()`, which previously + returned "1000", has been corrected to return "1 thousand" when the number + is exactly 1000, for example. + +Bugs Fixed +********** + +- **AutoRouting Legacy:** Fixed a bug that when you added a route with + ``$routes->add()``, the controller's other methods were inaccessible from the + web browser. + +See the repo's +`CHANGELOG.md `_ +for a complete list of bugs fixed. diff --git a/source/changelogs/v4.3.8.rst b/source/changelogs/v4.3.8.rst new file mode 100644 index 000000000..687b3e220 --- /dev/null +++ b/source/changelogs/v4.3.8.rst @@ -0,0 +1,23 @@ +Version 4.3.8 +############# + +Release Date: August 25, 2023 + +**4.3.8 release of CodeIgniter4** + +.. contents:: + :local: + :depth: 3 + +Bugs Fixed +********** + +- **Controller Filters:** In previous versions, ``['except' => []]`` or ``['except' => '']`` + meant "except all". The bug has been fixed, and now + + - ``['except' => []]`` means to exclude nothing. + - ``['except' => '']`` means to exclude the baseURL only. + +See the repo's +`CHANGELOG.md `_ +for a complete list of bugs fixed. diff --git a/source/changelogs/v4.4.0.rst b/source/changelogs/v4.4.0.rst new file mode 100644 index 000000000..59092ccd9 --- /dev/null +++ b/source/changelogs/v4.4.0.rst @@ -0,0 +1,365 @@ +Version 4.4.0 +############# + +Release Date: August 25, 2023 + +**4.4.0 release of CodeIgniter4** + +.. contents:: + :local: + :depth: 3 + +Highlights +********** + +- The Debug Toolbar now has a new “Hot Reload” feature + (*contributed by* `lonnieezell `_). + See `Testing`_. + +BREAKING +******** + +Behavior Changes +================ + +URI::setSegment() and Non-Existent Segment +------------------------------------------ + +An exception is now thrown when you set the last ``+2`` segment. +In previous versions, an exception was thrown only if the last segment ``+3`` +or more was specified. See :ref:`upgrade-440-uri-setsegment`. + +The next segment (``+1``) of the current last segment can be set as before. + +.. _v440-factories: + +Factories +--------- + +Passing Classname with Namespace +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Now ``preferApp`` works only when you request +:ref:`a classname without a namespace `. + +For example, when you call ``model(\Myth\Auth\Models\UserModel::class)`` or +``model('Myth\Auth\Models\UserModel')``: + + - before: + + - returns ``App\Models\UserModel`` if exists and ``preferApp`` is true (default) + - returns ``Myth\Auth\Models\UserModel`` if exists and ``preferApp`` is false + + - after: + + - returns ``Myth\Auth\Models\UserModel`` even if ``preferApp`` is true (default) + - returns ``App\Models\UserModel`` if you define ``Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel')`` before calling the ``model()`` + +If you had passed a non-existent classname by mistake, the previous version +would have returned a class instance in the ``App`` or ``Config`` namespace +because of the ``preferApp`` feature. + +For example, in a controller (``namespace App\Controllers``), if you called +``config(Config\App::class)`` by mistake (note the class is missing the leading ``\``), +meaning you actually passed ``App\Controllers\Config\App``. +But that class does not exist, so now Factories will return ``null``. + +Property Name +^^^^^^^^^^^^^ + +The property ``Factories::$basenames`` has been renamed to ``$aliases``. + +Autoloader +---------- + +Previously, CodeIgniter's autoloader allowed loading class names ending with the `.php` extension. This means instantiating objects like `new Foo.php()` was possible +and would instantiate as `new Foo()`. Since `Foo.php` is an invalid class name, this behavior of the autoloader is changed. Now, instantiating such classes would fail. + +.. _v440-codeigniter-and-exit: + +CodeIgniter and exit() +---------------------- + +The ``CodeIgniter::run()`` method no longer calls ``exit(EXIT_SUCCESS)``. The +exit call is moved to **public/index.php**. + +.. _v440-site-uri-changes: + +Site URI Changes +---------------- + +A new ``SiteURI`` class that extends the ``URI`` class and represents the site +URI has been added, and now it is used in many places that need the current URI. + +``$this->request->getUri()`` in controllers returns the ``SiteURI`` instance. +Also, :php:func:`site_url()`, :php:func:`base_url()`, and :php:func:`current_url()` +use the SiteURI internally. + +getPath() +^^^^^^^^^ + +The ``getPath()`` method now always returns the full URI path with leading ``/``. +Therefore, when your baseURL has sub-directories and you want to get the relative +path to baseURL, you must use the new ``getRoutePath()`` method instead. + +For example:: + + baseURL: http://localhost:8888/CodeIgniter4/ + The current URI: http://localhost:8888/CodeIgniter4/foo/bar + getPath(): /CodeIgniter4/foo/bar + getRoutePath(): foo/bar + +Site URI Values +^^^^^^^^^^^^^^^ + +The SiteURI class normalizes site URIs more strictly than before, and some bugs +have been fixed. + +As a result, the framework may return site URIs or the URI paths slightly differently +than in previous versions. +For example, ``/`` will be added after ``index.php``:: + + http://example.com/test/index.php?page=1 + ↓ + http://example.com/test/index.php/?page=1 + +.. _v440-interface-changes: + +Interface Changes +================= + +.. note:: As long as you have not extended the relevant CodeIgniter core classes + or implemented these interfaces, all these changes are backward compatible + and require no intervention. + +- **Validation:** Added the ``getValidated()`` method in ``ValidationInterface``. + +.. _v440-method-signature-changes: + +Method Signature Changes +======================== + +.. _v440-parameter-type-changes: + +Parameter Type Changes +---------------------- + +- **Services:** + - The first parameter of ``Services::security()`` has been changed from + ``Config\App`` to ``Config\Security``. + - The first parameter of ``Services::session()`` has been changed from + ``Config\App`` to ``Config\Session``. +- **Session:** + - The second parameter of ``Session::__construct()`` has been changed from + ``Config\App`` to ``Config\Session``. + - The first parameter of ``__construct()`` in the database's ``BaseHandler``, + ``DatabaseHandler``, ``FileHandler``, ``MemcachedHandler``, and ``RedisHandler`` + has been changed from ``Config\App`` to ``Config\Session``. +- **Security:** The first parameter of ``Security::__construct()`` has been + changed from ``Config\App`` to ``Config\Security``. +- **Validation:** The method signature of ``Validation::check()`` has been changed. + The ``string`` typehint on the ``$rule`` parameter was removed. +- **CodeIgniter:** The method signature of ``CodeIgniter::setRequest()`` has been + changed. The ``Request`` typehint on the ``$request`` parameter was removed. +- **FeatureTestCase:** + - The method signature of ``FeatureTestCase::populateGlobals()`` has been + changed. The ``Request`` typehint on the ``$request`` parameter was removed. + - The method signature of ``FeatureTestCase::setRequestBody()`` has been + changed. The ``Request`` typehint on the ``$request`` parameter and the + return type ``Request`` were removed. + +Added Parameters +---------------- + +- **Routing:** The third parameter ``Routing $routing`` has been added to + ``RouteCollection::__construct()``. + +Removed Parameters +------------------ + +- **Services:** The second parameter ``$request`` and the third parameter + ``$response`` in ``Services::exceptions()`` have been removed. +- **Error Handling:** The second parameter ``$request`` and the third parameter + ``$response`` in ``CodeIgniter\Debug\Exceptions::__construct()`` have been removed. + +Return Type Changes +------------------- + +- **Autoloader:** The return signatures of the `loadClass` and `loadClassmap` methods are made `void` + to be compatible as callbacks in `spl_autoload_register` and `spl_autoload_unregister` functions. + +Enhancements +************ + +Commands +======== + +- **spark routes:** + - Now you can specify the host in the request URL. + See :ref:`routing-spark-routes-specify-host`. + - It shows view files of :ref:`view-routes` in *Handler* like the following: + + +---------+-------------+------+------------------------------+----------------+---------------+ + | Method | Route | Name | Handler | Before Filters | After Filters | + +---------+-------------+------+------------------------------+----------------+---------------+ + | GET | about | » | (View) pages/about | | toolbar | + +---------+-------------+------+------------------------------+----------------+---------------+ + + +Testing +======= + +- **DebugBar:** + - The Debug Toolbar now has a new "Hot Reload" feature that can be used to + automatically reload the page when a file is changed. + See :ref:`debug-toolbar-hot-reload`. + - Now :ref:`view-routes` are displayed in *DEFINED ROUTES* on the *Routes* tab. + +Database +======== + +- **MySQLi:** Added the ``numberNative`` attribute to the Database Config to keep the variable type obtained after SQL Query consistent with the type set in the database. + See :ref:`Database Configuration `. +- **SQLSRV:** Field Metadata now includes ``nullable``. See :ref:`db-metadata-getfielddata`. + +Model +===== + +- Added special getter/setter to Entity to avoid method name conflicts. + See :ref:`entities-special-getter-setter`. + +Libraries +========= + +- **Validation:** Added ``Validation::getValidated()`` method that gets + the actual validated data. See :ref:`validation-getting-validated-data` for details. +- **Images:** The option ``$quality`` can now be used to compress WebP images. +- **Uploaded Files:** Added ``UploadedFiles::getClientPath()`` method that returns + the value of the `full_path` index of the file if it was uploaded via directory upload. +- **CURLRequest:** Added a request option ``proxy``. See + :ref:`CURLRequest Class `. +- **URI:** A new ``SiteURI`` class that extends ``URI`` and represents the site + URI has been added. + +Helpers and Functions +===================== + +- **Array:** Added :php:func:`array_group_by()` helper function to group data + values together. Supports dot-notation syntax. +- **Common:** :php:func:`force_https()` no longer terminates the application, but throws a ``RedirectException``. + +Others +====== + +- **DownloadResponse:** Added ``DownloadResponse::inline()`` method that sets + the ``Content-Disposition: inline`` header to display the file in the browser. + See :ref:`open-file-in-browser` for details. +- **View:** Added optional 2nd parameter ``$saveData`` on ``renderSection()`` to prevent from auto cleans the data after displaying. See :ref:`View Layouts ` for details. +- **Auto Routing (Improved)**: + - Now you can route to Modules. See :ref:`auto-routing-improved-module-routing` + for details. + - If a controller is found that corresponds to a URI segment and that controller + does not have a method defined for the URI segment, the default method will + now be executed. This addition allows for more flexible handling of URIs in + auto routing. See :ref:`controller-default-method-fallback` for details. +- **Filters:** Now you can use Filter Arguments with :ref:`$filters property `. +- **Request:** Added ``IncomingRequest::setValidLocales()`` method to set valid locales. +- **Table:** Added ``Table::setSyncRowsWithHeading()`` method to synchronize row columns with headings. See :ref:`table-sync-rows-with-headings` for details. +- **Error Handling:** Now you can use :ref:`custom-exception-handlers`. +- **RedirectException:** + - It can also take an object that implements ``ResponseInterface`` as its first argument. + - It implements ``ResponsableInterface``. +- **Factories:** + - You can now define the classname that will actually be loaded. + See :ref:`factories-defining-classname-to-be-loaded`. + - Config Caching implemented. See :ref:`factories-config-caching` for details. + +Message Changes +*************** + +- Added ``Core.invalidDirectory`` error message. +- Improved ``HTTP.invalidHTTPProtocol`` error message. + +Changes +******* + +- **Images:** The default quality for WebP in ``GDHandler`` has been changed from 80 to 90. +- **Config:** + - The deprecated Cookie items in **app/Config/App.php** has been removed. + - The deprecated Session items in **app/Config/App.php** has been removed. + - The deprecated CSRF items in **app/Config/App.php** has been removed. + - Routing settings have been moved to **app/Config/Routing.php** config file. + See :ref:`Upgrading Guide `. +- **DownloadResponse:** When generating response headers, does not replace the ``Content-Disposition`` header if it was previously specified. +- **Autoloader:** + - Before v4.4.0, CodeIgniter autoloader did not allow special + characters that are illegal in filenames on certain operating systems. + The symbols that can be used are ``/``, ``_``, ``.``, ``:``, ``\`` and space. + So if you installed CodeIgniter under the folder that contains the special + characters like ``(``, ``)``, etc., CodeIgniter didn't work. Since v4.4.0, + this restriction has been removed. + - The methods ``Autoloader::loadClass()`` and ``Autoloader::loadClassmap()`` are now both + marked ``@internal``. +- **RouteCollection:** The array structure of the protected property ``$routes`` + has been modified for performance. +- **HSTS:** Now :php:func:`force_https()` or + ``Config\App::$forceGlobalSecureRequests = true`` sets the HTTP status code 307, + which allows the HTTP request method to be preserved after the redirect. + In previous versions, it was 302. + +Deprecations +************ + +- **Entity:** ``Entity::setAttributes()`` is deprecated. Use ``Entity::injectRawData()`` instead. +- **Error Handling:** Many methods and properties in ``CodeIgniter\Debug\Exceptions`` + are deprecated. Because these methods have been moved to ``BaseExceptionHandler`` or + ``ExceptionHandler``. +- **Autoloader:** ``Autoloader::sanitizeFilename()`` is deprecated. +- **CodeIgniter:** + - ``CodeIgniter::$returnResponse`` property is deprecated. No longer used. + - ``CodeIgniter::$cacheTTL`` property is deprecated. No longer used. Use ``ResponseCache`` instead. + - ``CodeIgniter::cache()`` method is deprecated. No longer used. Use ``ResponseCache`` instead. + - ``CodeIgniter::cachePage()`` method is deprecated. No longer used. Use ``ResponseCache`` instead. + - ``CodeIgniter::generateCacheName()`` method is deprecated. No longer used. Use ``ResponseCache`` instead. + - ``CodeIgniter::callExit()`` method is deprecated. No longer used. +- **RedirectException:** ``\CodeIgniter\Router\Exceptions\RedirectException`` is deprecated. Use ``\CodeIgniter\HTTP\Exceptions\RedirectException`` instead. +- **Session:** The property ``$sessionDriverName``, ``$sessionCookieName``, + ``$sessionExpiration``, ``$sessionSavePath``, ``$sessionMatchIP``, + ``$sessionTimeToUpdate``, and ``$sessionRegenerateDestroy`` in ``Session`` are + deprecated, and no longer used. Use ``$config`` instead. +- **Security:** The property ``$csrfProtection``, ``$tokenRandomize``, + ``$tokenName``, ``$headerName``, ``$expires``, ``$regenerate``, and + ``$redirect`` in ``Security`` are deprecated, and no longer used. Use + ``$config`` instead. +- **URI:** + - ``URI::$uriString`` is deprecated. + - ``URI::$baseURL`` is deprecated. Use ``SiteURI`` instead. + - ``URI::setSilent()`` is deprecated. + - ``URI::setScheme()`` is deprecated. Use ``withScheme()`` instead. + - ``URI::setURI()`` is deprecated. +- **IncomingRequest:** + - ``IncomingRequest::detectURI()`` is deprecated and no longer used. + - ``IncomingRequest::detectPath()`` is deprecated, and no longer used. It + moved to ``SiteURIFactory``. + - ``IncomingRequest::parseRequestURI()`` is deprecated, and no longer used. It + moved to ``SiteURIFactory``. + - ``IncomingRequest::parseQueryString()`` is deprecated, and no longer used. It + moved to ``SiteURIFactory``. + - ``IncomingRequest::setPath()`` is deprecated. + +Bugs Fixed +********** + +- **Auto Routing (Improved)**: In previous versions, when ``$translateURIDashes`` + is true, two URIs correspond to a single controller method, one URI for dashes + (e.g., **foo-bar**) and one URI for underscores (e.g., **foo_bar**). This bug + has been fixed. Now the URI for underscores (**foo_bar**) is not accessible. +- **Output Buffering:** Bug fix with output buffering. +- **ControllerTestTrait:** ``ControllerTestTrait::withUri()`` creates a new Request + instance with the URI. Because the Request instance should have the URI instance. + Also if the hostname in the URI string is invalid with ``Config\App``, the valid + hostname will be set. + +See the repo's +`CHANGELOG.md `_ +for a complete list of bugs fixed. diff --git a/source/changelogs/v4.4.1.rst b/source/changelogs/v4.4.1.rst new file mode 100644 index 000000000..b6c92affc --- /dev/null +++ b/source/changelogs/v4.4.1.rst @@ -0,0 +1,22 @@ +Version 4.4.1 +############# + +Release Date: September 5, 2023 + +**4.4.1 release of CodeIgniter4** + +.. contents:: + :local: + :depth: 3 + +Bugs Fixed +********** + +- **AutoRouting Legacy:** Fixed a bug that Auto Routing Legacy does not work. +- **FeatureTest:** + - Fixed a bug that FeatureTest may cause risky tests. + - Fixed a bug that FeatureTest fails when forceGlobalSecureRequests is true. + +See the repo's +`CHANGELOG.md `_ +for a complete list of bugs fixed. diff --git a/source/changelogs/v4.4.2.rst b/source/changelogs/v4.4.2.rst new file mode 100644 index 000000000..eb146ef07 --- /dev/null +++ b/source/changelogs/v4.4.2.rst @@ -0,0 +1,50 @@ +Version 4.4.2 +############# + +Release Date: October 19, 2023 + +**4.4.2 release of CodeIgniter4** + +.. contents:: + :local: + :depth: 3 + +Message Changes +*************** + +- Added ``Language.invalidMessageFormat`` error message. + +Changes +******* + +- **Database Migrations:** The ``-g`` option for the ``spark migrate:rollback`` + command was removed. It did not work from the beginning. Also, the rollback + command returns the database(s) state to a specified batch number and cannot + specify only a specific database group. +- **Security:** The presence of the CSRF token is now also checked in the raw body (not JSON format) for PUT, PATCH, and DELETE type of requests. + +Deprecations +************ + +- **Filters:** The Auto-Discovery for Filters and ``Filters::discoverFilters()`` + is deprecated. Use :ref:`registrars` instead. See :ref:`modules-filters` for + details. +- **CLI:** The public property ``CLI::$readline_support`` and ``CLI::$wait_msg`` + are deprecated. These methods will be protected. +- **CodeIgniter:** The parameter ``$config`` for the ``displayCache()`` method is + deprecated. It was not used. + +Bugs Fixed +********** + +- **CodeIgniter:** Fixed a bug that returned "200 OK" response status code when + Page Not Found. +- **Spark:** Fixed a bug that caused spark to not display exceptions in the + production mode or to display backtrace in json when an exception occurred. +- **Forge:** Fixed a bug where adding a Primary Key to an existing table was + ignored if there were no other Keys added too. +- **Routing:** Fixed a bug that ``spark routes`` may show incorrect route names. + +See the repo's +`CHANGELOG.md `_ +for a complete list of bugs fixed. diff --git a/source/cli/cli_library/001.php b/source/cli/cli_library/001.php index e42c9a923..45f025b1c 100644 --- a/source/cli/cli_library/001.php +++ b/source/cli/cli_library/001.php @@ -1,11 +1,16 @@ defaultGroup = ENVIRONMENT; } } diff --git a/source/dbmgmt/migration/005.php b/source/dbmgmt/migration/005.php deleted file mode 100644 index e9b4c2ad3..000000000 --- a/source/dbmgmt/migration/005.php +++ /dev/null @@ -1,20 +0,0 @@ -latest(); - } catch (Throwable $e) { - // Do something with the error here... - } - } -} diff --git a/source/extending/composer_packages.rst b/source/extending/composer_packages.rst new file mode 100644 index 000000000..5f79b6ae2 --- /dev/null +++ b/source/extending/composer_packages.rst @@ -0,0 +1,201 @@ +########################## +Creating Composer Packages +########################## + +You can make the :doc:`../general/modules` you create into Composer packages, +or can create a Composer package for CodeIgniter 4. + +.. contents:: + :local: + :depth: 2 + +**************** +Folder Structure +**************** + +Here's a typical directory structure for a Composer package:: + + your-package-name/ + ├── .gitattributes + ├── .gitignore + ├── LICENSE + ├── README.md + ├── composer.json + ├── src/ + │   └── YourClass.php + └── tests/ + └── YourClassTest.php + +********************** +Creating composer.json +********************** + +In the root of your package directory, create a **composer.json** file. This file +defines metadata about your package and its dependencies. + +The ``composer init`` command helps you create it. + +For example, **composer.json** might look like this:: + + { + "name": "your-vendor/your-package", + "description": "Your package description", + "type": "library", + "license": "MIT", + "autoload": { + "psr-4": { + "YourVendor\\YourPackage\\": "src/" + } + }, + "authors": [ + { + "name": "Your Name", + "email": "yourname@example.com" + } + ], + "require": { + // Any dependencies required by your package go here + }, + "require-dev": { + // Any development dependencies (e.g., PHPUnit) go here + } + } + +Package Name +============ + +The ``name`` field is important here. Package names are generally written in the +format "vendor-name/package-name" with all lowercase. Here is a common example: + +- ``your-vendor-name``: The name that identifies the vendor (creator of the package), + such as your name or your organization. +- ``your-package-name``: The name of the package you are creating. + +Thus, it is important to make the name unique to distinguish it from other packages. +Uniqueness is especially important when publishing. + +Namespace +========= + +The package name then determines the vendor namespace in ``autoload.psr4``. + +If your package name is ``your-vendor/your-package``, the vendor namespace must +be ``YourVendor``. So you would write like the following:: + + "autoload": { + "psr-4": { + "YourVendor\\YourPackage\\": "src/" + } + }, + +This setting instructs Composer to autoload the source code for your package. + +Choosing License +================ + +If you are not familiar with open source licenses, see https://choosealicense.com/. +Many PHP packages, including CodeIgniter, use the MIT license. + +*************************** +Preparing Development Tools +*************************** + +There are many tools that help ensure quality code. So you should use them. +You can easily install and configure such tools with +`CodeIgniter DevKit `_. + +Installing DevKit +================= + +In the root of your package directory, run the following commands: + +.. code-block:: console + + composer config minimum-stability dev + composer config prefer-stable true + composer require --dev codeigniter4/devkit + +The DevKit installs various Composer packages that helps your development, and +installs templates for them in **vendor/codeigniter4/devkit/src/Template**. +Copy the files in it to your project root folder, and edit them for your needs. + +Configuring Coding Standards Fixer +================================== + +DevKit provides Coding Standards Fixer with +`CodeIgniter Coding Standard `_ +based on `PHP-CS-Fixer `_. + +Copy **vendor/codeigniter4/devkit/src/Template/.php-cs-fixer.dist.php** to your +project root folder. + +Create the **build** folder for the cache file:: + + your-package-name/ + ├── .php-cs-fixer.dist.php + ├── build/ + +Open **.php-cs-fixer.dist.php** in your editor, and fix the folder path:: + + --- a/.php-cs-fixer.dist.php + +++ b/.php-cs-fixer.dist.php + @@ -7,7 +7,7 @@ use PhpCsFixer\Finder; + $finder = Finder::create() + ->files() + ->in([ + - __DIR__ . '/app/', + + __DIR__ . '/src/', + __DIR__ . '/tests/', + ]) + ->exclude([ + +That't it. Now you can run Coding Standards Fixer: + +.. code-block:: console + + vendor/bin/php-cs-fixer fix --ansi --verbose --diff + +If you add ``scripts.cs-fix`` in your **composer.json**, you can run it with +``composer cs-fix`` command:: + + { + // ... + }, + "scripts": { + "cs-fix": "php-cs-fixer fix --ansi --verbose --diff" + } + } + +************ +Config Files +************ + +Allowing Users to Override Settings +=================================== + +If your package has a configuration file and you want users to be able to override +the settings, use :php:func:`config()` with the short classname like ``config('YourConfig')`` +to call the configuration file. + +Users can then override the package configuration by placing a configuration class +with the same short classname in **app/Config** that extends the package Config +class like ``YourVendor\YourPackage\Config\YourConfig``. + +Overriding Settings in app/Config +================================= + +If you need to override or add to known configurations in the **app/Config** folder, +you can use :ref:`Implicit Registrars `. + +********** +References +********** + +We have published some official packages. You can use these packages as references +when creating your own packages: + +- https://github.com/codeigniter4/shield +- https://github.com/codeigniter4/settings +- https://github.com/codeigniter4/tasks +- https://github.com/codeigniter4/cache + diff --git a/source/extending/core_classes/003.php b/source/extending/core_classes/003.php index c726b71ea..9e89d87d4 100644 --- a/source/extending/core_classes/003.php +++ b/source/extending/core_classes/003.php @@ -2,9 +2,9 @@ namespace App\Libraries; -use CodeIgniter\Router\RouteCollection; +use CodeIgniter\Router\RouteCollection as BaseRouteCollection; -class RouteCollection extends RouteCollection +class RouteCollection extends BaseRouteCollection { // ... } diff --git a/source/general/common_functions/002.php b/source/general/common_functions/002.php index 1ade75d94..f00b1f816 100644 --- a/source/general/common_functions/002.php +++ b/source/general/common_functions/002.php @@ -2,8 +2,7 @@ // in controller, checking form submittal if (! $model->save($user)) { - // 'withInput' is what specifies "old data" - // should be saved. + // 'withInput()' is what specifies "old data" should be saved. return redirect()->back()->withInput(); } diff --git a/source/general/configuration/007.php b/source/general/configuration/007.php index 3a77c1ca5..5298a99b1 100644 --- a/source/general/configuration/007.php +++ b/source/general/configuration/007.php @@ -1,5 +1,7 @@ 45, diff --git a/source/general/errors/010.php b/source/general/errors/010.php index ff9cfee97..dbe3736a4 100644 --- a/source/general/errors/010.php +++ b/source/general/errors/010.php @@ -1,3 +1,3 @@ render($exception, $statusCode, $this->viewPath . "error_{$statusCode}.php"); + + exit($exitCode); + } +} diff --git a/source/general/errors/016.php b/source/general/errors/016.php new file mode 100644 index 000000000..0fb61fa16 --- /dev/null +++ b/source/general/errors/016.php @@ -0,0 +1,18 @@ +redirect('https://example.com/path') + ->setHeader('Some', 'header') + ->setCookie('and', 'cookie'); + +throw new \CodeIgniter\HTTP\Exceptions\RedirectException($response); diff --git a/source/general/modules/015.php b/source/general/modules/015.php new file mode 100644 index 000000000..0b1f17508 --- /dev/null +++ b/source/general/modules/015.php @@ -0,0 +1,22 @@ + [ + 'session' => SessionAuth::class, + 'tokens' => TokenAuth::class, + ], + ]; + } +} diff --git a/source/helpers/array_helper/012.php b/source/helpers/array_helper/012.php new file mode 100644 index 000000000..8aeb6d705 --- /dev/null +++ b/source/helpers/array_helper/012.php @@ -0,0 +1,94 @@ + 1, + 'first_name' => 'Urbano', + 'gender' => null, + 'hr' => [ + 'country' => 'Canada', + 'department' => 'Engineering', + ], + ], + [ + 'id' => 2, + 'first_name' => 'Case', + 'gender' => 'Male', + 'hr' => [ + 'country' => null, + 'department' => 'Marketing', + ], + ], + [ + 'id' => 3, + 'first_name' => 'Emera', + 'gender' => 'Female', + 'hr' => [ + 'country' => 'France', + 'department' => 'Engineering', + ], + ], + [ + 'id' => 4, + 'first_name' => 'Richy', + 'gender' => null, + 'hr' => [ + 'country' => null, + 'department' => 'Sales', + ], + ], + [ + 'id' => 5, + 'first_name' => 'Mandy', + 'gender' => null, + 'hr' => [ + 'country' => 'France', + 'department' => 'Sales', + ], + ], + [ + 'id' => 6, + 'first_name' => 'Risa', + 'gender' => 'Female', + 'hr' => [ + 'country' => null, + 'department' => 'Engineering', + ], + ], + [ + 'id' => 7, + 'first_name' => 'Alfred', + 'gender' => 'Male', + 'hr' => [ + 'country' => 'France', + 'department' => 'Engineering', + ], + ], + [ + 'id' => 8, + 'first_name' => 'Tabby', + 'gender' => 'Male', + 'hr' => [ + 'country' => 'France', + 'department' => 'Marketing', + ], + ], + [ + 'id' => 9, + 'first_name' => 'Ario', + 'gender' => 'Male', + 'hr' => [ + 'country' => null, + 'department' => 'Sales', + ], + ], + [ + 'id' => 10, + 'first_name' => 'Somerset', + 'gender' => 'Male', + 'hr' => [ + 'country' => 'Germany', + 'department' => 'Marketing', + ], + ], +]; diff --git a/source/helpers/array_helper/013.php b/source/helpers/array_helper/013.php new file mode 100644 index 000000000..5b7e722fc --- /dev/null +++ b/source/helpers/array_helper/013.php @@ -0,0 +1,81 @@ + [ + 'Marketing' => [ + [ + 'id' => 2, + 'first_name' => 'Case', + 'gender' => 'Male', + 'hr' => [ + 'country' => null, + 'department' => 'Marketing', + ], + ], + [ + 'id' => 8, + 'first_name' => 'Tabby', + 'gender' => 'Male', + 'hr' => [ + 'country' => 'France', + 'department' => 'Marketing', + ], + ], + [ + 'id' => 10, + 'first_name' => 'Somerset', + 'gender' => 'Male', + 'hr' => [ + 'country' => 'Germany', + 'department' => 'Marketing', + ], + ], + ], + 'Engineering' => [ + [ + 'id' => 7, + 'first_name' => 'Alfred', + 'gender' => 'Male', + 'hr' => [ + 'country' => 'France', + 'department' => 'Engineering', + ], + ], + ], + 'Sales' => [ + [ + 'id' => 9, + 'first_name' => 'Ario', + 'gender' => 'Male', + 'hr' => [ + 'country' => null, + 'department' => 'Sales', + ], + ], + ], + ], + 'Female' => [ + 'Engineering' => [ + [ + 'id' => 3, + 'first_name' => 'Emera', + 'gender' => 'Female', + 'hr' => [ + 'country' => 'France', + 'department' => 'Engineering', + ], + ], + [ + 'id' => 6, + 'first_name' => 'Risa', + 'gender' => 'Female', + 'hr' => [ + 'country' => null, + 'department' => 'Engineering', + ], + ], + ], + ], +]; diff --git a/source/helpers/array_helper/014.php b/source/helpers/array_helper/014.php new file mode 100644 index 000000000..99089d236 --- /dev/null +++ b/source/helpers/array_helper/014.php @@ -0,0 +1,114 @@ + [ + 'Engineering' => [ + [ + 'id' => 1, + 'first_name' => 'Urbano', + 'gender' => null, + 'hr' => [ + 'country' => 'Canada', + 'department' => 'Engineering', + ], + ], + ], + 'Sales' => [ + [ + 'id' => 4, + 'first_name' => 'Richy', + 'gender' => null, + 'hr' => [ + 'country' => null, + 'department' => 'Sales', + ], + ], + [ + 'id' => 5, + 'first_name' => 'Mandy', + 'gender' => null, + 'hr' => [ + 'country' => 'France', + 'department' => 'Sales', + ], + ], + ], + ], + 'Male' => [ + 'Marketing' => [ + [ + 'id' => 2, + 'first_name' => 'Case', + 'gender' => 'Male', + 'hr' => [ + 'country' => null, + 'department' => 'Marketing', + ], + ], + [ + 'id' => 8, + 'first_name' => 'Tabby', + 'gender' => 'Male', + 'hr' => [ + 'country' => 'France', + 'department' => 'Marketing', + ], + ], + [ + 'id' => 10, + 'first_name' => 'Somerset', + 'gender' => 'Male', + 'hr' => [ + 'country' => 'Germany', + 'department' => 'Marketing', + ], + ], + ], + 'Engineering' => [ + [ + 'id' => 7, + 'first_name' => 'Alfred', + 'gender' => 'Male', + 'hr' => [ + 'country' => 'France', + 'department' => 'Engineering', + ], + ], + ], + 'Sales' => [ + [ + 'id' => 9, + 'first_name' => 'Ario', + 'gender' => 'Male', + 'hr' => [ + 'country' => null, + 'department' => 'Sales', + ], + ], + ], + ], + 'Female' => [ + 'Engineering' => [ + [ + 'id' => 3, + 'first_name' => 'Emera', + 'gender' => 'Female', + 'hr' => [ + 'country' => 'France', + 'department' => 'Engineering', + ], + ], + [ + 'id' => 6, + 'first_name' => 'Risa', + 'gender' => 'Female', + 'hr' => [ + 'country' => null, + 'department' => 'Engineering', + ], + ], + ], + ], +]; diff --git a/source/helpers/number_helper/009.php b/source/helpers/number_helper/009.php index 0a520a198..a55daa265 100644 --- a/source/helpers/number_helper/009.php +++ b/source/helpers/number_helper/009.php @@ -1,5 +1,5 @@ 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 literal 81068 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%0AC|OiCQw>-TI4w^)G!9F9Q9(XF0l5 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 literal 47293 zcmeEug3-Hp-bSwQ5qeE00jyP3SCx4QWXjcRuT#dItK{>coLyjlnDHgv6PTd zmX(koQ+BjBv$O$2L4o4m8yjQGGJ*z8OpJ{OzcbLGIJ&8ZhexRz`}KE!CmSQ{%^Ao^ zNYmF}dyTaQtKJLsMWv_78ZCDR4Oe(4~XDaS#L#(wA(LXLfu(3C?x+2r8=}(HuT1g>?yNqoL&y zBeBh(ARw$*A%q(2qGCs4uVWZL^s8o=*}$1VaM)O@pKhL?>lk5S@0k%oyQH3ruOf^%>|LCN zC@6k6^sj$^`U!To{C7)sPJa&z7$D2<6c#pSR+fL&4HOmp{ghwX(j9E0Eoo^BhzDpx zn3scF@UQ&;SIWOz{8LiH3G66gZwnN37XG(<|1SKWiT_*huO@Z=-6SX5e>M3ZDSwv~ zWcfYv|B%EVG5_@xkh3s~Aj`kzOc(_OAIAX&B?=`gDW>iYeVB=ufg?55e}FBm>8Shy zM~tdCT!wWw14@d`L^1ruB?rS!Mt68P3Vl^^P97XAOhO_V{*bI=XxsZP&%0k>S6A-k zWfHG8rAKYE!lJgKdy%>(1GSkM%e)Q9?WF7B&lx%<1?KbH{0f>GasCjvchuF+d+dCt z-LQcXdmKA5PR9ZXE%Go_%AzoqPmY#%VHx5uRHA=fSP9)Ik0nF}5>qGgsmzxlPj+|g z*B}X{t?i>(rL4o1qo6>XT7)dJ00%g;(KKp}Qgtq!Q=<9tE4hOv@z+S~Of%-@Q%v|<)`HA(Cho*NwUguZ%<4Rf191`<{d zzQAlVH8b0%mAK|mAmERH;9!$M|8)g;!@SPk*

HtF2|vRyMFOEYuBV&SU>7O+^Bi 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

=S7w#+g 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 literal 30520 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 diff --git a/source/images/welcome.png b/source/images/welcome.png index 63b9108d042574b3f4b37ccf556797b18f659ba5..d3a2b3c383771f5d9206e05d5665c74178acf4ff 100644 GIT binary patch literal 146354 zcmaI6V{j$R^9CB**x1i1U#m%;uM=G#FRw#R zs%l*HPwyXMVq*OKysvNn?(ZHy-o9higr7dYpPn9GzrXL_UvK`synnoWzWgh%tP&6w zzrDLZIX!!Qy1%@JHEWEG;d*eE64iY5P^XW`dQbtUO|Mm4IAUN#!=;-_X zB_cd5I3mW|%iYb(&)m$6o}8$sr|bLrpucY*JuL;$J(!VKl$a138WJ!xK7IA_;^b(* zdwfMr$M*L1u4`a&c(BvlP;-2J_w{ytdU|vA_I-VJXl>`xGc>%mwv=03QkY--`0!O) z+fv`s`ThA&P+DWGubY#VcJ=ukuOYg)Fuk^SI=`{&85s8O@``|#_vHTl@#g5*Nyfn3 zPEJa^3(z!IQ}lJZdbqQ);UxVHnj9PIW@hEwwGkR$+P*#9-){@^yM% z+BUHAw_exUYjt*cYWu1uGife6l1WJExhyQu#lqGvrZ2&N>Ev-gM1MHU!P!DLqrB~= zqp}t_S8ph;Ez8HNVpSg=yevHkAR?g9D4@_!Q&t+A*$}ZakBm`#C6a180FN1fkR8rB`Mv<)N+@4dOpf`u{604O8|8 zaRTV*bZ3BvoA+kChk}~(10oIDAFQ4Pau8tNN%^zaOg|P|EWB}a@=tixDVBrZ?*c(J z!y_IIZVq$>zP(a}X|;9BlQebAllz|dN-9?dU|`Jaqd#t{oq4Ygh}@POi5ge$JZ1QNVvA!^>tGDi)U3tU;GfCh>F30?ss?p*Wy z`^aEUi<@<4KX&|pUPVu)dUF(qyRK)dEfU(pezD395BfWYeOm_i0tXIi3oCw3vKpt{ z!Aeh8g-14|D7!E4UX-rkli7cy#mI1Jmr}ijbP%NV!+{~S*$h~O?4DP2?Jo!j23NPF z0=uQf4I)sI&aRDdq%yE)yEi#+4RzYjI~C$NpvUF_+76g}Vka3Ua52J>O;bJ352w3p zsi2Wu(Oie*GJ)p)@irgsg{UxA-OZ_oe&e}iJ(F&9u~V$7WL*s72f1|eB~xLvi85BH z2}kxj7LbR6r_ImpZO0v^-w>6rCcv_l*mdjx+|V!swEG0%|49nlOiSu+ez^KDfJRc) z36r=vvTU+`dIlj_A%qreWRgnDz^6@{n_}rt$isxPkXqn4h2BZQ6{R5wZu@C-+Tb`v zpE#X8>Ej4tryu)R(_i^Dd*M3$u$g|l9ocE)b&K+FP}=oylX+4`iE)e#t)?_9_EvpQ z`SmM+{*QX!Z&nZ-nLCD2b`%L{Cy3nht~@w|6fWz;$DHRM5wR*xIp3V2?2|<7<9jOf z(9L;W*~QWqrzSPsJ)vtbLbTVS2r!KS+e1)Yhb>rE}V6xJLk(@4Y7-nfPHr+bBTTYrbUf5mdciPOyt_&t*+xt`PPrm6fTxv>#u zjD5H2rVOERy77G`+CS{*(93{7*w+Svvr=a=G?U>d_AcR3NTAXE-+p5|bC^N(t8uZI zrUwdbyWZ2tvkTO{_$aZ}bO=9xVMykLdCP%@TsYbIR00_*OS}8r;?}*nSdTb5I!T-| zD%EMqUc3bgT=qF!G!nd-FX-X;MhM8l6)AGOzm7lrKRxWBUWXkuRdaS|W81s6XEwQ* z#4=b?uSfMJR9f{%mPPCcoM@{s^_ljMT-Oz+S_p~byaw4kt-fB~{9z_X9rU+n|8915 zF=06QQiRX-mMss*5uEJI7$w2}XNEj`>y_<0J-$z_kN0PfK6>GFrs=7|^Ps^vrNWGZ zm=&abhpAh-gJsuNUtSUdgO$fXU~4Vi#_Z;@?`NySrdI=~_0C=b()3`O<-eoFG*&-Ce^L+f+Z3a2xgb8#-{+Na~FR`-Fe3IFZqiOp$`(UdVEG z*7lk^;J;Y&Fr@I+Ez7EK9 z)z&|fg3$fvtR?-e=T#XLlX>|h@o?7Bw*0$ddFqj1Oa6GFel1*l3-aEX%%R#Vcq%F? zKHct3-jvGb^PQmI`=NZ`d|cz)8yPC!I`#MI%xdQ{y_%hWGZTl11VC~TDs=!q>5s27 zcdw1AeV+Bp(|_42@-+{d-w#Y{y%9<+^KqEGaq8 z&h~HJNL^(Q{VBc~mZ_=9#&wSL#`MZ3nC(t$CJ0sLc*Ey0gNmVQ9~woWZ4o|5_#cKv zMQRZ+i4l|JwKw5S4KJ}n{1 zbw>q%|BA29>UK8A=;c6Om;LYBX>mD_XyLV?53=nVeVAz#UiIlKo{`lE3xb821&r;n z4S45yr-?T9ecsKZpouIaKpmF+0Fh=(#eh1(hUSS@sNb5=FkrI`N! z$;{q}_^^-2lpq`J)0%8PN;(Wy#>KVUhjC1lA_8WQ(k2Lf944R?y}z)L1;bVr?}CEI zl|^N>_R~*XL#w^ zOQn(G3*+bN$ZA&QuV_}-h>JN~Gj*|yt~ZW!_X(U{z zjd2nh{vq4+PuOzeWQoJ2Nxg^}{(|KMrQWXl5#lW32=#4i!=QtN?mQpoblBdDi073e zM!-Iz?!DvqY+vWmo#$fzTe(iheZjS(Q01W;!MlRO1+Vgh%h8{8{qII?hQRh-SQlWP zk+AiK5KKVScA?=bnN_`!&kg5}g1-UC<2;W9&d2>1Hdbhqkxe=|TeuMfnUl34UbXd;5DbhF#vA^;^ zRNQ@+$;qT?FlJcSdPT4s_;H#E58Xrx8MNoD2*$PLvgqTbHfBa zdee}(q^P{*mdzFCU z9DwSbRXby!w-0-Jd$Yp!XL|+MC9bYe{IH`63O=993oEEmTJ`$8A0|qxk2ydOL9aR0 zTFn}xOZA#4ixSm3!%e5E0izsOEjv!9hf3`aXt6f}$Isk}RgJjv?q)}k&5GvF2e8tSCL zV(sOa<{jcf&pXAgVsMUUX(-mt{w%y7nXx9%&HD8yMDANx3_rqVic-vSDo4<0;2upb z8W^4}r7S|0M<-aTnp_2kkIIA`7nXKVR~HuTBk6o`cB;TzgMyjRPm2*#Imql5{>mHT zi?&Z*JXna|F&B7-;Wj=n#DL#zP|lUTZayP*>+V;Gfmfic+g(k=R^A^!!{DSvvGmsu zD)D*xu(z_~ov88oF=0EycCoxbv<+Y8(x=VYT^$bAey*$gCzkC+;W$w~q0>>@N)ien zK3geK2_^U8^>`w15+|3PJ|e9UFy+;|&L7U@r2vvL>Cz2PFunV0dS|z|*2V?)vc`&_ zuza4V^NMl!skZ2M{SheFRCcz3Gkm@}8o3VT0xUzgcZ`Zz`cJb!5iEx)is}}Z{uk2= z_beNfB-jUm^mH;2NNx3|p~^6}Tn%*IeCKfyhJLwod$uY*pLjwUBtZ!@k5sOO-69kP z8wZVO9G9Q~a6XvRJ~0dkR-$OLfLKD0Hx3xa8q z(r(k#%h{80()Rn}K@Xp-6Da75!C$gTcCForY(dS~)LPJJ!V9Iw`4BVQ?7zap3g!YJ=Y0 z^YQHNa}=-FhGy6rbDe!ax51BO-19qV@c?ETO>##j+(<(qp{n$Rt?}^;M_egKz)>8~ zgs|Wc=|BfC@2^gao6G6L9i-0i)$+H)jmZDA%*HSbbIaA?fS%>Wg90}6Yhubln|d}A znPvyrnl|e+z<8qIV`n&=@p(|!c&onse}Ev9%e6q@g3ig)^P=78cHUD|q@$6eSn3nkZ#Hr#sW9WZB?$V3xM0=n(ZsY6`tHmn(?yq$?aGNGBj*9YRvvAoB5KKw#339D` zZ(gaUA-xQm(2E@{M!}PMWY57R=;R?^9K%c#f2Qhe7AK-87VP2k*ulg!=$`#)b@jDY zDMq1IwR;egnF>hocwNfGn70D;UUgKhK~e0Rb1eja#ZXoW5clAU=7g!xNpwbyn4(t% z@eq&@Orpp$?>v00ZP+;pzsP&i@((1;2)}J9KR1TSDJbtuosa}II)7iyc8ir~jz(%? zL&sj6+QZ$Nb+;Sb;}I~nrjElvIX8Mc_^mG4?HGHZ6MBXL6EKdl9@9m%%=myFuF7!l zd1p1p{qRdQHKUzfZZmZ!iHY|kE3(5JbXmNz+LelntTH;NJ@!!B6hb?qngC z_V;Evm#0x2qgzIIC8?j+M4BZ;L?xI+UX~@a%C4mp#QD(*XboZ#)CIq;GtJbpM*F`` zRvmLrqmvZ>jfgo^`B{~u-Fe%aQU?0Wl?69umtFQ!-DqdLsXz{0%M|-j;s?2AB+f7! z68AdLU@I_5Tvcrzl+--nM6IUQ*#0qVo<1$OmVr21S-NaT9;&mqTuwv`Y0}& zxx|I1Jg_~P+T7`B{P)JrY!`-DwZ0BomXahx%7;(-$wG17%lXUN> zRClg$n%DFA7)XXWlE;Yr6iDZAsgaa0qfEkxH~Mq5V-N??aSuWvb84`}|Fyj{g?-u; zZ{Xi}feqEobe_dwURNoBQ3!By#6xC_x1{Yk%|`5CMuU5-i;5c)^o9}MW1zFM{ne~p z7YwW`VDBNtsqFf{Ama>?aa;KN>*{&SV|CwbutA9~dY0+AvRloQbzV?!B0gbr)J$SY z69*Pg=A{LwN1_vd@Mrd|GFw#bUMVetX60m_51v-D+PWu)P4(-oAa{uPOFNmYg zNe9Hzfj&Y$Mj$6P!t=&g5jIu$t3veXT4|-mhk_wSo%?zB$G{-wB9Z-{Gx@!!5(PWX z`(d1*kGoNvkms-T=fo;RAu|BN_-4zYgBaIN>tX&og%2Qjrw&4{>5V|Ewyj|bFXZ6$ zZJPSOu!BN|LPxh}>zBF=D5?A3Yw*DB7^W=;uj2`3lNLKwW$ut;e(&RT7Y^)3Gy~tE z+IUXh}3 zz36-%cyQ&*B@T~p%bHxyOH(8S9zNM2vy>>ynHej*cXAt)9(C^93<_4URzQ@;^~V}L8OyCSgAE8l3HziUpa zng(oVK>s-7j*UH^4AYWujcZZ_bAehxCWkAd{5KggRW1pOx+x?~OOJ=`?;j}|T4$Zj z2&xwIu-s^(BpAOKv9!Xs%Ty|xqvMRR{k0{z;QGaAD+6xjb-%gZj2}%9A4E6hf4Zer zBn@_)c)Y3-{DE~<;#!T{lmvwiLajG zEWL54GvmdrqR>WJ(gK554odm zF0O~sW?tiIk4eEvwM_D-9?Ed1y#(@LlXxMQ;@JDJLox$f|FLvp%}UG&-ZF5NzJ_zB zn2t<11-$#yc6%2FaS5L6f6TtYZfhGSQQfGZcR}|-{t|TO{XD@ez<-6T5k9vv-`|JOI2{C>~hHHuiq7QKz>|vKsVNq*kXq!i*vPGvBiagozniu5kDuhDjB>EHaf!W^L3L#}FdUaD$88wdP%-_(L zD<#cBFvH;J7b3jG;rftTit`LMQhXQC|L`}Ky*3Kyjudii+Qot*Oyqjp#l0ys{_1o#1sHeP!<<_bJJx9kCY+#AFiNN z>BvxNi~yRmGWWb^%M&w+B!eu1G5rtarObu0Ccwhf+WIAb;Lfd#R4}rfM)vrRwFrsQ z-Ve~Q)*}E%DW8sV=3D~#NxnL(>=ZZJba#n1Jn<0uh@^L`tEcxNE0epw)ww%>@+Mf+ zpI`+$%jTXC$*Ehj!`0dB@BN}^VOe&DhX+6-3X{;Y=FdLc)_I*yF5_)SnT_seS3|>R z)rR@IZQavv1BZJYA15RJbbuzbPtg2o^djWj*>z``v1}z#H0;Wd#9gSL58#wiL z^yx`fe6;?|5Fh}0^}k=ZgZx6EovSXCOcLPtVA91qEWgD?&F5n- zfD{nM>dM7HM5u^{EA6IYD&uSNv{$cs{o9$xGP-PwgDm?$xaj39yHKOpLzDvze!a}> zQM;WX?#19#P)3y5vk9Ox$(zO;4(z4aywkDU;NlWN*W&GM8p%{>&_Y{CcRNB9R5Msc26?m1kOFVa1J-SFOu_{~MM_J;^M< z)k44b7|T^X^zfl*O2HY#aqW?DKNRzZzW=Gl%bbBgo3BDWFplHOUg2+UGUCM~;9*J5 z`jg$7icqMx6U%*?G0_~xZ2dO7@s|nf0I}EkkJ40hjH!*USz)JDF7Beu&n5u`p#G~n z(K!qwYDTO$52;H3^O#$%mTuqm^|j`*Z|Tm44bkP(6LHH*ZRY3%%j==LUCnyuy1-gk zGQl-xgTBpnq~9@$Ja%mc8Su-Ph+3)p8}bxC$NlLUAOhM@I4ud6B0Oyjr|GeI5Ado` z{p-iPck~1@i7I1s3QwkRf{jWGr<8sApcJ>fevrn+G3l1sFGysuN3Ci9=jX0-dQn6*|t>p)oIkV3AhMR<`gAdg~k2}dHDT)w> ziNp6JG?>SaK$-Ju_gM`M!21KACiRF6@t(SHxkX?EDJuRb*a(kHp|0m?JAuHCANwy2 z>9lQdtsXaijt)blyu;Pg)h4%R?a0wcWFvTxmb|c)O6jkMNO@Z1}+Q;=tFea z?I*Ws!{yatI&aUBYnKD9g}lg7qu1Rv-Rf0Hul1BuXZi5!K+|P#%LZg^f4B{va^Q2g zyX$OfEK)CkI&io|`Wrj@@fBBxoQ<3zh1W5frF1h6%K6VMO4oYgI&~+C9B#E9GJcEn zjT9JFw8Qt>#s~v+R9Z>DdeB(zSUj1mc1oX-uU8Dlc(9II;PM}|p}1l)m_{*lyEyze z4$*f~_n7KN)yx@L(=OkwVWXTZ)op_ob_WQt8`Tl$aEVB?hAnX_I%JH@Omh3^RGKO{ z%UmSrZ3Ds@xY}Si*y%i_BsF_u@qIXrPD-hMjPm3gFLaof=Lc7xWNx!bf{5CSif2GA z+DaGI`XH)d=+~oPQHzp@_MtX73fhRj%Nm0%zBUgQ-7&OBWv$NRMAx5df7U`0T&}u_ za(L^UKje!oJ@xjsmNbWZ3KzPsylQs;H0*7YHFr9Huaf$F!AT2{)gjTRi(V%^4q`mM zmH)seV$7_2Tg_-wnffa^-ONz{!a;lIl?I`p{DiwDBWEHTI~8;s2+o5Jbnf)RM+PT^ifUVx>^Kx$8w z%_PTz(QIOrhw}X0XwI*LWkJYM8H}ydb^|B#G!bttEMp$cXxFmw{AJp;BSp1DsH!hg$-`Q z;pUPTul4GhHXsLT?{nvJiXk<>vEY-6OMqk4i_A9}6Vu*wuYnLAM-en9waN;NvG#IZEvpfcaNqd8+A$mAJ0B{t*?g{lUp`TRYNCsM{kgI&(ISjJ@m^5GtQ-KD zb7Y6fDqm4zL&()B=nf+n+_2kOfAd;Niat+X9lT|Xa-+yfnLEHw)$Tz2V=CB%L&a%~ z=g8lYyg1@tkH-Q-bnYNO73PiRB#&twIE>5{Wdnwo!E-lV9@N1+kAwvM;O4Q}NQ+jh zIj_^;`E6S?oXEp;XovD_XplUuizYn!{Qa$GDs;zH4J)MWI5YivaJ0X4_JH0lLpV2% zJuVE|{|$gZXFXloYlnTaw416p5)VnA8r;MICqHq+L}w%;f0k`Wu!`Im7xZXKT{?F} zw1JU}yNnTiJB#x`5E6hi zh(I2krKPsIK}2d3@5yCz6;e6X>H_l6w{dIwlv}hp3355*?uFY;o&WH^xIaNWMQbNVa9)6ajia$7@Ku2;>=)(zI3; zYxtyPRa?>VtJ|JYx21*Ylyp*Xa|Z90^D7#V_LC&F=zzXsm2#$EUw9og+_LgzeC2Nu z$2=RINh89EguJ>_)klK1T*s>SF-O|LNU$^wXezmQ1^W-Y5xVrh>do82eq%_pzs zh%LF6H*K42hL28hC>@n<_i$_5mLqrAh^!zDIm>YiMbtue%#Ldjn)HaR8S3<(OmCSU zdp0WC7z3;e$%ObW=&MvI))6{QM*9WNS!j8#Q&Hv3=e<>SL?2q*J9eZC44`9%t!vTU zubnGTnV(~)&>;divJmE12=w=J5SxdK9DIbzSlm>G{k-T@wb)yAhWGtZtZL4Tgo>$~ z9hQZeURAzyS=vl~-9q@#?USPI6w+}T>WZ8WJ{rJ$or1-m6^Jza}rcOH$fO>F1NkmYdZNDD21R}_efWf=r zlfaw%101x}JGePgTRc@&;bw06N&$3j(fF1HG*QqhIk-+ zguR}``706~-KQoPP$&luvVm|KG>QRACjT&kUPg(rQAwu>CBqLN`e{+p8fzX(gUIjb zia@2IZDfI|zNgT$1Qq7b#LS(-&Vv=gN&l~HFX4%f5ss7L;MsksW$eAdqrR($kl8A7 z^yiF0y3H1Oie8^xa2Lj68e}EJjW#yO`VWS?n#O8~#Zp@4LUxl*%#lr!QR)^W4V8ze zu~$T^hId!LIfN6Z$G>E}gfCV3x#~E@s@8kglC~kIr>)2eK|T-skjcZa#Q9T`jW+%Rm}F=P=Y-HscPUZvtzuNGJDJMDp&#RJR_ zy34#B9EpUChE3_*Sy#eXNk5)Y#$EfAV7pS^7w^2?KTH$J(Cd`FAgqPobIJY+Tx5dL z7)O+RVw71i59SuZ0cG({%F(g`oXW|$WTK@C77(`J=_9MceO;oBC}2W=YW5ITzp)fH zMt_g7{m^TD4;w!sw}F2YM;epK`J<=Hqf$N4C2P#fS84NU^~7PhZz&K)CW+|Aju7S{ z10br6i_Y0rFGH@{;MmQt8zA7xbRHP_3kT3Ev(bbF9+>@wpC86F!V8e5Jr{cqVmY>1 zhVa1#^)D^?uVg&d00tLKHg=9$ zAnKwayS!x!5=71(r5ltAE}@?4umX&|z@pNTol>xK9;4fCw7YE}Ht%@87{EY2ExT@ETgV*?vwyG6*(%9KTTUT9Krr|q0&>VfEMan&OHYE^N63!z|sRMyEl@~ITgfPvCp z=az4O7&IMLJ=j3pK!=qGXreJkY*j6dWP)`0k`;5!aN@v0A%Oqj%K+&JW7nYKVBU!7 z7}A8fLh5a{0{*N#D(erWo33!NK(asmPTz|6F1ofN#4hp#B*=yURBYky=HLJYg4(fL zMc@eGzQdp#)6KDO+9hhf!hkV?dSe6XsS|(@LdulEgvl4f8=Y?zz8ius zrjjYQB-Ao?#7>#flZJ`mDfg)f*QSdNG+OtFjIEJ-)5n}BAa3e{LIBKqe1gebjNY(< zfry}Z0?l6(z(#jI1@fEVXkQ|4e%F@DqdiH{S;ghi5;q)b9@*Jhyv5n!-PUYbDF zVU;*_UxC_7!IK zIA5q;}}R}-@B{p2eLd@J(E5prUlOodi$9K>3rQTbnrpRn@U zbi9MhbGwgK84V2Re4(#ey9&vWQ*Es-NLj{z@mYTM!K4%+u*D!=!T{+TQ=KU}YKMtn zkihuyPnO!a`t+LB;Z5Lyf`sL9haVz@w_I@UdhWl26> zGTGC0m5`&lxm{_@>k?8EQ*>puz#S0C+hDWVqsiRYxmJ1%iTY#n`z4W17jX{EeA?sqn!W8m3IT;&es}4CIyCq4W1-ys#bfW~ z9sj;4c1ljNqAgsz{~Di-&6{RKVLgS4g34)%&fmbpv4fJXARZZQ64@ zauDmcdMpE;+q@_#n!*tb4I9;yRR=8u;kU7KGF%WcDU3&y&U=Gm@2OG&6%Z8!s=YhtxSQBthm zqzHcPVs0i~^P@5lWnEnx(!eAyRdP%Cjz`Wm+suH(?g&CFu{7bu{f^HRNa_~S&g{vTeb6JUpm2sLG>6( za9x;$dCFi+R>7cZcOuHr2a(pxsr&7%O+@U;hRS|{ECp~W>8<K#74v(u*W1y6R}JL6TXG-?iKe@v>D6H4*gp9DkncBfG~e)s0q=P7#V9v9_=1u; z31&ox;qyHrUC(I6b-BIe5S$U8f6nmUp|NAukGvL_Xfc5qfWfBJv;H#o)0+M7{zC%_ z3att1n7k-Q43IyW8j>Auq!EIWZO9}9S+PsUNLqUKoS)c8iz$;E*wy6}HGiHd(MF-M z;d9v0HF<=cwAJ(pcl$Bvlmtd~%|GAHrs5%LIdopRk_hx)4^$cct*JoV+^Y~=nH;Mz#iCdj(aKHoI(lH4?? zhq?Z>&?Me||F9h(Nn6W8RK^W6akRasWTdAn#N9<`)?a)090qF5%V5aoVs{dB=LDMc zx-lqRlu>lw-J!xfE4GyGPLM#xoRym@ogRnkH%6;hG`9d=ekJEyAiOK7tGw4u%-bI(|8F9qYP_;0TAXHq~4(6DD3~Q9BLNhOY+J*vtp&|BBOR(XTm`NTfbf1hpCzJ;qol1*?mvO3k5tn?NR?UQX ze_UE=J5-i+kI`hZCiU~a6|?gBPmVC&L4*L*BLH^e3Y?s_%KUsJvzJ%Iz>q$EoK)HK z(xY6cu+?n|oA={}zFfE6tN$?W2Q%|?dzf*ug)e-MV{m z62R--!<6$Fd6evTVAtIZsU1rnpO{3F<*;n_^C_9v*n2Q`k49+cN-jJzjp#s|&H}>p ztjqU5+Aqr~`rGnSauFuwJUV?wAnZ2Z9lLdS(g+nALmsvnfnXX5hNY7{@XEg%`X*SZ zhJV4v)KVL8Z8-I7P`H09h1n{1&ewkD$Hx;3JN-2=7lF}f#Js=0=$NoZVPaAsXO2!& z$dtTyGCZ`>{VI6hCR|41<5TGQ-QL~&d<Y^2dXnSfoHl0f& zf?IO;YK{6oreTThUE|qID$-9S=QlOAUbLwc#(_g^VgJ$>blnJCZF@{>9f)Z#47xm8 z^_@O_xy!?d*8q%4H@`mx&mGMc?gWh1DfRH@BbNONlRKE7>O2wlJk`FB-8^(S| z-^7Dghl9Jp;7WJ6> z^euj!;TYv9SrudA2!Fj8H|g-hdrE5&zU(F@-JDZ`zjQzkHhKlS#)}P?FW8jM;r8Kd zVbDhq7Dz9$2_mY2N9Te*?-G>K46T^3;tack8gW_!zFz8bZ+y*ZS*^xG%ar&#N8=Oo zKTjWFK|+yDieT%m)y>9dC#GfnR>@iHZyyP$J#R8jdSC8A-f>{+kgudgr0)ndI-H<%FaiKr-&K$jc9 zHq4-JcP&Hz2&(OPzyt30UHunhIku15vc#_m@fzP!v&Q+nT)g}I%D&vDy#zUb!*hI1 zz+QebO<%6(|9MUZ&6^;xZUPx^qPg#Tsv6{cQ-fPSX6C+1X<=#fGt1Yac|je2i2Hy_ zGh^~q#{(YLF$NUqzcB4;oZL{F;nl;)h5m26!FT8WOuCFxVZ*8WA~{o<+k4JXUKYh}0q}HEyF~fpcUAQT zS9-TCJ&e?zvfLiOh45JB#a!(C%undozIoVftapl-=bNy->foI&h!J3|H%=@dQiUr$ z9?ewq-)-z%ZR2F`f!JD{_s6!OV|F`1PC$WfwCKF{{+3;ZiAFO75&`;graA6;N&ely zi&#O8Wp4XlX>_|BKPxw%!G??0I`Dc99^=r*v{xWMTdKf%oNklFUpvfpocumRKgN!; zEclxDOSJQmY8qB6>V%9-c=}xPgMievx5C3~!R3>y#YQPg1&n5QJ3l?IrYq9oC29LV}S6Md&3K zP@mKB12n}AcW;_RHGN%nBp5xTK@&$<;KyDRF+~Z%j)Qt8?(rnaU$jk=M|V)~{XX6x z_%-TaKup<)eqTdc7lNBGG%y$-yGvwDu;IDk1B#7PO4t=Gi7iHldsVMZ`!O?3M|2B> z&)r#X^{)wC)+{9ccMp^&L$qiF5x%#*9FHxr5`eTop97p1WhGCOXxmNwazB9Bij8}W zY#(ff#i|udgPXG0?uXV*ad+N$s0{(qT>Y~Q?cCF8GD|W6@JsPTsN5vPWAQ|NT$hI? zP#M|l`i}7L2`dj$yt=3C)whasWtcYYK-d(ex|dT+W}})%y>(~t=-eIkG})m-O=6$Y z#7m6q85~H6^*!-+9gg@X^?QyxN>{zECn9lkA@*$ck1G57GS_kzh27~DIIN_rf3~HL z1ri`$S@W=Uc58pa2T9}1x!?r)M{f^!`5*KNxt8Wm_mol`UUOhy0*1O88m9LHJ~Y$0 zF1VMk0_!NHLA*vxSTl|ak0k60sYaNjn_hflPi_!580RcMf4Fu8qb>fDYuc;eR|$Ep z-CyamGbNynu?uzVzNQ?XKVCBOZc^$!45?I`BzP3ZlMJO?C`ZFR;w{K;_KkKkw;NkHxDNTsH~<=uh8R z+L3QOal^<1Q>ptcU}d!;U1Q@c?Kh!Psj4r29V$@r{g3C($C7PUP)XVjUa*Y~ly-fm z%8Kpomb2etGF{HW>=Dc!VscXa>_`amcjSeFE~ zgHvG3qN~9XqubH%Q3Yzo1#o9^p)13NmiaC{V~)2kN-J`j5@FI3kr~m+YOYaJ127&S zYJL}zh|uTfd*y<0?n}p-b+5#!E~{hw0|yQpT&tgH`TZ?3!Wz~E@*bj*^5$vnO}ofw#!lej1ZPMnB2YGSETSi!JG+?kr63k1UG%Y=UtGvf^D zLI0O56W&feXf@kom(WQlO-Z6mcRSN+4v!czmluw$f~==f2Q3$=h`wo#Wf(`<#rd&9 zdaJnsnY6-WhmTsw=kbt4c zXE<=u98t%DZ6sT6tW3a&2Og+&ST@E<_HkBk6YJq)!(jh@Y|O;mB>s^K%qh`6?ND{R z1ng!F;6tgy+%e-tbW(j}u~b?}?l|ex@sT@SE2j#6^Rl+3jAIA^7ADX{IdzbFxhKa3 zyn7Fe??jVCG2a+EJwc(;85rAHQ^brhE zWhuUYzo{7D%iNgDryEFblkn zYfJ~MIX{?wNkEk9@_ot+JUohtRAHNjJ+f5%D1~a)545`RH`=T`;0fF%iW#EFq~$M?&gaENF4_J7Q($4ADCcPb{TbUsprLABO?`# z%AO+5I>a1J=qYy_27ZyB>DNhSiofrg=ySp5n)|)q9XLmh8gqTv3emqp!#K~B(4~Jw z83nYieN832?4X)Rel*Efw;P3z&-E|w86^3BB!wdCxf?H*rVUw=Y{}hh>gcG`dr!`G zdt!aB1u^1u2#g~(4UdnjN=uKf)DfYkQzJ8p-ztj!KcszSP#rjQaw;6W@C0yVC7wbc|SW2baLa)UQy zPu}$(56&{*e=%1-BZHa3Ss+u&;$(}DJxC~u400-28_+?%Anck#Cgv^lm@#A*v%&G? zQaoXmt+{1$y&K-nWLYDGKWqxP#^cFK<4jBc!QPs+1|q!1K*hIb5uB)=e0v-=XlwV8 zBwBmZi@eJIDG4bl^{MIl@`F)5IdMeijMz)``kpl;-GNxw@Oa}d9^oObB!&vUUS`S} zueLIF>24N$sP+ zKcOyI`@m@Yw=}X3@1cR7=(f_+IM0xVN%8@DzW@?=((MTjL$vF!S~9Spb7ixe4PB{Y z4p<7shYG*sPWjxTM)8T72S#B}Op>g=A-{Wa^qxGYDGKxT*`@K=u!l`DXX9vF(nu|S z-a7}_!Z1v{JSBbb*+8|#g*KR{3|-^;4b@zTfbH+MEtYD0P_t858yWyy&_g;7HkMi; zp1lkYI%Gt@Fc||;liAL;g#SrW<=ImD-VT3}i+oXJzU*ib++(K8iu^Asw6X_l9s6)p zefUVtSuOk#5&TO+l@xqiF~pA<&%uOa1f6-d6)k{FJaRFNVTIquVR`&HvLPjUZ^(ep zVTI3hi4~cvMzY$ov*ML#ZlK%DfA8QiU!ptI=CY zy;v=I(h;fyljAy5(UI8`)Qk^;_@DmkVdYL=SK=Hoab;nCBXHng#L+b>a`X9>;3C$< zf?5YFp4gZ+D%iQE5Y0`G2XE%U5|AP)rZ&B}bq47D!6^_q5f|$yK$}v%&C;;?cbl{$ z(fufpXHr5%v_$VJ?~x1#(U)IpgJ4=*DVTC>sZ4}pyA}xpNWub~8|#}48Uk99AJ_pl-{SIQJ7PvF3q0TJ;C8BaH~V``hepmzrc8?eNgE2hq)IFDI=#u%AeYrDhVYcz2g(Xd|!O$CCa6W6f zJu+)u(P9%525`cu6e>EeB$5*8&XoV!q1N10Oc-q!NX;S=n~gHEeBh1R&Dicd5xK;W z+D;MOo*;SgYam$_<}rPRRm!V@2cT<<;Z1Z0>D~-&Czd@zw@1rV`!)wIjHDGq0|oRa zNW)sjFQbfDv1fG-MkmHS&VDPE7UdtvuHH--LUj`7rtvglppL~Tce%Oh$mZF*U62?s z%_1L`$M5=EBBc5zm6NC!Q2p>l2m9LK(TU+6r4TJ|g*S>Y1J~v`4q5vQKGcRbnTgw@ zV<1o6(?%}6LVeEf-1YhttBp^{yrI@^GHyR>#|;SbFl^Al#;Lmx+-D%iKHBedw6*L` z_($VuYojiNy%;UX>?>!vOHrp+1+p&}rB)-PCJeiR_fRWg8L+J> zT`ad-4H=#NIo7&7s1NjjsSXE=KF-)%t5adXZ8(^+%Et zROf0iPgucbx3}*D=H&3%Ri%yw9Dp=`?BDV;ZitX$muw(%JF!3>IL?vs39Q;^Ia5X| zj|DCE8ER&+NL|$H0Xny#G>d?9fm0pF>q( zGGFRB+PPlt!^6NG;S(#7;2k0@!(RPPT2qwI1A+#35@mO_?6pQF144op=C`6B%gtuA z^-BVuPy#OJKrX#>{li#Y+?G7t7S9 zHz1TX@UWV{h)fZ~0RrYj@1rSu12KTGTelT5LW}lTpw{Z;u_dW5bQHZAV^Yj=-XLX& z`cJ5`O|%gfNIZQNxo2s`Jp)CgOP+929GDFuUxIrCLDT){Bxht@rh*zMbDf4;4k+4n z<$JN^Ycpi#mVu=0A}1^12`AG5Q>06r|6NM{(qkS|r|AqZB{mX?h@=$wq$i0Et_is_ zRoRw6;x(uL>xO+(YOpobkA@=HN!FXwR)PWWw0+#JY=k9*TYRu}s2J4al4Qvje%^um zr*zB!U2ehD|>RZ01rf6>8McUg#%Oh+y=e9CG_7`^{)Apw%W`gyo)kv zHw_aK+&zjt>^glppMYfy7{Eg$@af&dY}~v?O={Rl=-sQBcf8yJ^Xv@Yno~0lIS8Ln z3?jq!sZ=<0!Wan$Wb|K>&8^GJ0e1{v++n)OrqgqfO$;a6@GX8o%*CD%!G+tC26uBK z;AG=oi6-#ErfLYxq9Dt(w8he#T@@by+4+6aGpuoFt$pK6k&?hF zEoW?0tshK|yyjJ!L{O;$;ws(05f+U6+@TEB63y#hjAO;{7fevf0b8F9Zy({Tz{S*L z@24k5ZBoC0NuPQSki!h~RRh@pct`)n!)YTKqck|aWHnyp?hy`|vj|4&y4Lk|klpHT zLJNe@XBs{5DhWM1>nxonk{qZtMhH!|1_U&A*yHE1!F3Gn`!GIzFYgT4?954-1N?pN zrc@omojoT%lD|t;)2sacL#yL`-=HIFMCgJNk=w z*x72B{u(rXj(HCJ2R^T>yZ4r-N6k<=A-4Gz#chpbdnHQ08encp6Qzd6GW9un%SzBA zePiYC#rApK-t>#D7%RPa1H*jwh$JSan~KWj!c3V%TMJX$Q%(&%C0Cul^G%Ycv+%i^ zwp;uUfkBZYW#y@>9%TcHluG8fIGS=Dg^6QiMtj3WDMEee_KrdhRIzY(yNq@l*6|b7 zzbbBYHiyuF9x}qZ*aXMHL~l#IHkLx|bc9R8lvc0?Kb#3FK{STj)TFXHuI_;ykQxr( z=JZ5<@+)z!#Xb7tRnQ&^cmK3h_u3WzYAoLZ`Pa_me*anKxu0E+kb`^Lk&eDg|Dha< zdWU=#tI|T%2v4EoD;}T2WIHZ2gsn*AsQ$$HRBp-OFwq8e`UB6iWwJTdX8yN_ukHI2&&0kj9UaZYUv%(DoH&U^ zu};}x-`)8PA)A$Wh)2^~=vtR2oR^N=4$f)9@b-8V?gGo2p1q>1MQ#Znp+^DZ2?o|xh#3k`Rk88^(=uGK zBY&rEIvR&|hjUfMPBemCcL7XCnkA^zZt@mishi(PM~})f z1gde_vNZOSy6lH>rch76FGOZ=+F>9Yx>($`#2+#|=rI_b>KcppWtA&P{L++o%uY;H z&TBEFj_~?dcubm&{2@ENz0{0T_k%(PF6trm_T17VyqxKb2KoPkb^B2*uM}f&~St;E)K>t;`r@r9(hov z#H$5!<+A)G?VG`BVN@A!9nefzS%ydY1kWaoOrj3%SqePb&62LcdeUj3Mlsn`l<+6W zl_4GJJEFPvG^7rwiX_8%-i*Pm2WD3kW@Q%eh~=t=uAG7xlQI2ixU7e$f#HIP=*8ua zetuhN*r_R^LQd~b?nu2A%KT+}TFD=R!9nKL$L}yH=_c?69x3nD|ph2?6JHlU5 zJz)Ekk3~X?5$6a~ohdV%NW1b`_F$hRNj8B`VvybBoJ3~A-hGS)qkc?R&s=}%NTq|` zH}&43z9Fpmt7$ndf{<^hWU|IoyT`91q7g-ou{DYS=H2Qu+v9AS?A^3a`Lm{!(tE0| zY6=KpVqw}1^hiJF7Jg{i%q9)8&m?tSa5S(TLTlFlh-T8ZiKRM(``(8gmGWE4T`5Y> zQL{E!`PmatFhP7T*tGboU7PnyzmEX7+i}`=(mTAL*~jeWH;n@k)F@|;p6AiML<54f z1G;dm3^@GdGJ=F8<4OZMUa&}PTkm;|H%-5%t8_WxCrAh+DUUjT(a_t9t4XWl(Wd;| z9mC2<{VW39}^+~nv_N597IkFuHC z)i}mVk^DqamJ6nQdYR12^x;m!tA!58?A?mgY3;Y@3fHwTE1?Muaf3|jC42LYts%s< z+_9rq$DzLw4i++rS!Hn!w9BSJzpIw9$zoIsz6#nwl)wmkL?k9ZP6)a3kohSXHF6WX zv&I##Di6;(1vY<&mC8<)a53-Sl)w~m>m#u>TFPT7;Tc6`va@=v#fKKdxhcbofi5~* zJ}-{=F2OX8bBu80qx^IaRCTh6$*if~^~6|LSA{a^{ChMf?b5%RzQ<^;bVB{J(ULIK z5qA_b*YU%!ZJ0Yt@tlvtGov0exced27+Ggs*BJLVn77=Z{Pim%dTdU z3xwwj@@Zc8d7hUVV=j~jOsIVsp^jKlMUbEvhM#=@ahSvhO!jY@Pm~9Yzftl&p<}^j z;+n)rxLC(uG1$c4S7-aj-Agzgu!$JGW>8>xPAYMwu*G(|pRJ0VF{`Z^*jfm$$nR^P|zP%*@O$VZKSNSSRajhMj*Nk3h4B6pCB{ zPkZh^?2_(#KiVeJ+e<@IRk4FrwuhmJ?;ZH4W$n(Sv3*by0m#azub#4TF z(B~V(YX=~RnDua4q<~IN()6u153R)z(Nvo;&7@cVGe2p|x1U^x>+V@0jI@+eB{>Lx z5dWCMiOs=B?m{Vm;ip6`WpW&%@zn!Kn!WU?&CYPzJiMbUCO*lk$p><@~Tv9r3! zQPl&}B>DFZ!J6RS5j&Q$VD9RsuHn8-ZZ4vQe37I;B%+#>X_}}HpUZVlDuf*tPy5Qn z=ksaQ6C)#6NbxhMxqq9;CTTnhT86f?;uKb>bb|3(zO;#a1_fJ|c5MSKpYMnBx0zy~ z!C6{s*ar25a1C}K#-7nwTx2^nhZbY!5GQcoIs{aZy>c9!3iRrTHY2nr8 zHcEKB@3`OyWd?T4e^vwY!-&KD#7O1|paa-PAU>f;%FX6-2Gh87f>iQN6m&p5gEsNC z%xUt-raEA|)K>nK`&eb=14Ej+gR0RE^-7Y+McdWeq=viUK$UvPaU5&3K+3&N5vky@ z0#iLD{8pvaRKxJwY9oy!i{?n216t<$&7LC&S6aT6`hxJeD?}ZiB>|$WH+qeG5r%bD z2a@6a!XSYq8m;fGpF8H0f6kmo0bz0^W?)ajF;BhMJI}n|81eBp=bg+q(;IgP4QnjY3#=IP22PG0%cVmJ8UuQ3tf+lcfdqVi~7$s+D2)*o_J~};lCY!)c2I~_#wKawPAmF-Pf&R>HUU=DY$YU zQS$E& zdAVc|cjwjC!0y~9dw7o(r@dE*5vbWss(b3+&2Eg2`V)Ei>Y3$D9oc>y;|1&Ks){1D z775~|48-^#>8f;Y@+XJah(dN^tOu=P*6R4Qx@}Saz6vZJeM9vxXvH2W+0sA?HLUgG z)E0B?CFXCExN!j(gMWxvt5<;RgCPV$w#9>?Ap{A=epW{B?=gpuv)pq>yZ2z{hfBx_ z@M>rOuM~VVEbY)xMn*NOcJ%^3llEvVeevI(lh0f0SMQ2sp@s@viM2!x%cKhSa3jU$ zEgiSs_mPy8uXmHrHSIv@O7h--e&RRbxFDN#N+Y6LtS7e z8vOE>*0TsOhMlr1M~CINemRkN(`EG-kPXMHVXHuvyi~$^vmywPd!I9IZ zWRd6~wa8=NLM?BX?@X2w1wY>(>vuy)0B1bFK53=PYd&CyW3Px58Q2&Ed>nEXhU-}p zzK7&&PK0wa{8}92ManWMOAYx#kB=Byk*o|4Q`lSC6S~z*E(Z1T87>eiN(7otgx;W# zHpu~uBv9>cU~g)d=HUtUqxy+bwt@1k2a5eG^>%VbCIj^6kD#k;C>xGtE7oh%Dg^2TUO}dSuqMwF2w?q+iD>Q7#2)J`TkJ+L zF3riOUr5-@;tG57MAER@4p`mf-Kv3h!3et~bY+60SLy3(K-W&QKW@3e`Bd&9vae-lU7R1svxS1neyI7WmQIcY9bY|di6tHw>y`y* zQ|f45AR!)8DduLB>tA%o{}r4`MLDd70Ii6IOW#EAp*Qjrmwn7i{%C~^hg1q3=p`qm zrfV?+MTwUP4SfWK{ct2>Wk+PK@Tafd9^FZaf*psgSj`&8`de`e4y}G$3A_-MMkp-Q zD4MjwQ0tZT{iI)qM{SDq8Zy^|ivcY6B^RHsd1&Es*X3edcK9Pv5Mx#_wRC|~M5;PE zuUHvWu%;3$O31WWt$ygJZ`_AmT|t(PE@8Jio)5-M0`5cc#e3>*b(pgT_Bo-Mqv2`G z<|KF8p)@}AX=7Qk^V4BkOydz`QR8aKq6UwOX=-BQ=K)h_7KnfZfNjS<=cN-NK)|;X z-e7Kf(;&il!&u^EJcji4U)grNVieE$4C!Rfk9 zH;{@73(c=aiY>64jw5pQ;XRPlpMH28utYOw^UXQ}iIp~xN)tUKstT^A0{&NQExUbr z)7J9mEGRK`a;pK`r72)cvHJ_o(6j!q9dvdP|1g*)d@5p&Q^FBARC;!dzJ|{-){7#G zXj$#&*&4}zrnvjnr*D|By%t*ro0QKYf<7$-<#J~rCgU&K4p3p16=<+MDz|w#-!@;d zyWXQKA~JqBn<`5|AKvFVq;nmjfvYDstWw8}{*`XyLH>B%g_)Esh&_vt+_$X!uXak4 zm*Ea@$_@$J-0ykUXfxp5tBx0RCFbuOvK7`3nV(-xpOB}!y`D=@ny}1EI;yN3xK4y0 z0B-iroBDIrmJKyS(+#^I!&>ab4@D)$X-z4W-f?g{9Tx=nJKFuY@IKZAG|Q;Nwkr}k z*z8hk1};wbM~)Vi=mqW1-zGs?3+K*`*?Xd3%1EHK*KSK*_eV!^F)SN=b=Ig zQxJC#%dE9$6Zki9xta%#iNToPs}@rFx9j3iLo_ObvhmLO^;du=jpyr-YR?U?_gEnj zJNiJ~w*0e=oYt%ObKi%-XL7$A>*tNblLYj5Ixk{ zLQHz@B~%7k;Hfgy7{0koWf-;isVSA>$j)}z+g@|O*$Mo*!MpL3@&pnx>$sDpYu`g5 zHW3<%P~C>Hta!>TCJY@^!ouD#w6THWvo%CqA0ImzuTGa0cbTP>gjOoF!unDx&H}-I zp3O|VR?x&H9F1=^9ZAt`qoNB~zB6h2eTlSqpAd-m#Rgr(3r*2yOsu zV5lE|Rqil{Pcw{vi28cf6)KoU@P1kV5P;njomM@y1V?mr`$>STyPV)o;6PdUHI}G% zPtt$D$x?Tf0S?b%~by^dlE;Af)0P|%TcD5qM-U_c3S>8$H{J1XEqJtNQ+ye{cF#mL{a4I zKQGVWs~CxJ%)Woh`?FsGISwu$_!;k~Qb57e&dP*>Of^rU>giwo1~b8PQ%e*7=K2!1 zN^cfRCW#Y2EZ8tD@AiW(-#;#08U%D2DF|YAW;5#ZeFqr0URM9F9}@V03;Bw-8`F0ixt+bt@V zj2L}IVtV9NRWs-&^B+w+Mzns|@4wWTn#dNAQNFS*rF zxGoVZ7|}hqeLh%s1eFZ&{59GI{)ISeYlNV9Und@qBSJg+IeK?9I_lJahc5SZgMSij z2)dt8Ayc-js3AG~30+KMAQI~^9y^MHZVMeORqyzp+5_3nK80rUTyG7o%f0s6gJ@5q&s>ZTllrm>{5cu27)AxB)9x{MA zuFqW$9wZJj5V%l2nH@i_p*`}QJGr_3v7p862|33l!uM?iyD=@Sxd>^4Ag0VoTPa^X zVLh!=+eTgu%@dr)*KQ#2sWVYugGPp88|PjYaf=51z)?p|(Qw6U9;&`u@jC;CF^xD( z^HU)~Q7p$(UzRuSX^wdm<<5=oTe0VOMH*KtIpCj7$5id=tzqWa)Hm$R#lKY5t<@6i zZ~!?k8fNlGS}+@uh*W=Hb41aY%=fg7s8=Sh$2v&AxIk=!q+%*5rQp~=eOFy={wGej zGpqYRkt<1S8$OTB$N?OkB?tPao!791r-d13*o(+B@_k2Kcv#)f;Lb-YtG~@DpUB$? z?a@Rs14iR9bw=yTzBkjFepsyj<`)jeIS9MFWRyioIEvX#;W9ALl+)=Ras;ykb2ndL zYvVn*np+n1Yo=>gM;topS}JnpCb*T)F0FViDUe1ns4D1~fH(g}LMXbro!&5o^K?w! zf_&@4eoky(`#w#us*Gnox~j@=$@-ai5r7@Zex&EP3O{X$aqIm(s@0ytgFK4+%gXke z-NO$?S6>U2S`a?Tr}sG9QT>WelGO79Is6NTWc!KLTDjNeFasVZN?F+UmnUlP4CN zO*?wN%ZG1&loOc^uv+QVFw&<(Gy3c1q;Ky^HpAiTFjua9Ks6ld<}IErA>L?(St~og z%!HiHGg1?;!5ntgb|#%!rn;(+ahgj^2%EWX)lb1g-F!8`8!3?d_MN z^RcC{-mI5LE&RL{^+hLllP+GRvuqxTg<~GIe#ge8=l%Nvjj6@8$%)G0^RTa$+TSkB z7}D&}&;~`BX*(t|zg-U%K2NiSwqEmq;0Jd!Ph1fxJ20JY3o4Ro3r}4}^fh-I)!<}g zFoxZV7f-C*Exru>Ktlf}NBD3?%tYFH@?C^8>v~EO{Mpick&E*J8meZ>W+SY%5KQ>~ zfb=kG$KrY-c7A*xmJal=f94l_tR4XR2(3Gne{rY%R9@Uu@tfH|mD|gym==D;dR9aL zdvTGS#FEqOhfO_iY@V#oM(GI;)lqMr$Dax4{K9)a*dV$LT9-9{CH0rEbb83QD2&|X z14J4#&i3H$>#d%X7H&uK-j3v4F1P*zfo^S!jE;@pP=v%5e6OxYr`KJxYWn#LPbqEZ z?zC!3(XdKiN7X!BuTSQFQy}4m-p5WEgyQmrqDSZ)SD|DGex?R4gG`7$z`2BWUps%m ztrXIixCo}@pMtzD+Xn>d>rw;Dkq8F2|4|CnD0PVfBNiqUT6#ncT%-`Gdh>61gse=eV_vVy-efDj9+cpO!>^h+;$Hv1nbbMkIpfZ&$ZYb-}#zE^o z^=F7m+B;Ydi|yPn+Ig}y~Gy()e+nk2bOV4WvPDEt^9emp=&$6 z^!wZwg>-yy)c9d-R~I#yFgbzP!a_A%pX%UlVSSrpgY>I}Kd^Jiz=l*FiBxy14yj zxc21fDvvtre3ssl$4qF81Qo6-PFtt&@TWy*?!+L|)mTus`4oj5?PA(@`K=2;y*H3a z;W_ts(k)n0_qU5XV^19!0kAtV6ll|N#v)>5yKw}xJ|>_1C4X+}I>rW!?sDjV|wF8BWG*vgB<4GvKMx~TIVrsUgOt5?K;{;k^bkM3xG+j)~t2H3irt6S_9 z#6u8rAX!LWD|(`vr7gJArnI4TRuhdPmdZ(;#_Nq-Iq1thf=Vq!NE1?I(H=Olm5(AL$d`3Zm&d5lPD#(E)0=w zv^YT2#@y@g7a$`f=-xeJo?2M_1LuGqLUGW1n6Vfu-@LiOTTNBd&Vb7KH4Py0v0Qxo-WFWYq+-m)C~=N_|NEX9bRl=Xt{=C!uf0TJDI7 z*6llEnI|I{ySpqIU3IPHc&tqXY)C{d== z&p$cXeSrK*79~)Mxq$DWYp{V;7aVsNWAnWbhL^or7D?%8HmVxWiHZ~k5$L0GK-1;0 zQWk}5fV)G+}Jji*~fX2GTyM0Sn^w)oBcl0ey*1wl%RJ@!EY*> zbO9n(413(KhMFl_BGk4ty-8gt@E&-y+){f?bu~~n64Ia=hs@Fsozgs4_|M~W5 z?BaG}0Z=snp2rrCubVtXij~3g1$@ivGaUIrzofwjGwreLbxpIwY^=M;^Mw6Q_MXeR zFk9r+CuMpTFLnu9h}OOvGBE}qau15IcUMqIW{stmv-<#jJBhK6o@Y=#|$qg}q zv*vHGQ5$PwJ8GD7K+`E_wwLSj7_fx4lHzI^OgRN6v^Qpl=x)niHpq_bBK21#Sm3_J z=gZw|1uEA2GCQQ89%}UMf z29*nrzJ@g1J}w=3o{TTg?XE#BOFMC+@^#a;H&!$o)|-(iU4xRde-u;mRDUxZmqVQ( z-Vd4BJNMZ3@I75^eY|BeTF-Wr{K1zswKKpFHNbCweW)^LcQyKbCJ2EbCq<2o&tDM! z{pyCy`79(Y4tzx&TsUxm`!KPpwV0f5)byFgDZBMEhqZsBr*ORzoEizaS$G~h#>xa* z$5^+hsO~blz)0Db94_q=gXuI=;<;qW=|b^1tr+^W^jSQE+6DUJhZ1^YL1eN|fLrp* zDXb??ULoMzJ4L}*Zh^)p?C`Z-v@-IenmO&&hiQO?P zhvgxLjq5s^W|4a2&3daTVRz3mjCAchmQK?)=^pTWmfNc9SZyVdWyoTj)BWVtHS{** zWj2bD#=)AQNH)^e-Fo{JQoGoGl9{)5WFPI?a~8r`FuCC!MP(|QtRa&^%tUo#X%yN=Ac>1bq*$K==FQB$n4CJtq584AGyY;`^`i|>Tf~3O z%fMO0AM8aLnsV)#aPp^IU#J}Nun^`#$$T{!mDMxTrA|;s_C)gcFT;L_k8~2z$B(c# zAjK{Fapbtv%+qEc1r{<9a(?+5!(>u$S#o?+zWwEBs5WeWJNnJG!sPw-MuD;>S2J$$ zdB54SY%=DhZDqgtn!`1za4_k|l+SqPw|4@7Gd(y)L^yPuVYCER4t8kwRjCq)g~mVO zV1%SEPH4)jb~a(PhTd#zjc`elRi=)A{p#;JkHCI(lij!u=4nh?iAj5Pj3$xhO-gws zPZ;%gbY_{~sde5x>!_KDzt0;O!ZcB#J{$%c|G|%Lz$QVHtB$s6!abVsVu(<6lt|7<%X0nH(MS2W z8Fr!!rUq>k`rgQDPu!~?DPtVrG+1o?$nr<9>R!)CO6QUN`9vqLi;!TEY{|-4ld0y- zD~%XcG;=;pbYgUWNKHm*+@CJWT}C9Rus;>Q$%f{FnbMp*53+v{tzaFSP0$<3C^D=c z(V+Cw2rSu0KbXBfnH$ne9$RC?ocb;*CPq|;xblBGZZGQ_0)QbIF*Y*wIV_b_uZ3IfI1-sux+&wDrJlseCuxLyf$$l=gsewKC$ifG*H6V;T(dh#@zP*BCMRH}98`737Y zBaomb0tx&0tHc!<^x$YDwB5f$0yZ{_FW5wogM2-tnMS$T(D*8cIXFV7xyH0&*-&rB zvXg3A0~}_zof_i>S9L{n>7GV8@=tL7jLoo1^2D$tIv9)swWb!4Yc9sjYX%z)$3Er?0@#= zxvmUE_Uz`3%QkKPUhk^$DPOut4A{eMXDs$s{ApmUg=-$yDQSv1{|P-+Iuo%-nRm=^ zMKU9>Bwq}J!|YRx%XG@!kyp(dA0(R_jd3_RH&*{;`!N8Dq-|q}nn7CCpq1UIJCmY4 z$Q|4&&0gMor<7_V!ELOK*BtZ3KZL9n)aS2&g|DM};Cs|PKT=3pKgHgLyg3Cse^a9n zy4P5EHw{1vd$G8FZ)0;ll7ta>b#ho9Gr}}^^M-^`{i;v#~?FC8J8CcnV%)cdsO;M-&RbffHZ6?LSt>PfY9k4-;z1uN1Qlh z0VXAJ|A_nFNj+=o+3D>P6jcW?x=r_{T%ahlANnfn*F(TVG5&E5aJ-k%>-Cq&n^tI! z1Hl4$K;uJA!TRMQ-^o>Sr&3dv*36Qu74j7}jRU0!83v!=#6w3Sh*V5p4lX=tKVKsq2e{AP$W8x#l;=;rSv?~Cz zsL|s7Xa8)QKOsYNzq&1OhW<|%d4_j&)ClZoh#!Pq>DuBtB%JY z9&y{Mt#vVwR689&=kmZ4Xy2cd@eQnea%8yCt2=(QyakP4Poj3&u9O;3$%w$K#Knl&{l&6BF%ry8vORxNv4pR zB$=oC19SKuI@tcWB1NM$afe~1}BJ?|?;z;j>k)BADFCkQ5%FzEK;H?Ch@(}HtkGr{}B5atT zUw{)3wiki@F`DNs23XA~Ih<_g?)m8}9lsdVbWf$qaY;fIMefvq3?;D`iv~^lUbgkq zQCGkduDWpR>xn$m<38Dgozab8=%v7022ev%Hv4g&X`MlAspe=NIl6wQ7IF=&_6DJP zsB_%fTQy48X4QY}FcQXwzUrg%(el?dOxUc6`JmswF8~{W$pac|8l<@F_h9^@b%ijE zQ?Pp$>U{g@)-WJfLFnLgZ!@jcK@Q)3y5zt)e+4!s0Dm+_(MwD&!SS|8lk&|WpTb@p2{uOXNo=9C503C6} zA6VXHK&Uu&2tbFE?sOvotE?goNSnzIldkr=5MR(vUk3J6On6gPRdNj=EwH^{{{B!7 zf1dE7Ljoya>u%5B%U@On@SNB4D>unnJ2CTwKW!ogx1`nN2HF z)n6U(0#`~l{IN>g_phv1;Z;$ospEK3laT(25g!jLG%8yFAYq(A4=f^uc_ z{kho?X6C-6T+@BJ*~uCa=2Ar!D>xcsgd?I4>6qtW?)?HFXc`)ci** zWB@;k?gFc~-~$^A_#B=1ob1?ndm@k7q9-H)UwOr|i)9%nS@t`er~q{3S6hJuPYz(l z%Cygm^8%NBKY*LFC z``P%;PA-#60_Vz_`+gKvft8s;c!VeS&+_*2Nd8YxZ zavKWyxbz42zyj7+Y3tz9jQ8E{^JZSkXcd)afRhES;KT3e`;SwT4`Kz3 z(>{3(QJ$3DWvw{|XW@4op02eSk1CDbP2{aV_FPM7IIa6!H3XE&MOS;8Opx$if@5k0 zU0mLq&#K#53YG!cdT(1hHF+KST)Bio-xt?QQzkf*PTPI-3igE}oN_oCH@!LBgw!3s z*`MUs5D*iMs=?k(kaGB}yhIF@diHEkR}1(k8GP@5CKa&3S(U_#_<;zI9A8lqiHalk ztAssPI>a6?)n+}P`0EU`pRPu&xb%7ptA5B@5vfJvv4-8xt&-1}>d|HxEn+b2ICj|L zf`4#Bu<(k$Y)M^-92-sDy&?sTz!@ux2zU8LiBdceyajmq?6V6JN0s}}dvw~X*u3FEbRoj<_)t^1^yjM6WO)bHlrd4yBMj7h(OH1Vo)S{IycHtrCtfOhtp z`<%LUcDu0xOy(HnBPCof1`9Supmevb%ipxlJi5jdSV(W9g^8^^;O2AR?$g^~U;O4{ zfLD%kn0c_R(_v_1j(tNE@^(e590v+Xn!*0a8A;=T(1lV8`=Cp$YRb)gtwjPqtCvwLF)UKT9fX~tPai)?Yxvb7*LtM)0rJ2Fi~Dd;<;RHXT* zIeB-(o$TmNOz|nQxtq^aUZ`-v0j8?MYjhHqT@P8B2;nuytt%OcWS4tNCif0}V#t1l z_3>uD9@neX*rCzr*MeT2vS7kQt~iCiEAqOB2^dNmG}KA51j(VDCx0kg`!?2RZTuL` zOQ#iWr^m8d^l-^He|6l@|2zUGX=fB{Z8f&!q!0=@Wb(i3AFrfMU~4kSO>Y%~4_Ydj zr8lb}&CG)xi|1WY|4!1{*_CmS;DY}`-p7bfh1TZI{X`hLreTa2t1ZQ$0gSrme+mu9 zvrorT`?!x-HsY6rTPh9E@f`Hue$t78o#d+h7L=B|#}eygchURgLC178^ToR04Nun- zur)SuW=bH=K`W?FLFf1SqS-t85G{&-Z~TYp|H&cw#MVpj#9PNCxlh)L_Fs0IGGadH zD!KKxhkNQbV+psjHuy*h4IUf6ckNHviTU7^HAy3C|^mJix?LTgkf*+b8}j}`F5aL`l6J_!moOtMVmDH8f{ znD`KX#AKa8zKi3&BAgdN^G31{uKQYXxxK4Dr?{zE@oV^|SCeLZ#las-XF>=E3IEiZ zTLG^pwMlIzY>U%$K%1TLVEr?Y7KYlKIfm=b){x(ilOy^pUBPD(D{8%EEfa* zFmYNn>C?Zfrm4e`oI+Ni9JFPx5D@MWP4J%4J(CyUn2}_KUF09v{*!FIm6tGS$?pSn zrr!QD2VUFV;mYSFhs68kJ3_Gm3u2-^!k$%{eIBpFaCG8qME%3j|4G|EqQlF%dDr{W zJ2F`$mbUO;M9XvDcsq-y%ew}vI5kC5cX~>`OqAdEIrHdMdT1jC&0q5yklj}o6(GO@ zs*tg7KbRWB&T_Ttff~}^Gv*{~&ze?hxO|>h0AaxOYj>Uz2TCp(;3~~M!NG%9D z2s@spB#|UGJNzHWZ` zAbuxXk+n>`itsi|hbrNu!H-=zwa`f*c$glQyGc6BGJ2FPrzGXcjP;wyJ*Lv}8$)YO zN?JkY`F`=Y4Z^DmsXArHi-$||jE+B^ zN_X3LocjKoEtZod#Cgg#BX>V|QvL^NUlmkG8!fwWhmE@icXtmO+}$05ySoH;cMk*z zZX0)ZhmAvUhX4UC|E;=pAI{@>o2hx}S<_WhYkjM`ua+&nTRS=xF9eMDrvA^#Y?~S}`7^nVYU^kYnb3zc^P7J^T$9a{VeTIu8#;Z50da!L zHGCDfwo>l>dk6R9n=827m+{9ZF9LCc3P${|iX};SkgTIQmvZL?iUctuX3_&kRl}*) z-}d`$;2t;)maMls=X9T*tHZ%VFdX!CI5XK-%1ZyCDu%voL7l5eB6fxCf*ZslLfZH; zgl86!P~Fcv!|k4mKsBsj?MZiSzK2080) z$Rpx;#@^q5{G_*qmO)fb(x*9qSV<~hM*9tYoXl}zez2%af!-gdoomx9@k`$_7bUNp zc9!EQUQ};fHXJ$Nk zVl1l1g6^%ww34*JAbbh5MPwM{b7xX!9pt^#>M$`_7d$UmD`j}f@5-{t#Fx%+>fguQ(&&K?_mnTMh@qghPUSPO48vC05c ziLHz5ppn_^B181jqM+0|oh{Sv-ZyNJSz^j8xgeE!DkS8)jXgfpeqZL1O_nUFsQPHO9v2DyZbumd5L}d(b!hN_0%SYR^T2qvRw!8+=SAgg_ zeE@YO-1)spLSmt;5JD#YSf|tlyqr<9;S8P?AMsyAFGCVQnPohenW>e;6YY>o$$#*G zpYVdB0^`a|-tD-E+@))-JrA~pBENL8DXXM@lyKf^2Gpy;aej9B@S!iQ+#|$cfWH*~ zySc&t9YmN_pvwF=JAi%*+=>^Krv0A-gL<_qT2v@8UaTH{Nd#>#o}w3NWp_Fp(5;+q|}{N z3QW_`4DL0?2yL9EYgk0^gEumnCOWXy@$gg{1;6jKsMBkV9UkedHul0`_16vAmT^M5 z+Wbw&1xO-oZ?MsAo(;-nD3+@A>M<}p&_A?Aw$|t~(`roP!+Y82s7n!o9{^1+Li%ZpR?sO?}|I7jT{KzF@SxuFA!#l(VzrcZtm>TSNxi+7EduQ#)b29!5znxZFj-+n5&E>4LJg$V;kxQSy?rVXD(nrrAMJn&7X8@_~A6 zC%_4>f_4|(@cvTtdqbrRazyqwqG#CS++sYdRIjH8*sRGXR8DX*LgoTQ2uk6E5Q@cO zV$OlyDlY|!HoCBVb3aZQCaOhHwX2E7hsP};$d3myx znhFAno&;rPC$1a{1hd)qdbH0>AxRJoivUZW^&F#0hY7@eJWdB_Ib?tCHETCeT> z-duA6`=S(4tDfV+~74-w1?<3Y7WMmmzt9)=C<-EA7!=o{HI`l1b}xVG4ey@2TQuUj&sTL2 zyWy#UiSkceCvy0ZS_v$z4ktQh38(5m!+9TKGxByde@JJAV_Fat=4E$myi$Ze$Ui_J zzOo{+ki=#jU;qlQ&)~*XdS}{}0RE=h6#3W0^bcCc2}(@pMTak=vq0w!6~y)fk6SnL zlY^FdU zrECgZCT{lMiXb}KY|{fPGus}F&u%qYNSX+fW_On57RTgr(tmQT)ddSFm^Q^zg#YAD z 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 U;k&_u==Z1nZ~@BR#v<~X3nxICyK!$UN>Inf6 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 Wls*d^lmAzlCoQ2MUL$H4{J#KkhSq}s literal 176104 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%0AGbbEhT^~60 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 "required|is_unique[users.email,id,{$userID}]", 'name' => 'required|alpha_numeric_spaces', ])) { + // The validation failed. return view('users/update', [ 'errors' => $this->validator->getErrors(), ]); } - // do something here if successful... + // The validation was successful. + + // Get the validated data. + $validData = $this->validator->getValidated(); + + // ... } } diff --git a/source/incoming/controllers/005.php b/source/incoming/controllers/005.php index 48e936b60..341704373 100644 --- a/source/incoming/controllers/005.php +++ b/source/incoming/controllers/005.php @@ -7,11 +7,17 @@ class UserController extends BaseController public function updateUser(int $userID) { if (! $this->validate('userRules')) { + // The validation failed. return view('users/update', [ 'errors' => $this->validator->getErrors(), ]); } - // do something here if successful... + // The validation was successful. + + // Get the validated data. + $validData = $this->validator->getValidated(); + + // ... } } diff --git a/source/incoming/controllers/024.php b/source/incoming/controllers/024.php new file mode 100644 index 000000000..c3ae1a7c6 --- /dev/null +++ b/source/incoming/controllers/024.php @@ -0,0 +1,11 @@ + ['foo', 'bar'], - 'get' => ['baz'], + 'post' => ['InvalidChars', 'csrf'], + 'get' => ['csrf'], ]; // ... diff --git a/source/incoming/filters/012.php b/source/incoming/filters/012.php new file mode 100644 index 000000000..799bd57fc --- /dev/null +++ b/source/incoming/filters/012.php @@ -0,0 +1,17 @@ + ['before' => ['admin/*']], + 'permission:users.manage' => ['before' => ['admin/users/*']], + ]; + + // ... +} diff --git a/source/incoming/incomingrequest/021.php b/source/incoming/incomingrequest/021.php index 558bb6a98..9a1b8601b 100644 --- a/source/incoming/incomingrequest/021.php +++ b/source/incoming/incomingrequest/021.php @@ -7,7 +7,8 @@ echo $uri->getUserInfo(); // snoopy:password echo $uri->getHost(); // example.com echo $uri->getPort(); // 88 -echo $uri->getPath(); // path/to/page +echo $uri->getPath(); // /path/to/page +echo $uri->getRoutePath(); // path/to/page echo $uri->getQuery(); // foo=bar&bar=baz print_r($uri->getSegments()); // Array ( [0] => path [1] => to [2] => page ) echo $uri->getSegment(1); // path diff --git a/source/incoming/incomingrequest/022.php b/source/incoming/incomingrequest/022.php deleted file mode 100644 index 723d81e3a..000000000 --- a/source/incoming/incomingrequest/022.php +++ /dev/null @@ -1,15 +0,0 @@ -setPath('users/list'); - - $menu = new MyMenu(); - - $this->assertTrue('users/list', $menu->getActiveLink()); - } -} diff --git a/source/incoming/routing/045.php b/source/incoming/routing/045.php index 98aef9276..e9534931d 100644 --- a/source/incoming/routing/045.php +++ b/source/incoming/routing/045.php @@ -1,6 +1,12 @@ setDefaultNamespace(''); +// In app/Config/Routing.php +class Routing extends BaseRouting +{ + // ... + public string $defaultNamespace = ''; + // ... +} // Controller is \Users $routes->get('users', 'Users::index'); diff --git a/source/incoming/routing/046.php b/source/incoming/routing/046.php index fbbbee230..8998fe70c 100644 --- a/source/incoming/routing/046.php +++ b/source/incoming/routing/046.php @@ -1,5 +1,6 @@ setDefaultNamespace('App'); // Controller is \App\Users diff --git a/source/incoming/routing/049.php b/source/incoming/routing/049.php index 31d49508a..9f53bee87 100644 --- a/source/incoming/routing/049.php +++ b/source/incoming/routing/049.php @@ -1,3 +1,12 @@ setTranslateURIDashes(true); diff --git a/source/incoming/routing/050.php b/source/incoming/routing/050.php index c331102cd..6f5446f5a 100644 --- a/source/incoming/routing/050.php +++ b/source/incoming/routing/050.php @@ -1,3 +1,12 @@ setAutoRoute(false); diff --git a/source/incoming/routing/051.php b/source/incoming/routing/051.php index dddd067f0..bced5d531 100644 --- a/source/incoming/routing/051.php +++ b/source/incoming/routing/051.php @@ -1,5 +1,13 @@ set404Override('App\Errors::show404'); diff --git a/source/incoming/filters/010.php b/source/incoming/routing/067.php similarity index 100% rename from source/incoming/filters/010.php rename to source/incoming/routing/067.php diff --git a/source/installation/upgrade_437.rst b/source/installation/upgrade_437.rst new file mode 100644 index 000000000..f3835f938 --- /dev/null +++ b/source/installation/upgrade_437.rst @@ -0,0 +1,90 @@ +############################# +Upgrading from 4.3.6 to 4.3.7 +############################# + +Please refer to the upgrade instructions corresponding to your installation method. + +- :ref:`Composer Installation App Starter Upgrading ` +- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` +- :ref:`Manual Installation Upgrading ` + +.. contents:: + :local: + :depth: 2 + +Breaking Changes +**************** + +.. _upgrade-437-feature-testing: + +Feature Testing Request Body +============================ + +If you call: + +1. :ref:`withBody() ` +2. and :ref:`withBodyFormat() ` +3. and pass the ``$params`` to :ref:`call() ` (or shorthand methods) + +the priority for a Request body has been changed. In the unlikely event that you +have test code affected by this change, modify it. + +For example, now the ``$params`` is used to build the request body, and the ``$body`` +is not used:: + + $this->withBody($body)->withBodyFormat('json')->call('post', $params) + +Previously, the ``$body`` was used for the request body. + +Return value of Validation::loadRuleGroup() +=========================================== + +The return value of ``Validation::loadRuleGroup()`` has been changed from +"**rules array**" to "**array** of **rules array** and **customErrors array**" +(``[rules, customErrors]``). + +If you use the method, update the code like the following:: + + $rules = $this->validation->loadRuleGroup($rules); + ↓ + [$rules, $customErrors] = $this->validation->loadRuleGroup($rules); + +Project Files +************* + +Some files in the **project space** (root, app, public, writable) received updates. Due to +these files being outside of the **system** scope they will not be changed without your intervention. + +There are some third-party CodeIgniter modules available to assist with merging changes to +the project space: `Explore on Packagist `_. + +Content Changes +=============== + +The following files received significant changes (including deprecations or visual adjustments) +and it is recommended that you merge the updated versions with your application: + +Config +------ + +- app/Config/Kint.php + +All Changes +=========== + +This is a list of all files in the **project space** that received changes; +many will be simple comments or formatting that have no effect on the runtime: + +- app/Config/App.php +- app/Config/Autoload.php +- app/Config/Cache.php +- app/Config/ContentSecurityPolicy.php +- app/Config/Filters.php +- app/Config/Kint.php +- app/Config/Logger.php +- app/Config/Migrations.php +- app/Config/Modules.php +- app/Config/Paths.php +- app/Controllers/BaseController.php +- app/Controllers/Home.php +- composer.json diff --git a/source/installation/upgrade_438.rst b/source/installation/upgrade_438.rst new file mode 100644 index 000000000..2f5decd2a --- /dev/null +++ b/source/installation/upgrade_438.rst @@ -0,0 +1,41 @@ +############################# +Upgrading from 4.3.7 to 4.3.8 +############################# + +Please refer to the upgrade instructions corresponding to your installation method. + +- :ref:`Composer Installation App Starter Upgrading ` +- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` +- :ref:`Manual Installation Upgrading ` + +.. contents:: + :local: + :depth: 2 + +Project Files +************* + +Some files in the **project space** (root, app, public, writable) received updates. Due to +these files being outside of the **system** scope they will not be changed without your intervention. + +There are some third-party CodeIgniter modules available to assist with merging changes to +the project space: `Explore on Packagist `_. + +Content Changes +=============== + +The following files received significant changes (including deprecations or visual adjustments) +and it is recommended that you merge the updated versions with your application: + +Config +------ + +- composer.json + +All Changes +=========== + +This is a list of all files in the **project space** that received changes; +many will be simple comments or formatting that have no effect on the runtime: + +- composer.json diff --git a/source/installation/upgrade_440.rst b/source/installation/upgrade_440.rst new file mode 100644 index 000000000..c84d72a7e --- /dev/null +++ b/source/installation/upgrade_440.rst @@ -0,0 +1,330 @@ +############################## +Upgrading from 4.3.8 to 4.4.0 +############################## + +Please refer to the upgrade instructions corresponding to your installation method. + +- :ref:`Composer Installation App Starter Upgrading ` +- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` +- :ref:`Manual Installation Upgrading ` + +.. contents:: + :local: + :depth: 2 + +SECURITY +******** + +When Using $this->validate() +============================ + +There was a known potential vulnerability in :ref:`$this->validate() ` in the Controller to bypass validation. +The attack could allow developers to misinterpret unvalidated empty data as +validated and proceed with processing. + +The :ref:`Validation::getValidated() ` +method has been added to ensure that validated data is obtained. + +Therefore, when you use ``$this->validate()`` in your Controllers, you should +use the new ``Validation::getValidated()`` method to get the validated data. + +.. literalinclude:: ../libraries/validation/045.php + :lines: 2- + +Breaking Changes +**************** + +.. _upgrade-440-uri-setsegment: + +URI::setSegment() Change +======================== + +Dut to a bug, in previous versions an exception was not thrown if the last segment +``+2`` was specified. This bug has been fixed. + +If your code depends on this bug, fix the segment number. + +.. literalinclude:: upgrade_440/002.php + :lines: 2- + +Site URI Changes +================ + +- Because of the rework for the current URI determination, the framework may return + site URIs or the URI paths slightly differently than in previous versions. It may + break your test code. Update assertions if the existing tests fail. +- When your baseURL has sub-directories and you get the relative path to baseURL of + the current URI by the ``URI::getPath()`` method, you must use the new + ``SiteURI::getRoutePath()`` method instead. + +See :ref:`v440-site-uri-changes` for details. + +When You Extend Exceptions +========================== + +If you are extending ``CodeIgniter\Debug\Exceptions`` and have not overridden +the ``exceptionHandler()`` method, defining the new ``Config\Exceptions::handler()`` +method in your **app/Config/Exceptions.php** will cause the specified Exception +Handler to be executed. + +Your overridden code will no longer be executed, so make any necessary changes +by defining your own exception handler. + +See :ref:`custom-exception-handlers` for the detail. + +Auto Routing (Improved) and translateURIDashes +============================================== + +When using Auto Routing (Improved) and ``$translateURIDashes`` is true +(``$routes->setTranslateURIDashes(true)``), in previous versions due to a bug +two URIs correspond to a single controller method, one URI for dashes +(e.g., **foo-bar**) and one URI for underscores (e.g., **foo_bar**). + +This bug was fixed and now URIs for underscores (**foo_bar**) is not accessible. + +If you have links to URIs for underscores (**foo_bar**), update them with URIs +for dashes (**foo-bar**). + +When Passing Classname with Namespace to Factories +================================================== + +The behavior of passing a classname with a namespace to Factories has been changed. +See :ref:`ChangeLog ` for details. + +If you have code like ``model(\Myth\Auth\Models\UserModel::class)`` or +``model('Myth\Auth\Models\UserModel')`` (the code may be in the third-party packages), +and you expect to load your ``App\Models\UserModel``, you need to define the +classname to be loaded before the first loading of that class:: + + Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel'); + +See :ref:`factories-defining-classname-to-be-loaded` for details. + +Interface Changes +================= + +Some interface changes have been made. Classes that implement them should update +their APIs to reflect the changes. See :ref:`v440-interface-changes` for details. + +Method Signature Changes +======================== + +Some method signature changes have been made. Classes that extend them should +update their APIs to reflect the changes. See :ref:`v440-method-signature-changes` +for details. + +Also, the parameter types of some constructors and ``Services::security()`` have changed. +If you call them with the parameters, change the parameter values. +See :ref:`v440-parameter-type-changes` for details. + +RouteCollection::$routes +======================== + +The array structure of the protected property ``$routes`` has been modified for +performance. + +If you extend ``RouteCollection`` and use the ``$routes``, update your code to +match the new array structure. + +Mandatory File Changes +********************** + +index.php and spark +=================== + +The following files received significant changes and +**you must merge the updated versions** with your application: + +- ``public/index.php`` (see also :ref:`v440-codeigniter-and-exit`) +- ``spark`` + +.. important:: If you don't update the above files, CodeIgniter will not work + properly after running ``composer update``. + + The upgrade procedure, for example, is as follows: + + .. code-block:: console + + composer update + cp vendor/codeigniter4/framework/public/index.php public/index.php + cp vendor/codeigniter4/framework/spark spark + +Config Files +============ + +app/Config/App.php +------------------ + +The property ``$proxyIPs`` must be an array. If you don't use proxy servers, +it must be ``public array $proxyIPs = [];``. + +.. _upgrade-440-config-routing: + +app/Config/Routing.php +---------------------- + +To clean up the routing system, the following changes were made: + +- New **app/Config/Routing.php** file that holds the settings that used to be in the Routes file. +- The **app/Config/Routes.php** file was simplified so that it only contains the routes without settings and verbiage to clutter the file. +- The environment-specific routes files are no longer loaded automatically. + +So you need to do: + +1. Copy **app/Config/Routing.php** from the new framework to your **app/Config** + directory, and configure it. +2. Remove all settings in **app/Config/Routes.php** that are no longer needed. +3. If you use the environment-specific routes files, add them to the ``$routeFiles`` property in **app/Config/Routing.php**. + +app/Config/Toolbar.php +---------------------- + +You need to add the new properties ``$watchedDirectories`` and ``$watchedExtensions`` +for :ref:`debug-toolbar-hot-reload`:: + + --- a/app/Config/Toolbar.php + +++ b/app/Config/Toolbar.php + @@ -88,4 +88,31 @@ class Toolbar extends BaseConfig + * `$maxQueries` defines the maximum amount of queries that will be stored. + */ + public int $maxQueries = 100; + + + + /** + + * -------------------------------------------------------------------------- + + * Watched Directories + + * -------------------------------------------------------------------------- + + * + + * Contains an array of directories that will be watched for changes and + + * used to determine if the hot-reload feature should reload the page or not. + + * We restrict the values to keep performance as high as possible. + + * + + * NOTE: The ROOTPATH will be prepended to all values. + + */ + + public array $watchedDirectories = [ + + 'app', + + ]; + + + + /** + + * -------------------------------------------------------------------------- + + * Watched File Extensions + + * -------------------------------------------------------------------------- + + * + + * Contains an array of file extensions that will be watched for changes and + + * used to determine if the hot-reload feature should reload the page or not. + + */ + + public array $watchedExtensions = [ + + 'php', 'css', 'js', 'html', 'svg', 'json', 'env', + + ]; + } + + +app/Config/Events.php +--------------------- + +You need to add the code to add a route for :ref:`debug-toolbar-hot-reload`:: + + --- a/app/Config/Events.php + +++ b/app/Config/Events.php + @@ -4,6 +4,7 @@ namespace Config; + + use CodeIgniter\Events\Events; + use CodeIgniter\Exceptions\FrameworkException; + +use CodeIgniter\HotReloader\HotReloader; + + /* + * -------------------------------------------------------------------- + @@ -44,5 +45,11 @@ Events::on('pre_system', static function () { + if (CI_DEBUG && ! is_cli()) { + Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect'); + Services::toolbar()->respond(); + + // Hot Reload route - for framework use on the hot reloader. + + if (ENVIRONMENT === 'development') { + + Services::routes()->get('__hot-reload', static function () { + + (new HotReloader())->run(); + + }); + + } + } + }); + +app/Config/Cookie.php +--------------------- + +The Cookie config items in **app/Config/App.php** are no longer used. + +1. Copy **app/Config/Cookie.php** from the new framework to your **app/Config** + directory, and configure it. +2. Remove the properties (from ``$cookiePrefix`` to ``$cookieSameSite``) in + **app/Config/App.php**. + +app/Config/Security.php +----------------------- + +The CSRF config items in **app/Config/App.php** are no longer used. + +1. Copy **app/Config/Security.php** from the new framework to your **app/Config** + directory, and configure it. +2. Remove the properties (from ``$CSRFTokenName`` to ``$CSRFSameSite``) in + **app/Config/App.php**. + +app/Config/Session.php +---------------------- + +The Session config items in **app/Config/App.php** are no longer used. + +1. Copy **app/Config/Session.php** from the new framework to your **app/Config** + directory, and configure it. +2. Remove the properties (from ``$sessionDriver`` to ``$sessionDBGroup``) in + **app/Config/App.php**. + +Breaking Enhancements +********************* + +- **Routing:** The method signature of ``RouteCollection::__construct()`` has been changed. + The third parameter ``Routing $routing`` has been added. Extending classes + should likewise add the parameter so as not to break LSP. +- **Validation:** The method signature of ``Validation::check()`` has been changed. + The ``string`` typehint on the ``$rule`` parameter was removed. Extending classes + should likewise remove the typehint so as not to break LSP. + +Project Files +************* + +Some files in the **project space** (root, app, public, writable) received updates. Due to +these files being outside of the **system** scope they will not be changed without your intervention. + +There are some third-party CodeIgniter modules available to assist with merging changes to +the project space: `Explore on Packagist `_. + +Content Changes +=============== + +The following files received significant changes (including deprecations or visual adjustments) +and it is recommended that you merge the updated versions with your application: + +Config +------ + +- app/Config/CURLRequest.php + - The default value of :ref:`$shareOptions ` has been change to ``false``. +- app/Config/Exceptions.php + - Added the new method ``handler()`` that define custom Exception Handlers. + See :ref:`custom-exception-handlers`. + +All Changes +=========== + +This is a list of all files in the **project space** that received changes; +many will be simple comments or formatting that have no effect on the runtime: + +- app/Config/App.php +- app/Config/CURLRequest.php +- app/Config/Cookie.php +- app/Config/Database.php +- app/Config/Events.php +- app/Config/Exceptions.php +- app/Config/Filters.php +- app/Config/Routes.php +- app/Config/Routing.php +- app/Config/Toolbar.php +- public/index.php +- spark diff --git a/source/installation/upgrade_440/002.php b/source/installation/upgrade_440/002.php new file mode 100644 index 000000000..9cabdfcfc --- /dev/null +++ b/source/installation/upgrade_440/002.php @@ -0,0 +1,12 @@ +setSegment(4, 'three'); +// The URI will be http://example.com/one/two/three + +// After: +$uri->setSegment(4, 'three'); // Will throw Exception +$uri->setSegment(3, 'three'); +// The URI will be http://example.com/one/two/three diff --git a/source/installation/upgrade_441.rst b/source/installation/upgrade_441.rst new file mode 100644 index 000000000..c2fc56859 --- /dev/null +++ b/source/installation/upgrade_441.rst @@ -0,0 +1,41 @@ +############################# +Upgrading from 4.4.0 to 4.4.1 +############################# + +Please refer to the upgrade instructions corresponding to your installation method. + +- :ref:`Composer Installation App Starter Upgrading ` +- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` +- :ref:`Manual Installation Upgrading ` + +.. contents:: + :local: + :depth: 2 + +Project Files +************* + +Some files in the **project space** (root, app, public, writable) received updates. Due to +these files being outside of the **system** scope they will not be changed without your intervention. + +There are some third-party CodeIgniter modules available to assist with merging changes to +the project space: `Explore on Packagist `_. + +Content Changes +=============== + +Version 4.4.1 did not alter any executable code in project files. + +All Changes +=========== + +This is a list of all files in the **project space** that received changes; +many will be simple comments or formatting that have no effect on the runtime: + +- app/Config/Autoload.php +- app/Config/DocTypes.php +- app/Config/Email.php +- app/Config/ForeignCharacters.php +- app/Config/Mimes.php +- app/Config/Modules.php +- composer.json diff --git a/source/installation/upgrade_442.rst b/source/installation/upgrade_442.rst new file mode 100644 index 000000000..46ed0ff7d --- /dev/null +++ b/source/installation/upgrade_442.rst @@ -0,0 +1,32 @@ +############################# +Upgrading from 4.4.1 to 4.4.2 +############################# + +Please refer to the upgrade instructions corresponding to your installation method. + +- :ref:`Composer Installation App Starter Upgrading ` +- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` +- :ref:`Manual Installation Upgrading ` + +.. contents:: + :local: + :depth: 2 + +Project Files +************* + +Some files in the **project space** (root, app, public, writable) received updates. Due to +these files being outside of the **system** scope they will not be changed without your intervention. + +There are some third-party CodeIgniter modules available to assist with merging changes to +the project space: `Explore on Packagist `_. + +All Changes +=========== + +This is a list of all files in the **project space** that received changes; +many will be simple comments or formatting that have no effect on the runtime: + +- app/Config/Migrations.php +- app/Config/View.php +- composer.json diff --git a/source/libraries/cookies/004.php b/source/libraries/cookies/004.php index ca0cf0a74..cce1ea2c7 100644 --- a/source/libraries/cookies/004.php +++ b/source/libraries/cookies/004.php @@ -19,19 +19,19 @@ ] ); -$cookie->getName(); // 'remember_token' -$cookie->getPrefix(); // '__Secure-' -$cookie->getPrefixedName(); // '__Secure-remember_token' +$cookie->getName(); // 'remember_token' +$cookie->getPrefix(); // '__Secure-' +$cookie->getPrefixedName(); // '__Secure-remember_token' $cookie->getExpiresTimestamp(); // Unix timestamp -$cookie->getExpiresString(); // 'Fri, 14-Feb-2025 00:00:00 GMT' -$cookie->isExpired(); // false -$cookie->getMaxAge(); // the difference from time() to expires -$cookie->isRaw(); // false -$cookie->isSecure(); // true -$cookie->getPath(); // '/' -$cookie->getDomain(); // '' -$cookie->isHTTPOnly(); // true -$cookie->getSameSite(); // 'Lax' +$cookie->getExpiresString(); // 'Fri, 14-Feb-2025 00:00:00 GMT' +$cookie->isExpired(); // false +$cookie->getMaxAge(); // the difference from time() to expires +$cookie->isRaw(); // false +$cookie->isSecure(); // true +$cookie->getPath(); // '/' +$cookie->getDomain(); // '' +$cookie->isHTTPOnly(); // true +$cookie->getSameSite(); // 'Lax' // additional getter $cookie->getId(); // '__Secure-remember_token;;/' diff --git a/source/libraries/cookies/006.php b/source/libraries/cookies/006.php index a8be634a9..1bf6c732b 100644 --- a/source/libraries/cookies/006.php +++ b/source/libraries/cookies/006.php @@ -2,6 +2,6 @@ use CodeIgniter\Cookie\Cookie; -Cookie::SAMESITE_LAX; // 'lax' -Cookie::SAMESITE_STRICT; // 'strict' -Cookie::SAMESITE_NONE; // 'none' +Cookie::SAMESITE_LAX; // 'lax' +Cookie::SAMESITE_STRICT; // 'strict' +Cookie::SAMESITE_NONE; // 'none' diff --git a/source/libraries/cookies/017.php b/source/libraries/cookies/017.php new file mode 100644 index 000000000..eadbc8083 --- /dev/null +++ b/source/libraries/cookies/017.php @@ -0,0 +1,16 @@ + 3600 * 2, // Expires in 2 hours + ] +); + +$response->setCookie($cookie); diff --git a/source/libraries/cookies/018.php b/source/libraries/cookies/018.php new file mode 100644 index 000000000..41dff8d6a --- /dev/null +++ b/source/libraries/cookies/018.php @@ -0,0 +1,15 @@ + 3600 * 2, // Expires in 2 hours + ] +); + +set_cookie($cookie); diff --git a/source/libraries/curlrequest/001.php b/source/libraries/curlrequest/001.php index e89e06924..303366336 100644 --- a/source/libraries/curlrequest/001.php +++ b/source/libraries/curlrequest/001.php @@ -6,7 +6,6 @@ class CURLRequest extends BaseConfig { - public $shareOptions = false; - // ... + public bool $shareOptions = true; } diff --git a/source/libraries/curlrequest/026.php b/source/libraries/curlrequest/026.php index 36ea74cb9..6c4289454 100644 --- a/source/libraries/curlrequest/026.php +++ b/source/libraries/curlrequest/026.php @@ -1,8 +1,9 @@ request('GET', '/status/500'); -// Will fail verbosely +// If the response code is 500, an HTTPException is thrown, +// and a detailed error report is displayed if in development mode. -$res = $client->request('GET', '/status/500', ['http_errors' => false]); -echo $res->getStatusCode(); -// 500 +$response = $client->request('GET', '/status/500', ['http_errors' => false]); +echo $response->getStatusCode(); // 500 +echo $response->getBody(); // You can see the response body. diff --git a/source/libraries/curlrequest/035.php b/source/libraries/curlrequest/035.php new file mode 100644 index 000000000..a729f9f3b --- /dev/null +++ b/source/libraries/curlrequest/035.php @@ -0,0 +1,7 @@ +request( + 'GET', + 'http://example.com', + ['proxy' => 'http://localhost:3128'] +); diff --git a/source/libraries/pagination/002.php b/source/libraries/pagination/002.php index c8cd31ebe..c1bc43222 100644 --- a/source/libraries/pagination/002.php +++ b/source/libraries/pagination/002.php @@ -2,9 +2,7 @@ namespace App\Controllers; -use CodeIgniter\Controller; - -class UserController extends Controller +class UserController extends BaseController { public function index() { diff --git a/source/libraries/pagination/003.php b/source/libraries/pagination/003.php index 423adc232..6ea631c7a 100644 --- a/source/libraries/pagination/003.php +++ b/source/libraries/pagination/003.php @@ -1,26 +1,9 @@ $model->where('ban', 1)->paginate(10), 'pager' => $model->pager, ]; - -// You can move the conditions to a separate method. -// Model method -class UserModel extends Model -{ - public function banned() - { - $this->builder()->where('ban', 1); - - return $this; // This will allow the call chain to be used. - } -} - -$data = [ - 'users' => $model->banned()->paginate(10), - 'pager' => $model->pager, -]; diff --git a/source/libraries/pagination/004.php b/source/libraries/pagination/004.php index 75eb88c3e..a8ef4d296 100644 --- a/source/libraries/pagination/004.php +++ b/source/libraries/pagination/004.php @@ -2,9 +2,7 @@ namespace App\Controllers; -use CodeIgniter\Controller; - -class UserController extends Controller +class UserController extends BaseController { public function index() { diff --git a/source/libraries/pagination/015.php b/source/libraries/pagination/015.php index e6ea3e86c..ac9f4fc43 100644 --- a/source/libraries/pagination/015.php +++ b/source/libraries/pagination/015.php @@ -2,9 +2,7 @@ namespace App\Controllers; -use CodeIgniter\Controller; - -class UserController extends Controller +class UserController extends BaseController { public function index() { diff --git a/source/libraries/pagination/016.php b/source/libraries/pagination/016.php new file mode 100644 index 000000000..64be257b4 --- /dev/null +++ b/source/libraries/pagination/016.php @@ -0,0 +1,24 @@ +builder() + ->select('news.*, category.name') + ->join('category', 'news.category_id = category.id'); + + return [ + 'news' => $this->paginate($perPage), + 'pager' => $this->pager, + ]; + } +} diff --git a/source/libraries/pagination/017.php b/source/libraries/pagination/017.php new file mode 100644 index 000000000..86e656be5 --- /dev/null +++ b/source/libraries/pagination/017.php @@ -0,0 +1,17 @@ +builder()->where('ban', 1); + + return $this; // This will allow the call chain to be used. + } +} diff --git a/source/libraries/pagination/018.php b/source/libraries/pagination/018.php new file mode 100644 index 000000000..002d034a6 --- /dev/null +++ b/source/libraries/pagination/018.php @@ -0,0 +1,9 @@ + $model->banned()->paginate(10), + 'pager' => $model->pager, +]; diff --git a/source/libraries/publisher/009.php b/source/libraries/publisher/009.php index 1e840ce9d..f3c2fb21d 100644 --- a/source/libraries/publisher/009.php +++ b/source/libraries/publisher/009.php @@ -13,7 +13,7 @@ class BootstrapPublisher extends Publisher * * @var string */ - protected $source = 'vendor/twbs/bootstrap/'; + protected $source = VENDORPATH . 'twbs/bootstrap/'; /** * FCPATH is always the default destination, diff --git a/source/libraries/sessions/003.php b/source/libraries/sessions/003.php index ed979ddc0..13d9b068f 100644 --- a/source/libraries/sessions/003.php +++ b/source/libraries/sessions/003.php @@ -1,3 +1,3 @@ close(); diff --git a/source/libraries/sessions/037.php b/source/libraries/sessions/037.php index 1e7931f34..9f474a3c7 100644 --- a/source/libraries/sessions/037.php +++ b/source/libraries/sessions/037.php @@ -1,5 +1,3 @@ destroy(); diff --git a/source/libraries/sessions/044.php b/source/libraries/sessions/044.php new file mode 100644 index 000000000..13d9b068f --- /dev/null +++ b/source/libraries/sessions/044.php @@ -0,0 +1,3 @@ +close(); diff --git a/source/libraries/uploaded_files/023.php b/source/libraries/uploaded_files/023.php new file mode 100644 index 000000000..f8accc908 --- /dev/null +++ b/source/libraries/uploaded_files/023.php @@ -0,0 +1,4 @@ +getClientPath(); +echo $clientPath; // dir/file.txt, or dir/sub_dir/file.txt diff --git a/source/libraries/uri/001.php b/source/libraries/uri/001.php index 524e67669..7219d03d2 100644 --- a/source/libraries/uri/001.php +++ b/source/libraries/uri/001.php @@ -1,3 +1,3 @@ request->getPath(); +$uri = $this->request->getUri(); diff --git a/source/libraries/validation/001.php b/source/libraries/validation/001.php index af2acb754..e797b21a6 100644 --- a/source/libraries/validation/001.php +++ b/source/libraries/validation/001.php @@ -2,8 +2,6 @@ namespace App\Controllers; -use Config\Services; - class Form extends BaseController { protected $helpers = ['form']; @@ -20,6 +18,9 @@ public function index() return view('signup'); } + // If you want to get the validated data. + $validData = $this->validator->getValidated(); + return view('success'); } } diff --git a/source/libraries/validation/002.php b/source/libraries/validation/002.php index d1eeff19c..b8d5811f3 100644 --- a/source/libraries/validation/002.php +++ b/source/libraries/validation/002.php @@ -3,10 +3,10 @@ // ... $rules = [ - 'username' => 'required', - 'password' => 'required|min_length[10]', - 'passconf' => 'required|matches[password]', - 'email' => 'required|valid_email', + 'username' => 'required|max_length[30]', + 'password' => 'required|max_length[255]|min_length[10]', + 'passconf' => 'required|max_length[255]|matches[password]', + 'email' => 'required|max_length[254]|valid_email', ]; // ... diff --git a/source/libraries/validation/003.php b/source/libraries/validation/003.php index fbd3ee579..e83233803 100644 --- a/source/libraries/validation/003.php +++ b/source/libraries/validation/003.php @@ -2,7 +2,9 @@ namespace Config; -class Validation +// ... + +class Validation extends BaseConfig { // ... diff --git a/source/libraries/validation/005.php b/source/libraries/validation/005.php index 9d129e642..6ab43932d 100644 --- a/source/libraries/validation/005.php +++ b/source/libraries/validation/005.php @@ -1,4 +1,4 @@ setRule('username', 'Username', 'required|min_length[3]'); -$validation->setRule('password', 'Password', ['required', 'min_length[8]', 'alpha_numeric_punct']); +$validation->setRule('username', 'Username', 'required|max_length[30]|min_length[3]'); +$validation->setRule('password', 'Password', ['required', 'max_length[255]', 'min_length[8]', 'alpha_numeric_punct']); diff --git a/source/libraries/validation/006.php b/source/libraries/validation/006.php index 5f7cbf645..bd4dbf10c 100644 --- a/source/libraries/validation/006.php +++ b/source/libraries/validation/006.php @@ -1,11 +1,11 @@ setRules([ - 'username' => 'required', - 'password' => 'required|min_length[10]', + 'username' => 'required|max_length[30]', + 'password' => 'required|max_length[255]|min_length[10]', ]); // or $validation->setRules([ - 'username' => 'required', - 'password' => ['required', 'min_length[10]'], + 'username' => ['required', 'max_length[30]'], + 'password' => ['required', 'max_length[255]', 'min_length[10]'], ]); diff --git a/source/libraries/validation/007.php b/source/libraries/validation/007.php index cb12c5a61..c545e70c8 100644 --- a/source/libraries/validation/007.php +++ b/source/libraries/validation/007.php @@ -1,11 +1,11 @@ setRules([ - 'username' => ['label' => 'Username', 'rules' => 'required'], - 'password' => ['label' => 'Password', 'rules' => 'required|min_length[10]'], + 'username' => ['label' => 'Username', 'rules' => 'required|max_length[30]'], + 'password' => ['label' => 'Password', 'rules' => 'required|max_length[255]|min_length[10]'], ]); // or $validation->setRules([ - 'username' => ['label' => 'Username', 'rules' => 'required'], - 'password' => ['label' => 'Password', 'rules' => ['required', 'min_length[10]']], + 'username' => ['label' => 'Username', 'rules' => 'required|max_length[30]'], + 'password' => ['label' => 'Password', 'rules' => ['required', 'max_length[255]', 'min_length[10]']], ]); diff --git a/source/libraries/validation/008.php b/source/libraries/validation/008.php index 1b570f1aa..38656dda3 100644 --- a/source/libraries/validation/008.php +++ b/source/libraries/validation/008.php @@ -1,3 +1,11 @@ withRequest($this->request)->run(); +$validation = \Config\Services::validation(); +$request = \Config\Services::request(); + +if ($validation->withRequest($request)->run()) { + // If you want to get the validated data. + $validData = $validation->getValidated(); + + // ... +} diff --git a/source/libraries/validation/009.php b/source/libraries/validation/009.php index 58f0749a0..7e321e966 100644 --- a/source/libraries/validation/009.php +++ b/source/libraries/validation/009.php @@ -19,10 +19,10 @@ // Joe Smith $validation->setRules([ - 'contacts.name' => 'required', + 'contacts.name' => 'required|max_length[60]', ]); // Fred Flintsone & Wilma $validation->setRules([ - 'contacts.friends.name' => 'required', + 'contacts.friends.name' => 'required|max_length[60]', ]); diff --git a/source/libraries/validation/010.php b/source/libraries/validation/010.php index 94c691931..0951f582c 100644 --- a/source/libraries/validation/010.php +++ b/source/libraries/validation/010.php @@ -2,5 +2,5 @@ // Fred Flintsone & Wilma $validation->setRules([ - 'contacts.*.name' => 'required', + 'contacts.*.name' => 'required|max_length[60]', ]); diff --git a/source/libraries/validation/011.php b/source/libraries/validation/011.php index 2754c41ac..9b5e03eb4 100644 --- a/source/libraries/validation/011.php +++ b/source/libraries/validation/011.php @@ -13,5 +13,5 @@ // Rule $validation->setRules([ - 'user_ids.*' => 'required', + 'user_ids.*' => 'required|max_length[19]', ]); diff --git a/source/libraries/validation/012.php b/source/libraries/validation/012.php index a43f9ab1a..9b9e89c21 100644 --- a/source/libraries/validation/012.php +++ b/source/libraries/validation/012.php @@ -1,3 +1,5 @@ check($value, 'required'); +if ($validation->check($value, 'required')) { + // $value is valid. +} diff --git a/source/libraries/validation/013.php b/source/libraries/validation/013.php index 671b5386f..b43a32f97 100644 --- a/source/libraries/validation/013.php +++ b/source/libraries/validation/013.php @@ -2,13 +2,17 @@ namespace Config; -class Validation +// ... + +class Validation extends BaseConfig { - public $signup = [ - 'username' => 'required', - 'password' => 'required', - 'pass_confirm' => 'required|matches[password]', - 'email' => 'required|valid_email', + // ... + + public array $signup = [ + 'username' => 'required|max_length[30]', + 'password' => 'required|max_length[255]', + 'pass_confirm' => 'required|max_length[255]|matches[password]', + 'email' => 'required|max_length[254]|valid_email', ]; // ... diff --git a/source/libraries/validation/015.php b/source/libraries/validation/015.php index 5815abfac..6e666e41c 100644 --- a/source/libraries/validation/015.php +++ b/source/libraries/validation/015.php @@ -2,16 +2,20 @@ namespace Config; -class Validation +// ... + +class Validation extends BaseConfig { - public $signup = [ - 'username' => 'required', - 'password' => 'required', - 'pass_confirm' => 'required|matches[password]', - 'email' => 'required|valid_email', + // ... + + public array $signup = [ + 'username' => 'required|max_length[30]', + 'password' => 'required|max_length[255]', + 'pass_confirm' => 'required|max_length[255]|matches[password]', + 'email' => 'required|max_length[254]|valid_email', ]; - public $signup_errors = [ + public array $signup_errors = [ 'username' => [ 'required' => 'You must choose a username.', ], diff --git a/source/libraries/validation/016.php b/source/libraries/validation/016.php index 5b08e7398..1eb72bc8c 100644 --- a/source/libraries/validation/016.php +++ b/source/libraries/validation/016.php @@ -2,21 +2,26 @@ namespace Config; -class Validation +// ... + +class Validation extends BaseConfig { - public $signup = [ + // ... + + public array $signup = [ 'username' => [ - 'rules' => 'required', + 'rules' => 'required|max_length[30]', 'errors' => [ 'required' => 'You must choose a Username.', ], ], 'email' => [ - 'rules' => 'required|valid_email', + 'rules' => 'required|max_length[254]|valid_email', 'errors' => [ 'valid_email' => 'Please check the Email field. It does not appear to be valid.', ], ], ]; + // ... } diff --git a/source/libraries/validation/020.php b/source/libraries/validation/020.php index 67fdb567e..792b7ba6b 100644 --- a/source/libraries/validation/020.php +++ b/source/libraries/validation/020.php @@ -1,6 +1,6 @@ setRules([ - 'id' => 'is_natural_no_zero', - 'email' => 'required|valid_email|is_unique[users.email,id,{id}]', + 'id' => 'max_length[19]|is_natural_no_zero', + 'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,{id}]', ]); diff --git a/source/libraries/validation/022.php b/source/libraries/validation/022.php index 001c0f0d7..f3dda9e96 100644 --- a/source/libraries/validation/022.php +++ b/source/libraries/validation/022.php @@ -1,6 +1,6 @@ setRules([ - 'id' => 'is_natural_no_zero', - 'email' => 'required|valid_email|is_unique[users.email,id,4]', + 'id' => 'max_length[19]|is_natural_no_zero', + 'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,4]', ]); diff --git a/source/libraries/validation/023.php b/source/libraries/validation/023.php index f9ba86d1f..85fd02e5b 100644 --- a/source/libraries/validation/023.php +++ b/source/libraries/validation/023.php @@ -2,8 +2,8 @@ $validation->setRules( [ - 'username' => 'required|is_unique[users.username]', - 'password' => 'required|min_length[10]', + 'username' => 'required|max_length[30]|is_unique[users.username]', + 'password' => 'required|max_length[254]|min_length[10]', ], [ // Errors 'username' => [ diff --git a/source/libraries/validation/024.php b/source/libraries/validation/024.php index 17f053ee4..a8fb8151d 100644 --- a/source/libraries/validation/024.php +++ b/source/libraries/validation/024.php @@ -3,14 +3,14 @@ $validation->setRules([ 'username' => [ 'label' => 'Username', - 'rules' => 'required|is_unique[users.username]', + 'rules' => 'required|max_length[30]|is_unique[users.username]', 'errors' => [ 'required' => 'All accounts must have {field} provided', ], ], 'password' => [ 'label' => 'Password', - 'rules' => 'required|min_length[10]', + 'rules' => 'required|max_length[255]|min_length[10]', 'errors' => [ 'min_length' => 'Your {field} is too short. You want to get hacked?', ], diff --git a/source/libraries/validation/025.php b/source/libraries/validation/025.php index 6e2f1e408..60f53893e 100644 --- a/source/libraries/validation/025.php +++ b/source/libraries/validation/025.php @@ -3,14 +3,14 @@ $validation->setRules([ 'username' => [ 'label' => 'Rules.username', - 'rules' => 'required|is_unique[users.username]', + 'rules' => 'required|max_length[30]|is_unique[users.username]', 'errors' => [ 'required' => 'Rules.username.required', ], ], 'password' => [ 'label' => 'Rules.password', - 'rules' => 'required|min_length[10]', + 'rules' => 'required|max_length[255]|min_length[10]', 'errors' => [ 'min_length' => 'Rules.password.min_length', ], diff --git a/source/libraries/validation/032.php b/source/libraries/validation/032.php index acec3cfc6..cf8bcf8b9 100644 --- a/source/libraries/validation/032.php +++ b/source/libraries/validation/032.php @@ -2,9 +2,13 @@ namespace Config; -class Validation +// ... + +class Validation extends BaseConfig { - public $templates = [ + // ... + + public array $templates = [ 'list' => 'CodeIgniter\Validation\Views\list', 'single' => 'CodeIgniter\Validation\Views\single', 'my_list' => '_errors_list', diff --git a/source/libraries/validation/033.php b/source/libraries/validation/033.php index fe61b137f..aa67529ba 100644 --- a/source/libraries/validation/033.php +++ b/source/libraries/validation/033.php @@ -2,12 +2,13 @@ namespace Config; +use CodeIgniter\Config\BaseConfig; use CodeIgniter\Validation\CreditCardRules; use CodeIgniter\Validation\FileRules; use CodeIgniter\Validation\FormatRules; use CodeIgniter\Validation\Rules; -class Validation +class Validation extends BaseConfig { // ... diff --git a/source/libraries/validation/036.php b/source/libraries/validation/036.php index 2cc83471e..66919dadf 100644 --- a/source/libraries/validation/036.php +++ b/source/libraries/validation/036.php @@ -1,5 +1,5 @@ setRules([ - 'foo' => 'required|even', + 'foo' => 'required|max_length[19]|even', ]); diff --git a/source/libraries/validation/038.php b/source/libraries/validation/038.php index f4ec33715..1330267eb 100644 --- a/source/libraries/validation/038.php +++ b/source/libraries/validation/038.php @@ -3,10 +3,10 @@ // is_unique[table.field,ignore_field,ignore_value] $validation->setRules([ - 'name' => "is_unique[supplier.name,uuid, {$uuid}]", // is not ok - 'name' => "is_unique[supplier.name,uuid,{$uuid} ]", // is not ok - 'name' => "is_unique[supplier.name,uuid,{$uuid}]", // is ok - 'name' => 'is_unique[supplier.name,uuid,{uuid}]', // is ok - see "Validation Placeholders" + 'name' => "max_length[36]|is_unique[supplier.name,uuid, {$uuid}]", // is not ok + 'name' => "max_length[36]|is_unique[supplier.name,uuid,{$uuid} ]", // is not ok + 'name' => "max_length[36]|is_unique[supplier.name,uuid,{$uuid}]", // is ok + 'name' => 'max_length[36]|is_unique[supplier.name,uuid,{uuid}]', // is ok - see "Validation Placeholders" ]); // Warning: If `$uuid` is a user input, be sure to validate the format of the value before using it. // Otherwise, it is vulnerable. diff --git a/source/libraries/validation/044.php b/source/libraries/validation/044.php new file mode 100644 index 000000000..7f3a0e0e0 --- /dev/null +++ b/source/libraries/validation/044.php @@ -0,0 +1,21 @@ +setRules([ + 'username' => 'required', + 'password' => 'required|min_length[10]', +]); + +$data = [ + 'username' => 'john', + 'password' => 'BPi-$Swu7U5lm$dX', + 'csrf_token' => '8b9218a55906f9dcc1dc263dce7f005a', +]; + +if ($validation->run($data)) { + $validatedData = $validation->getValidated(); + // $validatedData = [ + // 'username' => 'john', + // 'password' => 'BPi-$Swu7U5lm$dX', + // ]; +} diff --git a/source/libraries/validation/045.php b/source/libraries/validation/045.php new file mode 100644 index 000000000..1becb578d --- /dev/null +++ b/source/libraries/validation/045.php @@ -0,0 +1,18 @@ +validate([ + 'username' => 'required', + 'password' => 'required|min_length[10]', +])) { + // The validation failed. + return view('login', [ + 'errors' => $this->validator->getErrors(), + ]); +} + +// The validation was successful. + +// Get the validated data. +$validData = $this->validator->getValidated(); diff --git a/source/models/model/027.php b/source/models/model/027.php index 5c457a09d..3a039df49 100644 --- a/source/models/model/027.php +++ b/source/models/model/027.php @@ -7,10 +7,10 @@ class UserModel extends Model { protected $validationRules = [ - 'username' => 'required|alpha_numeric_space|min_length[3]', - 'email' => 'required|valid_email|is_unique[users.email]', - 'password' => 'required|min_length[8]', - 'pass_confirm' => 'required_with[password]|matches[password]', + 'username' => 'required|max_length[30]|alpha_numeric_space|min_length[3]', + 'email' => 'required|max_length[254]|valid_email|is_unique[users.email]', + 'password' => 'required|max_length[255]|min_length[8]', + 'pass_confirm' => 'required_with[password]|max_length[255]|matches[password]', ]; protected $validationMessages = [ 'email' => [ diff --git a/source/models/model/028.php b/source/models/model/028.php index acffbf22b..9cea0eb31 100644 --- a/source/models/model/028.php +++ b/source/models/model/028.php @@ -1,6 +1,6 @@ setValidationRule($fieldName, $fieldRules); diff --git a/source/models/model/029.php b/source/models/model/029.php index b7876797a..93ba8ae51 100644 --- a/source/models/model/029.php +++ b/source/models/model/029.php @@ -1,9 +1,9 @@ 'required|alpha_numeric_space|min_length[3]', + 'username' => 'required|max_length[30]|alpha_numeric_space|min_length[3]', 'email' => [ - 'rules' => 'required|valid_email|is_unique[users.email]', + 'rules' => 'required|max_length[254]|valid_email|is_unique[users.email]', 'errors' => [ 'required' => 'We really need your email.', ], diff --git a/source/models/model/038.php b/source/models/model/038.php index 820d37def..5ed40baae 100644 --- a/source/models/model/038.php +++ b/source/models/model/038.php @@ -7,6 +7,7 @@ class MyModel extends Model { protected $validationRules = [ - 'email' => 'required|valid_email|is_unique[users.email,id,{id}]', + 'id' => 'max_length[19]|is_natural_no_zero', + 'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,{id}]', ]; } diff --git a/source/models/model/040.php b/source/models/model/040.php index 6e1ff1711..df4d628d1 100644 --- a/source/models/model/040.php +++ b/source/models/model/040.php @@ -7,6 +7,7 @@ class MyModel extends Model { protected $validationRules = [ - 'email' => 'required|valid_email|is_unique[users.email,id,4]', + 'id' => 'max_length[19]|is_natural_no_zero', + 'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,4]', ]; } diff --git a/source/outgoing/response/003.php b/source/outgoing/response/003.php index e5bff8cab..da5819d98 100644 --- a/source/outgoing/response/003.php +++ b/source/outgoing/response/003.php @@ -6,5 +6,6 @@ ]; return $this->response->setJSON($data); + // or return $this->response->setXML($data); diff --git a/source/outgoing/response/033.php b/source/outgoing/response/033.php new file mode 100644 index 000000000..8afaf8496 --- /dev/null +++ b/source/outgoing/response/033.php @@ -0,0 +1,6 @@ +response->download($name, $data)->inline(); diff --git a/source/outgoing/table/019.php b/source/outgoing/table/019.php new file mode 100644 index 000000000..5478867fd --- /dev/null +++ b/source/outgoing/table/019.php @@ -0,0 +1,40 @@ +setHeading(['name' => 'Name', 'color' => 'Color', 'size' => 'Size']) + ->setSyncRowsWithHeading(true) + ->addRow(['color' => 'Blue', 'name' => 'Fred', 'size' => 'Small']) + ->addRow(['size' => 'Large', 'age' => '24', 'name' => 'Mary']) + ->addRow(['color' => 'Green']); + +echo $table->generate(); +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameColorSize
FredBlueSmall
MaryLarge
Green
diff --git a/source/outgoing/table/020.php b/source/outgoing/table/020.php new file mode 100644 index 000000000..42bda4d2f --- /dev/null +++ b/source/outgoing/table/020.php @@ -0,0 +1,24 @@ + 'Blue', + 'name' => 'Fred', + 'size' => 'Small', + ], + [ + 'size' => 'Large', + 'age' => '24', + 'name' => 'Mary', + ], + [ + 'color' => 'Green', + ], +]; + +$table = new \CodeIgniter\View\Table(); + +$table->setHeading(['name' => 'Name', 'color' => 'Color', 'size' => 'Size']) + ->setSyncRowsWithHeading(true); + +echo $table->generate($data); diff --git a/source/outgoing/view_cells/001.php b/source/outgoing/view_cells/001.php new file mode 100644 index 000000000..2a9e43617 --- /dev/null +++ b/source/outgoing/view_cells/001.php @@ -0,0 +1,2 @@ +// In a View. + 'value1', 'param2' => 'value2']) ?> diff --git a/source/outgoing/view_cells/002.php b/source/outgoing/view_cells/002.php new file mode 100644 index 000000000..1dcea3556 --- /dev/null +++ b/source/outgoing/view_cells/002.php @@ -0,0 +1,2 @@ +// In a View. + 'value1', 'param2' => 'value2']) ?> diff --git a/source/outgoing/view_cells/003.php b/source/outgoing/view_cells/003.php new file mode 100644 index 000000000..93fa8eea5 --- /dev/null +++ b/source/outgoing/view_cells/003.php @@ -0,0 +1,2 @@ +// In a View. + diff --git a/source/outgoing/view_cells/004.php b/source/outgoing/view_cells/004.php new file mode 100644 index 000000000..26009d86a --- /dev/null +++ b/source/outgoing/view_cells/004.php @@ -0,0 +1,11 @@ +{$params['message']}"; + } +} diff --git a/source/outgoing/view_cells/005.php b/source/outgoing/view_cells/005.php new file mode 100644 index 000000000..776b26573 --- /dev/null +++ b/source/outgoing/view_cells/005.php @@ -0,0 +1,2 @@ +// In a View. + 'success', 'message' => 'The user has been updated.']) ?> diff --git a/source/outgoing/view_cells/006.php b/source/outgoing/view_cells/006.php new file mode 100644 index 000000000..64157d309 --- /dev/null +++ b/source/outgoing/view_cells/006.php @@ -0,0 +1,2 @@ +// In a View. + diff --git a/source/outgoing/view_cells/007.php b/source/outgoing/view_cells/007.php new file mode 100644 index 000000000..ab1e56b3c --- /dev/null +++ b/source/outgoing/view_cells/007.php @@ -0,0 +1,20 @@ +blogModel->where('category', $category) + ->orderBy('published_on', 'desc') + ->limit($limit) + ->get(); + + return view('recentPosts', ['posts' => $posts]); + } +} diff --git a/source/outgoing/view_cells/008.php b/source/outgoing/view_cells/008.php new file mode 100644 index 000000000..f8b8c68ea --- /dev/null +++ b/source/outgoing/view_cells/008.php @@ -0,0 +1,13 @@ +"> + + diff --git a/source/outgoing/view_cells/010.php b/source/outgoing/view_cells/010.php new file mode 100644 index 000000000..3fdcbd9d1 --- /dev/null +++ b/source/outgoing/view_cells/010.php @@ -0,0 +1,2 @@ +// Called in main View: + diff --git a/source/outgoing/view_cells/011.php b/source/outgoing/view_cells/011.php new file mode 100644 index 000000000..75f37da19 --- /dev/null +++ b/source/outgoing/view_cells/011.php @@ -0,0 +1,13 @@ +view('my/custom/view', ['extra' => 'data']); + } +} diff --git a/source/outgoing/view_cells/013.php b/source/outgoing/view_cells/013.php new file mode 100644 index 000000000..32e02a03d --- /dev/null +++ b/source/outgoing/view_cells/013.php @@ -0,0 +1,2 @@ +// In a View. Initialize the protected properties. + 'note', 'message' => 'test']) ?> diff --git a/source/outgoing/view_cells/014.php b/source/outgoing/view_cells/014.php new file mode 100644 index 000000000..29378e119 --- /dev/null +++ b/source/outgoing/view_cells/014.php @@ -0,0 +1,34 @@ +computed = sprintf('%s - %s', $this->type, $this->message); + } + + public function getComputedProperty(): string + { + return $this->computed; + } + + public function getTypeProperty(): string + { + return $this->type; + } + + public function getMessageProperty(): string + { + return $this->message; + } +} diff --git a/source/outgoing/view_cells/015.php b/source/outgoing/view_cells/015.php new file mode 100644 index 000000000..382152cfb --- /dev/null +++ b/source/outgoing/view_cells/015.php @@ -0,0 +1,6 @@ +// app/Cells/alert_message.php +

diff --git a/source/outgoing/view_cells/016.php b/source/outgoing/view_cells/016.php new file mode 100644 index 000000000..4b2c10ef0 --- /dev/null +++ b/source/outgoing/view_cells/016.php @@ -0,0 +1,17 @@ +id, $post->title); + } +} diff --git a/source/outgoing/view_cells/017.php b/source/outgoing/view_cells/017.php new file mode 100644 index 000000000..359eb6fce --- /dev/null +++ b/source/outgoing/view_cells/017.php @@ -0,0 +1,6 @@ +// app/Cells/recent_posts.php +
    + +
  • linkPost($post) ?>
  • + +
diff --git a/source/outgoing/view_cells/018.php b/source/outgoing/view_cells/018.php new file mode 100644 index 000000000..3f64e6846 --- /dev/null +++ b/source/outgoing/view_cells/018.php @@ -0,0 +1,15 @@ +posts = model('PostModel')->orderBy('created_at', 'DESC')->findAll(10); + } +} diff --git a/source/outgoing/view_cells/019.php b/source/outgoing/view_cells/019.php new file mode 100644 index 000000000..df78ab0ac --- /dev/null +++ b/source/outgoing/view_cells/019.php @@ -0,0 +1,23 @@ +posts = model('PostModel') + ->when( + $categoryId, + static fn ($query, $categoryId) => $query->where('category_id', $categoryId) + ) + ->orderBy('created_at', 'DESC') + ->findAll(10); + } +} diff --git a/source/outgoing/view_cells/020.php b/source/outgoing/view_cells/020.php new file mode 100644 index 000000000..55d678821 --- /dev/null +++ b/source/outgoing/view_cells/020.php @@ -0,0 +1,2 @@ +// Called in main View: + 5]) ?> diff --git a/source/outgoing/view_cells/021.php b/source/outgoing/view_cells/021.php new file mode 100644 index 000000000..a6b814d1f --- /dev/null +++ b/source/outgoing/view_cells/021.php @@ -0,0 +1,2 @@ +// Cache the view for 5 minutes + diff --git a/source/outgoing/view_cells/022.php b/source/outgoing/view_cells/022.php new file mode 100644 index 000000000..8c5886957 --- /dev/null +++ b/source/outgoing/view_cells/022.php @@ -0,0 +1,2 @@ +// Cache the view for 5 minutes + diff --git a/source/outgoing/view_parser/012.php b/source/outgoing/view_parser/012.php index 000642837..696bd2d29 100644 --- a/source/outgoing/view_parser/012.php +++ b/source/outgoing/view_parser/012.php @@ -7,8 +7,8 @@ class View extends BaseView { public $filters = [ - 'abs' => '\CodeIgniter\View\Filters::abs', - 'capitalize' => '\CodeIgniter\View\Filters::capitalize', + 'foo' => '\Some\Class::methodName', + 'str_repeat' => 'str_repeat', // native php function ]; // ... diff --git a/source/outgoing/view_parser/023.php b/source/outgoing/view_parser/023.php index 1bdb256d9..8e65d489f 100644 --- a/source/outgoing/view_parser/023.php +++ b/source/outgoing/view_parser/023.php @@ -1,3 +1,3 @@ render('myview'); +return $parser->renderString('
  • Item 1
  • Item 2
'); diff --git a/source/testing/response/018.php b/source/testing/response/018.php index a76172d50..a32d2742d 100644 --- a/source/testing/response/018.php +++ b/source/testing/response/018.php @@ -1,10 +1,21 @@ see('Hello World'); +if ($results->see('Hello World')) { + // ... +} + // Check that "Hello World" is within an h1 tag -$results->see('Hello World', 'h1'); +if ($results->see('Hello World', 'h1')) { + // ... +} + // Check that "Hello World" is within an element with the "notice" class -$results->see('Hello World', '.notice'); +if ($results->see('Hello World', '.notice')) { + // ... +} + // Check that "Hello World" is within an element with id of "title" -$results->see('Hello World', '#title'); +if ($results->see('Hello World', '#title')) { + // ... +} diff --git a/source/testing/response/019.php b/source/testing/response/019.php index f96493b52..128e6862b 100644 --- a/source/testing/response/019.php +++ b/source/testing/response/019.php @@ -1,6 +1,11 @@ dontSee('Hello World'); +if ($results->dontSee('Hello World')) { + // ... +} + // Checks that "Hellow World" does NOT exist within any h1 tag -$results->dontSee('Hello World', 'h1'); +if ($results->dontSee('Hello World', 'h1')) { + // ... +} diff --git a/source/testing/response/020.php b/source/testing/response/020.php index 8b716717b..94598bf98 100644 --- a/source/testing/response/020.php +++ b/source/testing/response/020.php @@ -1,8 +1,16 @@ seeElement('.notice'); +if ($results->seeElement('.notice')) { + // ... +} + // Check that an element with id 'title' exists -$results->seeElement('#title'); +if ($results->seeElement('#title')) { + // ... +} + // Verify that an element with id 'title' does NOT exist -$results->dontSeeElement('#title'); +if ($results->dontSeeElement('#title')) { + // ... +} diff --git a/source/testing/response/021.php b/source/testing/response/021.php index bc74e3ad9..d073ec5a3 100644 --- a/source/testing/response/021.php +++ b/source/testing/response/021.php @@ -1,6 +1,11 @@ seeLink('Upgrade Account'); +if ($results->seeLink('Upgrade Account')) { + // ... +} + // Check that a link exists with 'Upgrade Account' as the text, AND a class of 'upsell' -$results->seeLink('Upgrade Account', '.upsell'); +if ($results->seeLink('Upgrade Account', '.upsell')) { + // ... +} diff --git a/source/testing/response/022.php b/source/testing/response/022.php index 9bb549c9d..791d72da4 100644 --- a/source/testing/response/022.php +++ b/source/testing/response/022.php @@ -1,6 +1,11 @@ seeInField('user', 'John Snow'); +if ($results->seeInField('user', 'John Snow')) { + // ... +} + // Check a multi-dimensional input -$results->seeInField('user[name]', 'John Snow'); +if ($results->seeInField('user[name]', 'John Snow')) { + // ... +} diff --git a/source/testing/response/023.php b/source/testing/response/023.php index 3378144f6..af7c768e3 100644 --- a/source/testing/response/023.php +++ b/source/testing/response/023.php @@ -1,6 +1,11 @@ seeCheckboxIsChecked('.foo'); +if ($results->seeCheckboxIsChecked('.foo')) { + // ... +} + // Check if checkbox with id of 'bar' is checked -$results->seeCheckboxIsChecked('#bar'); +if ($results->seeCheckboxIsChecked('#bar')) { + // ... +} diff --git a/source/testing/response/024.php b/source/testing/response/024.php index 822d62974..9238cd2fd 100644 --- a/source/testing/response/024.php +++ b/source/testing/response/024.php @@ -1,10 +1,13 @@ assertSee('Hello World'); -// Check that "Hello World" is within an h1 tag + +// Verify that "Hello World" is within an h1 tag $result->assertSee('Hello World', 'h1'); -// Check that "Hello World" is within an element with the "notice" class + +// Verify that "Hello World" is within an element with the "notice" class $result->assertSee('Hello World', '.notice'); -// Check that "Hello World" is within an element with id of "title" + +// Verify that "Hello World" is within an element with id of "title" $result->assertSee('Hello World', '#title'); diff --git a/source/testing/response/025.php b/source/testing/response/025.php index b255f4155..ea65727d0 100644 --- a/source/testing/response/025.php +++ b/source/testing/response/025.php @@ -1,6 +1,7 @@ dontSee('Hello World'); -// Checks that "Hello World" does NOT exist within any h1 tag -$results->dontSee('Hello World', 'h1'); +// Verify that "Hello World" does NOT exist on the page +$results->assertDontSee('Hello World'); + +// Verify that "Hello World" does NOT exist within any h1 tag +$results->assertDontSee('Hello World', 'h1'); diff --git a/source/testing/response/026.php b/source/testing/response/026.php index 4afd20161..5a6b38df3 100644 --- a/source/testing/response/026.php +++ b/source/testing/response/026.php @@ -1,6 +1,7 @@ seeElement('.notice'); -// Check that an element with id 'title' exists -$results->seeElement('#title'); +// Verify that an element with class 'notice' exists +$results->assertSeeElement('.notice'); + +// Verify that an element with id 'title' exists +$results->assertSeeElement('#title'); diff --git a/source/testing/response/027.php b/source/testing/response/027.php index 978048913..e5df1d09f 100644 --- a/source/testing/response/027.php +++ b/source/testing/response/027.php @@ -1,4 +1,4 @@ dontSeeElement('#title'); +$results->assertDontSeeElement('#title'); diff --git a/source/testing/response/028.php b/source/testing/response/028.php index bc74e3ad9..91b42c99a 100644 --- a/source/testing/response/028.php +++ b/source/testing/response/028.php @@ -1,6 +1,7 @@ seeLink('Upgrade Account'); -// Check that a link exists with 'Upgrade Account' as the text, AND a class of 'upsell' -$results->seeLink('Upgrade Account', '.upsell'); +// Verify that a link exists with 'Upgrade Account' as the text:: +$results->assertSeeLink('Upgrade Account'); + +// Verify that a link exists with 'Upgrade Account' as the text, AND a class of 'upsell' +$results->assertSeeLink('Upgrade Account', '.upsell'); diff --git a/source/testing/response/029.php b/source/testing/response/029.php index 1ae7910e9..dfa511aa0 100644 --- a/source/testing/response/029.php +++ b/source/testing/response/029.php @@ -1,6 +1,7 @@ assertSeeInField('user', 'John Snow'); -// Check a multi-dimensional input + +// Verify a multi-dimensional input $results->assertSeeInField('user[name]', 'John Snow'); diff --git a/source/tutorial/create_news_items/002.php b/source/tutorial/create_news_items/002.php index be1ad6a54..0b196dfa7 100644 --- a/source/tutorial/create_news_items/002.php +++ b/source/tutorial/create_news_items/002.php @@ -3,46 +3,18 @@ namespace App\Controllers; use App\Models\NewsModel; +use CodeIgniter\Exceptions\PageNotFoundException; class News extends BaseController { // ... - public function create() + public function new() { helper('form'); - // Checks whether the form is submitted. - if (! $this->request->is('post')) { - // The form is not submitted, so returns the form. - return view('templates/header', ['title' => 'Create a news item']) - . view('news/create') - . view('templates/footer'); - } - - $post = $this->request->getPost(['title', 'body']); - - // Checks whether the submitted data passed the validation rules. - if (! $this->validateData($post, [ - 'title' => 'required|max_length[255]|min_length[3]', - 'body' => 'required|max_length[5000]|min_length[10]', - ])) { - // The validation fails, so returns the form. - return view('templates/header', ['title' => 'Create a news item']) - . view('news/create') - . view('templates/footer'); - } - - $model = model(NewsModel::class); - - $model->save([ - 'title' => $post['title'], - 'slug' => url_title($post['title'], '-', true), - 'body' => $post['body'], - ]); - return view('templates/header', ['title' => 'Create a news item']) - . view('news/success') + . view('news/create') . view('templates/footer'); } } diff --git a/source/tutorial/create_news_items/004.php b/source/tutorial/create_news_items/004.php index 3de06f181..6b04f3c66 100644 --- a/source/tutorial/create_news_items/004.php +++ b/source/tutorial/create_news_items/004.php @@ -5,10 +5,10 @@ use App\Controllers\News; use App\Controllers\Pages; -$routes->match(['get', 'post'], 'news/create', [News::class, 'create']); -$routes->get('news/(:segment)', [News::class, 'view']); $routes->get('news', [News::class, 'index']); +$routes->get('news/new', [News::class, 'new']); // Add this line +$routes->post('news', [News::class, 'create']); // Add this line +$routes->get('news/(:segment)', [News::class, 'show']); + $routes->get('pages', [Pages::class, 'index']); $routes->get('(:segment)', [Pages::class, 'view']); - -// ... diff --git a/source/tutorial/create_news_items/005.php b/source/tutorial/create_news_items/005.php new file mode 100644 index 000000000..6d5657891 --- /dev/null +++ b/source/tutorial/create_news_items/005.php @@ -0,0 +1,40 @@ +validate([ + 'title' => 'required|max_length[255]|min_length[3]', + 'body' => 'required|max_length[5000]|min_length[10]', + ])) { + // The validation fails, so returns the form. + return $this->new(); + } + + // Gets the validated data. + $post = $this->validator->getValidated(); + + $model = model(NewsModel::class); + + $model->save([ + 'title' => $post['title'], + 'slug' => url_title($post['title'], '-', true), + 'body' => $post['body'], + ]); + + return view('templates/header', ['title' => 'Create a news item']) + . view('news/success') + . view('templates/footer'); + } +} diff --git a/source/tutorial/create_news_items/006.php b/source/tutorial/create_news_items/006.php new file mode 100644 index 000000000..b19bbfe9b --- /dev/null +++ b/source/tutorial/create_news_items/006.php @@ -0,0 +1,18 @@ +

+ +getFlashdata('error') ?> + + +
+ + + + +
+ + + +
+ + +
diff --git a/source/tutorial/news_section/003.php b/source/tutorial/news_section/003.php index 13c3b7263..22b24577b 100644 --- a/source/tutorial/news_section/003.php +++ b/source/tutorial/news_section/003.php @@ -13,7 +13,7 @@ public function index() $data['news'] = $model->getNews(); } - public function view($slug = null) + public function show($slug = null) { $model = model(NewsModel::class); diff --git a/source/tutorial/news_section/006.php b/source/tutorial/news_section/006.php index 657211792..95e48aa77 100644 --- a/source/tutorial/news_section/006.php +++ b/source/tutorial/news_section/006.php @@ -9,7 +9,7 @@ class News extends BaseController { // ... - public function view($slug = null) + public function show($slug = null) { $model = model(NewsModel::class); diff --git a/source/tutorial/news_section/008.php b/source/tutorial/news_section/008.php index 077efd422..df1159845 100644 --- a/source/tutorial/news_section/008.php +++ b/source/tutorial/news_section/008.php @@ -2,12 +2,11 @@ // ... -use App\Controllers\News; +use App\Controllers\News; // Add this line use App\Controllers\Pages; -$routes->get('news/(:segment)', [News::class, 'view']); -$routes->get('news', [News::class, 'index']); +$routes->get('news', [News::class, 'index']); // Add this line +$routes->get('news/(:segment)', [News::class, 'show']); // Add this line + $routes->get('pages', [Pages::class, 'index']); $routes->get('(:segment)', [Pages::class, 'view']); - -// ... diff --git a/source/tutorial/static_pages/003.php b/source/tutorial/static_pages/003.php index 956c097d3..fc4914a69 100644 --- a/source/tutorial/static_pages/003.php +++ b/source/tutorial/static_pages/003.php @@ -1,9 +1,8 @@ get('/', 'Home::index'); - -// ... From 2e21b5236e1ede9fda9d67badd367bdbeb3423bb Mon Sep 17 00:00:00 2001 From: Hex Date: Fri, 27 Oct 2023 17:25:33 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=88=B0=204.4.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/changelogs/index.rst | 5 + source/changelogs/v4.1.1.rst | 2 +- source/changelogs/v4.3.7.rst | 42 +- source/changelogs/v4.3.8.rst | 22 +- source/changelogs/v4.4.0.rst | 401 ++++++++---------- source/changelogs/v4.4.1.rst | 20 +- source/changelogs/v4.4.2.rst | 48 +-- source/cli/cli_commands.rst | 4 +- source/cli/cli_generators.rst | 12 +- source/cli/cli_overview.rst | 6 +- source/cli/spark_commands.rst | 105 +++-- source/concepts/autoloader.rst | 6 +- source/concepts/factories.rst | 146 +++++-- source/concepts/security.rst | 27 +- source/concepts/structure.rst | 2 + source/database/configuration.rst | 81 ++-- source/database/metadata.rst | 4 +- source/database/queries.rst | 14 +- source/dbmgmt/db_commands.rst | 30 +- source/dbmgmt/forge.rst | 15 +- source/dbmgmt/migration.rst | 103 +++-- source/dbmgmt/seeds.rst | 29 +- source/extending/composer_packages.rst | 108 ++--- source/extending/index.rst | 1 + source/general/caching.rst | 27 +- source/general/common_functions.rst | 31 +- source/general/configuration.rst | 75 +++- source/general/environments.rst | 12 +- source/general/errors.rst | 51 ++- source/general/modules.rst | 64 ++- source/general/urls.rst | 6 +- source/helpers/array_helper.rst | 22 + source/helpers/cookie_helper.rst | 12 +- source/helpers/form_helper.rst | 10 +- source/helpers/inflector_helper.rst | 2 +- source/helpers/number_helper.rst | 4 +- source/incoming/controllers.rst | 53 ++- source/incoming/filters.rst | 42 +- source/incoming/incomingrequest.rst | 21 +- source/incoming/message.rst | 4 +- source/incoming/routing.rst | 82 +++- .../backward_compatibility_notes.rst | 2 +- source/installation/installing_composer.rst | 82 +++- source/installation/installing_manual.rst | 4 +- source/installation/running.rst | 374 +++++++++++----- source/installation/troubleshooting.rst | 6 +- source/installation/upgrade_420.rst | 10 +- source/installation/upgrade_4210.rst | 2 +- source/installation/upgrade_4211.rst | 2 +- source/installation/upgrade_4212.rst | 2 +- source/installation/upgrade_423.rst | 2 +- source/installation/upgrade_425.rst | 2 +- source/installation/upgrade_427.rst | 2 +- source/installation/upgrade_430.rst | 18 +- source/installation/upgrade_431.rst | 10 +- source/installation/upgrade_435.rst | 15 +- source/installation/upgrade_437.rst | 56 ++- source/installation/upgrade_438.rst | 30 +- source/installation/upgrade_440.rst | 206 ++++----- source/installation/upgrade_441.rst | 27 +- source/installation/upgrade_442.rst | 23 +- source/installation/upgrade_file_upload.rst | 2 +- source/installation/upgrade_migrations.rst | 6 +- source/installation/upgrade_validations.rst | 1 + source/installation/upgrading.rst | 5 + source/intro/requirements.rst | 2 + source/libraries/caching.rst | 20 +- source/libraries/cookies.rst | 56 ++- source/libraries/curlrequest.rst | 29 +- source/libraries/email.rst | 15 +- source/libraries/images.rst | 4 +- source/libraries/pagination.rst | 32 +- source/libraries/publisher.rst | 16 +- source/libraries/security.rst | 3 + source/libraries/sessions.rst | 94 +++- source/libraries/time.rst | 8 +- source/libraries/uploaded_files.rst | 10 + source/libraries/uri.rst | 29 +- source/libraries/validation.rst | 74 +++- source/models/entities.rst | 61 ++- source/models/model.rst | 33 +- source/outgoing/localization.rst | 6 +- source/outgoing/response.rst | 13 +- source/outgoing/table.rst | 38 +- source/outgoing/view_cells.rst | 275 +++--------- source/outgoing/view_layouts.rst | 19 +- source/outgoing/view_parser.rst | 11 +- source/testing/controllers.rst | 4 + source/testing/debugging.rst | 15 + source/testing/feature.rst | 33 +- source/testing/overview.rst | 24 +- source/testing/response.rst | 38 +- source/tutorial/create_news_items.rst | 139 +++--- source/tutorial/index.rst | 14 +- source/tutorial/news_section.rst | 59 ++- source/tutorial/static_pages.rst | 84 ++-- 96 files changed, 2382 insertions(+), 1516 deletions(-) diff --git a/source/changelogs/index.rst b/source/changelogs/index.rst index 117549c2a..5418ac165 100644 --- a/source/changelogs/index.rst +++ b/source/changelogs/index.rst @@ -12,6 +12,11 @@ .. toctree:: :titlesonly: + v4.4.2 + v4.4.1 + v4.4.0 + v4.3.8 + v4.3.7 v4.3.6 v4.3.5 v4.3.4 diff --git a/source/changelogs/v4.1.1.rst b/source/changelogs/v4.1.1.rst index d09e39eaa..b9d3bf4ab 100644 --- a/source/changelogs/v4.1.1.rst +++ b/source/changelogs/v4.1.1.rst @@ -14,7 +14,7 @@ - 修复了 ``.gitattributes`` 阻止框架下载的问题。 -请注意,此修复也被回溯应用于 **framework** 仓库中的 ``4.0.5``。 +请注意,此修复也被回溯应用于 **framework** 仓库中的 4.0.5 版。 有关已修复的错误列表,请参见仓库的 `CHANGELOG_4.1.md `_。 diff --git a/source/changelogs/v4.3.7.rst b/source/changelogs/v4.3.7.rst index 789acbd75..4e5e73e2f 100644 --- a/source/changelogs/v4.3.7.rst +++ b/source/changelogs/v4.3.7.rst @@ -1,42 +1,30 @@ -Version 4.3.7 +版本 4.3.7 ############# -Release Date: July 30, 2023 +发布日期:2023年7月30日 -**4.3.7 release of CodeIgniter4** +**CodeIgniter4 4.3.7 版本发布** .. contents:: :local: :depth: 3 -BREAKING +重大变更 ******** -- **RouteCollection:** The second parameter ``bool $includeWildcard = true`` has - been added to the ``RouteCollection::getRoutes()`` method. -- **AutoRouting Legacy:** The first parameter of the ``AutoRouter::__construct()`` - has been changed from ``$protectedControllers`` to ``$cliRoutes``. -- **FeatureTestTrait:** When using :ref:`withBodyFormat() `, - the priority of the request body has been changed. - See :ref:`Upgrading Guide ` for details. -- **Validation:** The return value of ``Validation::loadRuleGroup()`` has been - changed from "**rules array**" to "**array** of **rules array** and **customErrors array**" - (``[rules, customErrors]``). - -Changes +- **路由集合 (RouteCollection):** 在 ``RouteCollection::getRoutes()`` 方法中添加了第二个参数 ``bool $includeWildcard = true``。 +- **AutoRouting Legacy:** ``AutoRouter::__construct()`` 的第一个参数从 ``$protectedControllers`` 更改为 ``$cliRoutes``。 +- **FeatureTestTrait:** 当使用 :ref:`withBodyFormat() ` 时,请求正文的优先级已更改。详情请参考 :ref:`升级指南 `。 +- **验证 (Validation):** ``Validation::loadRuleGroup()`` 的返回值从“**规则数组**” 更改为“**规则数组**和**自定义错误数组**的**数组**” (``[rules, customErrors]``)。 + +变更 ******* -- The number helper function :php:func:`number_to_amount()`, which previously - returned "1000", has been corrected to return "1 thousand" when the number - is exactly 1000, for example. +- 数字辅助函数 :php:func:`number_to_amount()`,以前返回“1000”,现在在数字恰好为1000时已更正为返回“1千”。 -Bugs Fixed -********** +已修复的错误 +************ -- **AutoRouting Legacy:** Fixed a bug that when you added a route with - ``$routes->add()``, the controller's other methods were inaccessible from the - web browser. +- **自动路由遗留功能:** 修复了一个问题,当您使用``$routes->add()``添加路由时,控制器的其他方法在Web浏览器中无法访问。 -See the repo's -`CHANGELOG.md `_ -for a complete list of bugs fixed. +请查看仓库的 `CHANGELOG.md `_ 以获取已修复错误的完整列表。 diff --git a/source/changelogs/v4.3.8.rst b/source/changelogs/v4.3.8.rst index 687b3e220..32b896cae 100644 --- a/source/changelogs/v4.3.8.rst +++ b/source/changelogs/v4.3.8.rst @@ -1,23 +1,21 @@ -Version 4.3.8 +版本 4.3.8 ############# -Release Date: August 25, 2023 +发布日期:2023年8月25日 -**4.3.8 release of CodeIgniter4** +**CodeIgniter4 4.3.8 版本发布** .. contents:: :local: :depth: 3 -Bugs Fixed -********** +已修复的错误 +************ -- **Controller Filters:** In previous versions, ``['except' => []]`` or ``['except' => '']`` - meant "except all". The bug has been fixed, and now +- **控制器过滤器 (Controller Filters):** 在以前的版本中,``['except' => []]`` 或 ``['except' => '']`` + 意味着“排除所有”。已修复此错误,现在 - - ``['except' => []]`` means to exclude nothing. - - ``['except' => '']`` means to exclude the baseURL only. + - ``['except' => []]`` 意味着不排除任何内容。 + - ``['except' => '']`` 意味着只排除基础URL。 -See the repo's -`CHANGELOG.md `_ -for a complete list of bugs fixed. +请查看仓库的 `CHANGELOG.md `_ 以获取已修复错误的完整列表。 diff --git a/source/changelogs/v4.4.0.rst b/source/changelogs/v4.4.0.rst index 59092ccd9..643d52132 100644 --- a/source/changelogs/v4.4.0.rst +++ b/source/changelogs/v4.4.0.rst @@ -1,123 +1,111 @@ -Version 4.4.0 +版本 4.4.0 ############# -Release Date: August 25, 2023 +发布日期:2023年8月25日 -**4.4.0 release of CodeIgniter4** +CodeIgniter4 的 4.4.0 版本发布 .. contents:: :local: :depth: 3 -Highlights +亮点 ********** -- The Debug Toolbar now has a new “Hot Reload” feature - (*contributed by* `lonnieezell `_). - See `Testing`_. +- 调试工具栏现在具有新的“热重载”功能 + (*由* `lonnieezell `_ 贡献)。 + 请参阅 `测试`_。 -BREAKING +重大变更 ******** -Behavior Changes +行为变更 ================ -URI::setSegment() and Non-Existent Segment +URI::setSegment() 和不存在的段 ------------------------------------------ -An exception is now thrown when you set the last ``+2`` segment. -In previous versions, an exception was thrown only if the last segment ``+3`` -or more was specified. See :ref:`upgrade-440-uri-setsegment`. +当您设置最后一个 ``+2`` 段时,现在会抛出异常。 +在之前的版本中,只有当指定了最后一个段的 ``+3`` 或更多时才会抛出异常。请参阅 :ref:`upgrade-440-uri-setsegment`。 -The next segment (``+1``) of the current last segment can be set as before. +当前最后一个段的下一个段(``+1``)可以像以前一样设置。 .. _v440-factories: -Factories +工厂 --------- -Passing Classname with Namespace -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +使用命名空间传递类名 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Now ``preferApp`` works only when you request -:ref:`a classname without a namespace `. +现在,只有在请求 :ref:`不带命名空间的类名 ` 时,``preferApp`` 才起作用。 -For example, when you call ``model(\Myth\Auth\Models\UserModel::class)`` or -``model('Myth\Auth\Models\UserModel')``: +例如,当您调用 ``model(\Myth\Auth\Models\UserModel::class)`` 或 +``model('Myth\Auth\Models\UserModel')`` 时: - - before: + - 之前: - - returns ``App\Models\UserModel`` if exists and ``preferApp`` is true (default) - - returns ``Myth\Auth\Models\UserModel`` if exists and ``preferApp`` is false + - 如果存在 ``App\Models\UserModel`` 并且 ``preferApp`` 为 true(默认值),则返回该类 + - 如果存在 ``Myth\Auth\Models\UserModel`` 并且 ``preferApp`` 为 false,则返回该类 - - after: + - 现在: - - returns ``Myth\Auth\Models\UserModel`` even if ``preferApp`` is true (default) - - returns ``App\Models\UserModel`` if you define ``Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel')`` before calling the ``model()`` + - 无论 ``preferApp`` 是否为 true(默认值),都返回 ``Myth\Auth\Models\UserModel`` + - 如果在调用 ``model()`` 之前定义了 ``Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel')``,则返回 ``App\Models\UserModel`` -If you had passed a non-existent classname by mistake, the previous version -would have returned a class instance in the ``App`` or ``Config`` namespace -because of the ``preferApp`` feature. +如果您错误地传递了一个不存在的类名,之前的版本会返回 ``App`` 或 ``Config`` 命名空间中的类实例,因为存在 ``preferApp`` 功能。 -For example, in a controller (``namespace App\Controllers``), if you called -``config(Config\App::class)`` by mistake (note the class is missing the leading ``\``), -meaning you actually passed ``App\Controllers\Config\App``. -But that class does not exist, so now Factories will return ``null``. +例如,在控制器(``namespace App\Controllers``)中,如果您错误地调用了 ``config(Config\App::class)``(注意类名缺少前导的 ``\``),实际上传递的是 ``App\Controllers\Config\App``。 +但是该类不存在,因此 Factories 现在将返回 ``null``。 -Property Name +属性名称 ^^^^^^^^^^^^^ -The property ``Factories::$basenames`` has been renamed to ``$aliases``. +属性 ``Factories::$basenames`` 已更名为 ``$aliases``。 -Autoloader +自动加载器 ---------- -Previously, CodeIgniter's autoloader allowed loading class names ending with the `.php` extension. This means instantiating objects like `new Foo.php()` was possible -and would instantiate as `new Foo()`. Since `Foo.php` is an invalid class name, this behavior of the autoloader is changed. Now, instantiating such classes would fail. +以前,CodeIgniter 的自动加载器允许加载以 `.php` 扩展名结尾的类名。这意味着可以实例化类似 `new Foo.php()` 的对象,并将其实例化为 `new Foo()`。由于 `Foo.php` 是无效的类名,自动加载器的行为已更改。现在,实例化这样的类将失败。 .. _v440-codeigniter-and-exit: -CodeIgniter and exit() +CodeIgniter 和 exit() ---------------------- -The ``CodeIgniter::run()`` method no longer calls ``exit(EXIT_SUCCESS)``. The -exit call is moved to **public/index.php**. +``CodeIgniter::run()`` 方法不再调用 ``exit(EXIT_SUCCESS)``。退出调用已移至 **public/index.php**。 .. _v440-site-uri-changes: -Site URI Changes +站点 URI 更改 ---------------- -A new ``SiteURI`` class that extends the ``URI`` class and represents the site -URI has been added, and now it is used in many places that need the current URI. +添加了一个扩展了 ``URI`` 类并表示站点 URI 的新 ``SiteURI`` 类,并且现在在许多需要当前 URI 的地方使用它。 -``$this->request->getUri()`` in controllers returns the ``SiteURI`` instance. -Also, :php:func:`site_url()`, :php:func:`base_url()`, and :php:func:`current_url()` -use the SiteURI internally. +控制器中的 ``$this->request->getUri()`` 返回 ``SiteURI`` 实例。 +此外,:php:func:`site_url()` 、:php:func:`base_url()` 和 :php:func:`current_url()` +在内部使用 SiteURI。 getPath() ^^^^^^^^^ -The ``getPath()`` method now always returns the full URI path with leading ``/``. -Therefore, when your baseURL has sub-directories and you want to get the relative -path to baseURL, you must use the new ``getRoutePath()`` method instead. +``getPath()`` 方法现在始终返回带有前导 ``/`` 的完整 URI 路径。 +因此,当您的 baseURL 具有子目录并且您想获取相对于 baseURL 的路径时,必须使用新的 ``getRoutePath()`` 方法。 -For example:: +例如:: - baseURL: http://localhost:8888/CodeIgniter4/ - The current URI: http://localhost:8888/CodeIgniter4/foo/bar - getPath(): /CodeIgniter4/foo/bar - getRoutePath(): foo/bar + baseURL: http://localhost:8888/CodeIgniter4/ + 当前 URI: http://localhost:8888/CodeIgniter4/foo/bar + getPath(): /CodeIgniter4/foo/bar + getRoutePath(): foo/bar -Site URI Values +站点 URI 值 ^^^^^^^^^^^^^^^ -The SiteURI class normalizes site URIs more strictly than before, and some bugs -have been fixed. +SiteURI 类现在比以前更严格地规范化站点 URI,并修复了一些错误。 -As a result, the framework may return site URIs or the URI paths slightly differently -than in previous versions. -For example, ``/`` will be added after ``index.php``:: +因此,与之前的版本相比,框架可能会以稍微不同的方式返回站点 URI 或 URI 路径。 +例如,在 ``index.php`` 之后会添加 ``/``:: http://example.com/test/index.php?page=1 ↓ @@ -125,79 +113,62 @@ For example, ``/`` will be added after ``index.php``:: .. _v440-interface-changes: -Interface Changes +接口更改 ================= -.. note:: As long as you have not extended the relevant CodeIgniter core classes - or implemented these interfaces, all these changes are backward compatible - and require no intervention. +.. note:: 只要您没有扩展相关的 CodeIgniter 核心类或实现这些接口,所有这些更改都是向后兼容的,无需干预。 -- **Validation:** Added the ``getValidated()`` method in ``ValidationInterface``. +- **Validation:** 在 ``ValidationInterface`` 中添加了 ``getValidated()`` 方法。 .. _v440-method-signature-changes: -Method Signature Changes +方法签名更改 ======================== .. _v440-parameter-type-changes: -Parameter Type Changes +参数类型更改 ---------------------- - **Services:** - - The first parameter of ``Services::security()`` has been changed from - ``Config\App`` to ``Config\Security``. - - The first parameter of ``Services::session()`` has been changed from - ``Config\App`` to ``Config\Session``. + - ``Services::security()`` 的第一个参数已从 ``Config\App`` 更改为 ``Config\Security``。 + - ``Services::session()`` 的第一个参数已从 ``Config\App`` 更改为 ``Config\Session``。 - **Session:** - - The second parameter of ``Session::__construct()`` has been changed from - ``Config\App`` to ``Config\Session``. - - The first parameter of ``__construct()`` in the database's ``BaseHandler``, - ``DatabaseHandler``, ``FileHandler``, ``MemcachedHandler``, and ``RedisHandler`` - has been changed from ``Config\App`` to ``Config\Session``. -- **Security:** The first parameter of ``Security::__construct()`` has been - changed from ``Config\App`` to ``Config\Security``. -- **Validation:** The method signature of ``Validation::check()`` has been changed. - The ``string`` typehint on the ``$rule`` parameter was removed. -- **CodeIgniter:** The method signature of ``CodeIgniter::setRequest()`` has been - changed. The ``Request`` typehint on the ``$request`` parameter was removed. + - ``Session::__construct()`` 的第二个参数已从 ``Config\App`` 更改为 ``Config\Session``。 + - 数据库的 ``BaseHandler``、``DatabaseHandler``、``FileHandler``、``MemcachedHandler`` 和 ``RedisHandler`` 中的 ``__construct()`` 的第一个参数已从 ``Config\App`` 更改为 ``Config\Session``。 +- **Security:** ``Security::__construct()`` 的第一个参数已从 ``Config\App`` 更改为 ``Config\Security``。 +- **Validation:** ``Validation::check()`` 的方法签名已更改。``$rule`` 参数上的 ``string`` 类型提示已被删除。 +- **CodeIgniter:** ``CodeIgniter::setRequest()`` 的方法签名已更改。``$request`` 参数上的 ``Request`` 类型提示已被删除。 - **FeatureTestCase:** - - The method signature of ``FeatureTestCase::populateGlobals()`` has been - changed. The ``Request`` typehint on the ``$request`` parameter was removed. - - The method signature of ``FeatureTestCase::setRequestBody()`` has been - changed. The ``Request`` typehint on the ``$request`` parameter and the - return type ``Request`` were removed. + - ``FeatureTestCase::populateGlobals()`` 的方法签名已更改。``$request`` 参数上的 ``Request`` 类型提示已被删除。 + - ``FeatureTestCase::setRequestBody()`` 的方法签名已更改。``$request`` 参数上的 ``Request`` 类型提示和返回类型 ``Request`` 已被删除。 -Added Parameters +添加的参数 ---------------- -- **Routing:** The third parameter ``Routing $routing`` has been added to - ``RouteCollection::__construct()``. +- **Routing:** 在 ``RouteCollection::__construct()`` 中添加了第三个参数 ``Routing $routing``。 -Removed Parameters +删除的参数 ------------------ -- **Services:** The second parameter ``$request`` and the third parameter - ``$response`` in ``Services::exceptions()`` have been removed. -- **Error Handling:** The second parameter ``$request`` and the third parameter - ``$response`` in ``CodeIgniter\Debug\Exceptions::__construct()`` have been removed. +- **Services:** 在 ``Services::exceptions()`` 中删除了第二个参数 ``$request`` 和第三个参数 ``$response``。 +- **错误处理:** 在 ``CodeIgniter\Debug\Exceptions::__construct()`` 中删除了第二个参数 ``$request`` 和第三个参数 ``$response``。 -Return Type Changes +返回类型更改 ------------------- -- **Autoloader:** The return signatures of the `loadClass` and `loadClassmap` methods are made `void` - to be compatible as callbacks in `spl_autoload_register` and `spl_autoload_unregister` functions. +- **自动加载器:** ``loadClass`` 和 ``loadClassmap`` 方法的返回签名都改为 ``void``,以便与 ``spl_autoload_register`` 和 ``spl_autoload_unregister`` 函数中的回调兼容。 -Enhancements +增强功能 ************ -Commands +命令 ======== - **spark routes:** - - Now you can specify the host in the request URL. - See :ref:`routing-spark-routes-specify-host`. - - It shows view files of :ref:`view-routes` in *Handler* like the following: + - 现在您可以在请求 URL 中指定主机。 + 请参阅 :ref:`routing-spark-routes-specify-host`。 + - 它在 *Handler* 中显示 :ref:`view-routes` 的视图文件,如下所示: +---------+-------------+------+------------------------------+----------------+---------------+ | Method | Route | Name | Handler | Before Filters | After Filters | @@ -206,160 +177,128 @@ Commands +---------+-------------+------+------------------------------+----------------+---------------+ -Testing +测试 ======= -- **DebugBar:** - - The Debug Toolbar now has a new "Hot Reload" feature that can be used to - automatically reload the page when a file is changed. - See :ref:`debug-toolbar-hot-reload`. - - Now :ref:`view-routes` are displayed in *DEFINED ROUTES* on the *Routes* tab. +- **调试工具栏:** + - 调试工具栏现在具有新的“热重载”功能,可以在文件更改时自动重新加载页面。 + 请参阅 :ref:`debug-toolbar-hot-reload`。 + - 现在,在 *Routes* 选项卡的 *DEFINED ROUTES* 中显示 :ref:`view-routes`。 -Database +数据库 ======== -- **MySQLi:** Added the ``numberNative`` attribute to the Database Config to keep the variable type obtained after SQL Query consistent with the type set in the database. - See :ref:`Database Configuration `. -- **SQLSRV:** Field Metadata now includes ``nullable``. See :ref:`db-metadata-getfielddata`. +- **MySQLi:** 在数据库配置中添加了 ``numberNative`` 属性,以保持 SQL 查询后获取的变量类型与数据库中设置的类型一致。 + 请参阅 :ref:`Database Configuration `。 +- **SQLSRV:** 字段元数据现在包括 ``nullable``。请参阅 :ref:`db-metadata-getfielddata`。 -Model +模型 ===== -- Added special getter/setter to Entity to avoid method name conflicts. - See :ref:`entities-special-getter-setter`. +- 为实体添加了特殊的 getter/setter,以避免方法名称冲突。 + 请参阅 :ref:`entities-special-getter-setter`。 -Libraries +库 ========= -- **Validation:** Added ``Validation::getValidated()`` method that gets - the actual validated data. See :ref:`validation-getting-validated-data` for details. -- **Images:** The option ``$quality`` can now be used to compress WebP images. -- **Uploaded Files:** Added ``UploadedFiles::getClientPath()`` method that returns - the value of the `full_path` index of the file if it was uploaded via directory upload. -- **CURLRequest:** Added a request option ``proxy``. See - :ref:`CURLRequest Class `. -- **URI:** A new ``SiteURI`` class that extends ``URI`` and represents the site - URI has been added. - -Helpers and Functions +- **Validation:** 添加了 ``Validation::getValidated()`` 方法,用于获取实际验证的数据。请参阅 :ref:`validation-getting-validated-data` 了解详细信息。 +- **Images:** 现在可以使用选项 ``$quality`` 压缩 WebP 图像。 +- **Uploaded Files:** 添加了 ``UploadedFiles::getClientPath()`` 方法,如果通过目录上传方式上传文件,则返回文件的 `full_path` 索引的值。 +- **CURLRequest:** 添加了请求选项 ``proxy``。请参阅 :ref:`CURLRequest Class `。 +- **URI:** 添加了一个扩展了 ``URI`` 并表示站点 URI 的新 ``SiteURI`` 类。 + +辅助函数和方法 ===================== -- **Array:** Added :php:func:`array_group_by()` helper function to group data - values together. Supports dot-notation syntax. -- **Common:** :php:func:`force_https()` no longer terminates the application, but throws a ``RedirectException``. +- **Array:** 添加了 :php:func:`array_group_by()` 辅助函数,用于将数据值分组在一起。支持点符号语法。 +- **Common:** :php:func:`force_https()` 不再终止应用程序,而是抛出 ``RedirectException``。 -Others +其他 ====== -- **DownloadResponse:** Added ``DownloadResponse::inline()`` method that sets - the ``Content-Disposition: inline`` header to display the file in the browser. - See :ref:`open-file-in-browser` for details. -- **View:** Added optional 2nd parameter ``$saveData`` on ``renderSection()`` to prevent from auto cleans the data after displaying. See :ref:`View Layouts ` for details. -- **Auto Routing (Improved)**: - - Now you can route to Modules. See :ref:`auto-routing-improved-module-routing` - for details. - - If a controller is found that corresponds to a URI segment and that controller - does not have a method defined for the URI segment, the default method will - now be executed. This addition allows for more flexible handling of URIs in - auto routing. See :ref:`controller-default-method-fallback` for details. -- **Filters:** Now you can use Filter Arguments with :ref:`$filters property `. -- **Request:** Added ``IncomingRequest::setValidLocales()`` method to set valid locales. -- **Table:** Added ``Table::setSyncRowsWithHeading()`` method to synchronize row columns with headings. See :ref:`table-sync-rows-with-headings` for details. -- **Error Handling:** Now you can use :ref:`custom-exception-handlers`. +- **DownloadResponse:** 添加了 ``DownloadResponse::inline()`` 方法,将 ``Content-Disposition: inline`` 标头设置为在浏览器中显示文件。 + 请参阅 :ref:`open-file-in-browser` 了解详细信息。 +- **View:** 在 ``renderSection()`` 上添加了可选的第二个参数 ``$saveData``,以防止在显示后自动清除数据。请参阅 :ref:`View Layouts ` 了解详细信息。 +- **自动路由(改进):** + - 现在您可以路由到模块。请参阅 :ref:`auto-routing-improved-module-routing` 了解详细信息。 + - 如果找到与 URI 段对应的控制器,并且该控制器没有为该 URI 段定义的方法,则将执行默认方法。这样可以更灵活地处理自动路由中的 URI。请参阅 :ref:`controller-default-method-fallback` 了解详细信息。 +- **过滤器:** 现在可以在 :ref:`$filters 属性 ` 中使用过滤器参数。 +- **请求:** 添加了 ``IncomingRequest::setValidLocales()`` 方法,用于设置有效的区域设置。 +- **Table:** 添加了 ``Table::setSyncRowsWithHeading()`` 方法,用于将行列与标题同步。请参阅 :ref:`table-sync-rows-with-headings` 了解详细信息。 +- **错误处理:** 现在可以使用 :ref:`custom-exception-handlers`。 - **RedirectException:** - - It can also take an object that implements ``ResponseInterface`` as its first argument. - - It implements ``ResponsableInterface``. + - 它还可以接受实现 ``ResponseInterface`` 的对象作为第一个参数。 + - 它实现了 ``ResponsableInterface``。 - **Factories:** - - You can now define the classname that will actually be loaded. - See :ref:`factories-defining-classname-to-be-loaded`. - - Config Caching implemented. See :ref:`factories-config-caching` for details. + - 现在可以定义实际加载的类名。请参阅 :ref:`factories-defining-classname-to-be-loaded`。 + - 实现了配置缓存。请参阅 :ref:`factories-config-caching` 了解详细信息。 -Message Changes +消息更改 *************** -- Added ``Core.invalidDirectory`` error message. -- Improved ``HTTP.invalidHTTPProtocol`` error message. +- 添加了 ``Core.invalidDirectory`` 错误消息。 +- 改进了 ``HTTP.invalidHTTPProtocol`` 错误消息。 -Changes +变更 ******* -- **Images:** The default quality for WebP in ``GDHandler`` has been changed from 80 to 90. +- **Images:** 在 ``GDHandler`` 中,WebP 的默认质量从 80 改为 90。 - **Config:** - - The deprecated Cookie items in **app/Config/App.php** has been removed. - - The deprecated Session items in **app/Config/App.php** has been removed. - - The deprecated CSRF items in **app/Config/App.php** has been removed. - - Routing settings have been moved to **app/Config/Routing.php** config file. - See :ref:`Upgrading Guide `. -- **DownloadResponse:** When generating response headers, does not replace the ``Content-Disposition`` header if it was previously specified. -- **Autoloader:** - - Before v4.4.0, CodeIgniter autoloader did not allow special - characters that are illegal in filenames on certain operating systems. - The symbols that can be used are ``/``, ``_``, ``.``, ``:``, ``\`` and space. - So if you installed CodeIgniter under the folder that contains the special - characters like ``(``, ``)``, etc., CodeIgniter didn't work. Since v4.4.0, - this restriction has been removed. - - The methods ``Autoloader::loadClass()`` and ``Autoloader::loadClassmap()`` are now both - marked ``@internal``. -- **RouteCollection:** The array structure of the protected property ``$routes`` - has been modified for performance. -- **HSTS:** Now :php:func:`force_https()` or - ``Config\App::$forceGlobalSecureRequests = true`` sets the HTTP status code 307, - which allows the HTTP request method to be preserved after the redirect. - In previous versions, it was 302. - -Deprecations + - 删除了 **app/Config/App.php** 中已弃用的 Cookie 项。 + - 删除了 **app/Config/App.php** 中已弃用的 Session 项。 + - 删除了 **app/Config/App.php** 中已弃用的 CSRF 项。 + - 将路由设置移至 **app/Config/Routing.php** 配置文件。 + 请参阅 :ref:`Upgrading Guide `。 +- **DownloadResponse:** 在生成响应标头时,如果之前已指定了 ``Content-Disposition`` 标头,则不替换它。 +- **自动加载器:** + - 在 v4.4.0 之前,CodeIgniter 的自动加载器不允许在某些操作系统上的文件名中使用特殊字符。 + 可以使用的符号是 ``/``、``_``、``.``、``:``、``\`` 和空格。 + 因此,如果您将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法工作。 + 从 v4.4.0 开始,此限制已被移除。 + - ``Autoloader::loadClass()`` 和 ``Autoloader::loadClassmap()`` 方法现在都标记为 ``@internal``。 +- **RouteCollection:** 受保护属性 ``$routes`` 的数组结构已进行了修改以提高性能。 +- **HSTS:** 现在,无论是通过 :php:func:`force_https()` 还是 ``Config\App::$forceGlobalSecureRequests = true``,都会设置 HTTP 状态码 307,允许在重定向后保留 HTTP 请求方法。 + 在之前的版本中,它是 302。 + +弃用 ************ -- **Entity:** ``Entity::setAttributes()`` is deprecated. Use ``Entity::injectRawData()`` instead. -- **Error Handling:** Many methods and properties in ``CodeIgniter\Debug\Exceptions`` - are deprecated. Because these methods have been moved to ``BaseExceptionHandler`` or - ``ExceptionHandler``. -- **Autoloader:** ``Autoloader::sanitizeFilename()`` is deprecated. +- **Entity:** 弃用了 ``Entity::setAttributes()`` 方法。请改用 ``Entity::injectRawData()``。 +- **错误处理:** 弃用了 ``CodeIgniter\Debug\Exceptions`` 中的许多方法和属性。因为这些方法已移至 ``BaseExceptionHandler`` 或 ``ExceptionHandler``。 +- **自动加载器:** 弃用了 ``Autoloader::sanitizeFilename()``。 - **CodeIgniter:** - - ``CodeIgniter::$returnResponse`` property is deprecated. No longer used. - - ``CodeIgniter::$cacheTTL`` property is deprecated. No longer used. Use ``ResponseCache`` instead. - - ``CodeIgniter::cache()`` method is deprecated. No longer used. Use ``ResponseCache`` instead. - - ``CodeIgniter::cachePage()`` method is deprecated. No longer used. Use ``ResponseCache`` instead. - - ``CodeIgniter::generateCacheName()`` method is deprecated. No longer used. Use ``ResponseCache`` instead. - - ``CodeIgniter::callExit()`` method is deprecated. No longer used. -- **RedirectException:** ``\CodeIgniter\Router\Exceptions\RedirectException`` is deprecated. Use ``\CodeIgniter\HTTP\Exceptions\RedirectException`` instead. -- **Session:** The property ``$sessionDriverName``, ``$sessionCookieName``, - ``$sessionExpiration``, ``$sessionSavePath``, ``$sessionMatchIP``, - ``$sessionTimeToUpdate``, and ``$sessionRegenerateDestroy`` in ``Session`` are - deprecated, and no longer used. Use ``$config`` instead. -- **Security:** The property ``$csrfProtection``, ``$tokenRandomize``, - ``$tokenName``, ``$headerName``, ``$expires``, ``$regenerate``, and - ``$redirect`` in ``Security`` are deprecated, and no longer used. Use - ``$config`` instead. + - 弃用了 ``CodeIgniter::$returnResponse`` 属性。不再使用。 + - 弃用了 ``CodeIgniter::$cacheTTL`` 属性。不再使用。请改用 ``ResponseCache``。 + - 弃用了 ``CodeIgniter::cache()`` 方法。不再使用。请改用 ``ResponseCache``。 + - 弃用了 ``CodeIgniter::cachePage()`` 方法。不再使用。请改用 ``ResponseCache``。 + - 弃用了 ``CodeIgniter::generateCacheName()`` 方法。不再使用。请改用 ``ResponseCache``。 + - 弃用了 ``CodeIgniter::callExit()`` 方法。不再使用。 +- **RedirectException:** 弃用了 ``\CodeIgniter\Router\Exceptions\RedirectException``。请改用 ``\CodeIgniter\HTTP\Exceptions\RedirectException``。 +- **Session:** 弃用了 ``Session`` 中的属性 ``$sessionDriverName``、``$sessionCookieName``、 + ``$sessionExpiration``、``$sessionSavePath``、``$sessionMatchIP``、 + ``$sessionTimeToUpdate`` 和 ``$sessionRegenerateDestroy``,不再使用。请改用 ``$config``。 +- **Security:** 弃用了 ``Security`` 中的属性 ``$csrfProtection``、``$tokenRandomize``、 + ``$tokenName``、``$headerName``、``$expires``、``$regenerate`` 和 + ``$redirect``,不再使用。请改用 ``$config``。 - **URI:** - - ``URI::$uriString`` is deprecated. - - ``URI::$baseURL`` is deprecated. Use ``SiteURI`` instead. - - ``URI::setSilent()`` is deprecated. - - ``URI::setScheme()`` is deprecated. Use ``withScheme()`` instead. - - ``URI::setURI()`` is deprecated. + - 弃用了 ``URI::$uriString``。 + - 弃用了 ``URI::$baseURL``。请改用 ``SiteURI``。 + - 弃用了 ``URI::setSilent()``。 + - 弃用了 ``URI::setScheme()``。请改用 ``withScheme()``。 + - 弃用了 ``URI::setURI()``。 + - **IncomingRequest:** - - ``IncomingRequest::detectURI()`` is deprecated and no longer used. - - ``IncomingRequest::detectPath()`` is deprecated, and no longer used. It - moved to ``SiteURIFactory``. - - ``IncomingRequest::parseRequestURI()`` is deprecated, and no longer used. It - moved to ``SiteURIFactory``. - - ``IncomingRequest::parseQueryString()`` is deprecated, and no longer used. It - moved to ``SiteURIFactory``. - - ``IncomingRequest::setPath()`` is deprecated. - -Bugs Fixed -********** + - 弃用了 ``IncomingRequest::detectURI()``,不再使用。 + - 弃用了 ``IncomingRequest::detectPath()``,不再使用。已移至 ``SiteURIFactory``。 + - 弃用了 ``IncomingRequest::parseRequestURI()``,不再使用。已移至 ``SiteURIFactory``。 + - 弃用了 ``IncomingRequest::parseQueryString()``,不再使用。已移至 ``SiteURIFactory``。 + - 弃用了 ``IncomingRequest::setPath()``。 + +已修复的错误 +************ + +- **自动路由(改进):** 在之前的版本中,当 ``$translateURIDashes`` 为 true 时,两个 URI 对应于单个控制器方法,一个 URI 用于破折号(例如 **foo-bar**),另一个 URI 用于下划线(例如 **foo_bar**)。修复了此错误。现在,下划线的 URI(**foo_bar**)无法访问。 +- **输出缓冲:** 修复了输出缓冲的错误。 +- **ControllerTestTrait:** ``ControllerTestTrait::withUri()`` 使用 URI 创建一个新的 Request 实例。因为 Request 实例应该具有 URI 实例。此外,如果 URI 字符串中的主机名与 ``Config\App`` 中的有效主机名不匹配,则将设置有效的主机名。 -- **Auto Routing (Improved)**: In previous versions, when ``$translateURIDashes`` - is true, two URIs correspond to a single controller method, one URI for dashes - (e.g., **foo-bar**) and one URI for underscores (e.g., **foo_bar**). This bug - has been fixed. Now the URI for underscores (**foo_bar**) is not accessible. -- **Output Buffering:** Bug fix with output buffering. -- **ControllerTestTrait:** ``ControllerTestTrait::withUri()`` creates a new Request - instance with the URI. Because the Request instance should have the URI instance. - Also if the hostname in the URI string is invalid with ``Config\App``, the valid - hostname will be set. - -See the repo's -`CHANGELOG.md `_ -for a complete list of bugs fixed. +有关修复的所有错误的完整列表,请参阅存储库的 `CHANGELOG.md `_。 diff --git a/source/changelogs/v4.4.1.rst b/source/changelogs/v4.4.1.rst index b6c92affc..12b65f178 100644 --- a/source/changelogs/v4.4.1.rst +++ b/source/changelogs/v4.4.1.rst @@ -1,22 +1,22 @@ -Version 4.4.1 +版本 4.4.1 ############# -Release Date: September 5, 2023 +发布日期:2023年9月5日 -**4.4.1 release of CodeIgniter4** +**CodeIgniter4 的 4.4.1 版本** .. contents:: :local: :depth: 3 -Bugs Fixed +修复的问题 ********** -- **AutoRouting Legacy:** Fixed a bug that Auto Routing Legacy does not work. -- **FeatureTest:** - - Fixed a bug that FeatureTest may cause risky tests. - - Fixed a bug that FeatureTest fails when forceGlobalSecureRequests is true. +- **AutoRouting Legacy:** 修复了 Legacy 自动路由无法正常工作的 bug。 +- **FeatureTest:** + - 修复了 FeatureTest 可能导致风险测试的 bug。 + - 修复了 FeatureTest 在 forceGlobalSecureRequests 为 true 时失败的 bug。 -See the repo's +请参阅仓库的 `CHANGELOG.md `_ -for a complete list of bugs fixed. +获取完整的修复 bug 列表。 diff --git a/source/changelogs/v4.4.2.rst b/source/changelogs/v4.4.2.rst index eb146ef07..b0cec36d2 100644 --- a/source/changelogs/v4.4.2.rst +++ b/source/changelogs/v4.4.2.rst @@ -1,50 +1,40 @@ -Version 4.4.2 +版本 4.4.2 ############# -Release Date: October 19, 2023 +发布日期:2023年10月19日 -**4.4.2 release of CodeIgniter4** +**CodeIgniter4 的 4.4.2 版本** .. contents:: :local: :depth: 3 -Message Changes +消息变更 *************** -- Added ``Language.invalidMessageFormat`` error message. +- 添加了 ``Language.invalidMessageFormat`` 错误消息。 -Changes +变更 ******* -- **Database Migrations:** The ``-g`` option for the ``spark migrate:rollback`` - command was removed. It did not work from the beginning. Also, the rollback - command returns the database(s) state to a specified batch number and cannot - specify only a specific database group. -- **Security:** The presence of the CSRF token is now also checked in the raw body (not JSON format) for PUT, PATCH, and DELETE type of requests. +- **数据库迁移:** 移除了 ``spark migrate:rollback`` 命令的 ``-g`` 选项。该选项从一开始就无效。此外,回滚命令将数据库状态恢复到指定的批次号,并且无法仅指定特定的数据库组。 +- **安全性:** 现在还会检查原始请求体(非 JSON 格式)中的 CSRF 令牌,用于 PUT、PATCH 和 DELETE 类型的请求。 -Deprecations +弃用 ************ -- **Filters:** The Auto-Discovery for Filters and ``Filters::discoverFilters()`` - is deprecated. Use :ref:`registrars` instead. See :ref:`modules-filters` for - details. -- **CLI:** The public property ``CLI::$readline_support`` and ``CLI::$wait_msg`` - are deprecated. These methods will be protected. -- **CodeIgniter:** The parameter ``$config`` for the ``displayCache()`` method is - deprecated. It was not used. +- **过滤器:** 过滤器的自动发现和 ``Filters::discoverFilters()`` 方法已弃用。请改用 :ref:`registrars`。有关详细信息,请参阅 :ref:`modules-filters`。 +- **CLI:** 弃用了公共属性 ``CLI::$readline_support`` 和 ``CLI::$wait_msg``。这些方法将被保护。 +- **CodeIgniter:** ``displayCache()`` 方法的 ``$config`` 参数已弃用。未使用该参数。 -Bugs Fixed +修复的问题 ********** -- **CodeIgniter:** Fixed a bug that returned "200 OK" response status code when - Page Not Found. -- **Spark:** Fixed a bug that caused spark to not display exceptions in the - production mode or to display backtrace in json when an exception occurred. -- **Forge:** Fixed a bug where adding a Primary Key to an existing table was - ignored if there were no other Keys added too. -- **Routing:** Fixed a bug that ``spark routes`` may show incorrect route names. +- **CodeIgniter:** 修复了在页面未找到时返回 "200 OK" 响应状态码的 bug。 +- **Spark:** 修复了在生产模式下 spark 无法显示异常或在发生异常时以 JSON 格式显示回溯的 bug。 +- **Forge:** 修复了在给现有表添加主键时,如果没有添加其他键,则会被忽略的 bug。 +- **路由:** 修复了 ``spark routes`` 可能显示不正确的路由名称的 bug。 -See the repo's +请参阅仓库的 `CHANGELOG.md `_ -for a complete list of bugs fixed. +获取完整的修复 bug 列表。 diff --git a/source/cli/cli_commands.rst b/source/cli/cli_commands.rst index 8b3627c5f..0a01a2d26 100644 --- a/source/cli/cli_commands.rst +++ b/source/cli/cli_commands.rst @@ -51,7 +51,9 @@ run() ``run()`` 方法是在运行命令时调用的方法。``$params`` 数组是命令名称后面的任何 CLI 参数列表,供你使用。如果 CLI 字符串是: - > php spark foo bar baz +.. code-block:: console + + php spark foo bar baz 那么 **foo** 是命令名称, ``$params`` 数组将是: diff --git a/source/cli/cli_generators.rst b/source/cli/cli_generators.rst index bd718391d..18aa5e2c0 100644 --- a/source/cli/cli_generators.rst +++ b/source/cli/cli_generators.rst @@ -13,9 +13,11 @@ CodeIgniter4 现在配备了生成器,以简化常规控制器、模型、实体 ************ 所有内置生成器在使用 ``php spark list`` 列出时都位于 ``Generators`` 组下。 -要查看特定生成器的完整描述和使用信息,请使用命令:: +要查看特定生成器的完整描述和使用信息,请使用命令: - > php spark help <生成器命令> +.. code-block:: console + + php spark help <生成器命令> 其中 ``<生成器命令>`` 将替换为要检查的命令。 @@ -265,9 +267,11 @@ make:validation 不要担心!CodeIgniter4 还配备了专用的 ``make:scaffold`` 命令,它基本上是控制器、模型、实体、迁移和种子生成器命令的包装器。你只需要输入用于命名所有生成类的类名。另外, **每个生成器命令支持的单独选项** 也会被脚手架命令识别。 -在终端中运行此命令:: +在终端中运行此命令: + +.. code-block:: console - > php spark make:scaffold user + php spark make:scaffold user 将创建以下文件: diff --git a/source/cli/cli_overview.rst b/source/cli/cli_overview.rst index 74c4aa9b7..7a54fdac7 100644 --- a/source/cli/cli_overview.rst +++ b/source/cli/cli_overview.rst @@ -31,9 +31,11 @@ Spark 命令 CodeIgniter 提供了官方命令 **spark** 和内置命令。 -你可以运行 spark 并查看帮助:: +你可以运行 spark 并查看帮助: - > php spark +.. code-block:: console + + php spark 有关详细信息,请参阅 :doc:`spark_commands` 页面。 diff --git a/source/cli/spark_commands.rst b/source/cli/spark_commands.rst index 1041d9684..5eeda9ee0 100644 --- a/source/cli/spark_commands.rst +++ b/source/cli/spark_commands.rst @@ -6,7 +6,7 @@ CodeIgniter 提供了官方命令 **spark** 和内置命令。 .. contents:: :local: - :depth: 2 + :depth: 3 **************** 运行命令 @@ -15,64 +15,99 @@ CodeIgniter 提供了官方命令 **spark** 和内置命令。 通过 CLI 运行 =============== -这些命令是从项目根目录的命令行运行的。 -提供了命令文件 **spark** 用于运行任何 CLI 命令:: +命令是从命令行中在项目根目录下运行的。 +提供了一个名为 **spark** 的命令文件,用于运行任何 CLI 命令。 - > php spark +显示命令列表 +------------------------ -如果不指定命令直接调用,将显示一个简单的帮助页面,其中也提供了可用命令列表。 +当不指定命令调用 **spark** 时,会显示一个简单的帮助页面,其中还提供了按类别排序的可用命令列表及其描述: -你应该将命令名作为第一个参数传递来运行该命令:: +.. code-block:: console - > php spark migrate + php spark -某些命令需要附加参数,应在命令后直接提供这些参数,使用空格分隔:: +spark list +^^^^^^^^^^ - > php spark db:seed DevUserSeeder +``php spark`` 与 ``list`` 命令完全相同: -你始终可以传递 ``--no-header`` 来隐藏标题输出,有助于解析结果:: +.. code-block:: console - > php spark cache:clear --no-header + php spark list -对于 CodeIgniter 提供的所有命令,如果你没有提供所需的参数,它会提示你它需要正确运行的信息:: +您还可以使用 ``--simple`` 选项获取按字母顺序排序的所有可用命令的原始列表: - > php spark make::controller +.. code-block:: console - Controller class name: + php spark list --simple -调用命令 -================ +显示帮助 +------------ -命令也可以在代码中调用。这通常在控制器的 cron 任务中完成,但可以在任何时候使用。你可以使用 ``command()`` 函数来实现。该函数一直可用。 +您可以使用 ``help`` 命令获取有关任何 CLI 命令的帮助,如下所示: -.. literalinclude:: cli_commands/001.php +.. code-block:: console -唯一的参数是一个字符串,即调用的命令及任何参数。这看起来与从命令行调用完全相同。 + php spark help db:seed -从命令行外运行时,命令的所有输出都会被捕获。它从命令返回,以便你可以选择显示或不显示。 +自 v4.3.0 起,您还可以使用 ``--help`` 选项代替 ``help`` 命令: -****************** -使用帮助命令 -****************** +.. code-block:: console -spark help -========== + php spark db:seed --help -你可以使用 ``help`` 命令获取有关任何 CLI 命令的帮助:: +运行命令 +----------------- - > php spark help db:seed +您应该将命令的名称作为第一个参数传递以运行该命令: -从 v4.3.0 开始,你也可以使用 ``--help`` 选项代替 ``help`` 命令:: +.. code-block:: console - > php spark db:seed --help + php spark migrate -spark list -========== +某些命令接受附加参数,这些参数应该直接在命令之后用空格分隔提供: + +.. code-block:: console + + php spark db:seed DevUserSeeder + +对于 CodeIgniter 提供的所有命令,如果您没有提供所需的参数,系统将提示您提供运行所需的信息: + +.. code-block:: console + + php spark make:controller + + Controller 类名: + +抑制头部输出 +------------------------- -使用 ``list`` 命令获取可用命令列表及其描述,这些命令已按类别排序:: +运行命令时,会输出包含 CodeIgniter 版本和当前时间的头部信息: - > php spark list +.. code-block:: console + + php spark env + + CodeIgniter v4.3.5 Command Line Tool - Server Time: 2023-06-16 12:45:31 UTC+00:00 + + Your environment is currently set as development. + +您可以始终传递 ``--no-header`` 以抑制头部输出,这对于解析结果很有帮助: + +.. code-block:: console + + php spark env --no-header + + Your environment is currently set as development. + +调用命令 +================ + +命令也可以从您自己的代码中运行。这通常在控制器中用于 cron 任务,但可以随时使用。您可以使用 ``command()`` 函数来实现。该函数始终可用。 + +.. literalinclude:: cli_commands/001.php -你也可以使用 ``--simple`` 选项获取所有可用命令的原始列表,这些命令已按字母顺序排序:: +唯一的参数是字符串,即所调用的命令和任何参数。它的使用方式与从命令行调用完全相同。 - > php spark list --simple +当不从命令行运行时,所有运行的命令的输出都会被捕获。它会从命令中返回,以便您可以选择是否显示它。 diff --git a/source/concepts/autoloader.rst b/source/concepts/autoloader.rst index ee6cc1fff..afdb930fa 100755 --- a/source/concepts/autoloader.rst +++ b/source/concepts/autoloader.rst @@ -39,9 +39,11 @@ CodeIgniter 提供了一个非常灵活的自动加载器,可以通过非常少 每行的键是命名空间本身。这个不需要尾部反斜杠。 值是可以找到类的目录位置。 -.. note:: 你可以使用 ``spark namespaces`` 命令检查命名空间配置:: +.. note:: 你可以使用 ``spark namespaces`` 命令检查命名空间配置: - > php spark namespaces + .. code-block:: console + + php spark namespaces 默认情况下,应用程序目录被映射到 ``App`` 命名空间。你必须为应用程序目录中的控制器、库或模型添加命名空间,它们将在 ``App`` 命名空间下被找到。 diff --git a/source/concepts/factories.rst b/source/concepts/factories.rst index f98fce195..528dfbc81 100644 --- a/source/concepts/factories.rst +++ b/source/concepts/factories.rst @@ -32,65 +32,72 @@ 另一方面,服务具有创建实例的代码,所以它可以创建一个需要其他服务或类实例的复杂实例。获取服务时,服务需要一个服务名称,而不是一个类名,所以可以在不更改客户端代码的情况下更改返回的实例。 +.. _factories-loading-class: + 加载类 *************** 加载一个类 =============== -.. _factories-example: +以 **模型** 为例。你可以通过使用 Factories 类的魔术静态方法 ``Factories::models()`` 访问特定于模型的工厂。 -模型示例 -------------- +静态方法名称称为 *component*。 -以 **模型** 为例。你可以通过使用 Factories 类的魔术静态方法 ``Factories::models()`` 访问特定于模型的工厂。 +不带命名空间的类名 +----------------------------------- -静态方法名称称为 *组件*。 +如果您传递一个不带命名空间的类名,Factories 首先会在 ``App`` 命名空间中搜索与魔术静态方法名对应的路径。``Factories::models()`` 会搜索 **app/Models** 目录。 -默认情况下,工厂首先在 ``App`` 命名空间中搜索与魔术静态方法名称对应的路径。``Factories::models()`` 搜索 **app/Models** 目录。 +传递短类名 +^^^^^^^^^^^^^^^^^^^^^^^ -在以下代码中,如果你有 ``App\Models\UserModel``,将返回实例: +在下面的代码中,如果您有 ``App\Models\UserModel``,将返回该实例: .. literalinclude:: factories/001.php -或者你也可以请求一个特定的类: +如果没有 ``App\Models\UserModel``,它会在所有命名空间中搜索 ``Models\UserModel``。 -.. literalinclude:: factories/002.php - :lines: 2- +下次您在代码中的任何地方请求相同的类时,Factories 将确保您获得之前的实例: + +.. literalinclude:: factories/003.php -如果你只有 ``Blog\Models\UserModel``,将返回实例。 -但如果你同时有 ``App\Models\UserModel`` 和 ``Blog\Models\UserModel``, -将返回 ``App\Models\UserModel`` 的实例。 +传递带有子目录的短类名 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -如果你想获取 ``Blog\Models\UserModel``,你需要禁用 ``preferApp`` 选项: +如果要加载子目录中的类,可以使用 ``/`` 作为分隔符。如果存在,以下代码将加载 **app/Libraries/Sub/SubLib.php**: -.. literalinclude:: factories/010.php +.. literalinclude:: factories/013.php :lines: 2- -参见 :ref:`factories-options` 了解详细信息。 +传递完全限定类名 +-------------------------------- -下次你在代码中的任何地方请求相同的类,工厂都会确保像以前一样返回该实例: +您还可以请求一个完全限定的类名: -.. literalinclude:: factories/003.php +.. literalinclude:: factories/002.php + :lines: 2- -在子目录中加载类 -================================== +如果存在,它将返回 ``Blog\Models\UserModel`` 的实例。 -如果你想在子目录中加载类,可以使用 ``/`` 作为分隔符。 -以下代码加载 **app/Libraries/Sub/SubLib.php**: +.. note:: 在 v4.4.0 之前,当您请求一个完全限定的类名时,如果只有 ``Blog\Models\UserModel``,将返回该实例。但是,如果同时存在 ``App\Models\UserModel`` 和 ``Blog\Models\UserModel``,将返回 ``App\Models\UserModel`` 的实例。 -.. literalinclude:: factories/013.php - :lines: 2- + 如果您想获取 ``Blog\Models\UserModel``,您需要禁用选项 ``preferApp``: + + .. literalinclude:: factories/010.php + :lines: 2- 便利函数 ********************* 为工厂提供了两个快捷函数。这些函数始终可用。 +.. _factories-config: + config() ======== -第一个是 ``config()``,它返回一个新的 Config 类实例。唯一必需的参数是类名称: +第一个是 :php:func:`config()`,它返回一个新的 Config 类实例。唯一必需的参数是类名称: .. literalinclude:: factories/008.php @@ -101,6 +108,25 @@ model() .. literalinclude:: factories/009.php +.. _factories-defining-classname-to-be-loaded: + +定义要加载的类名 +******************************* + +.. versionadded:: 4.4.0 + +您可以使用 ``Factories::define()`` 方法定义在加载类之前要加载的类名: + +.. literalinclude:: factories/014.php + :lines: 2- + +第一个参数是组件。第二个参数是类别名(Factories 魔术静态方法的第一个参数),第三个参数是要加载的真实完全限定类名。 + +之后,如果使用 Factories 加载 ``Myth\Auth\Models\UserModel``,将返回 ``App\Models\UserModel`` 的实例: + +.. literalinclude:: factories/015.php + :lines: 2- + 工厂参数 ****************** @@ -131,6 +157,8 @@ getShared boolean 是否返回类的共享实例或者加载一个新实 preferApp boolean 是否优先使用 App 命名空间中具有相同基本名称的类而不是其他明确的类请求。 ``true`` ========== ============== ======================================================================= =================================================== +.. note:: 自 v4.4.0 起,``preferApp`` 仅在您请求 :ref:`不带命名空间的类名 ` 时起作用。 + 工厂行为 ****************** @@ -191,3 +219,71 @@ setOptions 方法 .. literalinclude:: factories/007.php :lines: 2- + +.. _factories-config-caching: + +配置缓存 +************** + +.. versionadded:: 4.4.0 + +为了提高性能,实现了配置缓存。 + +先决条件 +============ + +.. important:: 当不满足先决条件时使用此功能将阻止 CodeIgniter 正常运行。在这种情况下不要使用此功能。 + +- 要使用此功能,Factories 中实例化的所有 Config 对象的属性在实例化后不能被修改。换句话说,Config 类必须是不可变或只读的类。 +- 默认情况下,每个被缓存的 Config 类必须实现 ``__set_state()`` 方法。 + +工作原理 +============ + +- 如果 Factories 中的 Config 实例的状态发生变化,则在关闭之前将所有 Config 实例保存到缓存文件中。 +- 如果有缓存可用,则在 CodeIgniter 初始化之前恢复缓存的 Config 实例。 + +简而言之,Factories 持有的所有 Config 实例在关闭之前都会被缓存,并且缓存的实例将永久使用。 + +如何更新配置值 +=========================== + +一旦存储,缓存的版本将永不过期。更改现有的 Config 文件(或更改其环境变量)不会更新缓存或 Config 值。 + +因此,如果要更新 Config 值,请更新 Config 文件或其环境变量,并且必须手动删除缓存文件。 + +您可以使用 ``spark cache:clear`` 命令: + +.. code-block:: console + + php spark cache:clear + +或者直接删除 **writable/cache/FactoriesCache_config** 文件。 + +如何启用配置缓存 +============================ + +取消 **public/index.php** 中以下代码的注释:: + + --- a/public/index.php + +++ b/public/index.php + @@ -49,8 +49,8 @@ if (! defined('ENVIRONMENT')) { + } + + // Load Config Cache + -// $factoriesCache = new \CodeIgniter\Cache\FactoriesCache(); + -// $factoriesCache->load('config'); + +$factoriesCache = new \CodeIgniter\Cache\FactoriesCache(); + +$factoriesCache->load('config'); + // ^^^ Uncomment these lines if you want to use Config Caching. + + /* + @@ -79,7 +79,7 @@ $app->setContext($context); + $app->run(); + + // Save Config Cache + -// $factoriesCache->save('config'); + +$factoriesCache->save('config'); + // ^^^ Uncomment this line if you want to use Config Caching. + + // Exits the application, setting the exit code for CLI-based applications diff --git a/source/concepts/security.rst b/source/concepts/security.rst index afb561455..d45e8857a 100755 --- a/source/concepts/security.rst +++ b/source/concepts/security.rst @@ -34,8 +34,9 @@ OWASP 建议 CodeIgniter 对应措施 ====================== -- :doc:`HTTP 库 <../incoming/incomingrequest>` 提供输入字段过滤和内容元数据 -- 验证库 +- :ref:`invalidchars` 过滤器 +- :doc:`../libraries/validation` 库 +- :doc:`HTTP 库 <../incoming/incomingrequest>` 提供了 :ref:`输入字段过滤 ` 和内容元数据的功能 ********************************************* A2 弱认证和会话管理 @@ -57,6 +58,7 @@ CodeIgniter 对应措施 - :doc:`会话 <../libraries/sessions>` 库 - :doc:`安全 ` 库提供 CSRF 验证 +- 一个官方的身份验证和授权框架 :ref:`CodeIgniter Shield ` - 易于添加第三方认证 ***************************** @@ -75,8 +77,9 @@ OWASP 建议 CodeIgniter 对应措施 ====================== -- esc 函数 -- 验证库 +- :php:func:`esc()` 函数 +- :doc:`../libraries/validation` 库 +- 支持 :ref:`content-security-policy` *********************************** A4 不安全的直接对象引用 @@ -95,7 +98,8 @@ OWASP 建议 CodeIgniter 对应措施 ====================== -- 验证库 +- :doc:`../libraries/validation` 库 +- 一个官方的身份验证和授权框架 :ref:`CodeIgniter Shield ` - 易于添加第三方认证 **************************** @@ -132,7 +136,10 @@ OWASP 建议 CodeIgniter 对应措施 ====================== -- 会话密钥以加密形式存储 +- 全局安全访问的配置(``Config\App::$forceGlobalSecureRequests``) +- :php:func:`force_https()` 函数 +- :doc:`../libraries/encryption` +- :ref:`数据库配置 `(``encrypt``) **************************************** A7 缺少功能级访问控制 @@ -150,8 +157,8 @@ OWASP 建议 CodeIgniter 对应措施 ====================== -- 公共文件夹,应用程序和系统在外 -- :doc:`安全库 ` 提供 CSRF 验证 +- :ref:`Public ` 文件夹,其中应用程序和系统位于外部 +- :doc:`安全库 ` 提供了 :ref:`CSRF 验证 ` 的功能 ************************************ A8 跨站请求伪造(CSRF) @@ -169,7 +176,7 @@ OWASP 建议 CodeIgniter 对应措施 ====================== -- :doc:`安全库 ` 提供 CSRF 验证 +- :doc:`安全库 ` 提供了 :ref:`CSRF 验证 ` 的功能 ********************************************** A9 使用已知漏洞的组件 @@ -204,4 +211,4 @@ CodeIgniter 对应措施 ====================== - :doc:`HTTP 库 <../incoming/incomingrequest>` 提供... -- :doc:`Session 库 <../libraries/sessions>` 提供临时数据 +- :doc:`Session 库 <../libraries/sessions>` 提供 :ref:`sessions-flashdata` diff --git a/source/concepts/structure.rst b/source/concepts/structure.rst index 221699c65..3d6abef24 100755 --- a/source/concepts/structure.rst +++ b/source/concepts/structure.rst @@ -48,6 +48,8 @@ system 此目录下的所有文件位于 ``CodeIgniter`` 命名空间下。 +.. _application-structure-public: + public ====== diff --git a/source/database/configuration.rst b/source/database/configuration.rst index c9e2d1e75..5ca8b5760 100755 --- a/source/database/configuration.rst +++ b/source/database/configuration.rst @@ -83,6 +83,8 @@ DSN .. literalinclude:: configuration/008.php +.. _database-config-with-env-file: + ************************** 使用 .env 文件配置 ************************** @@ -105,48 +107,51 @@ DSN .. literalinclude:: configuration/009.php +.. _database-config-explanation-of-values: + ********************** 值的解释: ********************** -=============== =========================================================================================================== +================ =========================================================================================================== 名称 描述 -=============== =========================================================================================================== -**DSN** DSN 连接字符串(一体化配置序列)。 -**hostname** 数据库服务器的主机名。通常是 'localhost'。 -**username** 用于连接数据库的用户名。(``SQLite3`` 不使用此用户名) -**password** 用于连接数据库的密码。(``SQLite3`` 不使用此密码) -**database** 要连接的数据库名称。 - - .. note:: CodeIgniter 不支持数据库、表格和列名称中的点(``.``)。 -**DBDriver** 数据库驱动名称。驱动名称区分大小写。 - 你可以设置完全限定的类名以使用自定义驱动。 - 支持的驱动:``MySQLi``、``Postgre``、``SQLite3``、``SQLSRV`` 和 ``OCI8``。 -**DBPrefix** 可选的表前缀,在运行时会添加到表名中:doc:`查询构造器 ` 查询。这允许多个 CodeIgniter 安装共享一个数据库。 -**pConnect** true/false (布尔值)- 是否使用持久连接。 -**DBDebug** true/false (布尔值)- 数据库错误发生时是否抛出异常。 -**charset** 与数据库通信使用的字符集。 -**DBCollat** 与数据库通信使用的字符整理(``MySQLi`` 仅)。 -**swapPre** 一个默认的表前缀,应该与 ``DBPrefix`` 互换。这对于分布式应用程序很有用,在那里你可能运行手动编写的查询,并需要最终用户仍可自定义前缀。 -**schema** 数据库模式,默认值因驱动而异。(``Postgre`` 和 ``SQLSRV`` 使用。) -**encrypt** 是否使用加密连接。 - ``SQLSRV`` 驱动程序接受 true/false - ``MySQLi`` 驱动程序接受带有以下选项的数组: - * ``ssl_key`` - 私钥文件的路径 - * ``ssl_cert`` - 公钥证书文件的路径 - * ``ssl_ca`` - 证书颁发机构文件的路径 - * ``ssl_capath`` - 包含 PEM 格式可信 CA 证书的目录的路径 - * ``ssl_cipher`` - 用冒号 (``:``) 分隔的允许使用的加密的列表 - * ``ssl_verify`` - true/false; 是否验证服务器证书 (``MySQLi`` 仅) -**compress** 是否使用客户端压缩(``MySQLi`` 仅)。 -**strictOn** true/false (布尔值)- 是否强制“严格模式”连接,有助于开发应用程序时确保严格的 SQL (``MySQLi`` 仅)。 -**port** 数据库端口号。 -**foreignKeys** true/false (布尔值)- 是否启用外键约束(``SQLite3`` 仅)。 - - .. important:: SQLite3 外键约束默认关闭。 - 请参阅 `SQLite 文档 `_。 - 要实施外键约束,请将此配置项设置为 true。 -**busyTimeout** 毫秒(int) - 表锁定时休眠指定时间(``SQLite3`` 仅)。 -=============== =========================================================================================================== +================ =========================================================================================================== +**DSN** DSN 连接字符串(一体化配置序列)。 +**hostname** 数据库服务器的主机名。通常是 'localhost'。 +**username** 用于连接数据库的用户名。(``SQLite3`` 不使用此用户名) +**password** 用于连接数据库的密码。(``SQLite3`` 不使用此密码) +**database** 要连接的数据库名称。 + + .. note:: CodeIgniter 不支持数据库、表格和列名称中的点(``.``)。 +**DBDriver** 数据库驱动名称。驱动名称区分大小写。 + 你可以设置完全限定的类名以使用自定义驱动。 + 支持的驱动:``MySQLi``、``Postgre``、``SQLite3``、``SQLSRV`` 和 ``OCI8``。 +**DBPrefix** 可选的表前缀,在运行时会添加到表名中:doc:`查询构造器 ` 查询。这允许多个 CodeIgniter 安装共享一个数据库。 +**pConnect** true/false (布尔值)- 是否使用持久连接。 +**DBDebug** true/false (布尔值)- 数据库错误发生时是否抛出异常。 +**charset** 与数据库通信使用的字符集。 +**DBCollat** 与数据库通信使用的字符整理(``MySQLi`` 仅)。 +**swapPre** 一个默认的表前缀,应该与 ``DBPrefix`` 互换。这对于分布式应用程序很有用,在那里你可能运行手动编写的查询,并需要最终用户仍可自定义前缀。 +**schema** 数据库模式,默认值因驱动而异。(``Postgre`` 和 ``SQLSRV`` 使用。) +**encrypt** 是否使用加密连接。 + ``SQLSRV`` 驱动程序接受 true/false + ``MySQLi`` 驱动程序接受带有以下选项的数组: + * ``ssl_key`` - 私钥文件的路径 + * ``ssl_cert`` - 公钥证书文件的路径 + * ``ssl_ca`` - 证书颁发机构文件的路径 + * ``ssl_capath`` - 包含 PEM 格式可信 CA 证书的目录的路径 + * ``ssl_cipher`` - 用冒号 (``:``) 分隔的允许使用的加密的列表 + * ``ssl_verify`` - true/false; 是否验证服务器证书 (``MySQLi`` 仅) +**compress** 是否使用客户端压缩(``MySQLi`` 仅)。 +**strictOn** true/false (布尔值)- 是否强制“严格模式”连接,有助于开发应用程序时确保严格的 SQL (``MySQLi`` 仅)。 +**port** 数据库端口号 - 默认端口为空字符串 ``''``(或使用 ``SQLSRV`` 动态端口)。 +**foreignKeys** true/false (布尔值)- 是否启用外键约束(``SQLite3`` 仅)。 + + .. important:: SQLite3 外键约束默认关闭。 + 请参阅 `SQLite 文档 `_。 + 要实施外键约束,请将此配置项设置为 true。 +**busyTimeout** 毫秒(int) - 表锁定时休眠指定时间(``SQLite3`` 仅)。 +**numberNative** true/false (布尔值) - 是否启用 MYSQLI_OPT_INT_AND_FLOAT_NATIVE(仅适用于 ``MySQLi``)。 +================ =========================================================================================================== .. note:: 根据你使用的数据库驱动程序(``MySQLi``、``Postgre`` 等),并非所有的值都是必需的。例如,在使用 ``SQLite3`` 时,你不需要提供用户名或密码,数据库名称将是数据库文件的路径。 diff --git a/source/database/metadata.rst b/source/database/metadata.rst index bdd9d6e62..6453aadad 100755 --- a/source/database/metadata.rst +++ b/source/database/metadata.rst @@ -71,6 +71,8 @@ $db->fieldExists() 检索字段元数据 ======================= +.. _db-metadata-getfielddata: + $db->getFieldData() ------------------- @@ -94,7 +96,7 @@ $db->getFieldData() - type - 列的类型 - max_length - 列的最大长度 - primary_key - 如果列是主键,则为整数 ``1`` (即使有多个主键,也全部为整数 ``1``),否则为整数 ``0`` (此字段当前仅适用于 MySQL 和 SQLite3) -- nullable - 如果列可为空,则为布尔值 ``true``,否则为布尔值 ``false`` (此字段当前在 SQL Server 中不可用) +- nullable - 如果列可为空,则为布尔值 ``true``,否则为布尔值 ``false`` - default - 默认值 列出表中的索引 diff --git a/source/database/queries.rst b/source/database/queries.rst index 579cbd7b4..125efec37 100755 --- a/source/database/queries.rst +++ b/source/database/queries.rst @@ -15,11 +15,16 @@ 常规查询 =============== -要提交查询,请使用 **query** 函数: +.. _db-query: + +$db->query() +------------ + +要提交查询,请使用 ``query()`` 方法: .. literalinclude:: queries/001.php -当运行“读取”类型查询时, ``query()`` 函数会返回一个可以用来 :doc:`显示结果 ` 的数据库结果 **对象**。当运行“写入”类型查询时,它根据成功或失败简单地返回 true 或 false。检索数据时,你通常会将查询分配给自己的变量,如下所示: +当运行“读取”类型查询时, ``query()`` 方法会返回一个可以用来 :doc:`显示结果 ` 的数据库结果 **对象**。当运行“写入”类型查询时,它根据成功或失败简单地返回 true 或 false。检索数据时,你通常会将查询分配给自己的变量,如下所示: .. literalinclude:: queries/002.php @@ -28,6 +33,11 @@ 简化的查询 ================== +.. _db-simplequery: + +$db->simpleQuery() +------------------ + ``simpleQuery()`` 方法是 ``$db->query()`` 方法的简化版本。 它不会返回数据库结果集,也不会设置查询计时器或编译绑定数据或存储调试查询。它只是让你提交一个查询。大多数用户很少使用此功能。 diff --git a/source/dbmgmt/db_commands.rst b/source/dbmgmt/db_commands.rst index 14d96b244..92de5b7fb 100644 --- a/source/dbmgmt/db_commands.rst +++ b/source/dbmgmt/db_commands.rst @@ -18,9 +18,11 @@ CodeIgniter 提供了一些简单的数据库管理命令。 db:table --show --------------- -要直接从喜欢的终端列出数据库中的所有表,可以使用 ``db:table --show`` 命令:: +要直接从喜欢的终端列出数据库中的所有表,可以使用 ``db:table --show`` 命令: - > php spark db:table --show +.. code-block:: console + + php spark db:table --show 使用此命令时,假定表存在。否则,CodeIgniter 将抱怨数据库没有表。 @@ -30,21 +32,27 @@ db:table --show db:table -------- -当你有一个名为 ``my_table`` 的表时,你可以看到表的字段名和记录:: +当你有一个名为 ``my_table`` 的表时,你可以看到表的字段名和记录: + +.. code-block:: console - > php spark db:table my_table + php spark db:table my_table 如果数据库中没有表 ``my_table``,CodeIgniter 会显示可用表列表以供选择。 -你也可以不使用表名使用以下命令:: +你也可以不使用表名使用以下命令: + +.. code-block:: console - > php spark db:table + php spark db:table 在这种情况下,将询问表名。 -你还可以传递一些选项:: +你还可以传递一些选项: - > php spark db:table my_table --limit-rows 50 --limit-field-value 20 --desc +.. code-block:: console + + php spark db:table my_table --limit-rows 50 --limit-field-value 20 --desc 选项 ``--limit-rows 50`` 将行数限制为 50 行。 @@ -58,9 +66,11 @@ db:table db:table --metadata ------------------- -当你有一个名为 ``my_table`` 的表时,你可以使用 ``--metadata`` 选项查看元数据,如列类型、表的最大长度:: +当你有一个名为 ``my_table`` 的表时,你可以使用 ``--metadata`` 选项查看元数据,如列类型、表的最大长度: + +.. code-block:: console - > php spark db:table my_table --metadata + php spark db:table my_table --metadata 使用此命令时,假定表存在。否则,CodeIgniter 将显示表列表以供选择。 此外,你可以将此命令用作 ``db:table --metadata``。 diff --git a/source/dbmgmt/forge.rst b/source/dbmgmt/forge.rst index 582152509..b8f992fac 100644 --- a/source/dbmgmt/forge.rst +++ b/source/dbmgmt/forge.rst @@ -51,18 +51,23 @@ $forge->dropDatabase('db_name') CodeIgniter 支持直接从喜欢的终端使用专用的 ``db:create`` 命令创建数据库。通过使用此命令,假定数据库还不存在。否则,CodeIgniter 将抱怨数据库创建失败。 -首先,只需键入命令和数据库名称(例如 ``foo``):: +首先,只需键入命令和数据库名称(例如 ``foo``): - > php spark db:create foo +.. code-block:: console + + php spark db:create foo 如果一切顺利,你应该会看到显示的 ``Database "foo" successfully created.`` 消息。 如果你在测试环境中或正在使用 SQLite3 驱动程序,可以使用 ``--ext`` 选项 为将创建数据库的文件传递文件扩展名。有效值为 ``db`` 和 ``sqlite``,默认为 ``db``。请记住,这些前面不应有句点。 -:: +: + +.. code-block:: console + + php spark db:create foo --ext sqlite - > php spark db:create foo --ext sqlite - // 将在 WRITEPATH/foo.sqlite 中创建 db 文件 +上述命令将创建名为 **WRITEPATH/foo.sqlite** 的数据库文件。 .. note:: 当使用特殊的 SQLite3 数据库名称 ``:memory:`` 时,请注意命令仍会生成成功消息,但不会创建数据库文件。这是因为 SQLite3 将只使用内存中的数据库。 diff --git a/source/dbmgmt/migration.rst b/source/dbmgmt/migration.rst index a3a255ec0..115cbafcf 100644 --- a/source/dbmgmt/migration.rst +++ b/source/dbmgmt/migration.rst @@ -4,7 +4,7 @@ 迁移是一种以结构化和有序的方式修改数据库的便捷方法。你可以手工编辑 SQL 片段,但这样你就需要告知其他开发者他们需要运行这些片段。你也需要在下次部署到生产环境时跟踪哪些更改需要运行。 -数据库表 **migrations** 记录了哪些迁移已经运行,所以你只需要确保你的迁移就位,然后调用 ``$migration->latest()`` 就可以将数据库状态更新到最新。你也可以使用 ``$migration->setNamespace(null)->latest()`` 来包含所有命名空间的迁移。 +数据库表 **migrations** 用于跟踪已经运行的迁移,因此您只需确保您的迁移文件已经准备好,并运行 ``spark migrate`` 命令将数据库更新到最新状态。您还可以使用 ``spark migrate --all`` 命令来包括所有命名空间的迁移。 .. contents:: :local: @@ -46,7 +46,11 @@ 数据库组 =============== -迁移只会针对单个数据库组运行。如果你在 **app/Config/Database.php** 中定义了多个组,那么它将针对那里指定的 ``$defaultGroup`` 运行。有时你可能需要为不同的数据库组使用不同的模式。也许你有一个数据库用于所有常规站点信息,而另一个数据库用于业务关键的数据。你可以通过在迁移上设置 ``$DBGroup`` 属性来确保迁移只针对适当的组运行。此名称必须与数据库组的名称完全匹配: +迁移只会针对单个数据库组运行。如果你在 **app/Config/Database.php** 中定义了多个组,那么它将针对那里指定的 ``$defaultGroup`` 运行。 + +有时你可能需要为不同的数据库组使用不同的模式。也许你有一个数据库用于所有常规站点信息,而另一个数据库用于业务关键的数据。 + +你可以通过在迁移上设置 ``$DBGroup`` 属性来确保迁移只针对适当的组运行。此名称必须与数据库组的名称完全匹配: .. literalinclude:: migration/003.php @@ -63,78 +67,86 @@ 这将查找 **APPPATH/Database/Migrations** 和 **ROOTPATH/MyCompany/Database/Migrations** 中的任何迁移。这使得在你的可重用、模块化代码套件中包含迁移变得很简单。 -************* -使用示例 -************* - -在这个示例中,一些简单的代码被放置在 **app/Controllers/Migrate.php** 中以更新 schema: - -.. literalinclude:: migration/005.php - .. _command-line-tools: ******************* 命令行工具 ******************* -CodeIgniter 自带了几个 :doc:`commands `,可通过命令行访问,以帮助你使用迁移。这些工具不是使用迁移的必需品,但对于那些希望使用它们的人来说可能会更方便。这些工具主要提供了 MigrationRunner 类中可用的相同方法的访问。 +CodeIgniter 自带了几个 :doc:`commands `,可通过命令行访问,以帮助你使用迁移。这些工具使得使用迁移更加方便。这些工具主要提供了 MigrationRunner 类中可用的相同方法的访问。 migrate ======= -使用所有可用的迁移迁移一个数据库组:: +使用所有可用的迁移迁移一个数据库组: - > php spark migrate +.. code-block:: console + + php spark migrate 你可以对 (migrate) 使用以下选项: -- ``-g`` - 选择数据库组,否则将使用默认数据库组。 -- ``-n`` - 选择命名空间,否则将使用 (App) 命名空间。 +- ``-g`` - 用于指定数据库组。如果指定了该选项,只会运行指定数据库组的迁移。如果未指定,则会运行所有迁移。 +- ``-n`` - 用于选择命名空间,否则将使用 ``App`` 命名空间。 - ``--all`` - 迁移所有命名空间到最新的迁移。 -这个例子将在 test 数据库组上使用任何新的迁移迁移 ``Acme\Blog`` 命名空间:: +这个例子将在 test 数据库组上使用任何新的迁移迁移 ``Acme\Blog`` 命名空间: + +For Unix: + +.. code-block:: console + + php spark migrate -g test -n Acme\\Blog + +For Windows: - For Unix: - > php spark migrate -g test -n Acme\\Blog +.. code-block:: console - For Windows: - > php spark migrate -g test -n Acme\Blog + php spark migrate -g test -n Acme\Blog 当使用 ``--all`` 选项时,它将扫描所有命名空间,尝试找到任何未运行的迁移。这些迁移将一起收集,然后按创建日期排序为一组。这应该有助于最大限度地减少主应用程序和任何模块之间的潜在冲突。 rollback ======== -回滚所有迁移,将数据库组还原到空白状态,有效迁移到 0:: +回滚所有迁移到空白状态,有效迁移到 0: - > php spark migrate:rollback +.. code-block:: console + + php spark migrate:rollback 你可以对 (rollback) 使用以下选项: -- ``-g`` - 选择数据库组,否则将使用默认数据库组。 - ``-b`` - 选择批次:自然数指定批次。 - ``-f`` - 强制绕过确认问题,它仅在生产环境中询问。 refresh ======= -首先回滚所有迁移,然后迁移所有来刷新数据库状态:: +首先回滚所有迁移,然后迁移所有来刷新数据库状态: + +.. code-block:: console - > php spark migrate:refresh + php spark migrate:refresh 你可以对 (refresh) 使用以下选项: -- ``-g`` - 选择数据库组,否则将使用默认数据库组。 -- ``-n`` - 选择命名空间,否则将使用 (App) 命名空间。 +- ``-g`` - 用于指定数据库组。如果指定了该选项,只会运行指定数据库组的迁移。如果未指定,则会运行所有迁移。 +- ``-n`` - 用于选择命名空间,否则将使用 ``App`` 命名空间。 - ``--all`` - 刷新所有命名空间。 - ``-f`` - 强制绕过确认问题,它仅在生产环境中询问。 status ====== -显示所有迁移的列表以及它们运行的日期和时间,如果未运行则显示 '--':: +显示所有迁移的列表以及它们运行的日期和时间,如果未运行则显示 '--': + +.. code-block:: console + + php spark migrate:status + + ... - > php spark migrate:status +----------------------+-------------------+-----------------------+---------+---------------------+-------+ | Namespace | Version | Filename | Group | Migrated On | Batch | +----------------------+-------------------+-----------------------+---------+---------------------+-------+ @@ -145,38 +157,41 @@ status 你可以对 (status) 使用以下选项: -- ``-g`` - 选择数据库组,否则将使用默认数据库组。 +- ``-g`` - 用于指定数据库组。如果指定了该选项,只会检查指定数据库组的迁移。如果未指定,则会检查所有迁移。 make:migration ============== -在 **app/Database/Migrations** 中创建一个骨架迁移文件。它会自动在文件名前加上当前时间戳。它创建的类名是文件名的帕斯卡大小写版本。 +在 **app/Database/Migrations** 中创建一个骨架迁移文件。它会自动在文件名前加上当前时间戳。它创建的类名是文件名的大驼峰版本。 -:: +.. code-block:: console - > php spark make:migration [options] + php spark make:migration [options] -你可以对 (make:migration) 使用以下选项: +你可以对 (``make:migration``) 使用以下选项: -- ``--session`` - 为数据库 sessions 生成迁移文件。 -- ``--table`` - 数据库 sessions 使用的表名。默认:``ci_sessions``。 -- ``--dbgroup`` - 数据库 sessions 使用的数据库组。默认:``default``。 -- ``--namespace`` - 设置根命名空间。默认:``APP_NAMESPACE``。 +- ``--namespace`` - 设置根命名空间。默认: ``APP_NAMESPACE``。 - ``--suffix`` - 在类名后追加组件标题。 +以下选项也可用于为数据库 Sessions 生成迁移文件: + +- ``--session`` - 为数据库 sessions 生成迁移文件。 +- ``--table`` - 数据库 sessions 使用的表名。默认: ``ci_sessions``。 +- ``--dbgroup`` - 数据库 sessions 使用的数据库组。默认: ``default``。 + ********************* 迁移配置 ********************* 下表列出了所有迁移的配置选项,在 **app/Config/Migrations.php** 中可用。 -========================== ====================== ========================== ============================================================= +========================== ====================== ========================== ================================================================================= 首选项 默认值 可选值 描述 -========================== ====================== ========================== ============================================================= +========================== ====================== ========================== ================================================================================= **enabled** true true / false 启用或禁用迁移。 -**table** migrations None 用于存储 schema 版本号的表名。 +**table** migrations None 用于存储 schema 版本号的表名。该表始终在默认数据库组(``$defaultGroup``)中创建。 **timestampFormat** Y-m-d-His\_ 创建迁移时使用的时间戳格式。 -========================== ====================== ========================== ============================================================= +========================== ====================== ========================== ================================================================================= *************** 类参考 @@ -191,7 +206,7 @@ make:migration :returns: 迁移文件数组 :rtype: array - 返回在 **path** 属性中找到的迁移文件名数组。 + 返回在 ``path`` 属性中找到的迁移文件名数组。 .. php:method:: latest($group) @@ -220,7 +235,7 @@ make:migration :returns: 成功则为 ``true``,失败则为 ``false`` :rtype: bool - 该方法强制单文件迁移,不考虑顺序或批次。基于它是否已经迁移来检测“up”或“down”方法。 + 该方法强制单文件迁移,不考虑顺序或批次。基于它是否已经迁移来检测 ``up()`` 或 ``down()`` 方法。 .. note:: 该方法仅建议用于测试,可能会导致数据一致性问题。 diff --git a/source/dbmgmt/seeds.rst b/source/dbmgmt/seeds.rst index 12be4fbe3..3cc63b33a 100755 --- a/source/dbmgmt/seeds.rst +++ b/source/dbmgmt/seeds.rst @@ -43,9 +43,11 @@ 命令行填充 ==================== -你也可以通过命令行作为迁移CLI工具的一部分从命令行填充数据,如果你不想创建一个专用的控制器:: +你也可以通过命令行作为迁移CLI工具的一部分从命令行填充数据,如果你不想创建一个专用的控制器: - > php spark db:seed TestSeeder +.. code-block:: console + + php spark db:seed TestSeeder ********************* 创建填充器文件 @@ -53,18 +55,25 @@ 使用命令行,你可以轻松生成填充器文件。 -:: +.. code-block:: console + + php spark make:seeder user --suffix + +上述命令将输出位于 **app/Database/Seeds** 目录下的 **UserSeeder.php** 文件。 + +你可以通过提供 ``--namespace`` 选项来指定填充器文件要存储的 ``root`` 命名空间: + +For Unix: + +.. code-block:: console - > php spark make:seeder user --suffix - // 输出: UserSeeder.php 文件位于 app/Database/Seeds 目录中。 + php spark make:seeder MySeeder --namespace Acme\\Blog -你可以通过提供 ``--namespace`` 选项来指定填充器文件要存储的 ``root`` 命名空间:: +For Windows: - For Unix: - > php spark make:seeder MySeeder --namespace Acme\\Blog +.. code-block:: console - For Windows: - > php spark make:seeder MySeeder --namespace Acme\Blog + php spark make:seeder MySeeder --namespace Acme\Blog 如果 ``Acme\Blog`` 映射到 **app/Blog** 目录,那么此命令将在 **app/Blog/Database/Seeds** 目录中生成 **MySeeder.php**。 diff --git a/source/extending/composer_packages.rst b/source/extending/composer_packages.rst index 5f79b6ae2..bb2d841c1 100644 --- a/source/extending/composer_packages.rst +++ b/source/extending/composer_packages.rst @@ -1,19 +1,18 @@ ########################## -Creating Composer Packages +创建 Composer 包 ########################## -You can make the :doc:`../general/modules` you create into Composer packages, -or can create a Composer package for CodeIgniter 4. +您可以将您创建的 :doc:`../general/modules` 转换为 Composer 包,或者为 CodeIgniter 4 创建一个 Composer 包。 .. contents:: :local: :depth: 2 **************** -Folder Structure +文件夹结构 **************** -Here's a typical directory structure for a Composer package:: +下面是一个典型的 Composer 包的目录结构示例:: your-package-name/ ├── .gitattributes @@ -22,20 +21,19 @@ Here's a typical directory structure for a Composer package:: ├── README.md ├── composer.json ├── src/ - │   └── YourClass.php + │ └── YourClass.php └── tests/ └── YourClassTest.php ********************** -Creating composer.json +创建 composer.json ********************** -In the root of your package directory, create a **composer.json** file. This file -defines metadata about your package and its dependencies. +在您的包目录的根目录中,创建一个 **composer.json** 文件。该文件定义了关于您的包及其依赖项的元数据。 -The ``composer init`` command helps you create it. +使用 ``composer init`` 命令可以帮助您创建它。 -For example, **composer.json** might look like this:: +例如,**composer.json** 可能如下所示:: { "name": "your-vendor/your-package", @@ -54,60 +52,53 @@ For example, **composer.json** might look like this:: } ], "require": { - // Any dependencies required by your package go here + // 在此处添加您的包所需的任何依赖项 }, "require-dev": { - // Any development dependencies (e.g., PHPUnit) go here + // 在此处添加开发所需的任何依赖项(例如 PHPUnit) } } -Package Name +包名称 ============ -The ``name`` field is important here. Package names are generally written in the -format "vendor-name/package-name" with all lowercase. Here is a common example: +``name`` 字段在这里非常重要。包名称通常以 "vendor-name/package-name" 的格式书写,全部小写。以下是一个常见的示例: -- ``your-vendor-name``: The name that identifies the vendor (creator of the package), - such as your name or your organization. -- ``your-package-name``: The name of the package you are creating. +- ``your-vendor-name``:标识供应商(包的创建者)的名称,例如您的姓名或组织名称。 +- ``your-package-name``:您正在创建的包的名称。 -Thus, it is important to make the name unique to distinguish it from other packages. -Uniqueness is especially important when publishing. +因此,为了使名称唯一以区分其它包,使其与其他包区分开是非常重要的,尤其是在发布时。 -Namespace +命名空间 ========= -The package name then determines the vendor namespace in ``autoload.psr4``. +包名称决定了 ``autoload.psr4`` 中的供应商命名空间。 -If your package name is ``your-vendor/your-package``, the vendor namespace must -be ``YourVendor``. So you would write like the following:: +如果您的包名称是 ``your-vendor/your-package``,那么供应商命名空间必须是 ``YourVendor``。因此,您需要像下面这样编写:: "autoload": { "psr-4": { "YourVendor\\YourPackage\\": "src/" } - }, + } -This setting instructs Composer to autoload the source code for your package. +这个设置指示 Composer 自动加载您的包的源代码。 -Choosing License +选择许可证 ================ -If you are not familiar with open source licenses, see https://choosealicense.com/. -Many PHP packages, including CodeIgniter, use the MIT license. +如果您对开源许可证不熟悉,请参考 https://choosealicense.com/。许多 PHP 包,包括 CodeIgniter,使用 MIT 许可证。 *************************** -Preparing Development Tools +准备开发工具 *************************** -There are many tools that help ensure quality code. So you should use them. -You can easily install and configure such tools with -`CodeIgniter DevKit `_. +有许多工具可以帮助确保代码质量。因此,您应该使用它们。您可以使用 `CodeIgniter DevKit `_ 轻松安装和配置此类工具。 -Installing DevKit +安装 DevKit ================= -In the root of your package directory, run the following commands: +在您的包目录的根目录中,运行以下命令: .. code-block:: console @@ -115,27 +106,22 @@ In the root of your package directory, run the following commands: composer config prefer-stable true composer require --dev codeigniter4/devkit -The DevKit installs various Composer packages that helps your development, and -installs templates for them in **vendor/codeigniter4/devkit/src/Template**. -Copy the files in it to your project root folder, and edit them for your needs. +DevKit 安装了各种 Composer 包,帮助您进行开发,并在 **vendor/codeigniter4/devkit/src/Template** 中为它们安装了模板。将其中的文件复制到您的项目根目录,并根据您的需求进行编辑。 -Configuring Coding Standards Fixer +配置 Coding Standards Fixer ================================== -DevKit provides Coding Standards Fixer with -`CodeIgniter Coding Standard `_ -based on `PHP-CS-Fixer `_. +DevKit 提供了基于 `PHP-CS-Fixer `_ 的 `CodeIgniter Coding Standard `_ 的 Coding Standards Fixer。 -Copy **vendor/codeigniter4/devkit/src/Template/.php-cs-fixer.dist.php** to your -project root folder. +将 **vendor/codeigniter4/devkit/src/Template/.php-cs-fixer.dist.php** 复制到您的项目根目录。 -Create the **build** folder for the cache file:: +为缓存文件创建 **build** 文件夹:: your-package-name/ ├── .php-cs-fixer.dist.php ├── build/ -Open **.php-cs-fixer.dist.php** in your editor, and fix the folder path:: +打开您的编辑器中的 **.php-cs-fixer.dist.php** 文件,并修复文件夹路径:: --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -149,14 +135,13 @@ Open **.php-cs-fixer.dist.php** in your editor, and fix the folder path:: ]) ->exclude([ -That't it. Now you can run Coding Standards Fixer: +完成后,您可以运行 Coding Standards Fixer: .. code-block:: console vendor/bin/php-cs-fixer fix --ansi --verbose --diff -If you add ``scripts.cs-fix`` in your **composer.json**, you can run it with -``composer cs-fix`` command:: +如果您在 **composer.json** 中添加了 ``scripts.cs-fix``,则可以使用 ``composer cs-fix`` 命令运行它:: { // ... @@ -167,35 +152,28 @@ If you add ``scripts.cs-fix`` in your **composer.json**, you can run it with } ************ -Config Files +配置文件 ************ -Allowing Users to Override Settings +允许用户覆盖设置 =================================== -If your package has a configuration file and you want users to be able to override -the settings, use :php:func:`config()` with the short classname like ``config('YourConfig')`` -to call the configuration file. +如果您的包有一个配置文件,并且您希望用户能够覆盖设置,可以使用 :php:func:`config()` 函数与短类名(例如 ``config('YourConfig')``)来调用配置文件。 -Users can then override the package configuration by placing a configuration class -with the same short classname in **app/Config** that extends the package Config -class like ``YourVendor\YourPackage\Config\YourConfig``. +然后,用户可以通过在 **app/Config** 中放置一个与短类名相同且扩展了包配置类的配置类(例如 ``YourVendor\YourPackage\Config\YourConfig``)来覆盖包配置。 -Overriding Settings in app/Config +在 app/Config 中覆盖设置 ================================= -If you need to override or add to known configurations in the **app/Config** folder, -you can use :ref:`Implicit Registrars `. +如果您需要在 **app/Config** 文件夹中覆盖或添加已知配置,可以使用 :ref:`Implicit Registrars `。 ********** -References +参考资料 ********** -We have published some official packages. You can use these packages as references -when creating your own packages: +我们已经发布了一些官方包。您可以在创建自己的包时使用这些包作为参考: - https://github.com/codeigniter4/shield - https://github.com/codeigniter4/settings - https://github.com/codeigniter4/tasks - https://github.com/codeigniter4/cache - diff --git a/source/extending/index.rst b/source/extending/index.rst index eb9be7c7e..e5b9ebafe 100644 --- a/source/extending/index.rst +++ b/source/extending/index.rst @@ -12,4 +12,5 @@ events basecontroller authentication + composer_packages contributing diff --git a/source/general/caching.rst b/source/general/caching.rst index debf734d4..56f6ff501 100755 --- a/source/general/caching.rst +++ b/source/general/caching.rst @@ -13,10 +13,29 @@ CodeIgniter 允许你缓存网页以达到最大性能。 缓存是如何工作的? ====================== -缓存可以在每个页面的基础上启用,你可以设置页面保持缓存的时间长度,之后会刷新。当一个页面第一次加载时,该文件将使用当前配置的缓存引擎进行缓存。在后续页面加载中,会检索缓存文件并发送给请求用户的浏览器。如果已过期,它会在发送到浏览器前删除和刷新。 +可以按页面启用缓存,并设置页面在刷新之前应保持缓存的时间长度。当首次加载页面时,将使用当前配置的缓存引擎对页面进行缓存。在后续的页面加载中,将检索缓存并发送给浏览器。如果缓存已过期,将在发送给浏览器之前删除并刷新。 .. note:: Benchmark 标签不会被缓存,所以启用缓存后你仍可以查看页面加载速度。 +配置缓存 +=================== + +设置缓存引擎 +-------------------- + +在使用网页缓存之前,您必须通过编辑 **app/Config/Cache.php** 来设置缓存引擎。有关详细信息,请参阅 :ref:`libraries-caching-configuring-the-cache`。 + +设置 $cacheQueryString +------------------------- + +您可以使用 ``Config\Cache::$cacheQueryString`` 设置是否在生成缓存时包含查询字符串。 + +有效选项为: + +- ``false``: (默认)禁用。不考虑查询字符串;对于具有相同 URI 路径但不同查询字符串的请求,返回相同的缓存。 +- ``true``: 启用,考虑所有查询参数。请注意,这可能导致为同一页面反复生成大量缓存。 +- **array**: 启用,但仅考虑指定的查询参数列表。例如: ``['q', 'page']``。 + 启用缓存 ================ @@ -28,13 +47,11 @@ CodeIgniter 允许你缓存网页以达到最大性能。 上面的标签可以放在一个方法的任何位置。它的位置不会受到影响,所以将其放在你认为最合适的位置。一旦标签就位,你的页面就会开始被缓存。 -.. important:: 如果你改变了可能影响输出的配置选项,你必须手动删除缓存文件。 - -.. note:: 在可以写入缓存文件之前,你必须通过编辑 **app/Config/Cache.php** 来设置缓存引擎。 +.. important:: 如果你改变了可能影响输出的配置选项,你必须手动删除缓存。 删除缓存 =============== -如果你不再希望缓存一个文件,可以删除缓存标签,它就不会在过期时刷新。 +如果你不再希望缓存一个页面,可以删除缓存标签,它就不会在过期时刷新。 .. note:: 删除标签不会立即删除缓存。它必须正常过期。 diff --git a/source/general/common_functions.rst b/source/general/common_functions.rst index 7bbd7549d..34ef57a4c 100755 --- a/source/general/common_functions.rst +++ b/source/general/common_functions.rst @@ -27,6 +27,21 @@ CodeIgniter 提供了一些全局定义的函数和变量,在任何时候都可 .. literalinclude:: common_functions/001.php +.. php:function:: config(string $name[, bool $getShared = true]) + + :param string $name: 配置类名。 + :param bool $getShared: 是否返回共享实例。 + :returns: 配置实例。 + :rtype: object|null + + 从工厂获取配置实例的更简单方式。 + + 有关详细信息,请参阅 :ref:`Configuration ` 和 + :ref:`Factories `。 + + ``config()`` 在内部使用 ``Factories::config()``。 + 有关第一个参数 ``$name`` 的详细信息,请参阅 :ref:`factories-loading-class`。 + .. php:function:: cookie(string $name[, string $value = ''[, array $options = []]]) :param string $name: Cookie 名称 @@ -70,7 +85,7 @@ CodeIgniter 提供了一些全局定义的函数和变量,在任何时候都可 如果 $data 是字符串,则简单转义并返回它。如果 $data 是数组,则遍历它,转义每个键/值对的 'value'。 - 有效的 context 值:html、js、css、url、attr、raw + 有效的 context 值: ``html``, ``js``, ``css``, ``url``, ``attr``, ``raw`` .. php:function:: helper($filename) @@ -101,17 +116,17 @@ CodeIgniter 提供了一些全局定义的函数和变量,在任何时候都可 获取模型实例的更简单方法。 - ``model()`` 在内部使用 ``Factories::models()``。有关第一个参数 ``$name`` 的详细信息,请参阅 :ref:`factories-example`。 + ``model()`` 在内部使用 ``Factories::models()``。有关第一个参数 ``$name`` 的详细信息,请参阅 :ref:`factories-loading-class`。 另请参阅 :ref:`使用 CodeIgniter 的模型 `。 .. php:function:: old($key[, $default = null,[, $escape = 'html']]) :param string $key: 要检查的旧表单数据的名称 - :param mixed $default: 如果 $key 不存在,返回的默认值 - :param mixed $escape: `转义 <#esc>`_ 上下文或禁用它的 false + :param string|null $default: 如果 $key 不存在,返回的默认值 + :param false|string $escape: `转义 <#esc>`_ 上下文或设置 false 禁用它 :returns: 定义键的值或默认值 - :rtype: mixed + :rtype: array|string|null 提供了一种简单的方式来访问提交表单后的“旧输入数据”。 @@ -119,7 +134,7 @@ CodeIgniter 提供了一些全局定义的函数和变量,在任何时候都可 .. literalinclude:: common_functions/002.php -.. note:: 如果使用 :doc:`表单辅助器 `,则此功能已内置。只有在不使用表单辅助器时,才需要使用此函数。 +.. note:: 如果您在 :doc:`表单辅助函数 ` 中使用了 :php:func:`set_value()`、:php:func:`set_select()`、:php:func:`set_checkbox()` 和 :php:func:`set_radio()` 函数,这个功能已经内置了。只有在不使用表单辅助函数时才需要使用此函数。 .. php:function:: session([$key]) @@ -245,7 +260,9 @@ CodeIgniter 提供了一些全局定义的函数和变量,在任何时候都可 :param RequestInterface $request: 当前 Request 对象的实例 :param ResponseInterface $response: 当前 Response 对象的实例 - 检查页面当前是否通过 HTTPS 访问。如果是,则什么都不做。如果不是,则将用户重定向回当前的 URI,但通过 HTTPS。将设置 HTTP 严格传输安全性标头,它指示现代浏览器自动将任何 HTTP 请求修改为 HTTPS 请求,持续时间为 $duration。 + 检查当前页面是否通过 HTTPS 访问。如果是,则不执行任何操作。如果不是,则将用户重定向回当前 URI,但通过 HTTPS 进行访问。将设置 HTTP 严格传输安全(HTST)头,指示现代浏览器将任何 HTTP 请求自动修改为 HTTPS 请求,持续时间为 ``$duration``。 + + .. note:: 当您将 ``Config\App:$forceGlobalSecureRequests`` 设置为 true 时,也会使用此函数。 .. php:function:: function_usable($function_name) diff --git a/source/general/configuration.rst b/source/general/configuration.rst index 279bfa439..cdf35cd02 100755 --- a/source/general/configuration.rst +++ b/source/general/configuration.rst @@ -13,31 +13,51 @@ 使用配置文件 ********************************** +获取配置对象 +======================= + 你可以通过几种不同的方式访问类的配置文件。 -- 使用 ``new`` 关键字创建一个实例: +使用 new 关键字 +--------------- - .. literalinclude:: configuration/001.php +使用 ``new`` 关键字创建一个实例: -- 使用 ``config()`` 函数: +.. literalinclude:: configuration/001.php - .. literalinclude:: configuration/002.php +.. _configuration-config: -所有配置对象属性都是公共的,所以你可以像访问任何其他属性一样访问设置: +config() +-------- -.. literalinclude:: configuration/003.php +使用 :php:func:`config()` 函数: -如果没有提供命名空间,它将在所有定义的命名空间以及 **app/Config/** 中查找该文件。 +.. literalinclude:: configuration/002.php + +如果未提供命名空间,它将首先在 **app/Config** 文件夹中查找文件,如果找不到,则在所有定义的命名空间的 **Config** 文件夹中查找。 CodeIgniter 提供的所有配置文件都使用 ``Config`` 命名空间。在你的应用程序中使用这个命名空间将提供最佳性能,因为它确切知道在哪里可以找到这些文件。 你可以通过使用不同的命名空间将配置文件放在任何你想要的文件夹中。这允许你在生产服务器上将配置文件放在一个不可公开访问的文件夹中,同时在开发期间保持其位于 **/app** 下方便访问。 +.. note:: 在 v4.4.0 之前,``config()`` 会在有与 shortname 相同的类时,在 **app/Config/** 中查找文件,即使您指定了完全限定的类名,如 ``config(\Acme\Blog\Config\Blog::class)``。在 v4.4.0 中修复了此行为,并返回指定的实例。 + +获取配置属性 +========================= + +所有配置对象属性都是公共的,所以你可以像访问任何其他属性一样访问设置: + +.. literalinclude:: configuration/003.php + 创建配置文件 **************************** 当你需要一个新的配置时,首先在所需位置创建一个新文件。默认文件位置(大多数情况下推荐)是 **app/Config**。该类应使用适当的命名空间,并且它应扩展 ``CodeIgniter\Config\BaseConfig`` 以确保它可以接收特定环境的设置。 +您可以通过使用不同的命名空间将配置文件放置在任何 **Config** 文件夹中。 + +该类应使用适当的命名空间,并应扩展 ``CodeIgniter\Config\BaseConfig`` 以确保它可以接收特定于环境的设置。 + 定义类并用代表你的设置的公共属性填充它: .. literalinclude:: configuration/004.php @@ -85,7 +105,7 @@ CodeIgniter 期望 **.env** 文件与 **app** 目录一起位于项目的根目 .. literalinclude:: configuration/005.php -.. warning:: 请注意,来自 **.env** 文件的设置会添加到环境变量中。由此带来的一个副作用是,如果你的 CodeIgniter 应用程序生成一个 ``var_dump($_ENV)`` 或 ``phpinfo()`` (用于调试或其他有效原因) **你的安全凭据可能会公开暴露**。 +.. warning:: 请注意,来自 **.env** 文件的设置会添加到 ``$_SERVER`` and ``$_ENV`` 中。由此带来的一个副作用是,如果你的 CodeIgniter 应用程序生成一个 ``var_dump($_ENV)`` 或 ``phpinfo()`` (用于调试或其他有效原因) ,或者在 ``development`` 环境中显示了详细的错误报告,**你的安全凭据可能会公开暴露**。 嵌套变量 ----------------- @@ -138,6 +158,8 @@ CodeIgniter 期望 **.env** 文件与 **app** 目录一起位于项目的根目 .. important:: 你无法通过设置环境变量来添加新属性,也不能将标量值改变为数组。请参见 :ref:`env-var-replacements-for-data`。 +.. note:: 此功能是在 ``CodeIgniter\Config\BaseConfig`` 类中实现的。因此,它不适用于 **app/Config** 文件夹中的一些文件,这些文件不扩展该类。 + 如果命名空间变量的前缀正好匹配配置类的命名空间,那么设置的尾部(点之后)将被视为配置属性。如果它与现有的配置属性匹配,环境变量的值将替换配置文件中相应的值。如果没有匹配,配置类属性保持不变。在此用法中,前缀必须是类的完整(区分大小写)命名空间。 :: @@ -174,7 +196,7 @@ CodeIgniter 期望 **.env** 文件与 **app** 目录一起位于项目的根目 例如,你不能只是在 **.env** 中放置 ``app.myNewConfig = foo`` 并期望你的 ``Config\App`` 在运行时神奇地拥有该属性和值。 -当你在 ``Config\Database`` 中有属性 ``$default = ['encrypt' => false]`` 时,即使你在 **.env** 中放置 ``database.default.encrypt.ssl_verify = true``,也不能将 ``encrypt`` 值更改为数组。 +当你在 ``Config\Database`` 中有属性 ``$default = ['encrypt' => false]`` 时,即使你在 **.env** 中放置 ``database.default.encrypt.ssl_verify = true``,也不能将 ``encrypt`` 值更改为数组。如果您想这样做,请参阅 :ref:`Database Configuration `。 将环境变量视为数组 ======================================== @@ -218,33 +240,42 @@ CodeIgniter 期望 **.env** 文件与 **app** 目录一起位于项目的根目 .. _registrars: -注册表 +注册器 ********** -“注册表”是可以在命名空间和文件之间在运行时提供其他配置属性的任何其他类。 -注册表提供了一种在运行时跨命名空间和文件更改配置的方法。 -有两种实现注册表的方法:隐式和显式。 +“注册器”是可以在命名空间和文件之间在运行时提供其他配置属性的任何其他类。 +注册器提供了一种在运行时跨命名空间和文件更改配置的方法。 + +如果在 :doc:`模块 ` 中启用了 :ref:`auto-discovery`,则注册器可以在命名空间和文件之间在运行时更改配置属性。 -.. note:: 来自 **.env** 的值始终优先于注册表。 +有两种实现注册器的方法: **隐式** 和 **显式**。 -隐式注册表 +.. note:: 来自 **.env** 的值始终优先于注册器。 + +隐式注册器 =================== -如果在 :doc:`Modules ` 中启用了发现,任何命名空间都可以通过使用 **Config/Registrar.php** 文件来定义注册表。这些文件是方法名为你希望扩展的每个配置类的类。例如,第三方模块可能希望在不覆盖开发者已经配置的的情况下为 ``Pager`` 提供额外的模板。在 **src/Config/Registrar.php** 中将有一个 ``Registrar`` 类,其中只有单个 ``Pager()`` 方法(请注意大小写敏感性): +隐式注册器可以更改任何配置类的属性。 + +任何命名空间都可以通过使用 **Config/Registrar.php** 文件定义隐式注册器。这些文件是类,其方法的名称与您希望扩展的每个配置类的名称相同。 + +例如,第三方模块或 Composer 包可能希望为 ``Config\Pager`` 提供额外的模板,而不会覆盖开发人员已经配置的内容。在 **src/Config/Registrar.php** 中,将有一个名为 ``Registrar`` 的类,其中只有一个 ``Pager()`` 方法(注意大小写敏感): .. literalinclude:: configuration/007.php -注册方法必须始终返回一个数组,其中的键对应目标配置文件中的属性。存在的值被合并,注册表属性具有覆盖优先级。 +注册方法必须始终返回一个数组,其中的键对应目标配置文件中的属性。存在的值被合并,注册器属性具有覆盖优先级。 -显式注册表 +显式注册器 =================== -配置文件还可以显式指定任意数量的注册表。 -这是通过在配置文件中添加一个 ``$registrars`` 属性来完成的,其中包含候选注册表的名称数组: +显式注册器只能更改其注册的配置类属性。 + +配置文件还可以显式指定任意数量的注册器。 +这是通过在配置文件中添加一个 ``$registrars`` 属性来完成的,其中包含候选注册器的名称数组: .. literalinclude:: configuration/008.php -为了充当“注册表”,标识的类必须具有一个与配置类同名的静态函数,它应返回一个关联数组的属性设置。 +为了充当“注册器”,标识的类必须具有一个与配置类同名的静态函数,它应返回一个关联数组的属性设置。 在实例化配置对象时,它将循环遍历 ``$registrars`` 中指定的类。对于这些类中的每个类,它都会调用以配置类命名的方法,并合并任何返回的属性。 @@ -256,6 +287,6 @@ CodeIgniter 期望 **.env** 文件与 **app** 目录一起位于项目的根目 .. literalinclude:: configuration/010.php -通过上面的示例,在实例化 ``MySalesConfig`` 时,它将最终具有声明的三个属性,但 ``$target`` 属性的值将通过将 ``RegionalSales`` 视为“注册表”来覆盖。生成的配置属性: +通过上面的示例,在实例化 ``MySalesConfig`` 时,它将最终具有声明的三个属性,但 ``$target`` 属性的值将通过将 ``RegionalSales`` 视为“注册器”来覆盖。生成的配置属性: .. literalinclude:: configuration/011.php diff --git a/source/general/environments.rst b/source/general/environments.rst index 9271f5d38..b06f615c6 100755 --- a/source/general/environments.rst +++ b/source/general/environments.rst @@ -46,9 +46,11 @@ ENVIRONMENT 常量 CI_ENVIRONMENT = development -.. note:: 你可以通过 ``spark env`` 命令更改 **.env** 文件中的 ``CI_ENVIRONMENT`` 值:: +.. note:: 你可以通过 ``spark env`` 命令更改 **.env** 文件中的 ``CI_ENVIRONMENT`` 值: - > php spark env production + .. code-block:: console + + php spark env production .. _environment-apache: @@ -112,9 +114,11 @@ CodeIgniter 要求与环境名称匹配的 PHP 脚本位于 **APPPATH/Config/Boo 要确认当前环境,只需打印常量 ``ENVIRONMENT``。 -你也可以通过 ``spark env`` 命令检查当前环境:: +你也可以通过 ``spark env`` 命令检查当前环境: + +.. code-block:: console - > php spark env + php spark env ************************************* 对默认框架行为的影响 diff --git a/source/general/errors.rst b/source/general/errors.rst index 0e6300c8b..5b573a8fe 100755 --- a/source/general/errors.rst +++ b/source/general/errors.rst @@ -3,9 +3,10 @@ ############## CodeIgniter 通过 Exceptions 在你的系统中内置了错误报告,包括 -`SPL 集合 `_,以及框架提供的一些自定义 exceptions。 +`SPL 集合 `_,以及框架提供的一些 exceptions。 + 取决于你的环境设置,当抛出错误或异常时的默认操作是显示详细的错误报告,除非应用程序在 ``production`` 环境下运行。 -在这种情况下,会显示更通用的消息以对用户保持最佳体验。 +在 ``production`` 环境中,会显示更通用的消息以对用户保持最佳体验。 .. contents:: :local: @@ -37,10 +38,15 @@ Exceptions 简单来说就是在抛出异常时发生的事件。这将中止脚 配置 ============= -默认情况下,CodeIgniter 将在 ``development`` 和 ``testing`` 环境中显示所有错误,并且在 ``production`` 环境中不显示任何错误。你可以通过在 **.env** 文件中设置 ``CI_ENVIRONMENT`` 变量来更改此设置。 +错误报告 +--------------- + +默认情况下,CodeIgniter 将在 ``development`` 和 ``testing`` 环境中显示包含所有错误的详细错误报告,并且在 ``production`` 环境中不显示任何错误。你可以通过在 :ref:`.env ` 文件中设置 ``CI_ENVIRONMENT`` 变量来更改此设置。 .. important:: 禁用错误报告并不会停止在错误发生时写入日志。 +.. warning:: 请注意,**.env** 文件中的设置会添加到 ``$_SERVER`` 和 ``$_ENV`` 中。作为副作用,这意味着如果显示详细的错误报告,**您的安全凭据将被公开**。 + 记录 Exceptions ------------------ @@ -89,14 +95,20 @@ DatabaseException RedirectException ----------------- -此异常是一个特殊情况,允许覆盖所有其他响应路由并强制重定向到特定路由或 URL: +.. note:: 自 v4.4.0 起,``RedirectException`` 的命名空间已更改。之前是 ``CodeIgniter\Router\Exceptions\RedirectException``。之前的类已被弃用。 + +此异常是一个特殊情况,允许覆盖所有其他响应路由并强制重定向到特定的 URI: .. literalinclude:: errors/010.php -``$route`` 可以是命名路由、相对 URI 或完整 URL。你还可以提供要使用的重定向代码,而不是默认值(``302``、“临时重定向”): +``$uri`` 是相对于 baseURL 的 URI 路径。您还可以提供一个重定向代码,以替代默认值 (``302``, "temporary redirect"): .. literalinclude:: errors/011.php +另外,自 v4.4.0 版本开始,可以将实现了 ResponseInterface 接口的类的对象用作第一个参数。这种解决方案适用于需要在响应中添加额外的头部或 Cookie 的情况。 + +.. literalinclude:: errors/018.php + .. _error-specify-http-status-code: 在异常中指定 HTTP 状态码 @@ -145,3 +157,32 @@ RedirectException .. literalinclude:: errors/014.php 为了测试你的应用程序,你可能希望始终在弃用时抛出。你可以通过将环境变量 ``CODEIGNITER_SCREAM_DEPRECATIONS`` 设置为真值来配置此行为。 + +.. _custom-exception-handlers: + +自定义异常处理程序 +========================= + +.. versionadded:: 4.4.0 + +如果您需要更多地控制异常的显示方式,现在可以定义自己的处理程序并指定它们适用的情况。 + +定义新的处理程序 +------------------------ + +第一步是创建一个新的类,该类实现了 ``CodeIgniter\Debug\ExceptionHandlerInterface`` 接口。您还可以扩展 ``CodeIgniter\Debug\BaseExceptionHandler`` 类。该类包含了许多在默认异常处理程序中使用的实用方法。新的处理程序必须实现一个方法:``handle()``: + +.. literalinclude:: errors/015.php + +这个示例定义了通常需要的最少代码 - 显示一个视图并使用适当的退出代码退出。然而,``BaseExceptionHandler`` 提供了许多其他的辅助函数和对象。 + +配置新的处理程序 +--------------------------- + +告诉 CodeIgniter 使用您的新异常处理程序类是在 **app/Config/Exceptions.php** 配置文件的 ``handler()`` 方法中完成的: + +.. literalinclude:: errors/016.php + +您可以使用任何逻辑来确定应用程序是否应该处理异常,但最常见的两种情况是检查 HTTP 状态码或异常的类型。如果您的类应该处理它,则返回一个新的实例: + +.. literalinclude:: errors/017.php diff --git a/source/general/modules.rst b/source/general/modules.rst index 73d57430c..4a08f0177 100755 --- a/source/general/modules.rst +++ b/source/general/modules.rst @@ -2,15 +2,19 @@ 代码模块 ############ -CodeIgniter 支持一种代码模块化形式,以帮助你创建可重用的代码。模块通常围绕特定主题展开,可以认为是你更大的应用程序中的微型应用程序。框架支持的任何标准文件类型都受支持,如控制器、模型、视图、配置文件、辅助函数、语言文件等。模块可以包含尽可能少或多的这些文件。 +CodeIgniter 支持一种代码模块化形式,以帮助你创建可重用的代码。模块通常围绕特定主题展开,可以认为是你更大的应用程序中的微型应用程序。 + +框架支持的任何标准文件类型都受支持,如控制器、模型、视图、配置文件、辅助函数、语言文件等。模块可以包含尽可能少或多的这些文件。 + +如果您想将一个模块创建为 Composer 包,请参阅 :doc:`../extending/composer_packages`。 .. contents:: :local: :depth: 2 -========== +********** 命名空间 -========== +********** 模块功能的核心元素来自 CodeIgniter 使用的 :doc:`兼容 PSR-4 的自动加载 <../concepts/autoloader>`。虽然任何代码都可以使用 PSR-4 自动加载器和命名空间,但充分利用模块的主要方法是为你的代码添加命名空间并将其添加到 **app/Config/Autoload.php** 中的 ``$psr4`` 属性。 @@ -47,9 +51,9 @@ CodeIgniter 支持一种代码模块化形式,以帮助你创建可重用的代 当然,没有什么能强制你使用这个确切的结构,你应该以最适合模块的方式组织它,省略不需要的目录,为实体、接口或存储库等创建新目录。 -=========================== +*************************** 自动加载非类文件 -=========================== +*************************** 通常,你的模块不仅包含 PHP 类,还包含像程序函数、引导文件、模块常量文件等通常不会像加载类那样加载的文件。一种方法是在使用文件位置的开头 ``require`` 这些文件。 @@ -57,28 +61,30 @@ CodeIgniter 提供的另一种方法是像自动加载类一样自动加载这 .. literalinclude:: modules/002.php -============== +.. _auto-discovery: + +************** 自动发现 -============== +************** 通常,你需要指定要包含的文件的完全命名空间,但是可以通过自动发现许多不同类型的文件来配置 CodeIgniter,从而使将模块集成到应用程序中更简单,包括: - :doc:`Events <../extending/events>` - :doc:`Filters <../incoming/filters>` -- :doc:`Registrars <./configuration>` +- :ref:`registrars` - :doc:`Route files <../incoming/routing>` - :doc:`Services <../concepts/services>` 这在文件 **app/Config/Modules.php** 中配置。 -自动发现系统通过扫描在 **Config/Autoload.php** 中定义的 psr4 命名空间下的特定目录和文件来工作。 +自动发现系统通过扫描在 **Config/Autoload.php** 和 Composer 包中定义的 psr4 命名空间下的特定目录和文件来工作。 -例如,发现过程将在路径中查找可以发现的项,并应该找到 **/acme/Blog/Config/Routes.php** 中的 routes 文件。 +例如,发现过程将在路径中查找可以发现的项,并应该找到 **acme/Blog/Config/Routes.php** 中的 routes 文件。 启用/禁用发现 ======================= -你可以通过系统中的 ``$enabled`` 类变量打开或关闭所有自动发现。False 将禁用所有发现,优化性能,但会消除模块的特殊功能。 +你可以通过系统中的 ``$enabled`` 类变量打开或关闭所有自动发现。False 将禁用所有发现,优化性能,但会消除模块和 Composer 包的特殊功能。 指定要发现的项 ======================= @@ -112,9 +118,9 @@ CodeIgniter 提供的另一种方法是像自动加载类一样自动加载这 .. literalinclude:: modules/004.php -================== +****************** 使用文件 -================== +****************** 本节将查看每种文件类型(控制器、视图、语言文件等)以及如何在模块中使用它们。用户指南的相关位置已对其中一些信息进行了更详细的描述,但在此重复以更容易掌握所有部分的关系。 @@ -127,9 +133,17 @@ CodeIgniter 提供的另一种方法是像自动加载类一样自动加载这 使用模块时,如果应用程序中的路由包含通配符,这可能是一个问题。在这种情况下,请参阅 :ref:`routing-priority`。 +.. _modules-filters: + 过滤器 ======= +.. deprecated:: 4.4.2 + +.. note:: 此功能已被弃用。请改用 :ref:`registrars`,如下所示: + + .. literalinclude:: modules/015.php + 默认情况下,模块内会自动扫描 :doc:`过滤器 <../incoming/filters>`。可以在上面描述的 **Modules** 配置文件中将其关闭。 .. note:: 由于文件被包含到当前作用域中,因此 ``$filters`` 实例已为你定义。如果尝试重新定义该类,则会导致错误。 @@ -156,11 +170,11 @@ CodeIgniter 提供的另一种方法是像自动加载类一样自动加载这 .. literalinclude:: modules/008.php -每次使用始终可用的 ``config()`` 函数时,都会自动发现配置文件。 +无论何时使用始终可用的 :php:func:`config()` 函数,并将一个短类名传递给它,配置文件都会被自动发现。 -.. note:: 我们不建议在模块中使用相同的短类名。需要覆盖或添加 **app/Config/** 中已知配置的模块应使用 :ref:`registrars`。 +.. note:: 我们不建议在模块中使用相同的短类名。需要覆盖或添加 **app/Config/** 中已知配置的模块应使用 :ref:`Implicit Registrars `。 -.. note:: 当有一个相同短名称的类时,即使你指定了完全限定的类名(如 ``config(\Acme\Blog\Config\Blog::class)``), ``config()`` 也会在 **app/Config/** 中找到该文件。这是因为 ``config()`` 是 ``Factories`` 类的包装器,默认使用 ``preferApp``。有关更多信息,请参阅 :ref:`Factories 示例 `。 +.. note:: 在 v4.4.0 之前,即使您指定了一个完全限定的类名,如 ``config(\Acme\Blog\Config\Blog::class)``,``config()`` 仍会在 **app/Config/** 中查找文件,只要存在与短类名相同的类。在 v4.4.0 中修复了这个行为,并返回指定的实例。 迁移 ========== @@ -170,13 +184,19 @@ CodeIgniter 提供的另一种方法是像自动加载类一样自动加载这 种子 ===== -只要提供完全限定的命名空间,就可以从 CLI 和其他种子文件中调用种子文件。如果在 CLI 上调用,则需要提供双反斜杠:: +只要提供完全限定的命名空间,就可以从 CLI 和其他种子文件中调用种子文件。如果在 CLI 上调用,则需要提供双反斜杠: + +For Unix: + +.. code-block:: console + + php spark db:seed Acme\\Blog\\Database\\Seeds\\TestPostSeeder + +For Windows: - For Unix: - > php spark db:seed Acme\\Blog\\Database\\Seeds\\TestPostSeeder +.. code-block:: console - For Windows: - > php spark db:seed Acme\Blog\Database\Seeds\TestPostSeeder + php spark db:seed Acme\Blog\Database\Seeds\TestPostSeeder 辅助函数 ======== @@ -210,7 +230,7 @@ CodeIgniter 提供的另一种方法是像自动加载类一样自动加载这 .. note:: 我们不建议在模块中使用相同的短类名。 -.. note:: 当有一个相同短名称的类时,即使你指定了完全限定的类名(如 ``model(\Acme\Blog\Model\PostModel::class)``), ``model()`` 也会在 **app/Models/** 中找到该文件。这是因为 ``model()`` 是 ``Factories`` 类的包装器,默认使用 ``preferApp``。有关更多信息,请参阅 :ref:`Factories 示例 `。 +.. note:: 当有一个相同短名称的类时,即使你指定了完全限定的类名(如 ``model(\Acme\Blog\Model\PostModel::class)``), ``model()`` 也会在 **app/Models/** 中找到该文件。这是因为 ``model()`` 是 ``Factories`` 类的包装器,默认使用 ``preferApp``。有关更多信息,请参阅 :ref:`factories-loading-class`。 视图 ===== diff --git a/source/general/urls.rst b/source/general/urls.rst index fb73e488e..dc691efbd 100755 --- a/source/general/urls.rst +++ b/source/general/urls.rst @@ -60,7 +60,7 @@ URI 路径 /ci-blog/blog/news/2022/10 删除 index.php 文件 =========================== -默认情况下, **index.php** 文件将包含在你的 URL 中:: +当你使用 Apache Web 服务器时,默认情况下,在你的 URL 中需要 **index.php** 文件:: example.com/index.php/news/article/my_article @@ -88,10 +88,10 @@ Apache 必须启用 *mod_rewrite* 扩展。如果是,你可以使用一些简单 .. _urls-remove-index-php-nginx: -NGINX +Nginx ----- -在 NGINX 中,你可以定义一个位置块并使用 ``try_files`` 指令来获取与我们在上面的 Apache 配置中相同的效果: +在 Nginx 中,你可以定义一个位置块并使用 ``try_files`` 指令来获取与我们在上面的 Apache 配置中相同的效果: .. code-block:: nginx diff --git a/source/helpers/array_helper.rst b/source/helpers/array_helper.rst index 249267f25..5d481d8fe 100644 --- a/source/helpers/array_helper.rst +++ b/source/helpers/array_helper.rst @@ -93,3 +93,25 @@ Array 辅助函数提供了几个函数来简化数组的更复杂用法。它 用户可以自己使用 ``$id`` 参数,但不需要这样做。该函数在内部使用此参数来跟踪展平后的键。如果用户将提供初始 ``$id``,它将添加到所有键前面。 .. literalinclude:: array_helper/011.php + +.. php:function:: array_group_by(array $array, array $indexes[, bool $includeEmpty = false]): array + + :param array $array: 数据行(很可能来自查询结果) + :param array $indexes: 要按索引值分组的索引。遵循点语法 + :param bool $includeEmpty: 如果为 true,则不过滤掉 ``null`` 和 ``''`` 值 + :rtype: array + :returns: 按索引值分组的数组 + + 该函数允许您按索引值将数据行分组在一起。返回的数组的深度等于作为参数传递的索引数。 + + 以下示例显示了一些数据(例如从 API 加载的数据)和嵌套数组。 + + .. literalinclude:: array_helper/012.php + + 我们首先想要按 "gender" 分组,然后按 "hr.department" 分组(最大深度为 2)。首先排除空值的结果如下: + + .. literalinclude:: array_helper/013.php + + 这里是相同的代码,但这次我们想要包括空值: + + .. literalinclude:: array_helper/014.php diff --git a/source/helpers/cookie_helper.rst b/source/helpers/cookie_helper.rst index e8a039145..d82044447 100755 --- a/source/helpers/cookie_helper.rst +++ b/source/helpers/cookie_helper.rst @@ -22,7 +22,7 @@ Cookie 辅助函数文件包含了帮助处理 cookie 的函数。 .. php:function:: set_cookie($name[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = false[, $httpOnly = false[, $sameSite = '']]]]]]]]) - :param mixed $name: Cookie 名称 *或* 此函数可用的所有参数的关联数组 + :param array|Cookie|string $name: Cookie 名称 *或* 此函数可用的所有参数的关联数组 *或* ``CodeIgniter\Cookie\Cookie`` 的实例 :param string $value: Cookie 值 :param int $expire: 到期秒数。如果设置为 ``0`` 则 cookie 仅在浏览器打开时有效 :param string $domain: Cookie 域名(通常:.yourdomain.com) @@ -50,11 +50,9 @@ Cookie 辅助函数文件包含了帮助处理 cookie 的函数。 .. note:: 从 v4.2.1 开始,引入了第三个参数 ``$prefix``,并且由于一个错误修复,行为发生了一些变化。详见 :ref:`升级 `。 - 该辅助函数为获取浏览器 cookie 提供了更友好的语法。有关其使用的详细描述,请参阅 - :doc:`IncomingRequest 库 `,因为此函数的作用与 ``IncomingRequest::getCookie()`` - 非常相似,只是它还会在你可能在 **app/Config/Cookie.php** 文件中设置的 ``Config\Cookie::$prefix`` 前加上前缀。 + 这个辅助函数为您提供了更友好的语法来获取浏览器的 Cookie。有关其使用的详细描述,请参考 :doc:`IncomingRequest 库 `,因为这个函数的行为与 :php:meth:`CodeIgniter\\HTTP\\IncomingRequest::getCookie()` 非常相似,只是它还会在前面添加您在 **app/Config/Cookie.php** 文件中设置的 ``Config\Cookie::$prefix``。 - .. warning:: 使用 XSS 过滤是一个不好的做法。它不能完美地防止 XSS 攻击。在视图中建议使用正确 ``$context`` 的 ``esc()``。 + .. warning:: 使用 XSS 过滤是一个不好的做法。它不能完美地防止 XSS 攻击。在视图中建议使用正确 ``$context`` 的 :php:func:`esc()`。 .. php:function:: delete_cookie($name[, $domain = ''[, $path = '/'[, $prefix = '']]]) @@ -68,9 +66,9 @@ Cookie 辅助函数文件包含了帮助处理 cookie 的函数。 .. literalinclude:: cookie_helper/002.php - 此函数与 ``set_cookie()`` 其他方面相同,只是它没有 ``value`` 和 ``expire`` 参数。 + 此函数与 :php:func:`set_cookie()` 其他方面相同,只是它没有 ``value`` 和 ``expire`` 参数。 - .. note:: 当你使用 ``set_cookie()`` 时,如果 ``value`` 设置为空字符串且 ``expire`` 设置为 ``0``,则 cookie 将被删除。 + .. note:: 当你使用 :php:func:`set_cookie()` 时,如果 ``value`` 设置为空字符串且 ``expire`` 设置为 ``0``,则 cookie 将被删除。 如果 ``value`` 设置为非空字符串且 ``expire`` 设置为 ``0``,则 cookie 仅在浏览器打开时有效。 你可以在第一个参数中提交值数组,也可以设置离散参数。 diff --git a/source/helpers/form_helper.rst b/source/helpers/form_helper.rst index 8875ea40d..07ddd9cbb 100755 --- a/source/helpers/form_helper.rst +++ b/source/helpers/form_helper.rst @@ -436,8 +436,8 @@ 示例:: - > - > + > + > .. php:function:: set_radio($field[, $value = ''[, $default = false]]) @@ -465,6 +465,8 @@ 返回的数组与 ``Validation::getErrors()`` 相同。详见 :ref:`验证 `。 + .. note:: 此函数与 :ref:`in-model-validation` 不兼容。如果您想在模型验证中获取验证错误,请参阅 :ref:`model-getting-validation-errors`。 + 示例:: @@ -483,6 +485,8 @@ 此函数在内部使用 :php:func:`validation_errors()`。 + .. note:: 此函数与 :ref:`in-model-validation` 不兼容。如果您想在模型验证中获取验证错误,请参阅 :ref:`model-getting-validation-errors`。 + 示例:: @@ -502,6 +506,8 @@ 此函数在内部使用 :php:func:`validation_errors()`。 + .. note:: 此函数与 :ref:`in-model-validation` 不兼容。如果您想在模型验证中获取验证错误,请参阅 :ref:`model-getting-validation-errors`。 + 示例:: diff --git a/source/helpers/inflector_helper.rst b/source/helpers/inflector_helper.rst index 1b45ad9f7..2b003210a 100755 --- a/source/helpers/inflector_helper.rst +++ b/source/helpers/inflector_helper.rst @@ -89,7 +89,7 @@ Inflector 辅助函数文件包含了允许你将 **英语** 单词更改为复 获取多个驼峰或帕斯卡单词并将它们转换为下划线分隔的单词。示例: - .. literalinclude:: inflector_helper/007.php + .. literalinclude:: inflector_helper/014.php .. php:function:: humanize($string[, $separator = '_']) diff --git a/source/helpers/number_helper.rst b/source/helpers/number_helper.rst index 9462ce86c..2a9131763 100755 --- a/source/helpers/number_helper.rst +++ b/source/helpers/number_helper.rst @@ -83,7 +83,7 @@ .. php:function:: number_to_roman($num) - :param string $num: 要转换的数字 + :param int|string $num: 要转换的数字 :returns: 从给定参数转换后的罗马数字 :rtype: string|null @@ -91,4 +91,4 @@ .. literalinclude:: number_helper/009.php - 此函数仅处理 1 到 3999 范围内的数字。对于该范围之外的任何值,它都将返回 null。 + 此函数仅处理 1 到 3999 范围内的数字。对于该范围之外的任何值,它都将返回 ``null``。 diff --git a/source/incoming/controllers.rst b/source/incoming/controllers.rst index 0cae0a938..89109dba0 100755 --- a/source/incoming/controllers.rst +++ b/source/incoming/controllers.rst @@ -88,17 +88,14 @@ $this->validate() 为了简化数据检查,控制器还提供了方便的 ``validate()`` 方法。 该方法在第一个参数中接受规则数组,在可选的第二个参数中,接受自定义错误消息的数组,以在项目无效时显示。在内部,这使用控制器的 ``$this->request`` 实例来获取要验证的数据。 -.. warning:: - ``validate()`` 方法使用 :ref:`Validation::withRequest() ` 方法。 - 它会验证来自 :ref:`$request->getJSON() ` - 或 :ref:`$request->getRawInput() ` - 或 :ref:`$request->getVar() ` 的数据。 - 使用哪些数据取决于请求。请记住,攻击者可以自由地向服务器发送任何请求。 - :doc:`验证库文档 ` 有关于规则和消息数组格式以及可用规则的详细信息: .. literalinclude:: controllers/004.php +.. warning:: 当您使用 ``validate()`` 方法时,应该使用 :ref:`getValidated() ` 方法来获取经过验证的数据。因为 ``validate()`` 方法在内部使用了 :ref:`Validation::withRequest() ` 方法,并且它会验证来自 :ref:`$request->getJSON() `、:ref:`$request->getRawInput() ` 或 :ref:`$request->getVar() ` 的数据,而攻击者可能会更改要验证的数据。 + +.. note:: 自 v4.4.0 版本开始,可以使用 :ref:`$this->validator->getValidated() ` 方法。 + 如果你发现在配置文件中保持规则更简单,你可以用 **app/Config/Validation.php** 中定义的组名替换 ``$rules`` 数组: .. literalinclude:: controllers/005.php @@ -251,10 +248,6 @@ URI 的第二段通常确定控制器中的哪个方法被调用。 .. literalinclude:: controllers/022.php -.. important:: 如果 URI 中的参数比方法的参数更多, - 自动路由(改进版)不会执行该方法,并导致 404 - 未找到。 - 默认控制器 ================== @@ -282,6 +275,44 @@ URI 的第二段通常确定控制器中的哪个方法被调用。 有关更多信息,请参阅 :ref:`routes-configuration-options` 部分 :ref:`URI 路由 ` 文档。 +.. _controller-default-method-fallback: + +默认方法回退 +======================= + +.. versionadded:: 4.4.0 + +如果与方法名的 URI 段对应的控制器方法不存在,并且如果定义了默认方法,则剩余的 URI 段将传递给默认方法进行执行。 + +.. literalinclude:: controllers/024.php + +加载以下 URL:: + + example.com/index.php/product/15/edit + +该方法将传递 URI 段 2 和 3(``'15'`` 和 ``'edit'``): + +.. important:: 如果 URI 中的参数多于方法参数,自动路由(改进版)不会执行该方法,并返回 404 Not Found。 + +回退到默认控制器 +------------------------------ + +如果与控制器名的 URI 段对应的控制器不存在,并且如果默认控制器(默认为 ``Home``)存在于目录中,则剩余的 URI 段将传递给默认控制器的默认方法。 + +例如,当您在 **app/Controllers/News** 目录中有以下默认控制器 ``Home`` 时: + +.. literalinclude:: controllers/025.php + +加载以下 URL:: + + example.com/index.php/news/101 + +将找到 ``News\Home`` 控制器和默认的 ``getIndex()`` 方法。因此,默认方法将传递 URI 段 2(``'101'``): + +.. note:: 如果存在 ``App\Controllers\News`` 控制器,则它具有优先权。URI 段按顺序搜索,找到的第一个控制器将被使用。 + +.. note:: 如果 URI 中的参数多于方法参数,自动路由(改进版)不会执行该方法,并返回 404 Not Found。 + 将控制器组织到子目录中 ================================================ diff --git a/source/incoming/filters.rst b/source/incoming/filters.rst index 8ded899a6..6f8fea49d 100644 --- a/source/incoming/filters.rst +++ b/source/incoming/filters.rst @@ -6,7 +6,9 @@ :local: :depth: 2 -控制器过滤器允许你在控制器执行之前或之后执行操作。与 :doc:`事件 <../extending/events>` 不同,你可以选择应用过滤器的特定 URI。传入过滤器可以修改请求,而后置过滤器可以操作甚至修改响应,提供了很大的灵活性和能力。使用过滤器可以执行的一些常见任务示例: +控制器过滤器允许您在控制器执行之前或之后执行操作。与 :doc:`事件 <../extending/events>` 不同,您可以选择将过滤器应用于特定的 URI 或路由。前置过滤器可以修改请求,而后置过滤器可以对响应进行操作甚至修改,从而提供了很大的灵活性和功能。 + +使用过滤器可以执行的一些常见任务示例: * 对传入请求执行 CSRF 保护 * 根据角色限制站点的区域访问 @@ -23,7 +25,7 @@ .. literalinclude:: filters/001.php -Before 过滤器 +前置过滤器 ============== 替换请求 @@ -51,7 +53,7 @@ Before 过滤器 .. _after-filters: -After 过滤器 +后置过滤器 ============= After 过滤器与 Before 过滤器几乎完全相同,只是你只能返回 ``$response`` 对象,并且无法停止脚本执行。这确实允许你修改最终输出,或者只是做一些最终输出的事情。这可以用于确保某些安全头正确设置,缓存最终输出,或者使用禁用词过滤器过滤最终输出。 @@ -60,10 +62,16 @@ After 过滤器与 Before 过滤器几乎完全相同,只是你只能返回 ``$r 配置过滤器 ******************* -创建过滤器后,你需要配置它们的运行时机。这是在 **app/Config/Filters.php** 中完成的。该文件包含四个属性,允许你配置过滤器的确切运行时机。 +配置过滤器运行时有两种方法。一种是在 **app/Config/Filters.php** 中进行配置,另一种是在 **app/Config/Routes.php** 中进行配置。 + +如果您想为特定的路由指定过滤器,请使用 **app/Config/Routes.php** 并参考 :ref:`URI Routing `。 + +在路由中指定的过滤器(在 **app/Config/Routes.php** 中)会在 **app/Config/Filters.php** 中指定的过滤器之前执行。 .. note:: 最安全的应用过滤器方法是 :ref:`禁用自动路由 `,并 :ref:`设置过滤器到路由 `。 +**app/Config/Filters.php** 文件包含四个属性,允许您精确配置过滤器的运行时机。 + .. warning:: 建议你在过滤器设置中的 URI 末尾始终添加 ``*``。因为控制器方法可能比你想象的通过不同的 URL 访问。例如,当启用 :ref:`auto-routing-legacy` 时,如果你有 ``Blog::index``,它可以通过 ``blog``、``blog/index`` 和 ``blog/index/1`` 等方式访问。 $aliases @@ -91,11 +99,11 @@ $globals 除了少数 URI --------------------- -有时你希望将过滤器应用于几乎所有请求,但有一些应该不受影响。一个常见的示例是,如果你需要从 CSRF 保护过滤器中排除几个 URI,以允许第三方网站的请求访问一个或两个特定的 URI,同时保持其余 URI 受保护。要做到这一点,请在别名旁边添加一个包含 ``except`` 键和要匹配的 URI 值的数组: +有时你希望将过滤器应用于几乎所有请求,但有一些应该不受影响。一个常见的示例是,如果你需要从 CSRF 保护过滤器中排除几个 URI,以允许第三方网站的请求访问一个或两个特定的 URI,同时保持其余 URI 受保护。要做到这一点,请在别名旁边添加一个包含 ``except`` 键和要匹配的 URI 路径(相对于 BaseURL)值的数组: .. literalinclude:: filters/006.php -在过滤器设置中可以使用 URI 的任何位置,你都可以使用正则表达式,或者像在这个例子中使用星号 (``*``) 作为通配符,匹配之后的所有字符。在这个例子中,任何以 ``api/`` 开头的 URL 都将被免于 CSRF 保护,但网站的表单将全部受保护。如果你需要指定多个 URI,可以使用 URI 模式数组: +在过滤器设置中可以使用 URI 路径(相对于 BaseURL)的任何位置,你都可以使用正则表达式,或者像在这个例子中使用星号 (``*``) 作为通配符,匹配之后的所有字符。在这个例子中,任何以 ``api/`` 开头的 URI 路径都将被免于 CSRF 保护,但网站的表单将全部受保护。如果你需要指定多个 URI,可以使用 URI 路径模式数组: .. literalinclude:: filters/007.php @@ -115,18 +123,22 @@ $methods $filters ======== -该属性是一个过滤器别名数组。对于每个别名,你可以为 ``before`` 和 ``after`` 数组指定过滤器应该应用到的一系列 URI 模式: +该属性是一个过滤器别名数组。对于每个别名,你可以为 ``before`` 和 ``after`` 数组指定过滤器应该应用到的一系列 URI 路径(相对于 BaseURL)模式: .. literalinclude:: filters/009.php +.. _filters-filters-filter-arguments: + 过滤器参数 -================ +---------------- + +.. versionadded:: 4.4.0 -在配置过滤器时,可以在设置路由时向过滤器传递其他参数: +在配置 ``$filters`` 时,可以传递额外的参数给过滤器: -.. literalinclude:: filters/010.php +.. literalinclude:: filters/012.php -在这个例子中,数组 ``['dual', 'noreturn']`` 将在过滤器的 ``before()`` 和 ``after()`` 实现方法的 ``$arguments`` 中传递。 +在这个例子中,当 URI 匹配 ``admin/*'`` 时,数组 ``['admin', 'superadmin']`` 将作为 ``$arguments`` 传递给 ``group`` 过滤器的 ``before()`` 方法。当 URI 匹配 ``admin/users/*'`` 时,数组 ``['users.manage']`` 将作为 ``$arguments`` 传递给 ``permission`` 过滤器的 ``before()`` 方法。 ****************** 确认过滤器 @@ -141,9 +153,11 @@ filter:check .. versionadded:: 4.3.0 -使用 **GET** 方法检查路由 ``/`` 的过滤器:: +使用 **GET** 方法检查路由 ``/`` 的过滤器: - > php spark filter:check get / +.. code-block:: console + + php spark filter:check get / 输出如下所示: @@ -166,6 +180,8 @@ CodeIgniter4 提供的过滤器有: :doc:`Honeypot <../libraries/honeypot>`、:r .. note:: 过滤器按配置文件中定义的顺序执行。但是,如果启用, ``DebugToolbar`` 总是最后执行,因为它应该能够捕获其他过滤器中发生的所有事情。 +.. _invalidchars: + InvalidChars ============= diff --git a/source/incoming/incomingrequest.rst b/source/incoming/incomingrequest.rst index a9c4c3c13..b369f0b14 100755 --- a/source/incoming/incomingrequest.rst +++ b/source/incoming/incomingrequest.rst @@ -147,6 +147,8 @@ getMethod() .. literalinclude:: incomingrequest/039.php +.. _incomingrequest-filtering-input-data: + 过滤输入数据 ==================== @@ -192,11 +194,9 @@ getMethod() .. literalinclude:: incomingrequest/021.php -你可以使用 ``getPath()`` 和 ``setPath()`` 方法使用当前请求的 URI 字符串(相对于 baseURL 的路径)。 -请注意,共享的 ``IncomingRequest`` 实例上的此相对路径是 :doc:`URL 辅助函数 ` -函数使用的内容,因此这是一种有用的方法来“伪造”传入请求以进行测试: +您可以使用 ``getRoutePath()`` 方法来处理当前 URI 字符串(相对于您的 baseURL 的路径)。 -.. literalinclude:: incomingrequest/022.php +.. note:: 自 v4.4.0 版本开始,可以使用 ``getRoutePath()`` 方法。在 v4.4.0 之前,``getPath()`` 方法返回相对于您的 baseURL 的路径。 上传的文件 ************** @@ -425,13 +425,16 @@ getMethod() :returns: 相对于 baseURL 的当前 URI 路径 :rtype: string - 这是确定“当前 URI”最安全的方法,因为 ``IncomingRequest::$uri`` - 可能不了解完整的 App 配置的 base URL。 + 该方法返回相对于 baseURL 的当前 URI 路径。 + + .. note:: 在 v4.4.0 之前,这是确定“当前 URI”的最安全的方法,因为 ``IncomingRequest::$uri`` 可能不知道完整的 App 配置的 base URL。 .. php:method:: setPath($path) - :param string $path: 要用作当前 URI 的相对路径 - :returns: 这个 IncomingRequest + .. deprecated:: 4.4.0 + + :param string $path: 用作当前 URI 的相对路径 + :returns: 此传入请求 :rtype: IncomingRequest - 主要用于测试目的,这允许你设置当前请求的相对路径值,而不是依赖于 URI 检测。这也会用新的路径更新底层的 ``URI`` 实例。 + .. note:: 在 v4.4.0 之前,主要用于测试目的,这允许您设置当前请求的相对路径值,而不是依赖于 URI 检测。这也会更新底层的 ``URI`` 实例的新路径。 diff --git a/source/incoming/message.rst b/source/incoming/message.rst index e75366cdf..c20a2ae6f 100644 --- a/source/incoming/message.rst +++ b/source/incoming/message.rst @@ -139,7 +139,7 @@ Message 类为 HTTP 消息中请求和响应共有的部分提供了一个接口 :returns: 当前的 HTTP 协议版本 :rtype: string - 返回消息的当前 HTTP 协议。如果未设置,将返回 ``null``。可接受的值为 “1.0”、“1.1” 和 “2.0”。 + 返回消息的当前 HTTP 协议。如果未设置,将返回 ``1.1``。 .. php:method:: setProtocolVersion($version) @@ -147,6 +147,6 @@ Message 类为 HTTP 消息中请求和响应共有的部分提供了一个接口 :returns: 当前消息实例 :rtype: CodeIgniter\\HTTP\\Message - 设置此消息使用的 HTTP 协议版本。有效值为 “1.0”、“1.1” 和 “2.0”: + 设置此消息使用的 HTTP 协议版本。有效值为 ``1.0``, ``1.1``, ``2.0`` 和 ``3.0``: .. literalinclude:: message/010.php diff --git a/source/incoming/routing.rst b/source/incoming/routing.rst index 76c6cbe93..90f1fbf31 100755 --- a/source/incoming/routing.rst +++ b/source/incoming/routing.rst @@ -297,8 +297,9 @@ HTTP 动词路由 .. note:: 建议使用 Spark 命令作为 CLI 脚本,而不是通过 CLI 调用控制器。请参阅 :doc:`../cli/cli_commands` 页面以获取详细信息。 -你可以使用 ``cli()`` 方法创建只能从命令行使用、无法从 Web 浏览器访问的路由。 -通过任何 HTTP 动词路由方法创建的路由也无法从 CLI 访问,但通过 ``add()`` 方法创建的路由仍可从命令行使用: +任何通过基于 HTTP 动词的路由方法创建的路由也将无法从 CLI 访问,但通过 ``add()`` 方法创建的路由仍然可以从命令行访问。 + +你可以使用 ``cli()`` 方法创建只能从命令行使用、无法从 Web 浏览器访问的路由: .. literalinclude:: routing/032.php @@ -361,6 +362,15 @@ HTTP 动词路由 .. literalinclude:: routing/037.php +过滤器参数 +^^^^^^^^^^^^^^^^ + +可以向过滤器传递额外的参数: + +.. literalinclude:: routing/067.php + +在这个例子中,数组 ``['dual', 'noreturn']`` 将作为 ``$arguments`` 传递给过滤器的 ``before()`` 和 ``after()`` 实现方法。 + .. _assigning-namespace: 分配命名空间 @@ -513,8 +523,10 @@ HTTP 动词路由 路由配置选项 **************************** -RoutesCollection 类提供了几个影响所有路由的选项,可以根据你的应用需求进行修改。 -这些选项在 **app/Config/Routes.php** 的顶部可用。 +RoutesCollection 类提供了几个选项,可以影响所有路由,并且可以根据您的应用程序需求进行修改。这些选项可以在 **app/Config/Routing.php** 文件中找到。 + +.. note:: 配置文件 **app/Config/Routing.php** 自 v4.4.0 版本开始添加。 + 在之前的版本中,使用 **app/Config/Routes.php** 中的 setter 方法来更改设置。 .. _routing-default-namespace: @@ -535,12 +547,12 @@ RoutesCollection 类提供了几个影响所有路由的选项,可以根据你 转换 URI 中的破折号 ==================== -此选项使你可以自动将控制器和方法的 URI 段中的破折号 (``-``) 替换为下划线, -因此如果你需要这样做,可以节省额外的路由条目。这是必需的,因为破折号不是有效的类或方法名称字符, -如果尝试使用它会导致致命错误: +该选项允许您在使用自动路由时,自动将控制器和方法的 URI 段中的破折号(``-``)替换为下划线,从而节省了额外的路由条目。这是必需的,因为破折号不是有效的类或方法名称字符,如果您尝试使用它,将会导致致命错误: .. literalinclude:: routing/049.php +.. note:: 在使用自动路由(改进版)时,在 v4.4.0 之前,如果 ``$translateURIDashes`` 为 true,两个 URI 对应一个控制器方法,一个 URI 用于破折号(例如 **foo-bar**),另一个 URI 用于下划线(例如 **foo_bar**)。这是错误的行为。从 v4.4.0 开始,下划线的 URI(**foo_bar**)不可访问。 + .. _use-defined-routes-only: 仅使用定义的路由 @@ -550,7 +562,7 @@ RoutesCollection 类提供了几个影响所有路由的选项,可以根据你 当未找到与当前 URI 匹配的定义路由时,如果启用了自动路由,系统将尝试将该 URI 与控制器和方法匹配。 -你可以通过将 ``setAutoRoute()`` 选项设置为 false 来禁用此自动匹配, +你可以通过将 ``$autoRoute`` 属性设置为 false 来禁用此自动匹配, 并且只限制路由为你定义的路由: .. literalinclude:: routing/050.php @@ -567,6 +579,8 @@ RoutesCollection 类提供了几个影响所有路由的选项,可以根据你 .. literalinclude:: routing/051.php +在路由配置文件中使用 ``$override404`` 属性,您可以使用闭包函数。在路由文件中定义覆盖是限制在类或方法对上的。 + .. note:: ``set404Override()`` 方法不会将响应状态码更改为 ``404``。如果你不在设置的控制器中设置状态码, 将返回默认状态码 ``200``。有关如何设置状态码的信息,请参阅 :php:meth:`CodeIgniter\\HTTP\\Response::setStatusCode()`。 @@ -604,9 +618,9 @@ RoutesCollection 类提供了几个影响所有路由的选项,可以根据你 启用自动路由 =================== -要使用它,你需要在 **app/Config/Routes.php** 中将 ``setAutoRoute()`` 选项设置为 true:: +要使用它,你需要在 **app/Config/Routing.php** 中将 ``$autoRoute`` 选项设置为 true:: - $routes->setAutoRoute(true); + public bool $autoRoute = true; 并且你需要在 **app/Config/Feature.php** 中将属性 ``$autoRoutesImproved`` 设置为 ``true``:: @@ -671,6 +685,25 @@ URI 段 .. important:: 你无法使用控制器的默认方法名称访问控制器。在上面的示例中,你可以访问 **example.com/products**,但是如果访问 **example.com/products/listall** 将找不到。 +.. _auto-routing-improved-module-routing: + +模块路由 +============== + +.. versionadded:: 4.4.0 + +即使您使用 :doc:`../general/modules` 并将控制器放置在不同的命名空间中,您仍可以使用自动路由。 + +要路由到一个模块,必须在 **app/Config/Routing.php** 中设置 ``$moduleRoutes`` 属性:: + + public array $moduleRoutes = [ + 'blog' => 'Acme\Blog\Controllers', + ]; + +键是模块的第一个 URI 段,值是控制器的命名空间。在上述配置中,**http://localhost:8080/blog/foo/bar** 将被路由到 ``Acme\Blog\Controllers\Foo::getBar()``。 + +.. note:: 如果您定义了 ``$moduleRoutes``,模块的路由将优先生效。在上面的示例中,即使您有 ``App\Controllers\Blog`` 控制器,**http://localhost:8080/blog** 也将被路由到默认控制器 ``Acme\Blog\Controllers\Home``。 + .. _auto-routing-legacy: 自动路由(传统) @@ -689,7 +722,7 @@ URI 段 自 v4.2.0 起,默认禁用自动路由。 -要使用它,你需要在 **app/Config/Routes.php** 中将 ``setAutoRoute()`` 选项设置为 true:: +要使用它,你需要在 **app/Config/Routing.php** 中将 ``$autoRoute`` 选项设置为 true:: $routes->setAutoRoute(true); @@ -740,12 +773,14 @@ CodeIgniter 有以下 :doc:`命令 ` 可显示所有路由 .. _routing-spark-routes: -spark routes +spark 路由 ============ -显示所有路由和过滤器:: +显示所有路由和过滤器: + +.. code-block:: console - > php spark routes + php spark routes 输出类似以下内容: @@ -825,6 +860,21 @@ spark routes .. versionadded:: 4.3.0 -你可以按 *Handler* 对路由进行排序:: +你可以按 *Handler* 对路由进行排序: + +.. code-block:: console + + php spark routes -h + +.. _routing-spark-routes-specify-host: + +指定主机 +------------ + +.. versionadded:: 4.4.0 + +您可以使用 ``--host`` 选项在请求 URL 中指定主机: + +.. code-block:: console - > php spark routes -h + php spark routes --host accounts.example.com diff --git a/source/installation/backward_compatibility_notes.rst b/source/installation/backward_compatibility_notes.rst index 227f6ff68..a946d7a51 100644 --- a/source/installation/backward_compatibility_notes.rst +++ b/source/installation/backward_compatibility_notes.rst @@ -13,6 +13,6 @@ 什么不是破坏兼容性的更改 ***************************** -- 已弃用的配置项目不受后向兼容性(BC)承诺约束。它可能会在下一个 **次要** 版本或更高版本中被移除。 +- 已弃用的项目不受后向兼容性(BC)承诺约束。它可能会在下一个 **次要** 版本或更高版本中被移除。例如,如果一个项目从 4.3.x 版本开始被弃用,那么它可能会在 4.5.0 版本中被移除。 - 定义在 **system/Language/en/** 中的系统消息严格用于内部框架使用,不受后向兼容性(BC)承诺约束。如果开发者依赖语言字符串输出,应该检查函数调用 (``lang('...')``),而不是内容。 - `命名参数 `_ 不受后向兼容性(BC)承诺约束。当必要时,我们可能会重命名方法/函数的参数名以改进代码库。 diff --git a/source/installation/installing_composer.rst b/source/installation/installing_composer.rst index 1e0a3c063..b7491caba 100644 --- a/source/installation/installing_composer.rst +++ b/source/installation/installing_composer.rst @@ -28,21 +28,23 @@ App Starter 安装 ------------ -在项目根目录上层文件夹中:: +在项目根目录上层文件夹中: - > composer create-project codeigniter4/appstarter 项目根目录 +.. code-block:: console + + composer create-project codeigniter4/appstarter 项目根目录 上述命令将创建一个 **项目根目录** 文件夹。 如果省略“项目根目录”参数,该命令将创建一个“appstarter”文件夹,可以根据需要重命名。 -.. note:: CodeIgniter 自动加载程序不允许特殊字符,这些字符在某些操作系统中的文件名中是非法的。 - 可以使用的符号是 ``/``, ``_``, ``.``, ``:``, ``\`` 和空格。 - 因此,如果在包含特殊字符的文件夹下安装 CodeIgniter,比如 ``(``, ``)`` 等,CodeIgniter 将无法工作。 +.. note:: 在 v4.4.0 之前,CodeIgniter 的自动加载器不允许在某些操作系统上的文件名中使用非法的特殊字符。可以使用的符号包括 ``/``、``_``、``.``、``:``、``\`` 和空格。因此,如果您将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法正常工作。从 v4.4.0 开始,这个限制已经被移除。 + +.. important:: 当你将应用部署到生产服务器时,不要忘记运行以下命令: -.. important:: 当你将应用部署到生产服务器时,不要忘记运行以下命令:: + .. code-block:: console - > composer install --no-dev + composer install --no-dev 上述命令将只移除开发环境下的 Composer 软件包,这些软件包在生产环境中不需要。这将大大减少 vendor 文件夹的大小。 @@ -56,9 +58,11 @@ App Starter 升级 --------- -每当有新版本发布时,在项目根目录的命令行中运行:: +每当有新版本发布时,在项目根目录的命令行中运行: + +.. code-block:: console - > composer update + composer update 阅读 :doc:`升级说明 `,并查看已破坏的更改和增强功能。 @@ -91,15 +95,41 @@ App Starter 仓库带有 ``builds`` 脚本,可在当前稳定版本和框架的 `开发用户指南 `_ 可以在线访问。 请注意,这与已发布的用户指南不同,并将明确适用于 develop 分支。 -在项目根目录中:: +最新开发版更新 +^^^^^^^^^^^^^^^^^^^^^ + +在您的项目根目录中执行以下命令: + +.. code-block:: console + + php builds development + +上述命令将更新 **composer.json**,将其指向工作仓库的 ``develop`` 分支,并更新配置文件和 XML 文件中的相应路径。 + +使用 ``builds`` 命令后,请确保运行 ``composer update``,以使您的 vendor 文件夹与最新的目标构建同步。然后,根据需要检查 :doc:`upgrading` 并更新项目文件。 + +下一个次要版本 +^^^^^^^^^^^^^^^^^^ - > php builds development +如果您想使用下一个次要版本的分支,在使用 ``builds`` 命令后手动编辑 **composer.json**。 -上述命令将更新 **composer.json** 以指向工作仓库的 ``develop`` 分支,并更新配置和 XML 文件中的相应路径。要还原这些更改,请运行:: +如果您尝试使用 ``4.4`` 分支,请将版本更改为 ``4.4.x-dev``:: - > php builds release + "require": { + "php": "^7.4 || ^8.0", + "codeigniter4/codeigniter4": "4.4.x-dev" + }, -使用 ``builds`` 命令后,请务必运行 ``composer update`` 以使用最新目标构建同步 vendor 文件夹。 +然后运行 ``composer update``,以使您的 vendor 文件夹与最新的目标构建同步。然后,根据需要检查升级指南(**user_guide_src/source/installation/upgrade_{version}.rst**)并更新项目文件。 + +恢复到稳定版本 +^^^^^^^^^^^^^^^^^^^^^^^^ + +要恢复更改,请运行: + +.. code-block:: console + + php builds release 将 CodeIgniter4 添加到现有项目中 ========================================== @@ -112,13 +142,17 @@ App Starter 仓库带有 ``builds`` 脚本,可在当前稳定版本和框架的 在 ``app`` 文件夹中开发你的应用程序, ``public`` 文件夹将是你的文档根目录。 -在项目根目录中:: +在项目根目录中: - > composer require codeigniter4/framework +.. code-block:: console -.. important:: 将应用程序部署到生产服务器时,不要忘记运行以下命令:: + composer require codeigniter4/framework - > composer install --no-dev +.. important:: 将应用程序部署到生产服务器时,不要忘记运行以下命令: + +.. code-block:: console + + composer install --no-dev 上述命令将只移除开发环境下的 Composer 软件包,这些软件包在生产环境中不需要。这将大大减少 vendor 文件夹的大小。 @@ -139,9 +173,11 @@ App Starter 仓库带有 ``builds`` 脚本,可在当前稳定版本和框架的 升级 --------- -每当有新版本发布时,在项目根目录的命令行中运行:: +每当有新版本发布时,在项目根目录的命令行中运行: - > composer update +.. code-block:: console + + composer update 阅读 :doc:`升级说明 `,并查看已破坏的更改和增强功能。 @@ -171,8 +207,10 @@ App Starter 仓库带有 ``builds`` 脚本,可在当前稳定版本和框架的 如果你想利用系统消息翻译,可以以类似的方式将它们添加到项目中。 -在项目根目录的命令行中:: +在项目根目录的命令行中: + +.. code-block:: console - > composer require codeigniter4/translations + composer require codeigniter4/translations 每次执行 ``composer update`` 时,这些都会与框架一起更新。 diff --git a/source/installation/installing_manual.rst b/source/installation/installing_manual.rst index 2d02eb531..ba72e3624 100644 --- a/source/installation/installing_manual.rst +++ b/source/installation/installing_manual.rst @@ -21,9 +21,7 @@ 下载 `最新版本 `__, 并将其提取到成为项目根目录。 -.. note:: CodeIgniter 自动加载程序不允许特殊字符,这些字符在某些操作系统中的文件名中是非法的。 - 可以使用的符号是 ``/``, ``_``, ``.``, ``:``, ``\`` 和空格。 - 因此,如果在包含特殊字符的文件夹下安装 CodeIgniter,比如 ``(``, ``)`` 等,CodeIgniter 将无法工作。 +.. note:: 在 v4.4.0 之前,CodeIgniter 的自动加载器不允许在某些操作系统上的文件名中使用非法的特殊字符。可以使用的符号包括 ``/``、``_``、``.``、``:``、``\`` 和空格。因此,如果您将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法正常工作。从 v4.4.0 开始,这个限制已经被移除。 初始配置 ===================== diff --git a/source/installation/running.rst b/source/installation/running.rst index 016624721..5b6371974 100644 --- a/source/installation/running.rst +++ b/source/installation/running.rst @@ -1,76 +1,119 @@ -运行你的应用程序 +################ +运行您的应用程序 ################ .. contents:: :local: - :depth: 2 + :depth: 3 -CodeIgniter 4 应用程序可以通过多种方式运行:托管在 Web 服务器上,使用虚拟化,或者使用 CodeIgniter 的命令行工具进行测试。本节介绍如何使用每种技术,并解释了它们的一些优缺点。 +CodeIgniter 4 应用程序可以以多种不同的方式运行:托管在 Web 服务器上、使用虚拟化技术,或者使用 CodeIgniter 的命令行工具进行测试。本节介绍如何使用每种技术,并解释其中的一些优缺点。 -.. important:: 关于文件名的大小写,你应该始终小心。许多开发者在 Windows 或 macOS 上使用大小写不敏感的文件系统进行开发。然而,大多数服务器环境使用大小写敏感的文件系统。如果文件名大小写不正确,则在服务器上无法正常工作的代码在本地环境下也将无法正常工作。 +.. important:: 在文件名的大小写方面应始终小心。许多开发人员在 Windows 或 macOS 上使用不区分大小写的文件系统进行开发。然而,大多数服务器环境使用区分大小写的文件系统。如果文件名大小写不正确,本地上正常工作的代码在服务器上将无法正常工作。 -如果你是 CodeIgniter 的新手,请阅读用户指南的 :doc:`入门指南 ` 部分,开始学习构建动态 PHP 应用程序的方法。祝你使用愉快! +如果您是 CodeIgniter 的新手,请阅读用户指南的 :doc:`入门 ` 部分,开始学习如何构建动态的 PHP 应用程序。祝您使用愉快! .. _initial-configuration: +********************* 初始配置 -===================== +********************* + +为您的站点 URI 进行配置 +============================ + +使用文本编辑器打开 **app/Config/App.php** 文件。 + +#. $baseURL + 将您的基本 URL 设置为 ``$baseURL``。如果您需要更大的灵活性,可以在 :ref:`.env ` 文件中设置 baseURL,例如 ``app.baseURL = 'http://example.com/'``。**始终在基本 URL 的末尾使用斜杠!** + + .. note:: 如果您没有正确设置 ``baseURL``,在开发模式下,调试工具栏可能无法正确加载,网页可能需要更长的时间才能显示。 -#. 使用文本编辑器打开 **app/Config/App.php** 文件,并将你的基本 URL 设置为 ``$baseURL``。如果你需要更灵活的配置,也可以在 :ref:`.env ` 文件中设置 baseURL,例如 ``app.baseURL = 'http://example.com/'``。 (始终在基本 URL 后加上斜杠!) +#. $indexPage + 如果您不想在站点 URI 中包含 **index.php**,请将 ``$indexPage`` 设置为 ``''``。当框架生成您的站点 URI 时,将使用此设置。 - .. note:: 如果未正确设置 ``baseURL``,在开发模式下,调试工具栏可能无法正确加载,并且网页显示可能需要更长的时间。 + .. note:: 您可能需要配置您的 Web 服务器以访问不包含 **index.php** 的 URL。请参阅 :ref:`CodeIgniter URLs `。 -#. 如果你打算使用数据库,使用文本编辑器打开 - **app/Config/Database.php** 文件,并设置你的 - 数据库设置。或者,你也可以在 **.env** 文件中进行设置。 -#. 如果它不在生产服务器上,请在 **.env** 文件中将 ``CI_ENVIRONMENT`` 设置为 ``development``,以便利用提供的调试工具。有关详细信息,请参阅 :ref:`设置开发模式 `。 +配置数据库连接设置 +====================================== - .. important:: 在生产环境中,你应该禁用错误显示和任何其他仅用于开发的功能。在 CodeIgniter 中,可以通过将环境设置为“production”来实现。默认情况下,应用程序将使用“production”环境运行。另请参阅 :ref:`environment-constant`。 +如果您打算使用数据库,请使用文本编辑器打开 **app/Config/Database.php** 文件,并设置您的数据库设置。或者,您可以在 **.env** 文件中设置这些设置。 -.. note:: 如果你将使用 Web 服务器(例如 Apache 或 Nginx)运行你的站点,你需要修改项目中的 ``writable`` 文件夹的权限,以便由 Web 服务器使用的用户或账户具有写入权限。 +设置为开发模式 +======================= +如果不是在生产服务器上,请在 **.env** 文件中将 ``CI_ENVIRONMENT`` 设置为 ``development``,以利用提供的调试工具。有关详细信息,请参阅 :ref:`setting-development-mode`。 + +.. important:: 在生产环境中,应禁用错误显示和任何其他仅用于开发的功能。在 CodeIgniter 中,可以通过将环境设置为 "production" 来实现。默认情况下,应用程序将在 "production" 环境下运行。另请参阅 :ref:`environment-constant`。 + +设置可写文件夹权限 +============================== + +如果您将使用 Web 服务器(例如 Apache 或 nginx)运行您的站点,您需要修改项目中的 **writable** 文件夹的权限,以便它可以被您的 Web 服务器使用的用户或帐户写入。 + +************************ 本地开发服务器 -======================== +************************ -CodeIgniter 4 自带一个本地开发服务器,利用 PHP 的内置 Web 服务器和 CodeIgniter 的路由功能。你可以使用 ``serve`` 脚本来启动它,在主目录下使用以下命令行:: +CodeIgniter 4 自带一个本地开发服务器,利用 PHP 的内置 Web 服务器和 CodeIgniter 的路由功能。您可以使用以下命令在主目录中启动它: - > php spark serve +.. code-block:: console -这将启动服务器,并且你现在可以在浏览器中通过 http://localhost:8080 查看你的应用程序。 + php spark serve -.. note:: 内置的开发服务器应该只在本地开发机器上使用。绝对不要在生产服务器上使用。 +这将启动服务器,您现在可以在浏览器中通过 http://localhost:8080 查看您的应用程序。 -如果你需要在除 localhost 之外的主机上运行站点,你首先需要将主机添加到你的 ``hosts`` 文件中。该文件的确切位置在每个主要操作系统中都有所不同,不过所有的类 Unix 系统(包括 OS X)通常将该文件保存在 **/etc/hosts** 中。 +.. note:: 内置的开发服务器只应在本地开发机器上使用。它绝不能在生产服务器上使用。 -可以使用三个命令行选项自定义本地开发服务器: +如果您需要在除 localhost 之外的主机上运行站点,您首先需要将主机添加到您的 **hosts** 文件中。文件的确切位置因每个主要操作系统而异,但所有的类 Unix 类型的系统(包括 macOS)通常将文件保存在 **/etc/hosts** 中。 -- 你可以使用 ``--host`` CLI 选项指定要在其上运行应用程序的不同主机:: +本地开发服务器可以使用三个命令行选项进行自定义: - > php spark serve --host example.dev +- 您可以使用 ``--host`` CLI 选项指定要运行应用程序的不同主机: -- 默认情况下,服务器运行在端口 8080 上,但你可能有多个站点正在运行,或者已经有另一个应用程序使用该端口。你可以使用 ``--port`` CLI 选项指定一个不同的端口:: + .. code-block:: console - > php spark serve --port 8081 + php spark serve --host example.dev -- 你还可以使用 ``--php`` CLI 选项指定要使用的特定版本的 PHP,其值设置为要使用的 PHP 可执行文件的路径:: +- 默认情况下,服务器在端口 8080 上运行,但您可能有多个站点正在运行,或者已经有其他应用程序使用该端口。您可以使用 ``--port`` CLI 选项指定不同的端口: - > php spark serve --php /usr/bin/php7.6.5.4 + .. code-block:: console + php spark serve --port 8081 + +- 您还可以使用 ``--php`` CLI 选项指定要使用的特定版本的 PHP,将其值设置为您要使用的 PHP 可执行文件的路径: + + .. code-block:: console + + php spark serve --php /usr/bin/php7.6.5.4 + +******************* 使用 Apache 托管 -=================== +******************* -CodeIgniter 4 Web 应用程序通常托管在 Web 服务器上。Apache 的 ``httpd`` 是“标准”平台,在我们的大部分文档中都默认使用它。 +CodeIgniter 4 网站通常托管在 Web 服务器上。Apache HTTP Server 是“标准”平台,在我们的文档中假定使用它。 -Apache 随附于许多平台,但也可以从 `Bitnami `_ 下载包含数据库引擎和 PHP 的捆绑包。 +Apache 与许多平台捆绑在一起,但也可以从 `Bitnami `_ 下载捆绑了数据库引擎和 PHP 的版本。 -.htaccess ---------- +配置主配置文件 +========================== -我们的用户指南假设使用了“mod_rewrite”模块,该模块允许 URL 中没有 "index.php",请确保该模块已启用(取消注释)在主配置文件中,例如 ``apache2/conf/httpd.conf``:: +启用 mod_rewrite +-------------------- + +"mod_rewrite" 模块允许在 URL 中不包含 "index.php",我们在用户指南中假定了这一点。 + +确保在主配置文件中启用(取消注释)重写模块,例如 **apache2/conf/httpd.conf**: + +.. code-block:: apache LoadModule rewrite_module modules/mod_rewrite.so -还要确保默认文档根目录的 元素也启用了此设置,在 "AllowOverride" 设置中:: +设置文档根目录 +--------------------- + +还要确保默认文档根目录的 ```` 元素也启用了这一点,在 ``AllowOverride`` 设置中: + +.. code-block:: apache Options Indexes FollowSymLinks @@ -78,124 +121,228 @@ Apache 随附于许多平台,但也可以从 `Bitnami -去除 index.php ----------------------- +使用虚拟主机托管 +======================== -请参阅 :ref:`CodeIgniter URLs `。 +我们建议使用“虚拟主机”来运行您的应用程序。您可以为您工作的每个应用程序设置不同的别名, -虚拟主机 ---------------- +启用 vhost_alias_module +--------------------------- -我们建议使用“虚拟主机”来运行你的应用程序。你可以为你工作的每个应用程序设置不同的别名。 +确保在主配置文件中启用(取消注释)虚拟主机模块,例如 **apache2/conf/httpd.conf**: -确保虚拟主机模块已在主配置文件中启用(取消注释),例如 ``apache2/conf/httpd.conf``:: +.. code-block:: apache LoadModule vhost_alias_module modules/mod_vhost_alias.so -在你的 "hosts" 文件中添加一个主机别名,通常在类 Unix 系统的平台上是 ``/etc/hosts``,在 Windows 上是 ``c:/Windows/System32/drivers/etc/hosts``。在文件中 +添加主机别名 +----------------- + +在您的 "hosts" 文件中添加主机别名,通常在 Unix 类型平台上为 **/etc/hosts**,在 Windows 上为 **c:\Windows\System32\drivers\etc\hosts**。 -添加一行。例如,可以是 "myproject.local" 或 "myproject.test":: +在文件中添加一行。例如,可以是 ``myproject.local`` 或 ``myproject.test``:: 127.0.0.1 myproject.local -在虚拟主机配置内添加一个 元素,例如在虚拟主机配置文件中的 ``apache2/conf/extra/httpd-vhost.conf``:: +设置虚拟主机 +------------------- + +在虚拟主机配置中添加一个 ```` 元素,用于您的 Web 应用程序,例如 **apache2/conf/extra/httpd-vhost.conf**: + +.. code-block:: apache - DocumentRoot "/opt/lamp/apache2/htdocs/myproject/public" - ServerName myproject.local - ErrorLog "logs/myproject-error_log" - CustomLog "logs/myproject-access_log" common + DocumentRoot "/opt/lamp/apache2/myproject/public" + ServerName myproject.local + ErrorLog "logs/myproject-error_log" + CustomLog "logs/myproject-access_log" common + + + AllowOverride All + Require all granted + -如果你的项目文件夹不是 Apache 文档根目录的子文件夹,则你的 元素可能需要嵌套的 元素,以授予 Web 服务器对文件的访问权限。 +上述配置假设项目文件夹位于以下位置: + +.. code-block:: text + + apache2/ + ├── myproject/ (项目文件夹) + │ └── public/ (myproject.local 的 DocumentRoot) + └── htdocs/ + +重启 Apache。 + +测试 +------- + +使用上述配置,在浏览器中使用 URL **http://myproject.local/** 访问您的 Web 应用程序。 + +每当更改 Apache 配置时,都需要重新启动 Apache。 + +使用子文件夹进行托管 +====================== + +如果您希望使用类似 **http://localhost/myproject/** 的子文件夹 baseURL,有三种方法可以实现。 + +创建符号链接 +-------------- -使用 mod_userdir(共享主机) --------------------------------- +将您的项目文件夹放置在以下位置,其中 **htdocs** 是 Apache 的文档根目录:: -在共享托管环境中的常见做法是使用 Apache 模块 "mod_userdir" 自动启用每个用户的虚拟主机。为了允许从这些每个用户目录中运行 CodeIgniter4,需要进行额外的配置。 + ├── myproject/ (项目文件夹) + │ └── public/ + └── htdocs/ -以下假设服务器已经配置了 mod_userdir。关于启用此模块的指南可在 `Apache 文档 `_ 中找到。 +导航到 **htdocs** 文件夹并创建符号链接,如下所示: -因为 CodeIgniter4 默认情况下期望服务器在 ``/public/index.php`` 处找到框架前端控制器,所以你必须指定此位置作为搜索请求的替代位置(即使 CodeIgniter4 安装在每个用户的 Web 目录中)。 +.. code-block:: console -默认的用户 Web 目录 ``~/public_html`` 是由 ``UserDir`` 指令指定的,通常位于 ``/apache2/mods-available/userdir.conf`` 或 ``/apache2/conf/extra/httpd-userdir.conf`` 中:: + cd htdocs/ + ln -s ../myproject/public/ myproject + +使用别名 +----------- + +将您的项目文件夹放置在以下位置,其中 **htdocs** 是 Apache 的文档根目录: + + ├── myproject/ (项目文件夹) + │ └── public/ + └── htdocs/ + +在主配置文件中添加以下内容,例如 **apache2/conf/httpd.conf**: + +.. code-block:: apache + + Alias /myproject /opt/lamp/apache2/myproject/public + + AllowOverride All + Require all granted + + +重启 Apache。 + +添加 .htaccess +---------------- + +最后的选择是在项目根目录中添加 **.htaccess** 文件。 + +不建议将项目文件夹放置在文档根目录中。但是,如果您没有其他选择,例如在共享服务器上,您可以使用此方法。 + +将您的项目文件夹放置在以下位置,其中 **htdocs** 是 Apache 的文档根目录,并创建 **.htaccess** 文件: + + └── htdocs/ + └── myproject/ (项目文件夹) + ├── .htaccess + └── public/ + +并将 **.htaccess** 编辑如下: + +.. code-block:: apache + + + RewriteEngine On + RewriteRule ^(.*)$ public/$1 [L] + + + + Require all denied + Satisfy All + + +使用 mod_userdir 进行托管(共享主机) +======================================= + +在共享托管环境中,常见做法是使用 Apache 模块 "mod_userdir" 自动启用每个用户的虚拟主机。需要额外的配置才能允许 CodeIgniter4 从这些每个用户目录中运行。 + +以下假设服务器已经配置为 mod_userdir。有关启用此模块的指南,请参阅 Apache 文档中的 `相关部分 `_。 + +由于 CodeIgniter4 默认情况下期望服务器在 **public/index.php** 中找到框架前端控制器,因此您必须指定此位置作为替代位置以搜索请求(即使 CodeIgniter4 安装在每个用户的 Web 目录中)。 + +默认的用户 Web 目录 **~/public_html** 由 ``UserDir`` 指令指定,通常位于 **apache2/mods-available/userdir.conf** 或 **apache2/conf/extra/httpd-userdir.conf** 中: + +.. code-block:: apache UserDir public_html -因此,你需要配置 Apache,在尝试提供默认服务之前,首先查找 CodeIgniter 的 public 目录:: +因此,您需要配置 Apache 在尝试提供默认服务之前首先查找 CodeIgniter 的 public 目录: + +.. code-block:: apache UserDir "public_html/public" "public_html" -还请确保为 CodeIgniter 的 public 目录指定选项和权限。一个 ``userdir.conf`` 可能如下所示:: +确保还为 CodeIgniter 的 public 目录指定选项和权限。一个 **userdir.conf** 可能如下所示: + +.. code-block:: apache UserDir "public_html/public" "public_html" UserDir disabled root - AllowOverride All - Options MultiViews Indexes FollowSymLinks - - # Apache <= 2.2: - # Order allow,deny - # Allow from all - - # Apache >= 2.4: - Require all granted - - - # Apache <= 2.2: - # Order deny,allow - # Deny from all - - # Apache >= 2.4: - Require all denied - + AllowOverride All + Options MultiViews Indexes FollowSymLinks + + # Apache <= 2.2: + # Order allow,deny + # Allow from all + + # Apache >= 2.4: + Require all granted + + + # Apache <= 2.2: + # Order deny,allow + # Deny from all + + # Apache >= 2.4: + Require all denied + - AllowOverride All - Options MultiViews Indexes FollowSymLinks - - # Apache <= 2.2: - # Order allow,deny - # Allow from all - - # Apache >= 2.4: - Require all granted - - - # Apache <= 2.2: - # Order deny,allow - # Deny from all - - # Apache >= 2.4: - Require all denied - + AllowOverride All + Options MultiViews Indexes FollowSymLinks + + # Apache <= 2.2: + # Order allow,deny + # Allow from all + + # Apache >= 2.4: + Require all granted + + + # Apache <= 2.2: + # Order deny,allow + # Deny from all + + # Apache >= 2.4: + Require all denied + -设置环境 -------------------- +删除 index.php +====================== -请参阅 :ref:`处理多环境 `。 - -测试 -------- +请参阅 :ref:`CodeIgniter URLs `。 -通过上述配置,你的 Web 应用程序将可以通过 URL ``http://myproject.local`` 在浏览器中访问。 +设置环境 +=================== -每当更改 Apache 配置时,都需要重新启动 Apache。 +请参阅 :ref:`处理多个环境 `。 -使用 Nginx 托管 -================== +****************** +使用 nginx 托管 +****************** -Nginx 是第二个最广泛使用的 Web 托管 HTTP 服务器。这里你可以找到使用 PHP 7.3 FPM(unix sockets)的 Ubuntu Server 的示例配置。 +nginx 是第二常用的用于 Web 托管的 HTTP 服务器。以下是一个在 Ubuntu Server 上使用 PHP 8.1 FPM(Unix 套接字)的示例配置。 default.conf ------------- +============ -此配置使 URL 中没有 "index.php",并对以 ".php" 结尾的 URL 使用 CodeIgniter 的 "404 - 文件未找到"。 +此配置使 URL 中不包含 "index.php",并对以 ".php" 结尾的 URL 使用 CodeIgniter 的 "404 - 文件未找到"。 .. code-block:: nginx @@ -216,27 +363,28 @@ default.conf include snippets/fastcgi-php.conf; # 使用 php-fpm: - fastcgi_pass unix:/run/php/php7.3-fpm.sock; + fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 使用 php-cgi: # fastcgi_pass 127.0.0.1:9000; } error_page 404 /index.php; - # 拒绝访问隐藏文件,例如 .htaccess + # 禁止访问隐藏文件,如 .htaccess location ~ /\. { deny all; } } 设置环境 -------------------- +=================== -请参阅 :ref:`处理多环境 `。 +请参阅 :ref:`处理多个环境 `。 +********************* 引导应用程序 -===================== +********************* -在某些场景中,你可能希望加载框架,而不实际运行整个应用程序。这对于对项目进行单元测试非常有用,但也可以用于使用第三方工具来分析和修改你的代码。该框架提供了一个专门用于这种情况的单独引导脚本:``system/Test/bootstrap.php``。 +在某些情况下,您可能希望加载框架而不实际运行整个应用程序。这对于对项目进行单元测试非常有用,但也可能对使用第三方工具分析和修改代码很有用。框架提供了一个专门用于此场景的独立引导脚本:**system/Test/bootstrap.php**。 -大多数路径到你的项目都在引导过程中定义。你可以使用预定义的常量覆盖这些路径,但是当使用默认值时,请确保你的路径与预期的目录结构对齐,以适应你的安装方法。 +在引导过程中,大部分项目路径都会被定义。您可以使用预定义的常量来覆盖这些路径,但是当使用默认值时,请确保您的路径与安装方法的预期目录结构对齐。 diff --git a/source/installation/troubleshooting.rst b/source/installation/troubleshooting.rst index 52a38d0e3..bdf5a4573 100755 --- a/source/installation/troubleshooting.rst +++ b/source/installation/troubleshooting.rst @@ -11,9 +11,11 @@ 如何知道我的安装是否正常工作? --------------------------------------- -在项目根目录的命令行中:: +在项目根目录的命令行中: - > php spark serve +.. code-block:: console + + php spark serve 然后在浏览器中打开 ``http://localhost:8080`` 应该可以看到默认的欢迎页面: diff --git a/source/installation/upgrade_420.rst b/source/installation/upgrade_420.rst index 815195b07..eaf17c384 100644 --- a/source/installation/upgrade_420.rst +++ b/source/installation/upgrade_420.rst @@ -26,11 +26,13 @@ index.php 和 spark .. important:: 如果你不更新以上两个文件,在运行 ``composer update`` 后 CodeIgniter 将完全无法工作。 - 升级过程例如如下:: + 升级过程例如如下: - > composer update - > cp vendor/codeigniter4/framework/public/index.php public/index.php - > cp vendor/codeigniter4/framework/spark . + .. code-block:: console + + composer update + cp vendor/codeigniter4/framework/public/index.php public/index.php + cp vendor/codeigniter4/framework/spark . Config/Constants.php ==================== diff --git a/source/installation/upgrade_4210.rst b/source/installation/upgrade_4210.rst index b82c937de..f94ce7236 100644 --- a/source/installation/upgrade_4210.rst +++ b/source/installation/upgrade_4210.rst @@ -15,7 +15,7 @@ 项目文件 ************* -``4.2.10`` 版本没有更改项目文件中的任何可执行代码。 +4.2.10 版本没有更改项目文件中的任何可执行代码。 所有更改 =========== diff --git a/source/installation/upgrade_4211.rst b/source/installation/upgrade_4211.rst index 39c4771d3..fceaac725 100644 --- a/source/installation/upgrade_4211.rst +++ b/source/installation/upgrade_4211.rst @@ -47,7 +47,7 @@ Session 处理程序密钥更改 项目文件 ************* -``4.2.11`` 版本没有更改项目文件中的任何可执行代码。 +4.2.11 版本没有更改项目文件中的任何可执行代码。 所有更改 =========== diff --git a/source/installation/upgrade_4212.rst b/source/installation/upgrade_4212.rst index e3119bd21..e1a1814f8 100644 --- a/source/installation/upgrade_4212.rst +++ b/source/installation/upgrade_4212.rst @@ -15,7 +15,7 @@ 项目文件 ************* -``4.2.12`` 版本没有更改项目文件中的任何可执行代码。 +4.2.12 版本没有更改项目文件中的任何可执行代码。 所有更改 =========== diff --git a/source/installation/upgrade_423.rst b/source/installation/upgrade_423.rst index 1c857d302..863d32a1c 100644 --- a/source/installation/upgrade_423.rst +++ b/source/installation/upgrade_423.rst @@ -15,4 +15,4 @@ 项目文件 ************* -``4.2.3`` 版本是出于安全考虑的内部变更,项目中不需要任何干预。 +4.2.3 版本是出于安全考虑的内部变更,项目中不需要任何干预。 diff --git a/source/installation/upgrade_425.rst b/source/installation/upgrade_425.rst index 754e9e788..2f4f509d3 100644 --- a/source/installation/upgrade_425.rst +++ b/source/installation/upgrade_425.rst @@ -15,4 +15,4 @@ 项目文件 ************* -``4.2.5`` 版本没有更改任何项目文件。 +4.2.5 版本没有更改任何项目文件。 diff --git a/source/installation/upgrade_427.rst b/source/installation/upgrade_427.rst index dae1c8159..27f1617ad 100644 --- a/source/installation/upgrade_427.rst +++ b/source/installation/upgrade_427.rst @@ -56,7 +56,7 @@ set_cookie() 项目文件 ************* -``4.2.7`` 版本没有更改项目文件中的任何可执行代码。 +4.2.7 版本没有更改项目文件中的任何可执行代码。 所有更改 =========== diff --git a/source/installation/upgrade_430.rst b/source/installation/upgrade_430.rst index a500d279d..e2bad8680 100644 --- a/source/installation/upgrade_430.rst +++ b/source/installation/upgrade_430.rst @@ -21,11 +21,13 @@ Composer 版本 如果你使用的是更早版本的 Composer,请升级你的 ``composer`` 工具, 删除 **vendor/** 目录,并再次运行 ``composer update``。 -例如,过程如下:: +例如,过程如下: - > composer self-update - > rm -rf vendor/ - > composer update +.. code-block:: console + + composer self-update + rm -rf vendor/ + composer update 必备文件变更 ********************** @@ -40,10 +42,12 @@ spark .. important:: 如果不更新此文件,在运行 ``composer update`` 后 Spark 命令将完全无法工作。 - 升级过程例如如下:: + 升级过程例如如下: + + .. code-block:: console - > composer update - > cp vendor/codeigniter4/framework/spark . + composer update + cp vendor/codeigniter4/framework/spark . 配置文件 ============ diff --git a/source/installation/upgrade_431.rst b/source/installation/upgrade_431.rst index 489d37754..2e2e7c682 100644 --- a/source/installation/upgrade_431.rst +++ b/source/installation/upgrade_431.rst @@ -21,11 +21,13 @@ Composer 版本 如果你使用的是更早版本的 Composer,请升级你的 ``composer`` 工具, 删除 **vendor/** 目录,并再次运行 ``composer update``。 -例如,过程如下:: +例如,过程如下: - > composer self-update - > rm -rf vendor/ - > composer update +.. code-block:: console + + composer self-update + rm -rf vendor/ + composer update 必备文件变更 ********************** diff --git a/source/installation/upgrade_435.rst b/source/installation/upgrade_435.rst index a88e667e0..6fa35fad2 100644 --- a/source/installation/upgrade_435.rst +++ b/source/installation/upgrade_435.rst @@ -18,7 +18,20 @@ 验证占位符 ======================= -- 为了安全地使用 :ref:`validation-placeholders`,请记得为你将用作占位符的字段创建一个验证规则。 +为了安全地使用 :ref:`validation-placeholders`,请记得为你将用作占位符的字段创建一个验证规则。 + +例如,如果您有以下代码:: + + $validation->setRules([ + 'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,{id}]', + ]); + +您需要为 ``{id}`` 添加规则:: + + $validation->setRules([ + 'id' => 'max_length[19]|is_natural_no_zero', // Add this + 'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,{id}]', + ]); Session::stop() =============== diff --git a/source/installation/upgrade_437.rst b/source/installation/upgrade_437.rst index f3835f938..a531979e6 100644 --- a/source/installation/upgrade_437.rst +++ b/source/installation/upgrade_437.rst @@ -1,79 +1,71 @@ ############################# -Upgrading from 4.3.6 to 4.3.7 +从 4.3.6 升级到 4.3.7 ############################# -Please refer to the upgrade instructions corresponding to your installation method. +请参考与您的安装方法相对应的升级说明。 -- :ref:`Composer Installation App Starter Upgrading ` -- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` -- :ref:`Manual Installation Upgrading ` +- :ref:`使用 Composer 安装的应用程序启动器升级 ` +- :ref:`使用 Composer 安装的将 CodeIgniter4 添加到现有项目中升级 ` +- :ref:`手动安装升级 ` .. contents:: :local: :depth: 2 -Breaking Changes +重大变更 **************** .. _upgrade-437-feature-testing: -Feature Testing Request Body +功能测试请求体 ============================ -If you call: +如果您调用了以下方法: 1. :ref:`withBody() ` -2. and :ref:`withBodyFormat() ` -3. and pass the ``$params`` to :ref:`call() ` (or shorthand methods) +2. 并且 :ref:`withBodyFormat() ` +3. 并将 ``$params`` 传递给 :ref:`call() ` (或简写方法) -the priority for a Request body has been changed. In the unlikely event that you -have test code affected by this change, modify it. +则请求体的优先级已更改。如果您的测试代码受到此更改的影响,请进行修改。 -For example, now the ``$params`` is used to build the request body, and the ``$body`` -is not used:: +例如,现在使用 ``$params`` 来构建请求体,而不使用 ``$body``:: $this->withBody($body)->withBodyFormat('json')->call('post', $params) -Previously, the ``$body`` was used for the request body. +以前,``$body`` 用于请求体。 -Return value of Validation::loadRuleGroup() +Validation::loadRuleGroup() 的返回值 =========================================== -The return value of ``Validation::loadRuleGroup()`` has been changed from -"**rules array**" to "**array** of **rules array** and **customErrors array**" -(``[rules, customErrors]``). +``Validation::loadRuleGroup()`` 的返回值已从 "**rules 数组**" 更改为 "**rules 数组** 和 **customErrors 数组**" 的 "**数组**"(``[rules, customErrors]``)。 -If you use the method, update the code like the following:: +如果您使用了该方法,请将代码更新如下:: $rules = $this->validation->loadRuleGroup($rules); ↓ [$rules, $customErrors] = $this->validation->loadRuleGroup($rules); -Project Files +项目文件 ************* -Some files in the **project space** (root, app, public, writable) received updates. Due to -these files being outside of the **system** scope they will not be changed without your intervention. +**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **系统** 范围之外,因此不会在没有您干预的情况下进行更改。 -There are some third-party CodeIgniter modules available to assist with merging changes to -the project space: `Explore on Packagist `_. +有一些第三方 CodeIgniter 模块可用于帮助合并对项目空间的更改:`在 Packagist 上查看 `_。 -Content Changes +内容更改 =============== -The following files received significant changes (including deprecations or visual adjustments) -and it is recommended that you merge the updated versions with your application: +以下文件已经进行了重大更改(包括弃用或视觉调整),建议您将更新后的版本与您的应用程序合并: -Config +配置 ------ - app/Config/Kint.php -All Changes +所有更改 =========== -This is a list of all files in the **project space** that received changes; -many will be simple comments or formatting that have no effect on the runtime: +这是 **项目空间** 中所有已更改的文件的列表;其中许多只是注释或格式变化,对运行时没有影响: - app/Config/App.php - app/Config/Autoload.php diff --git a/source/installation/upgrade_438.rst b/source/installation/upgrade_438.rst index 2f5decd2a..13bac86d2 100644 --- a/source/installation/upgrade_438.rst +++ b/source/installation/upgrade_438.rst @@ -1,41 +1,37 @@ ############################# -Upgrading from 4.3.7 to 4.3.8 +从 4.3.7 升级到 4.3.8 ############################# -Please refer to the upgrade instructions corresponding to your installation method. +请参考与您的安装方法相对应的升级说明。 -- :ref:`Composer Installation App Starter Upgrading ` -- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` -- :ref:`Manual Installation Upgrading ` +- :ref:`使用 Composer 安装的应用程序启动器升级 ` +- :ref:`使用 Composer 安装的将 CodeIgniter4 添加到现有项目中升级 ` +- :ref:`手动安装升级 ` .. contents:: :local: :depth: 2 -Project Files +项目文件 ************* -Some files in the **project space** (root, app, public, writable) received updates. Due to -these files being outside of the **system** scope they will not be changed without your intervention. +**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,因此不会在没有您干预的情况下进行更改。 -There are some third-party CodeIgniter modules available to assist with merging changes to -the project space: `Explore on Packagist `_. +有一些第三方 CodeIgniter 模块可用于帮助合并对项目空间的更改:`在 Packagist 上查看 `_。 -Content Changes +内容更改 =============== -The following files received significant changes (including deprecations or visual adjustments) -and it is recommended that you merge the updated versions with your application: +以下文件已经进行了重大更改(包括弃用或视觉调整),建议您将更新后的版本与您的应用程序合并: -Config +配置 ------ - composer.json -All Changes +所有更改 =========== -This is a list of all files in the **project space** that received changes; -many will be simple comments or formatting that have no effect on the runtime: +这是 **项目空间** 中所有已更改的文件的列表;其中许多只是注释或格式变化,对运行时没有影响: - composer.json diff --git a/source/installation/upgrade_440.rst b/source/installation/upgrade_440.rst index c84d72a7e..f161360fc 100644 --- a/source/installation/upgrade_440.rst +++ b/source/installation/upgrade_440.rst @@ -1,147 +1,119 @@ ############################## -Upgrading from 4.3.8 to 4.4.0 +从 4.3.8 升级到 4.4.0 ############################## -Please refer to the upgrade instructions corresponding to your installation method. +请参考与您的安装方法对应的升级说明。 -- :ref:`Composer Installation App Starter Upgrading ` -- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` -- :ref:`Manual Installation Upgrading ` +- :ref:`使用 Composer 安装 App Starter 升级 ` +- :ref:`使用 Composer 安装将 CodeIgniter4 添加到现有项目并进行升级 ` +- :ref:`手动安装升级 ` .. contents:: :local: :depth: 2 -SECURITY +安全性 ******** -When Using $this->validate() +使用 $this->validate() 时 ============================ -There was a known potential vulnerability in :ref:`$this->validate() ` in the Controller to bypass validation. -The attack could allow developers to misinterpret unvalidated empty data as -validated and proceed with processing. +在 Controller 的 :ref:`$this->validate() ` 中存在已知的潜在漏洞,可绕过验证。 +攻击可以使开发人员误解未经验证的空数据为已验证数据并继续处理。 -The :ref:`Validation::getValidated() ` -method has been added to ensure that validated data is obtained. +已添加 :ref:`Validation::getValidated() ` 方法,以确保获取已验证数据。 -Therefore, when you use ``$this->validate()`` in your Controllers, you should -use the new ``Validation::getValidated()`` method to get the validated data. +因此,在您的 Controllers 中使用 ``$this->validate()`` 时,应使用新的 ``Validation::getValidated()`` 方法获取已验证的数据。 .. literalinclude:: ../libraries/validation/045.php :lines: 2- -Breaking Changes +破坏性变更 **************** .. _upgrade-440-uri-setsegment: -URI::setSegment() Change +URI::setSegment() 更改 ======================== -Dut to a bug, in previous versions an exception was not thrown if the last segment -``+2`` was specified. This bug has been fixed. +由于以前版本中没有抛出异常,如果指定了最后一个段 ``+2``,此错误已经修复。 -If your code depends on this bug, fix the segment number. +如果您的代码依赖于此错误,请修复段编号。 .. literalinclude:: upgrade_440/002.php :lines: 2- -Site URI Changes +站点 URI 更改 ================ -- Because of the rework for the current URI determination, the framework may return - site URIs or the URI paths slightly differently than in previous versions. It may - break your test code. Update assertions if the existing tests fail. -- When your baseURL has sub-directories and you get the relative path to baseURL of - the current URI by the ``URI::getPath()`` method, you must use the new - ``SiteURI::getRoutePath()`` method instead. +- 由于对当前 URI 确定进行了重新制定,框架可能以与以前版本不同的方式返回站点 URI 或 URI 路径。这可能会破坏您的测试代码。如果现有测试失败,请更新断言。 +- 如果您的 baseURL 具有子目录,并且通过 ``URI::getPath()`` 方法获取当前 URI 的相对路径到 baseURL,您必须改用新的 ``SiteURI::getRoutePath()`` 方法。 -See :ref:`v440-site-uri-changes` for details. +有关详细信息,请参见 :ref:`v440-site-uri-changes`。 -When You Extend Exceptions +当您扩展异常时 ========================== -If you are extending ``CodeIgniter\Debug\Exceptions`` and have not overridden -the ``exceptionHandler()`` method, defining the new ``Config\Exceptions::handler()`` -method in your **app/Config/Exceptions.php** will cause the specified Exception -Handler to be executed. +如果您扩展了 ``CodeIgniter\Debug\Exceptions`` 并且未覆盖 ``exceptionHandler()`` 方法,那么在 **app/Config/Exceptions.php** 中定义新的 ``Config\Exceptions::handler()`` 方法将导致执行指定的异常处理程序。 -Your overridden code will no longer be executed, so make any necessary changes -by defining your own exception handler. +您的覆盖代码将不再执行,因此请通过定义自己的异常处理程序进行必要的更改。 -See :ref:`custom-exception-handlers` for the detail. +请参阅 :ref:`custom-exception-handlers` 了解详细信息。 -Auto Routing (Improved) and translateURIDashes +自动路由(改进版)和 translateURIDashes ============================================== -When using Auto Routing (Improved) and ``$translateURIDashes`` is true -(``$routes->setTranslateURIDashes(true)``), in previous versions due to a bug -two URIs correspond to a single controller method, one URI for dashes -(e.g., **foo-bar**) and one URI for underscores (e.g., **foo_bar**). +在使用自动路由(改进版)和 ``$translateURIDashes`` 为 true 时(``$routes->setTranslateURIDashes(true)``),在以前版本中由于错误,两个 URI 对应一个控制器方法,一个 URI 用于破折号(例如 **foo-bar**),另一个 URI 用于下划线(例如 **foo_bar**)。 -This bug was fixed and now URIs for underscores (**foo_bar**) is not accessible. +此错误已经修复,现在不再支持下划线 URI(**foo_bar**)。 -If you have links to URIs for underscores (**foo_bar**), update them with URIs -for dashes (**foo-bar**). +如果您有指向下划线 URI(**foo_bar**)的链接,请将其更新为破折号 URI(**foo-bar**)。 -When Passing Classname with Namespace to Factories +传递带有命名空间的类名到工厂时 ================================================== -The behavior of passing a classname with a namespace to Factories has been changed. -See :ref:`ChangeLog ` for details. +传递带有命名空间的类名到工厂的行为已更改。有关详细信息,请参见 :ref:`ChangeLog `。 -If you have code like ``model(\Myth\Auth\Models\UserModel::class)`` or -``model('Myth\Auth\Models\UserModel')`` (the code may be in the third-party packages), -and you expect to load your ``App\Models\UserModel``, you need to define the -classname to be loaded before the first loading of that class:: +如果您有类似于 ``model(\Myth\Auth\Models\UserModel::class)`` 或 +``model('Myth\Auth\Models\UserModel')`` 的代码(代码可能在第三方包中),并且希望加载您的 ``App\Models\UserModel``,您需要在加载该类之前定义要加载的类名:: Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel'); -See :ref:`factories-defining-classname-to-be-loaded` for details. +有关详细信息,请参见 :ref:`factories-defining-classname-to-be-loaded`。 -Interface Changes +接口更改 ================= -Some interface changes have been made. Classes that implement them should update -their APIs to reflect the changes. See :ref:`v440-interface-changes` for details. +已进行了一些接口更改。实现它们的类应该更新其 API 以反映更改。有关详细信息,请参见 :ref:`v440-interface-changes`。 -Method Signature Changes +方法签名更改 ======================== -Some method signature changes have been made. Classes that extend them should -update their APIs to reflect the changes. See :ref:`v440-method-signature-changes` -for details. +已进行了一些方法签名更改。扩展它们的类应该更新其 API 以反映更改。有关详细信息,请参见 :ref:`v440-method-signature-changes`。 -Also, the parameter types of some constructors and ``Services::security()`` have changed. -If you call them with the parameters, change the parameter values. -See :ref:`v440-parameter-type-changes` for details. +此外,某些构造函数和 ``Services::security()`` 的参数类型已更改。如果您使用这些参数调用它们,请更改参数值。有关详细信息,请参见 :ref:`v440-parameter-type-changes`。 RouteCollection::$routes ======================== -The array structure of the protected property ``$routes`` has been modified for -performance. +受保护属性 ``$routes`` 的数组结构已进行了修改以提高性能。 -If you extend ``RouteCollection`` and use the ``$routes``, update your code to -match the new array structure. +如果您扩展了 ``RouteCollection`` 并使用了 ``$routes``,请更新您的代码以匹配新的数组结构。 -Mandatory File Changes +必要的文件更改 ********************** -index.php and spark +index.php 和 spark =================== -The following files received significant changes and -**you must merge the updated versions** with your application: +以下文件已经接收到重大更改,**您必须将更新后的版本与您的应用程序合并**: -- ``public/index.php`` (see also :ref:`v440-codeigniter-and-exit`) +- ``public/index.php`` (还请参阅 :ref:`v440-codeigniter-and-exit` ) - ``spark`` -.. important:: If you don't update the above files, CodeIgniter will not work - properly after running ``composer update``. +.. important:: 如果您不更新上述文件,运行 ``composer update`` 后 CodeIgniter 将无法正常工作。 - The upgrade procedure, for example, is as follows: + 升级过程,例如如下: .. code-block:: console @@ -149,38 +121,35 @@ The following files received significant changes and cp vendor/codeigniter4/framework/public/index.php public/index.php cp vendor/codeigniter4/framework/spark spark -Config Files +配置文件 ============ app/Config/App.php ------------------ -The property ``$proxyIPs`` must be an array. If you don't use proxy servers, -it must be ``public array $proxyIPs = [];``. +属性 ``$proxyIPs`` 必须是数组。如果您不使用代理服务器,则它必须为 ``public array $proxyIPs = [];``。 .. _upgrade-440-config-routing: app/Config/Routing.php ---------------------- -To clean up the routing system, the following changes were made: +为了清理路由系统,进行了以下更改: -- New **app/Config/Routing.php** file that holds the settings that used to be in the Routes file. -- The **app/Config/Routes.php** file was simplified so that it only contains the routes without settings and verbiage to clutter the file. -- The environment-specific routes files are no longer loaded automatically. +- 新的 **app/Config/Routing.php** 文件保存了以前在 Routes 文件中的设置。 +- **app/Config/Routes.php** 文件经过简化,仅包含路由,没有设置和冗余的内容。 +- 不再自动加载特定于环境的路由文件。 -So you need to do: +因此,您需要执行以下操作: -1. Copy **app/Config/Routing.php** from the new framework to your **app/Config** - directory, and configure it. -2. Remove all settings in **app/Config/Routes.php** that are no longer needed. -3. If you use the environment-specific routes files, add them to the ``$routeFiles`` property in **app/Config/Routing.php**. +1. 从新框架中复制 **app/Config/Routing.php** 到您的 **app/Config** 目录,并进行配置。 +2. 删除不再需要的 **app/Config/Routes.php** 中的所有设置。 +3. 如果使用特定于环境的路由文件,请将它们添加到 **app/Config/Routing.php** 中的 ``$routeFiles`` 属性中。 app/Config/Toolbar.php ---------------------- -You need to add the new properties ``$watchedDirectories`` and ``$watchedExtensions`` -for :ref:`debug-toolbar-hot-reload`:: +您需要添加新属性 ``$watchedDirectories`` 和 ``$watchedExtensions`` 以进行 :ref:`debug-toolbar-hot-reload`:: --- a/app/Config/Toolbar.php +++ b/app/Config/Toolbar.php @@ -217,11 +186,10 @@ for :ref:`debug-toolbar-hot-reload`:: + ]; } - app/Config/Events.php --------------------- -You need to add the code to add a route for :ref:`debug-toolbar-hot-reload`:: +您需要添加代码以为 :ref:`debug-toolbar-hot-reload` 添加一个路由:: --- a/app/Config/Events.php +++ b/app/Config/Events.php @@ -249,72 +217,58 @@ You need to add the code to add a route for :ref:`debug-toolbar-hot-reload`:: app/Config/Cookie.php --------------------- -The Cookie config items in **app/Config/App.php** are no longer used. +**app/Config/App.php** 中的 Cookie 配置项不再使用。 -1. Copy **app/Config/Cookie.php** from the new framework to your **app/Config** - directory, and configure it. -2. Remove the properties (from ``$cookiePrefix`` to ``$cookieSameSite``) in - **app/Config/App.php**. +1. 从新框架中复制 **app/Config/Cookie.php** 到您的 **app/Config** 目录,并进行配置。 +2. 删除 **app/Config/App.php** 中的属性(从 ``$cookiePrefix`` 到 ``$cookieSameSite``)。 app/Config/Security.php ----------------------- -The CSRF config items in **app/Config/App.php** are no longer used. +**app/Config/App.php** 中的 CSRF 配置项不再使用。 -1. Copy **app/Config/Security.php** from the new framework to your **app/Config** - directory, and configure it. -2. Remove the properties (from ``$CSRFTokenName`` to ``$CSRFSameSite``) in - **app/Config/App.php**. +1. 从新框架中复制 **app/Config/Security.php** 到您的 **app/Config** 目录,并进行配置。 +2. 删除 **app/Config/App.php** 中的属性(从 ``$CSRFTokenName`` 到 ``$CSRFSameSite``)。 app/Config/Session.php ---------------------- -The Session config items in **app/Config/App.php** are no longer used. +**app/Config/App.php** 中的 Session 配置项不再使用。 -1. Copy **app/Config/Session.php** from the new framework to your **app/Config** - directory, and configure it. -2. Remove the properties (from ``$sessionDriver`` to ``$sessionDBGroup``) in - **app/Config/App.php**. +1. 从新框架中复制 **app/Config/Session.php** 到您的 **app/Config** 目录,并进行配置。 +2. 删除 **app/Config/App.php** 中的属性(从 ``$sessionDriver`` 到 ``$sessionDBGroup``)。 -Breaking Enhancements +重大改进 ********************* -- **Routing:** The method signature of ``RouteCollection::__construct()`` has been changed. - The third parameter ``Routing $routing`` has been added. Extending classes - should likewise add the parameter so as not to break LSP. -- **Validation:** The method signature of ``Validation::check()`` has been changed. - The ``string`` typehint on the ``$rule`` parameter was removed. Extending classes - should likewise remove the typehint so as not to break LSP. +- **路由:** ``RouteCollection::__construct()`` 的方法签名已更改。添加了第三个参数 ``Routing $routing``。扩展类应该同样添加参数以不违反 LSP。 +- **验证:** ``Validation::check()`` 的方法签名已更改。``$rule`` 参数上的 ``string`` 类型提示已被删除。扩展类应该同样删除类型提示以不违反 LSP。 -Project Files +项目文件 ************* -Some files in the **project space** (root, app, public, writable) received updates. Due to -these files being outside of the **system** scope they will not be changed without your intervention. +**项目空间** 中的一些文件(根目录、app、public、writable)已接收到更新。由于这些文件位于 **系统** 范围之外,它们将不会在没有您干预的情况下更改。 -There are some third-party CodeIgniter modules available to assist with merging changes to -the project space: `Explore on Packagist `_. +有一些第三方 CodeIgniter 模块可帮助您合并对项目空间的更改:[Packagist 上探索](https://packagist.org/explore/?query=codeigniter4%20updates)。 -Content Changes +内容更改 =============== -The following files received significant changes (including deprecations or visual adjustments) -and it is recommended that you merge the updated versions with your application: +以下文件已接收到重大更改(包括弃用或视觉调整),建议您将更新后的版本与您的应用程序合并: -Config +配置 ------ - app/Config/CURLRequest.php - - The default value of :ref:`$shareOptions ` has been change to ``false``. + - :ref:`$shareOptions ` 的默认值已更改为 ``false``。 - app/Config/Exceptions.php - - Added the new method ``handler()`` that define custom Exception Handlers. - See :ref:`custom-exception-handlers`. + - 添加了新方法 ``handler()``,定义自定义异常处理程序。 + 请参阅 :ref:`custom-exception-handlers`。 -All Changes +所有更改 =========== -This is a list of all files in the **project space** that received changes; -many will be simple comments or formatting that have no effect on the runtime: +这是 **项目空间** 中所有文件的更改列表;其中许多将是对运行时没有影响的注释或格式化: - app/Config/App.php - app/Config/CURLRequest.php diff --git a/source/installation/upgrade_441.rst b/source/installation/upgrade_441.rst index c2fc56859..f91930fa4 100644 --- a/source/installation/upgrade_441.rst +++ b/source/installation/upgrade_441.rst @@ -1,36 +1,33 @@ ############################# -Upgrading from 4.4.0 to 4.4.1 +从 4.4.0 升级到 4.4.1 ############################# -Please refer to the upgrade instructions corresponding to your installation method. +请参考与您的安装方法相对应的升级说明。 -- :ref:`Composer Installation App Starter Upgrading ` -- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` -- :ref:`Manual Installation Upgrading ` +- :ref:`使用 Composer 安装 App Starter 升级 ` +- :ref:`使用 Composer 安装将 CodeIgniter4 添加到现有项目并进行升级 ` +- :ref:`手动安装升级 ` .. contents:: :local: :depth: 2 -Project Files +项目文件 ************* -Some files in the **project space** (root, app, public, writable) received updates. Due to -these files being outside of the **system** scope they will not be changed without your intervention. +**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有您的干预,它们将不会更改。 -There are some third-party CodeIgniter modules available to assist with merging changes to -the project space: `Explore on Packagist `_. +有一些第三方的 CodeIgniter 模块可用于帮助合并项目空间的更改:`在 Packagist 上查看 `_。 -Content Changes +内容更改 =============== -Version 4.4.1 did not alter any executable code in project files. +版本 4.4.1 没有更改项目文件中的任何可执行代码。 -All Changes +所有更改 =========== -This is a list of all files in the **project space** that received changes; -many will be simple comments or formatting that have no effect on the runtime: +这是 **项目空间** 中所有已更改的文件列表;其中许多只是注释或格式化的简单更改,对运行时没有影响: - app/Config/Autoload.php - app/Config/DocTypes.php diff --git a/source/installation/upgrade_442.rst b/source/installation/upgrade_442.rst index 46ed0ff7d..6f841d93d 100644 --- a/source/installation/upgrade_442.rst +++ b/source/installation/upgrade_442.rst @@ -1,31 +1,28 @@ ############################# -Upgrading from 4.4.1 to 4.4.2 +从 4.4.1 升级到 4.4.2 ############################# -Please refer to the upgrade instructions corresponding to your installation method. +请参考与您的安装方法相对应的升级说明。 -- :ref:`Composer Installation App Starter Upgrading ` -- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` -- :ref:`Manual Installation Upgrading ` +- :ref:`使用 Composer 安装 App Starter 升级 ` +- :ref:`使用 Composer 安装将 CodeIgniter4 添加到现有项目并进行升级 ` +- :ref:`手动安装升级 ` .. contents:: :local: :depth: 2 -Project Files +项目文件 ************* -Some files in the **project space** (root, app, public, writable) received updates. Due to -these files being outside of the **system** scope they will not be changed without your intervention. +**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有您的干预,它们将不会更改。 -There are some third-party CodeIgniter modules available to assist with merging changes to -the project space: `Explore on Packagist `_. +有一些第三方的 CodeIgniter 模块可用于帮助合并项目空间的更改:`在 Packagist 上查看 `_。 -All Changes +所有更改 =========== -This is a list of all files in the **project space** that received changes; -many will be simple comments or formatting that have no effect on the runtime: +这是 **项目空间** 中所有已更改的文件列表;其中许多只是注释或格式化的简单更改,对运行时没有影响: - app/Config/Migrations.php - app/Config/View.php diff --git a/source/installation/upgrade_file_upload.rst b/source/installation/upgrade_file_upload.rst index 19e194b39..41b1081bb 100644 --- a/source/installation/upgrade_file_upload.rst +++ b/source/installation/upgrade_file_upload.rst @@ -7,7 +7,7 @@ 文档 ============== -- `CodeIgniter 3.X 输出类文档 `_ +- `CodeIgniter 3.X 文件上传类文档 `_ - :doc:`CodeIgniter 4.X 上传文件处理文档 ` 变更点 diff --git a/source/installation/upgrade_migrations.rst b/source/installation/upgrade_migrations.rst index b1693b798..d295b906b 100644 --- a/source/installation/upgrade_migrations.rst +++ b/source/installation/upgrade_migrations.rst @@ -16,9 +16,11 @@ - 首先,迁移文件的顺序命名(``001_create_users``、``002_create_posts``)不再被支持。CodeIgniter 4 版本仅支持时间戳方案(``20121031100537_create_users``、``20121031500638_create_posts``)。如果使用了顺序命名,则需要重命名每个迁移文件。 - 迁移表定义已更改。如果从 CI3 升级到 CI4 并使用相同的数据库,则需要升级迁移表定义及其数据。 -- 迁移过程也已更改。你现在可以使用简单的 CLI 命令迁移数据库:: +- 迁移过程也已更改。你现在可以使用简单的 CLI 命令迁移数据库: - > php spark migrate +.. code-block:: console + + php spark migrate 升级指南 ============= diff --git a/source/installation/upgrade_validations.rst b/source/installation/upgrade_validations.rst index de8b42b16..1641ae28b 100644 --- a/source/installation/upgrade_validations.rst +++ b/source/installation/upgrade_validations.rst @@ -18,6 +18,7 @@ 请使用 :ref:`规则类 ` 或 :ref:`闭包规则 ` 代替。 +- 在 CI3 中,回调/可调用规则具有优先级,但在 CI4 中,闭包规则没有优先级,并且按照它们在列表中的顺序进行检查。 - CI4 验证格式规则不允许为空字符串。 - CI4 验证永远不会改变你的数据。 - 从 v4.3.0 开始,引入了 :php:func:`validation_errors()`,但 API 与 CI3 的不同。 diff --git a/source/installation/upgrading.rst b/source/installation/upgrading.rst index 7f621c68b..498cdfa75 100755 --- a/source/installation/upgrading.rst +++ b/source/installation/upgrading.rst @@ -14,6 +14,11 @@ backward_compatibility_notes + upgrade_442 + upgrade_441 + upgrade_440 + upgrade_438 + upgrade_437 upgrade_436 upgrade_435 upgrade_434 diff --git a/source/intro/requirements.rst b/source/intro/requirements.rst index 78dd47373..7a373fbc2 100755 --- a/source/intro/requirements.rst +++ b/source/intro/requirements.rst @@ -16,6 +16,8 @@ PHP 及所需扩展 - `mbstring `_ - `json `_ +.. warning:: PHP 7.4 的生命周期结束日期是 2022 年 11 月 28 日。如果您仍在使用 PHP 7.4,应立即升级。PHP 8.0 的生命周期结束日期将是 2023 年 11 月 26 日。 + *********************** 可选的 PHP 扩展 *********************** diff --git a/source/libraries/caching.rst b/source/libraries/caching.rst index f526604e7..379fe55fa 100755 --- a/source/libraries/caching.rst +++ b/source/libraries/caching.rst @@ -20,6 +20,8 @@ CodeIgniter 提供了一些最常用的快速动态缓存的封装。除基于 .. literalinclude:: caching/002.php +.. _libraries-caching-configuring-the-cache: + ********************* 配置缓存 ********************* @@ -73,16 +75,20 @@ CodeIgniter 提供了几个可以从命令行使用的 :doc:`commands php spark cache:clear + php spark cache:clear cache:info ========== -显示当前系统中的文件缓存信息:: +显示当前系统中的文件缓存信息: - > php spark cache:info +.. code-block:: console + + php spark cache:info .. note:: 这个命令只支持 File 缓存处理程序。 @@ -286,9 +292,11 @@ Redis 是一个内存中的键值存储,可以以 LRU 缓存模式运行。要 Predis 缓存 ============== -Predis 是一个用于 Redis 键值存储的灵活且功能完善的 PHP 客户端库。要使用它,从项目根目录的命令行中运行:: +Predis 是一个用于 Redis 键值存储的灵活且功能完善的 PHP 客户端库。要使用它,从项目根目录的命令行中运行: + +.. code-block:: console - > composer require predis/predis + composer require predis/predis 有关 Redis 的更多信息,请查看 `https://github.com/nrk/predis `_。 diff --git a/source/libraries/cookies.rst b/source/libraries/cookies.rst index 2fcb0b4fe..4dac25b34 100644 --- a/source/libraries/cookies.rst +++ b/source/libraries/cookies.rst @@ -10,7 +10,7 @@ Cookie 主要用于三个目的: - **个性化**:用户首选项、主题和其他设置 - **跟踪**:记录和分析用户行为 -为了帮助你在请求和响应中跨浏览器高效使用 cookie,CodeIgniter 提供了 ``CodeIgniter\Cookie\Cookie`` 类来抽象 cookie 的交互。 +为了帮助你有效地向浏览器发送 Cookie,CodeIgniter 提供了 ``CodeIgniter\Cookie\Cookie`` 类来抽象化 Cookie 的交互。 .. contents:: :local: @@ -24,11 +24,21 @@ Cookie 主要用于三个目的: .. literalinclude:: cookies/001.php -在构造 ``Cookie`` 对象时,只需要 ``name`` 属性是必需的。其余的都是可选的。如果没有修改可选属性,它们的值将由 ``Cookie`` 类中保存的默认值填充。要覆盖类中当前存储的默认值,你可以传递一个 ``Config\Cookie`` 实例或默认值数组给静态 ``Cookie::setDefaults()`` 方法。 +在构造 ``Cookie`` 对象时,只需要 ``name`` 属性是必需的。其余的都是可选的。如果没有修改可选属性,它们的值将由 ``Cookie`` 类中保存的默认值填充。 + +覆盖默认值 +=================== + +要覆盖类中当前存储的默认值,你可以传递一个 ``Config\Cookie`` 实例或默认值数组给静态 ``Cookie::setDefaults()`` 方法。 .. literalinclude:: cookies/002.php -将 ``Config\Cookie`` 实例或数组传递给 ``Cookie::setDefaults()`` 将有效地覆盖你的默认值,并且持续到新的默认值被传递。如果你不想要这种行为,而只是想在有限的时间内更改默认值,你可以利用 ``Cookie::setDefaults()`` 的返回值,它返回旧的默认值数组。 +将 ``Config\Cookie`` 实例或数组传递给 ``Cookie::setDefaults()`` 将有效地覆盖你的默认值,并且持续到新的默认值被传递。 + +有限的时间内更改默认值 +------------------------------------ + +如果你不想要这种行为,而只是想在有限的时间内更改默认值,你可以利用 ``Cookie::setDefaults()`` 的返回值,它返回旧的默认值数组。 .. literalinclude:: cookies/003.php @@ -65,7 +75,7 @@ cookie 名称可以是任何 US-ASCII 字符,以下字符除外: - 空格或制表符; - 分隔符,例如 ``( ) < > @ , ; : \ " / [ ] ? = { }`` -如果将 ``$raw`` 参数设置为 ``true``,则会严格进行此验证。这是因为 PHP 的 ``setcookie`` 和 ``setrawcookie`` 会拒绝具有无效名称的 cookie。另外,cookie 名称不能为空字符串。 +如果将 ``$raw`` 参数设置为 ``true``,则会严格进行此验证。这是因为 PHP 的 `setcookie() `_ 和 `setrawcookie() `_ 会拒绝具有无效名称的 cookie。另外,cookie 名称不能为空字符串。 验证前缀属性 =============================== @@ -95,19 +105,43 @@ SameSite 属性只接受三个值: .. literalinclude:: cookies/006.php +*************** +发送 Cookies +*************** + +将 ``Cookie`` 对象设置在 Response 对象的 ``CookieStore`` 中,框架会自动发送 Cookies。 + +使用 :php:meth:`CodeIgniter\\HTTP\\Response::setCookie()` 来设置: + +.. literalinclude:: cookies/017.php + +你也可以使用 :php:func:`set_cookie()` 辅助函数: + +.. literalinclude:: cookies/018.php + ********************** 使用 Cookie 存储 ********************** -``CookieStore`` 类表示 ``Cookie`` 对象的一个不可变集合。可以从当前的 ``Response`` 对象访问 ``CookieStore`` 实例。 +.. note:: 通常情况下,不需要直接使用 CookieStore。 + +``CookieStore`` 类表示 ``Cookie`` 对象的一个不可变集合。 + +从 Response 获取存储 +=============================== + +可以从当前的 ``Response`` 对象访问 ``CookieStore`` 实例。 .. literalinclude:: cookies/007.php +创建 CookieStore +==================== + CodeIgniter 提供了另外三种创建 ``CookieStore`` 新实例的方法。 .. literalinclude:: cookies/008.php -.. note:: 在使用全局 ``cookies()`` 函数时,只有在第二个参数 ``$getGlobal`` 设置为 ``false`` 时,才会考虑传递的 ``Cookie`` 数组。 +.. note:: 在使用全局 :php:func:`cookies()` 函数时,只有在第二个参数 ``$getGlobal`` 设置为 ``false`` 时,才会考虑传递的 ``Cookie`` 数组。 检查存储中的 Cookie ========================= @@ -135,7 +169,7 @@ CodeIgniter 提供了另外三种创建 ``CookieStore`` 新实例的方法。 .. literalinclude:: cookies/013.php -.. note:: 帮助函数 ``get_cookie()`` 从当前的 ``Request`` 对象获取 cookie,而不是从 ``Response`` 获取。如果该 cookie 已设置,此函数会检查 ``$_COOKIE`` 数组并立即获取它。 +.. note:: 辅助函数 :php:func:`get_cookie()` 从当前的 ``Request`` 对象获取 cookie,而不是从 ``Response`` 获取。如果该 cookie 已设置,此函数会检查 ``$_COOKIE`` 数组并立即获取它。 在存储中添加/删除 Cookie ================================ @@ -154,6 +188,10 @@ CodeIgniter 提供了另外三种创建 ``CookieStore`` 新实例的方法。 分派存储中的 Cookie ============================= +.. deprecated:: 4.1.6 + +.. important:: 该方法已被弃用。将在未来的版本中移除。 + 更多时候,你不需要自己手动发送 cookie。CodeIgniter 会为你做这件事。但是,如果你真的需要手动发送 cookie,你可以使用 ``dispatch`` 方法。就像发送其他标头一样,你需要确保标头还未发送,方法是检查 ``headers_sent()`` 的值。 .. literalinclude:: cookies/016.php @@ -189,11 +227,11 @@ Cookie 个性化 .. php:staticmethod:: setDefaults([$config = []]) - :param \Config\Cookie|array $config: 配置数组或实例 + :param \\Config\\Cookie|array $config: 配置数组或实例 :rtype: array :returns: 旧的默认值 - 通过从 ``\Config\Cookie`` 配置或数组中注入值来设置 Cookie 实例的默认属性。 + 通过从 ``Config\Cookie`` 配置或数组中注入值来设置 Cookie 实例的默认属性。 .. php:staticmethod:: fromHeaderString(string $header[, bool $raw = false]) diff --git a/source/libraries/curlrequest.rst b/source/libraries/curlrequest.rst index 070b5d8ca..b26bf5269 100755 --- a/source/libraries/curlrequest.rst +++ b/source/libraries/curlrequest.rst @@ -16,15 +16,19 @@ CURLRequest 类 CURLRequest 配置 ********************** +.. _curlrequest-sharing-options: + 共享选项 =============== -由于历史原因,默认情况下,CURLRequest 在请求之间共享所有选项。如果你使用该类的一个实例发送多个请求,这种行为可能会导致错误请求出现不必要的头和消息体。 +.. note:: 自 v4.4.0 起,默认值已更改为 ``false``。此设置仅用于向后兼容。新用户无需更改此设置。 -你可以通过在 **app/Config/CURLRequest.php** 中将以下配置参数值编辑为 ``false`` 来更改此行为: +如果您想在多个请求之间共享所有选项,请在 **app/Config/CURLRequest.php** 中将 ``$shareOptions`` 设置为 ``true``: .. literalinclude:: curlrequest/001.php +如果您使用该类的实例发送多个请求,此行为可能会导致发送不必要的头部和正文的错误请求。 + .. note:: 在 v4.2.0 之前,即使 ``$shareOptions`` 为 false,由于一个 bug,请求消息体也不会被重置。 ******************* @@ -172,14 +176,16 @@ connect_timeout cookie ====== -这指定了 CURL 应该使用的文件名,用于读取和保存 cookie 值。这是通过 CURL_COOKIEJAR 和 CURL_COOKIEFILE 选项完成的。例如: +这指定了 CURL 应该使用的文件名,用于读取和保存 cookie 值。这是通过 ``CURL_COOKIEJAR`` 和 ``CURL_COOKIEFILE`` 选项完成的。例如: .. literalinclude:: curlrequest/021.php debug ===== -当 ``debug`` 被传递并设置为 ``true`` 时,这将在脚本执行期间启用写入 STDERR 的其他调试信息。这是通过传递 CURLOPT_VERBOSE 并回显输出来完成的。因此,当你通过 ``spark serve`` 运行内置服务器时,你会在控制台中看到输出。否则,输出将被写入服务器的错误日志中。 +当 ``debug`` 被传递并设置为 ``true`` 时,这将在脚本执行期间启用写入 STDERR 的其他调试信息。 + +这是通过传递 ``CURLOPT_VERBOSE`` 并回显输出来完成的。因此,当你通过 ``spark serve`` 运行内置服务器时,你会在控制台中看到输出。否则,输出将被写入服务器的错误日志中。 .. literalinclude:: curlrequest/034.php @@ -217,7 +223,9 @@ headers http_errors =========== -默认情况下,如果返回的 HTTP 代码大于或等于 400,CURLRequest 将失败。你可以将 ``http_errors`` 设置为 ``false`` 来改为返回内容: +默认情况下,如果返回的 HTTP 状态码大于等于 400,CURLRequest 将抛出 ``HTTPException`` 异常。 + +如果您想查看响应正文,可以将 ``http_errors`` 设置为 ``false``,以返回内容而不是抛出异常: .. literalinclude:: curlrequest/026.php @@ -240,6 +248,17 @@ multipart .. note:: ``multipart`` 不能与 ``form_params`` 选项一起使用。你只能使用其中一个。对 ``application/x-www-form-urlencoded`` 请求使用 ``form_params``,对 ``multipart/form-data`` 请求使用 ``multipart``。 +.. _curlrequest-request-options-proxy: + +proxy +===== + +.. versionadded:: 4.4.0 + +您可以通过将关联数组作为 ``proxy`` 选项来设置代理: + +.. literalinclude:: curlrequest/035.php + query ===== diff --git a/source/libraries/email.rst b/source/libraries/email.rst index 0a32bbd5b..3233bf59a 100644 --- a/source/libraries/email.rst +++ b/source/libraries/email.rst @@ -55,6 +55,8 @@ CodeIgniter 强大的 Email 类支持以下功能: **app/Config/Email.php** 文件,并在电子邮件属性中设置你的配置。然后保存文件,它将被自动使用。 如果你在配置文件中设置了首选项,将 **不需要** 使用 ``$email->initialize()`` 方法。 +.. _email-ssl-tls-for-smtp: + SMTP 协议的 SSL 与 TLS -------------------------------- @@ -64,7 +66,7 @@ SMTP 协议的 SSL 与 TLS 关键差异在于端口 465 要求从一开始就使用 TLS 按照 `RFC 8314 `_ 来保护通信通道。而端口 587 上的连接允许明文连接,之后会使用 ``STARTTLS`` SMTP 命令升级通道以使用加密。 -端口 465 上的连接是否支持升级可能由服务器决定,所以如果服务器不允许, ``STARTTLS`` SMTP 命令可能会失败。如果你将端口设置为 465,你应该尝试让 ``SMTPCrypto`` 设置为空,因为通信从一开始就是用 TLS 保护的,不需要 ``STARTTLS``。 +端口 465 上的连接是否支持升级可能由服务器决定,所以如果服务器不允许, ``STARTTLS`` SMTP 命令可能会失败。如果你将端口设置为 465,你应该尝试设置 ``SMTPCrypto`` 为空字符串(``''``),因为通信从一开始就是用 TLS 保护的,不需要 ``STARTTLS``。 如果你的配置要求你连接到端口 587,你最好将 ``SMTPCrypto`` 设置为 ``tls``,因为这将在与 SMTP 服务器通信时实现 ``STARTTLS`` 命令,将明文通道切换为加密通道。初始通信将是明文的,并使用 ``STARTTLS`` 命令将通道升级为 TLS。 @@ -87,13 +89,18 @@ SMTP 协议的 SSL 与 TLS **SMTPHost** 无默认值 无 SMTP 服务器地址。 **SMTPUser** 无默认值 无 SMTP 用户名。 **SMTPPass** 无默认值 无 SMTP 密码。 -**SMTPPort** 25 无 SMTP 端口。(如果设置为 465,不管 SMTPCrypto 设置如何,都将使用 TLS 建立连接) +**SMTPPort** 25 无 SMTP 端口。(如果设置为 ``465``,不管 ``SMTPCrypto`` 设置如何, + 都将使用 TLS 建立连接) **SMTPTimeout** 5 无 SMTP 超时(秒)。 **SMTPKeepAlive** false true 或 false(布尔值) 启用持久 SMTP 连接。 -**SMTPCrypto** 无默认值 tls 或 ssl SMTP 加密。将此设置为“ssl”将使用 SSL 创建到服务器的安全通道,“tls”将向服务器发出 ``STARTTLS`` 命令。连接端口 465 应将此留空。 +**SMTPCrypto** tls tls, ssl 或空字符串 SMTP 加密。将其设置为 ``ssl`` 将使用 SSL 创建与服务器的安全通道, + 而 ``tls`` 将向服务器发出 ``STARTTLS`` 命令。 + 在端口 465 上的连接应将其设置为空字符串(``''``)。 + 另请参阅 :ref:`email-ssl-tls-for-smtp`。 **wordWrap** true true 或 false(布尔值) 启用自动换行。 **wrapChars** 76 换行处的字符数。 -**mailType** text text 或 html 邮件类型。如果发送 HTML 电子邮件,你必须将其作为完整的网页发送。确保你没有任何相对链接或相对图像路径,否则它们将无法工作。 +**mailType** text text 或 html 邮件类型。如果发送 HTML 电子邮件,你必须将其作为完整的网页发送。 + 确保你没有任何相对链接或相对图像路径,否则它们将无法工作。 **charset** utf-8 字符集(utf-8、iso-8859-1 等)。 **validate** true true 或 false(布尔值) 是否验证电子邮件地址。 **priority** 3 1、2、3、4、5 电子邮件优先级。1 最高。5 最低。3 为正常。 diff --git a/source/libraries/images.rst b/source/libraries/images.rst index acb9e4cdf..e3f8cc17a 100755 --- a/source/libraries/images.rst +++ b/source/libraries/images.rst @@ -60,7 +60,9 @@ CodeIgniter 的图像处理类允许你执行以下操作: 图像质量 ============= -``save()`` 可以接受额外的参数 ``$quality`` 来更改结果图像的质量。值的范围从 0 到 100,默认值为 90。此参数仅适用于 JPEG 图像,否则将被忽略: +``save()`` 可以接受额外的参数 ``$quality`` 来更改结果图像的质量。值的范围从 0 到 100,默认值为 90。此参数仅适用于 JPEG 和 WEBP 图像,否则将被忽略: + +.. note:: 自 v4.4.0 起,WebP 格式可以使用 ``$quality`` 参数。 .. literalinclude:: images/005.php diff --git a/source/libraries/pagination.rst b/source/libraries/pagination.rst index 3a63eb4fc..f8ca6a293 100755 --- a/source/libraries/pagination.rst +++ b/source/libraries/pagination.rst @@ -30,11 +30,39 @@ CodeIgniter 提供了一个非常简单但灵活的分页库,它易于主题化, 在这个示例中,我们首先创建 ``UserModel`` 的新实例。然后我们填充要发送到视图的数据。第一个元素是来自数据库的结果, **users**,它为正确的页面检索出 10 个用户每页。必须发送到视图的第二个项目是 Pager 实例本身。为方便起见,Model 将保存它使用的实例,并将其存储在公共属性 ``$pager`` 中。所以,我们获取它并将其赋值给视图中的 ``$pager`` 变量。 -.. important:: 重要的是要理解 ``Model::paginate()`` 方法使用 **Model** 和 **QueryBuilder** 方法。因此,试图使用 ``$db->query()`` 和 ``Model::paginate()`` 将 **不起作用**,因为 ``$db->query()`` 会立即执行查询,并且与 QueryBuilder 不关联。 +自定义分页查询 +================ -要在模型中定义分页条件,你可以: +要在模型中自定义分页查询,您可以在 ``paginate()`` 方法之前添加 :doc:`查询构建器 <../database/query_builder>` 方法。 + +添加 WHERE +------------ + +如果您想添加 WHERE 条件,可以直接指定条件: .. literalinclude:: pagination/003.php + :lines: 2- + +您还可以将条件移动到单独的方法中: + +.. literalinclude:: pagination/017.php + +.. literalinclude:: pagination/018.php + :lines: 2- + +添加 JOIN +--------- + +您可以连接另一个表: + +.. literalinclude:: pagination/016.php + +.. important:: 需要理解的重要一点是,``Model::paginate()`` 方法使用了 **模型** 和模型中的 **查询构建器** 实例。因此,尝试使用 ``Model::paginate()`` 与 :ref:`db-query` **不起作用**,因为 ``$db->query()`` 会立即执行查询,并且与查询构建器没有关联。 + +如果您需要一个无法使用查询构建器编写的复杂 SQL 查询,请尝试使用 :ref:`db-query` 和 `手动分页`_。 + +显示分页链接 +====================== 在视图内,我们然后需要告诉它在何处显示生成的链接:: diff --git a/source/libraries/publisher.rst b/source/libraries/publisher.rst index 13919ade5..9f8c771b8 100644 --- a/source/libraries/publisher.rst +++ b/source/libraries/publisher.rst @@ -57,9 +57,11 @@ Publisher 库提供了使用强大的检测和错误检查在项目内复制文 .. literalinclude:: publisher/006.php -大多数时候你不需要自己处理发现,只需使用提供的“publish”命令:: +大多数时候你不需要自己处理发现,只需使用提供的“publish”命令: - > php spark publish +.. code-block:: console + + php spark publish 默认情况下,在你的类扩展上 ``publish()`` 将从你的 ``$source`` 添加所有文件并合并到你的目标位置,在冲突时覆盖。 @@ -99,10 +101,14 @@ Publisher 库提供了使用强大的检测和错误检查在项目内复制文 .. literalinclude:: publisher/009.php -现在通过 Composer 添加依赖项并调用 ``spark publish`` 来运行发布:: +.. note:: 在执行命令之前,必须先创建目录 ``$destination``。 + +现在通过 Composer 添加依赖项并调用 ``spark publish`` 来运行发布: + +.. code-block:: console - > composer require twbs/bootstrap - > php spark publish + composer require twbs/bootstrap + php spark publish ... 然后你会在项目中得到类似下面的结果:: diff --git a/source/libraries/security.rst b/source/libraries/security.rst index 5abc71170..618cc269f 100755 --- a/source/libraries/security.rst +++ b/source/libraries/security.rst @@ -173,6 +173,9 @@ HTML 表单 1. ``$_POST`` 数组 2. HTTP 头 3. ``php://input`` (JSON 请求) - 请记住,这种方法是最慢的,因为我们必须解码 JSON 然后重新编码它 +4. ``php://input`` (原始 body) - 适用于 PUT、PATCH 和 DELETE 类型的请求 + +.. note:: 自 v4.4.2 起,会检查 ``php://input`` (原始 body)。 ********************* 其他有用的方法 diff --git a/source/libraries/sessions.rst b/source/libraries/sessions.rst index 9c9e578b1..d045d139a 100755 --- a/source/libraries/sessions.rst +++ b/source/libraries/sessions.rst @@ -18,15 +18,15 @@ CodeIgniter 带有几个 session 存储驱动器,你可以在目录内容的最 Session 通常会与每个页面加载一起全局运行,所以 Session 类应该自动初始化。 -要访问和初始化 session: +要访问和初始化 Session: .. literalinclude:: sessions/001.php -``$config`` 参数是可选的 - 你的应用配置。如果没有提供,服务注册表将实例化你的默认配置。 +``$config`` 参数是可选的 - 你的应用配置。如果没有提供,服务注册器将实例化你的默认配置。 -加载后,可以使用 ``$session`` 访问 Session 库对象: +加载后,Session 库对象将可通过以下方式访问:: -.. literalinclude:: sessions/002.php + $session 另外,你可以使用辅助函数,它将使用默认配置选项。这个版本的可读性更好一些,但不接受任何配置选项。 @@ -155,6 +155,8 @@ CodeIgniter 通过相同的方式提供对其 Session 数据的访问,因为它 .. literalinclude:: sessions/018.php +.. _sessions-flashdata: + Flashdata ========= @@ -256,6 +258,24 @@ CodeIgniter 还支持 “tempdata”,也就是在特定过期时间后自动删 .. literalinclude:: sessions/036.php +关闭一个 Session +================= + +.. _session-close: + +close() +------- + +.. versionadded:: 4.4.0 + +在不再需要当前 Session 时,可以使用 ``close()`` 方法手动关闭 Session: + +.. literalinclude:: sessions/044.php + +您不必手动关闭 Session,PHP 会在脚本终止后自动关闭它。但是,由于 Session 数据被锁定以防止并发写入,因此一次只能有一个请求操作 Session。通过在所有对 Session 数据的更改完成后立即关闭 Session,可以提高网站性能。 + +此方法的工作方式与 PHP 的 `session_write_close() `_ 函数完全相同。 + 销毁一个 Session ==================== @@ -264,11 +284,16 @@ CodeIgniter 还支持 “tempdata”,也就是在特定过期时间后自动删 destroy() --------- -要清除当前 session(例如在退出登录时),可以使用 PHP 的 `session_destroy() `_ 函数或库的 ``destroy()`` 方法。两者的作用完全相同: +要清除当前 session(例如在退出登录时),可以使用类库的 ``destroy()`` 方法: .. literalinclude:: sessions/037.php -.. note:: 这必须是在同一请求期间执行的最后一个与 session 相关的操作。所有 session 数据(包括 flashdata 和 tempdata)将被永久销毁,并且在销毁 session 后,同一请求中的函数将不可用。 +此方法的工作方式与 PHP 的 `session_destroy() `_ 函数完全相同。 + +这必须是在同一请求中进行的最后一个与 Session 相关的操作。 +所有 Session 数据(包括 flashdata 和 tempdata)将被永久销毁。 + +.. note:: 您不必在常规代码中调用此方法。清理 Session 数据而不是销毁会话。 .. _session-stop: @@ -320,14 +345,16 @@ CodeIgniter 通常会使一切正常工作。但是,Session 是任何应用程 **savePath** null 无 根据所使用的驱动程序指定存储位置。 **matchIP** false true/false(布尔值) 从 session cookie 读取时是否验证用户的 IP 地址。 请注意,某些 ISP 会动态更改 IP,因此如果你需要一个不过期的 session,你可能会将此设置为 false。 -**timeToUpdate** 300 秒数(整数) 此选项控制 session 类重新生成自身和创建新的 session ID 的频率。将其设置为 0 将禁用 session ID 重新生成。 -**regenerateDestroy** false true/false(布尔值) 是否在自动重新生成 session ID 时销毁与旧 session ID 关联的数据。将其设置为 false 时,稍后数据将由垃圾收集器删除。 +**timeToUpdate** 300 秒数(整数) 此选项控制 session 类重新生成自身和创建新的 session ID 的频率。 + 将其设置为 0 将禁用 session ID 重新生成。 +**regenerateDestroy** false true/false(布尔值) 是否在自动重新生成 session ID 时销毁与旧 session ID 关联的数据。 + 将其设置为 false 时,稍后数据将由垃圾收集器删除。 ======================= ============================================ ================================================= ============================================================================================ .. note:: 作为最后的手段,如果上述任何内容都未配置,Session 库将尝试获取 PHP 的与 session 相关的 INI 设置,以及 CodeIgniter 3 设置,如 'sess_expire_on_close'。 但是,你永远不应该依赖这种行为,因为它可能会导致意外结果或在未来更改。请正确配置一切。 -.. note:: 如果 ``sessionExpiration`` 设置为 ``0``,则将原封不动地使用 PHP 在会话管理中设置的 ``session.gc_maxlifetime`` 设置(通常默认值为 ``1440``)。 +.. note:: 如果 ``expiration`` 设置为 ``0``,则将原封不动地使用 PHP 在会话管理中设置的 ``session.gc_maxlifetime`` 设置(通常默认值为 ``1440``)。 根据需要,这需要在 ``php.ini`` 或通过 ``ini_set()`` 进行更改。 此外,在你的 **app/Config/Cookie.php** 文件中使用了以下配置值用于 Session cookie: @@ -373,11 +400,13 @@ FileHandler 驱动程序(默认) 在类 UNIX 操作系统上,这通常通过使用 `chmod` 命令对该目录设置 0700 模式权限来实现,它仅允许目录所有者在其上执行读写操作。但是要小心,因为*运行*脚本的系统用户通常不是你自己,而是类似 'www-data' 的用户,所以只设置这些权限可能会中断你的应用程序。 -相反,你应该执行类似以下操作,这取决于你的环境:: +相反,你应该执行类似以下操作,这取决于你的环境: + +.. code-block:: console - > mkdir //writable/sessions/ - > chmod 0700 //writable/sessions/ - > chown www-data //writable/sessions/ + mkdir //writable/sessions/ + chmod 0700 //writable/sessions/ + chown www-data //writable/sessions/ 奖励提示 --------- @@ -393,7 +422,7 @@ FileHandler 驱动程序(默认) DatabaseHandler 驱动程序 ========================== -.. important:: 由于其他平台缺乏顾问锁定机制,因此仅正式支持 MySQL 和 PostgreSQL 数据库。在其他平台上使用不带锁定的会话可能会导致各种问题,特别是在大量使用 AJAX 的情况下,我们不会支持此类情况。如果遇到性能问题,请在处理完 session 数据后使用 ``session_write_close()``。 +.. important:: 由于其他平台缺乏顾问锁定机制,因此仅正式支持 MySQL 和 PostgreSQL 数据库。在其他平台上使用不带锁定的会话可能会导致各种问题,特别是在大量使用 AJAX 的情况下,我们不会支持此类情况。如果遇到性能问题,请在处理完 session 数据后使用 :ref:`session-close` 方法。 'DatabaseHandler' 驱动程序使用 MySQL 或 PostgreSQL 等关系数据库来存储会话。这对许多用户来说是一个流行的选择,因为它允许开发人员轻松访问应用程序中的 session 数据——它只是数据库中的另一个表。 @@ -404,10 +433,16 @@ DatabaseHandler 驱动程序 配置 DatabaseHandler ------------------------- +设置表名 +^^^^^^^^^^^^^^^^^^ + 为了使用 'DatabaseHandler' session 驱动程序,还必须创建我们已经提到的表,然后将其设置为你的 ``$savePath`` 值。例如,如果你想使用 'ci_sessions' 作为表名,你将执行以下操作: .. literalinclude:: sessions/039.php +创建数据库表 +^^^^^^^^^^^^^^^^^^^^^^^ + 然后当然,创建数据库表...... 对于 MySQL:: @@ -433,25 +468,42 @@ DatabaseHandler 驱动程序 .. note:: ``id`` 值包含 session cookie 名称(``Config\Session::$cookieName``)和 session ID 以及一个分隔符。根据需要应增加它,例如在使用长 session ID 时。 -你还需要根据你的 $matchIP 设置添加主键:: +添加主键 +^^^^^^^^^^^^^^^^^^ + +**根据您的 $matchIP 设置**,您还需要添加一个主键。以下示例适用于 MySQL 和 PostgreSQL:: - // 当 sessionMatchIP = true 时 + // 当 $matchIP = true 时 ALTER TABLE ci_sessions ADD PRIMARY KEY (id, ip_address); - // 当 sessionMatchIP = false 时 + // 当 $matchIP = false 时 ALTER TABLE ci_sessions ADD PRIMARY KEY (id); // 删除先前创建的主键(更改设置时使用) ALTER TABLE ci_sessions DROP PRIMARY KEY; -你可以通过向 **app/Config/Session.php** 添加带有要使用的组名称的新行来选择要使用的数据库组: +.. important:: 如果您没有添加正确的主键, + 可能会出现以下错误:: + + Uncaught mysqli_sql_exception: Duplicate entry 'ci_session:***' for key 'ci_sessions.PRIMARY' + +更改数据库组 +^^^^^^^^^^^^^^^^^^^^^^^ + +默认情况下使用默认数据库组。 +您可以通过更改 **app/Config/Session.php** 文件中的 ``$DBGroup`` 属性为要使用的组的名称来更改数据库组: .. literalinclude:: sessions/040.php -当然,如果你不想手动执行所有这些操作,可以使用 cli 中的 ``php spark make:migration --session`` 命令为你生成迁移文件:: +使用命令设置数据库表 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +当然,如果你不想手动执行所有这些操作,可以使用 cli 中的 ``php spark make:migration --session`` 命令为你生成迁移文件: + +.. code-block:: console - > php spark make:migration --session - > php spark migrate + php spark make:migration --session + php spark migrate 此命令将考虑 ``$savePath`` 和 ``$matchIP`` 设置并生成代码。 diff --git a/source/libraries/time.rst b/source/libraries/time.rst index f40d18fb5..bbe86c2f4 100755 --- a/source/libraries/time.rst +++ b/source/libraries/time.rst @@ -16,7 +16,11 @@ CodeIgniter 提供了一个完全本地化的、不可变的日期/时间类,该 实例化 ************* -有几种方法可以创建新的 Time 实例。第一种就是像任何其他类一样简单地创建一个新实例。当你以这种方式执行时,你可以传递一个表示所需时间的字符串。这可以是 PHP 的 strtotime 函数可以解析的任何字符串: +有几种方法可以创建新的 Time 实例。第一种就是像任何其他类一样简单地创建一个新实例。 + +当你以这种方式执行时,你可以传递一个表示所需时间的字符串。这可以是 PHP 的 `strtotime()`_ 函数可以解析的任何字符串: + +.. _strtotime(): https://www.php.net/manual/en/function.strtotime.php .. literalinclude:: time/001.php @@ -130,7 +134,7 @@ toDateTimeString() ================== 这是三个帮助方法中的第一个,用于处理 `IntlDateFormatter `_ 而不必记住它们的值。 -这将返回以 (Y-m-d H:i:s) 格式化的本地化字符串版本: +这将返回以 (``Y-m-d H:i:s``) 格式化的本地化字符串版本: .. literalinclude:: time/016.php diff --git a/source/libraries/uploaded_files.rst b/source/libraries/uploaded_files.rst index 4e92b7207..11568768b 100755 --- a/source/libraries/uploaded_files.rst +++ b/source/libraries/uploaded_files.rst @@ -296,6 +296,16 @@ getClientMimeType() .. literalinclude:: uploaded_files/015.php +getClientPath() +--------------- + +.. versionadded:: 4.4.0 + +当客户端通过目录上传方式上传文件时,返回上传文件的 `webkit 相对路径 `_。 +在 PHP 8.1 以下的版本中,返回 ``null``。 + +.. literalinclude:: uploaded_files/023.php + 移动文件 ============ diff --git a/source/libraries/uri.rst b/source/libraries/uri.rst index d2e11b8d5..1375c20ac 100755 --- a/source/libraries/uri.rst +++ b/source/libraries/uri.rst @@ -12,32 +12,41 @@ CodeIgniter 提供了面向对象的方式来在你的应用中使用 URI。这 创建 URI 实例 ====================== -创建一个 URI 实例就像创建一个新的类实例一样简单: +创建一个 URI 实例就像创建一个新的类实例一样简单。 + +当您创建新实例时,可以在构造函数中传递完整或部分 URL,并将其解析为相应的部分: .. literalinclude:: uri/001.php + :lines: 2- -或者,你可以使用 ``service()`` 函数来获取一个实例: +或者,你可以使用 :php:func:`service()` 函数来获取一个实例: -.. literalinclude:: uri/002.php +.. literalinclude:: uri/003.php + :lines: 2- -当你创建新实例时,可以在构造函数中传递全部或部分 URL,它会解析成适当的部分: +自 v4.4.0 起,如果您没有传递 URL,则返回当前的 URI: -.. literalinclude:: uri/003.php +.. literalinclude:: uri/002.php + :lines: 2- + +.. note:: 上述代码返回 ``SiteURI`` 实例,它扩展了 ``URI`` 类。``URI`` 类用于一般的 URI,而 ``SiteURI`` 类用于您的站点 URI。 当前 URI --------------- -大多数时候,你真正想要的只是一个表示当前请求 URL 的对象。 -你可以使用 :doc:`../helpers/url_helper` 中可用的函数之一: +很多时候,您只需要一个表示当前请求的 URL 的对象。您可以使用 :doc:`../helpers/url_helper` 中提供的 :php:func:`current_url()` 函数: .. literalinclude:: uri/004.php + :lines: 2- 你必须传递 ``true`` 作为第一个参数,否则它会返回当前 URL 的字符串表示。 这个 URI 基于当前请求对象和你在 ``Config\App`` 中的设置(``baseURL``、``indexPage`` 和 ``forceGlobalSecureRequests``)确定的相对路径。 -假设你在一个扩展 ``CodeIgniter\Controller`` 的控制器中,你可以获取这个相对路径: + +假设您在一个扩展了 ``CodeIgniter\Controller`` 的控制器中,您还可以获取当前的 SiteURI 实例: .. literalinclude:: uri/005.php + :lines: 2- =========== URI 字符串 @@ -121,8 +130,10 @@ path 是站点本身内的所有段。如你所料,可以使用 ``getPath()`` .. note:: 当用这种或类允许的任何其他方式设置路径时,它会被编码以对任何危险字符进行转义,并移除段点以确保安全。 +.. note:: 自 v4.4.0 起,``SiteURI::getRoutePath()`` 方法返回相对于 baseURL 的 URI 路径,而 ``SiteURI::getPath()`` 方法始终返回带有前导 ``/`` 的完整 URI 路径。 + Query(查询) ---------------- +----------- 可以通过类使用简单的字符串表示来操作查询数据。 diff --git a/source/libraries/validation.rst b/source/libraries/validation.rst index 60a06f073..11aeb67d6 100755 --- a/source/libraries/validation.rst +++ b/source/libraries/validation.rst @@ -107,6 +107,8 @@ CodeIgniter 提供了一个全面的数据验证类,可以帮助 minimizing 你 .. note:: 从 v4.3.0 开始,可以使用 :ref:`$this->request->is() ` 方法。 在早期版本中,需要使用 ``if (strtolower($this->request->getMethod()) !== 'post')``。 +.. note:: 自 v4.4.0 起,可以使用 :ref:`$this->validator->getValidated() ` 方法。 + 路由 ========== @@ -214,6 +216,7 @@ CodeIgniter 4 有两种验证规则类。 该库以名为 **validation** 的服务加载: .. literalinclude:: validation/004.php + :lines: 2- 这会自动加载 ``Config\Validation`` 文件,其中包含用于包含多个 Rulesets 的设置,以及可以轻松重用的规则集合。 @@ -240,6 +243,7 @@ setRule() ``$rules`` 可以接收管道分隔的规则列表,或者规则数组: .. literalinclude:: validation/005.php + :lines: 2- 你传递给 ``$field`` 的值必须匹配传入数据数组的键。如果数据直接来自 ``$_POST``,那么它必须与表单输入名称完全匹配。 @@ -254,28 +258,35 @@ setRules() 像 ``setRule()`` 一样,但接受字段名称及其规则的数组: .. literalinclude:: validation/006.php + :lines: 2- 要给出带标签的错误消息,可以设置如下: .. literalinclude:: validation/007.php + :lines: 2- .. _validation-withrequest: +.. note:: ``setRules()`` 会覆盖先前设置的任何规则。要向现有规则集添加多个规则,请多次使用 ``setRule()``。 + 为数组数据设置规则 ============================ 如果你的数据在嵌套的关联数组中,你可以使用“点数组语法”来轻松验证数据: .. literalinclude:: validation/009.php + :lines: 2- 你可以使用通配符 ``*`` 符号匹配任意一层数组: .. literalinclude:: validation/010.php + :lines: 2- 当你有单维数组数据时,"点数组语法"也很有用。 例如,下拉多选返回的数据: .. literalinclude:: validation/011.php + :lines: 2- withRequest() ============= @@ -283,14 +294,11 @@ withRequest() 当验证从 HTTP 请求输入的数据时,你会最常使用验证库。如果需要的话,你可以传入当前请求对象的实例,它会获取所有输入数据并将其设置为要验证的数据: .. literalinclude:: validation/008.php + :lines: 2- + +.. warning:: 当您使用此方法时,应使用 :ref:`getValidated() ` 方法获取经过验证的数据。因为该方法从 :ref:`$request->getJSON() ` 获取 JSON 数据(当请求是 JSON 请求时,``Content-Type: application/json``),或者从 :ref:`$request->getRawInput() ` 获取原始数据(当请求是 PUT、PATCH、DELETE 请求且不是 HTML 表单提交时,``Content-Type: multipart/form-data``),或者从 :ref:`$request->getVar() ` 获取数据,并且攻击者可以更改要验证的数据。 -.. note:: 这个方法会从 - :ref:`$request->getJSON() ` - 获取 JSON 数据,当请求是 JSON 请求时(``Content-Type: application/json``), - 或者从 - :ref:`$request->getRawInput() ` - 获取原始数据,当请求是 PUT、PATCH、DELETE 请求且不是 HTML 表单 POST 时(``Content-Type: multipart/form-data``), - 或者从 :ref:`$request->getVar() ` 获取数据。 +.. note:: 自 v4.4.0 起,可以使用 :ref:`getValidated() ` 方法。 *********************** 使用验证 @@ -310,6 +318,7 @@ withRequest() 如果验证成功,该方法返回 true。 .. literalinclude:: validation/043.php + :lines: 2- 运行多个验证 ============================ @@ -319,13 +328,37 @@ withRequest() 如果你打算运行多个验证,例如对不同的数据集或之后的规则,你可能需要在每次运行之前调用 ``$validation->reset()`` 来清除之前运行的错误。要注意 ``reset()`` 会使任何数据、规则或自定义错误无效,所以 ``setRules()``、``setRuleGroup()`` 等需要重复: .. literalinclude:: validation/019.php + :lines: 2- 验证单个值 ================== -对一个值针对一个规则进行验证: +``check()`` 方法根据规则验证一个值。 +第一个参数 ``$value`` 是要验证的值。第二个参数 ``$rule`` 是验证规则。 +可选的第三个参数 ``$errors`` 是自定义错误消息。 .. literalinclude:: validation/012.php + :lines: 2- + +.. note:: 在 v4.4.0 之前,此方法的第二个参数 ``$rule`` 的类型提示为 ``string``。在 v4.4.0 及之后的版本中,类型提示被移除,允许接受数组。 + +.. note:: 此方法调用 ``setRule()`` 方法在内部设置规则。 + +.. _validation-getting-validated-data: + +获取经过验证的数据 +====================== + +.. versionadded:: 4.4.0 + +可以使用 ``getValidated()`` 方法获取实际经过验证的数据。 +该方法返回一个仅包含已通过验证规则的元素的数组。 + +.. literalinclude:: validation/044.php + :lines: 2- + +.. literalinclude:: validation/045.php + :lines: 2- 将一组验证规则保存到配置文件 ================================================== @@ -347,6 +380,7 @@ withRequest() 当调用 ``run()`` 方法时,你可以在第一个参数中指定要使用的组: .. literalinclude:: validation/014.php + :lines: 2- 如何保存错误消息 -------------------------- @@ -364,17 +398,21 @@ withRequest() 获取和设置规则组 ----------------------------- -**获取规则组** +获取规则组 +^^^^^^^^^^^^^^ 此方法从验证配置中获取规则组: .. literalinclude:: validation/017.php + :lines: 2- -**设置规则组** +设置规则组 +^^^^^^^^^^^^^^ 此方法将验证配置中的规则组设置到验证服务中: .. literalinclude:: validation/018.php + :lines: 2- .. _validation-placeholders: @@ -384,16 +422,19 @@ withRequest() 验证类提供了一种简单的方法,基于传入的数据替换规则的一部分。这听起来比较模糊,但在使用 ``is_unique`` 验证规则时特别有用。占位符简单地是以花括号括起来的字段名(或数组键),该字段名作为 ``$data`` 传入。它将被传入字段的 **值** 所替换。以下示例将阐明这一点: .. literalinclude:: validation/020.php + :lines: 2- .. note:: 从 v4.3.5 开始,你必须为占位符字段(``id``)设置验证规则。 在这组规则中,它说明电子邮件地址在数据库中应该是唯一的,除了具有与占位符的值匹配的 id 的行。假设表单 POST 数据如下: .. literalinclude:: validation/021.php + :lines: 2- 然后 ``{id}`` 占位符会被替换为数字 **4**,得到这条修改后的规则: .. literalinclude:: validation/022.php + :lines: 2- 所以在验证电子邮件唯一性时,它会忽略数据库中 ``id=4`` 的行。 @@ -421,10 +462,12 @@ withRequest() 作为最后一个参数: .. literalinclude:: validation/023.php + :lines: 2- 或者以标签样式: .. literalinclude:: validation/024.php + :lines: 2- 如果你想要包含字段的“人类”名称,或某些规则允许的可选参数(如 max_length),或者被验证的值,你可以分别在消息中添加 ``{field}``、``{param}`` 和 ``{value}`` 标签:: @@ -444,6 +487,7 @@ withRequest() 我们可以简单地使用这个文件中定义的语言行,像这样: .. literalinclude:: validation/025.php + :lines: 2- .. _validation-getting-all-errors: @@ -453,6 +497,7 @@ withRequest() 如果你需要检索所有失败字段的错误消息,可以使用 ``getErrors()`` 方法: .. literalinclude:: validation/026.php + :lines: 2- 如果没有错误,将返回一个空数组。 @@ -482,22 +527,24 @@ withRequest() 你可以使用 ``getError()`` 方法检索单个字段的错误。唯一的参数是字段名称: .. literalinclude:: validation/027.php + :lines: 2- 如果没有错误,将返回一个空字符串。 .. note:: 当使用通配符时,所有匹配通配符的找到的错误将组合成一行,以 EOL 字符分隔。 - 检查错误是否存在 ===================== 你可以使用 ``hasError()`` 方法检查是否存在错误。唯一的参数是字段名称: .. literalinclude:: validation/028.php + :lines: 2- 当指定使用通配符的字段时,将检查匹配通配符的所有错误: .. literalinclude:: validation/029.php + :lines: 2- .. _validation-redirect-and-validation-errors: @@ -532,6 +579,7 @@ PHP 请求之间不共享任何内容。所以在验证失败时重定向,重定 在视图内可以使用名为 ``$errors`` 的数组,它包含错误列表,其中键是有错误的字段名称,值是错误消息,像这样: .. literalinclude:: validation/031.php + :lines: 2- 实际上有两种类型的视图你可以创建。第一种具有所有错误的数组,这就是我们刚才看到的。另一种更简单,只包含一个名为 ``$error`` 的变量,其中包含错误消息。这在使用 ``showError()`` 方法时使用,该方法必须指定错误属于的字段:: @@ -593,6 +641,7 @@ PHP 请求之间不共享任何内容。所以在验证失败时重定向,重定 你的新自定义规则现在可以像任何其他规则一样使用了: .. literalinclude:: validation/036.php + :lines: 2- 允许参数 ------------------- @@ -622,6 +671,7 @@ PHP 请求之间不共享任何内容。所以在验证失败时重定向,重定 你需要为验证规则使用数组: .. literalinclude:: validation/040.php + :lines: 2- 你必须为闭包规则设置错误消息。 设置错误消息时,请为闭包规则设置数组键。 @@ -630,6 +680,7 @@ PHP 请求之间不共享任何内容。所以在验证失败时重定向,重定 或者可以使用以下参数: .. literalinclude:: validation/041.php + :lines: 2- *************** 可用规则 @@ -639,6 +690,7 @@ PHP 请求之间不共享任何内容。所以在验证失败时重定向,重定 ``ignore_value`` 前后不能有空格。 .. literalinclude:: validation/038.php + :lines: 2- 常规规则 ===================== diff --git a/source/models/entities.rst b/source/models/entities.rst index 5d366fe82..ca60e7f6f 100644 --- a/source/models/entities.rst +++ b/source/models/entities.rst @@ -8,8 +8,9 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 :local: :depth: 2 +************ 实体用法 -============ +************ 核心上,实体类仅仅是一个代表单个数据库行的类。它具有表示数据库列的类属性,并提供任何其他方法来实现该行的业务逻辑。但是,关键是它不知道如何持久化自己。这是模型或存储库类的责任。这样,如果你需要保存对象的方式发生了任何更改,你不需要更改整个应用程序中该对象的使用方式。这使得在快速原型阶段使用 JSON 或 XML 文件存储对象成为可能,然后在概念证明有效时轻松切换到数据库。 @@ -26,7 +27,7 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 .. important:: ``attributes`` 是一个保留字,供内部使用。如果你将其用作列名,实体将无法正确工作。 创建实体类 ------------------------ +======================= 现在创建一个新的实体类。由于没有默认的位置来存储这些类,也不符合现有的目录结构,所以在 **app/Entities** 中创建一个新目录。在 **app/Entities/User.php** 中创建实体本身。 @@ -35,7 +36,7 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 就这么简单,尽管我们马上会让它更有用。 创建模型 ----------------- +================ 首先在 **app/Models/UserModel.php** 创建模型,以便我们可以与其交互: @@ -44,7 +45,7 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 模型在数据库的所有活动中使用 ``users`` 表。我们已经设置了 ``$allowedFields`` 属性,以包含我们希望外部类更改的所有字段。 ``id``、``created_at`` 和 ``updated_at`` 字段由类或数据库自动处理,所以我们不想更改它们。最后,我们将实体类设置为 ``$returnType``。这确保从数据库返回行的所有模型方法都会返回我们的 User 实体类的实例,而不是正常的对象或数组。 使用实体类 ------------------------------ +============================= 现在各部分就绪,你将像使用任何其他类一样使用实体类: @@ -59,7 +60,7 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 .. note:: 当我们调用 ``insert()`` 时,实体的所有值都传递给该方法,但当我们调用 ``update()`` 时,只传递更改的值。 快速填充属性 --------------------------- +========================== 实体类还提供了一个方法 ``fill()``,允许你将键/值对数组推入类中并填充类属性。数组中的任何属性都将在实体上设置。但是,通过模型保存时,实际上只会将 ``$allowedFields`` 中的字段保存到数据库,所以你可以在实体上存储其他数据,而不必担心错误地保存多余的字段。 @@ -70,12 +71,13 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 .. literalinclude:: entities/005.php 批量访问属性 -------------------------- +========================= 实体类有两个方法可以将所有可用属性提取到一个数组中:``toArray()`` 和 ``toRawArray()``。使用原始版本将绕过魔术“getter”方法和转换。两个方法都可以接受一个布尔第一个参数,指定返回的值是否应该由更改的那些过滤,以及一个布尔最后一个参数,以使方法递归,以防出现嵌套的实体。 +*********************** 处理业务逻辑 -======================= +*********************** 虽然上面的例子很方便,但它们没有帮助执行任何业务逻辑。基本实体类实现了一些智能的 ``__get()`` 和 ``__set()`` 方法,这些方法将检查特殊方法并使用那些方法,而不是直接使用属性,从而允许你执行任何需要的业务逻辑或数据转换。 @@ -95,8 +97,22 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 .. literalinclude:: entities/007.php +.. _entities-special-getter-setter: + +特殊的 Getter/Setter +===================== + +.. versionadded:: 4.4.0 + +例如,如果您的实体的父类已经定义了一个名为 ``getParent()`` 的方法,并且您的实体还有一个名为 ``parent`` 的列,当您尝试在实体类中为 ``getParent()`` 方法添加业务逻辑时,该方法已经被定义了。 + +在这种情况下,您可以使用特殊的 getter/setter。而不是使用 ``getX()``/``setX()``,使用 ``_getX()``/``_setX()``。 + +在上面的示例中,如果您的实体有一个名为 ``_getParent()`` 的方法,当您获取 ``$entity->parent`` 时将使用该方法,当您设置 ``$entity->parent`` 时将使用 ``_setParent()`` 方法。 + +************ 数据映射 -============ +************ 在你的职业生涯的多个时间点上,你会遇到应用程序使用的情况发生变化,数据库中的原始列名不再有意义的情况。或者你发现你的编程风格更喜欢驼峰式类属性,但你的数据库模式要求使用蛇形名称。这些情况可以通过实体类的数据映射功能轻松处理。 @@ -116,11 +132,12 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 .. note:: 当你使用数据映射时,你必须为数据库列名定义 ``set*()`` 和 ``get*()`` 方法。在这个例子中,你必须定义 ``setFullName()`` 和 ``getFullName()``。 +******** 变更器 -======== +******** 日期变更器 -------------- +============= 默认情况下,当设置或检索名称为 `created_at`、`updated_at` 或 `deleted_at` 的字段时,实体类会将其转换为 :doc:`时间 ` 实例。Time 类以不可变的本地化方式提供了大量有用的方法。 @@ -135,11 +152,19 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 .. _entities-property-casting: 属性转换 ----------------- +================ + +您可以使用 ``$casts`` 属性指定实体中的属性应该转换为常见的数据类型。 +该选项应该是一个数组,其中键是类属性的名称,值是应该转换为的数据类型。 -你可以使用 ``$casts`` 属性指定实体中的属性应转换为常用的数据类型。这个选项应该是一个数组,其中键是类属性的名称,值是它应该转换到的数据类型。转换只影响读取值时。不会发生影响实体或数据库中的永久值的转换。属性可以转换为以下任何数据类型: +属性转换影响读取(获取)和写入(设置),但某些类型只影响读取(获取)。 + +标量类型转换 +------------------- + +属性可以转换为以下任何数据类型: **integer**、**float**、**double**、**string**、**boolean**、**object**、**array**、**datetime**、**timestamp**、**uri** 和 **int-bool**。 -在类型前加问号表示属性可为空,即 **?string**、**?integer**。 +在类型的开头加上问号,将属性标记为可为空,例如 **?string**、**?integer**。 .. note:: **int-bool** 可以从 v4.3.0 开始使用。 @@ -199,12 +224,11 @@ CSV 转换 .. literalinclude:: entities/019.php -**参数** +参数 +---------- 在某些情况下,一种类型是不够的。在这种情况下,你可以使用额外的参数。 -额外的参数用方括号表示,并以逗号分隔列表。 - -**type[param1,param2]** +额外的参数用方括号表示,并以逗号分隔列表,例如 ``type[param1, param2]``。 .. literalinclude:: entities/020.php @@ -213,8 +237,9 @@ CSV 转换 .. note:: 如果标记为 nullable 的转换类型是 ``?bool``,并且传入的值不是 null,那么参数 ``nullable`` 将传递给转换类型处理程序。 如果转换类型具有预定义的参数,则 ``nullable`` 将添加到列表的末尾。 +******************************* 检查更改的属性 -=============================== +******************************* 你可以检查自创建以来实体属性是否发生了更改。唯一的参数是要检查的属性名称: diff --git a/source/models/model.rst b/source/models/model.rst index 0c2e43059..aa44fc738 100644 --- a/source/models/model.rst +++ b/source/models/model.rst @@ -4,7 +4,7 @@ .. contents:: :local: - :depth: 2 + :depth: 3 模型 ****** @@ -24,7 +24,7 @@ CodeIgniter 的 Model 提供了方便的特性和额外的功能,可以使处理 .. literalinclude:: model/001.php -``model()`` 内部使用 ``Factories::models()``。详情参见 :ref:`factories-example`。 +``model()`` 内部使用 ``Factories::models()``。详情参见 :ref:`factories-loading-class`。 CodeIgniter 的 Model *********************** @@ -377,6 +377,8 @@ purgeDeleted() .. literalinclude:: model/026.php +.. _in-model-validation: + 模型内验证 =================== @@ -391,10 +393,17 @@ purgeDeleted() 如果你想检查必填字段,可以通过配置更改行为。 详情参见 :ref:`clean-validation-rules`。 +设置验证规则 +------------------------ + 第一步是用将应用的字段和规则填充 ``$validationRules`` 类属性。如果你有要使用的自定义错误消息,请将其放入 ``$validationMessages`` 数组中: .. literalinclude:: model/027.php +如果您更喜欢在验证配置文件中组织您的规则和错误消息,您可以这样做,并将 ``$validationRules`` 设置为您创建的验证规则组的名称: + +.. literalinclude:: model/034.php + 向字段设置验证规则的另一种方法是使用函数: .. php:namespace:: CodeIgniter @@ -445,7 +454,17 @@ purgeDeleted() .. literalinclude:: model/031.php -现在,每当调用 ``insert()``、``update()`` 或 ``save()`` 方法时,数据都会被验证。如果失败,模型将返回布尔值 **false**。你可以使用 ``errors()`` 方法检索验证错误: +获取验证结果 +------------------------- + +现在,每当您调用 ``insert()``、``update()`` 或 ``save()`` 方法时,数据将被验证。如果验证失败,模型将返回布尔值 **false**。 + +.. _model-getting-validation-errors: + +获取验证错误 +------------------------- + +您可以使用 ``errors()`` 方法来检索验证错误: .. literalinclude:: model/032.php @@ -453,10 +472,6 @@ purgeDeleted() .. literalinclude:: model/033.php -如果你更喜欢在验证配置文件中组织规则和错误消息,你可以这样做,并简单地将 ``$validationRules`` 设置为你创建的验证规则组的名称: - -.. literalinclude:: model/034.php - 检索验证规则 --------------------------- @@ -479,6 +494,8 @@ purgeDeleted() .. literalinclude:: model/038.php +.. note:: 自 v4.3.5 起,您必须为占位符字段(``id``)设置验证规则。 + 在这组规则中,它说明电子邮件地址在数据库中应该是唯一的,除了具有与占位符的值匹配的 id 的行。假设表单 POST 数据如下: .. literalinclude:: model/039.php @@ -489,6 +506,8 @@ purgeDeleted() 所以在验证电子邮件唯一性时,它会忽略数据库中 ``id=4`` 的行。 +.. note:: 自 v4.3.5 起,如果占位符(``id``)的值未通过验证,占位符将不会被替换。 + 这也可以用于在运行时创建更动态的规则,只要你注意传入的动态键不与你的表单数据冲突即可。 保护字段 diff --git a/source/outgoing/localization.rst b/source/outgoing/localization.rst index 159d3a9a2..f00e64639 100644 --- a/source/outgoing/localization.rst +++ b/source/outgoing/localization.rst @@ -47,6 +47,8 @@ CodeIgniter 提供了几个工具来帮助你为不同的语言本地化应用 如果你需要直接设置区域设置,请参见 `设置当前区域设置`_ 。 +自 v4.4.0 起,添加了 ``IncomingRequest::setValidLocales()`` 方法,用于设置(和重置)从 ``Config\App::$supportedLocales`` 设置中设置的有效区域设置。 + 内容协商 ------------------- @@ -207,6 +209,8 @@ CodeIgniter 提供了几个工具来帮助你为不同的语言本地化应用 或者,在你的项目中运行以下命令会更好: - > composer require codeigniter4/translations +.. code-block:: console + + composer require codeigniter4/translations 翻译的消息将自动被使用,因为翻译文件夹得到了正确的映射。 diff --git a/source/outgoing/response.rst b/source/outgoing/response.rst index 9d57fecf9..1a080d680 100644 --- a/source/outgoing/response.rst +++ b/source/outgoing/response.rst @@ -24,7 +24,7 @@ Response 类通过只适合服务器对调用它的客户端做出响应的方 .. literalinclude:: response/002.php -你可以将一个数组格式化为 JSON 或 XML,并通过 ``setJSON`` 和 ``setXML`` 方法将 content type header 设置为适当的 MIME 类型。通常,你会传递一个数据数组进行转换: +你可以将一个数组格式化为 JSON 或 XML,并通过 ``setJSON()`` 和 ``setXML()`` 方法将 content type header 设置为适当的 MIME 类型。通常,你会传递一个数据数组进行转换: .. literalinclude:: response/003.php @@ -143,6 +143,15 @@ Response 类提供了一种简单的方法来将文件发送给客户端,提示 .. note:: 必须返回响应对象以便下载被发送到客户端。这允许在被发送到客户端之前通过所有的 **after** 过滤器来传递响应。 +.. _open-file-in-browser: + +在浏览器中打开文件 +-------------------- + +一些浏览器可以显示诸如 PDF 等文件。为了告诉浏览器显示文件而不是保存它,调用 ``DownloadResponse::inline()`` 方法。 + +.. literalinclude:: response/033.php + HTTP 缓存 ============ @@ -379,7 +388,7 @@ HTTP 缓存 .. php:method:: setCookie($name = ''[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = false[, $httponly = false[, $samesite = null]]]]]]]]) - :param array|Cookie|string $name: Cookie 名称或参数数组或 ``CodeIgniter\Cookie\Cookie`` 实例 + :param array|Cookie|string $name: Cookie 名称 *或* 包含此方法可用的所有参数的关联数组 *或* ``CodeIgniter\Cookie\Cookie`` 的实例。 :param string $value: Cookie 值 :param int $expire: Cookie 到期时间,以秒为单位。如果设置为 ``0`` cookie 将只保持浏览器打开时有效 :param string $domain: Cookie 域名 diff --git a/source/outgoing/table.rst b/source/outgoing/table.rst index d1fd99e3a..90d4c54b0 100644 --- a/source/outgoing/table.rst +++ b/source/outgoing/table.rst @@ -55,6 +55,25 @@ Table 类允许你设置一个表格模板来指定布局设计。下面是模 .. literalinclude:: table/008.php +.. _table-sync-rows-with-headings: + +同步行与标题 +================================ + +.. versionadded:: 4.4.0 + +``setSyncRowsWithHeading(true)`` 方法使得每个数据值都放置在与 ``setHeading()`` 中定义的相同列中,如果参数使用了关联数组。这在处理通过 REST API 加载的数据时特别有用,因为其顺序可能不符合您的要求,或者如果 API 返回了过多的数据。 + +如果数据行包含一个在标题中不存在的键,则其值将被过滤。相反,如果数据行中没有列在标题中列出的键,则会在其位置放置一个空单元格。 + +.. literalinclude:: table/019.php + +.. important:: 您必须在通过 ``addRow([...])`` 添加任何行之前调用 ``setSyncRowsWithHeading(true)`` 和 ``setHeading([...])``,以进行列的重新排列。 + +使用数组作为 ``generate()`` 的输入会产生相同的结果: + +.. literalinclude:: table/020.php + *************** 类参考 *************** @@ -84,7 +103,7 @@ Table 类允许你设置一个表格模板来指定布局设计。下面是模 .. php:method:: setCaption($caption) :param string $caption: 表格标题 - :returns: Table 实例(方法链) + :returns: Table 实例(方法链式调用) :rtype: Table 允许你为表格添加标题。 @@ -94,7 +113,7 @@ Table 类允许你设置一个表格模板来指定布局设计。下面是模 .. php:method:: setHeading([$args = [] [, ...]]) :param mixed $args: 包含表格列标题的数组或多个字符串 - :returns: Table 实例(方法链) + :returns: Table 实例(方法链式调用) :rtype: Table 允许你设置表格标题。你可以提交数组或离散参数: @@ -104,7 +123,7 @@ Table 类允许你设置一个表格模板来指定布局设计。下面是模 .. php:method:: setFooting([$args = [] [, ...]]) :param mixed $args: 包含表格页脚值的数组或多个字符串 - :returns: Table 实例(方法链) + :returns: Table 实例(方法链式调用) :rtype: Table 允许你设置表格页脚。你可以提交数组或离散参数: @@ -114,7 +133,7 @@ Table 类允许你设置一个表格模板来指定布局设计。下面是模 .. php:method:: addRow([$args = [] [, ...]]) :param mixed $args: 包含行值的数组或多个字符串 - :returns: Table 实例(方法链) + :returns: Table 实例(方法链式调用) :rtype: Table 允许你向表格添加行。你可以提交数组或离散参数: @@ -151,7 +170,7 @@ Table 类允许你设置一个表格模板来指定布局设计。下面是模 .. php:method:: setEmpty($value) :param mixed $value: 放入空单元格中的值 - :returns: Table 实例(方法链) + :returns: Table 实例(方法链式调用) :rtype: Table 允许你为使用在任何空表格单元格中的默认值设置值。 @@ -161,7 +180,7 @@ Table 类允许你设置一个表格模板来指定布局设计。下面是模 .. php:method:: clear() - :returns: Table 实例(方法链) + :returns: Table 实例(方法链式调用) :rtype: Table 允许你清除表格标题、行数据和标题。 @@ -170,3 +189,10 @@ Table 类允许你设置一个表格模板来指定布局设计。下面是模 例子 .. literalinclude:: table/018.php + + .. php:method:: setSyncRowsWithHeading(bool $orderByKey) + + :returns: Table 实例(方法链式调用) + :rtype: Table + + 启用每个行数据键按照标题键进行排序。这样可以更好地控制数据在正确列中的显示位置。确保在调用第一个 ``addRow()`` 方法之前设置此值。 diff --git a/source/outgoing/view_cells.rst b/source/outgoing/view_cells.rst index 376a559bd..98fb0ce62 100644 --- a/source/outgoing/view_cells.rst +++ b/source/outgoing/view_cells.rst @@ -1,10 +1,10 @@ ########## -视图单元格 +视图单元 ########## -许多应用程序都有可以在页面之间重复使用的小视图片段,或者在页面的不同位置重复使用。这些通常是帮助框、导航控件、广告、登录表单等。CodeIgniter 允许你将这些表示块的逻辑封装在视图单元格中。它们基本上是可以在其他视图中包含的迷你视图。它们可以内置逻辑来处理任何单元格特定的显示逻辑。它们可以用于通过将每个单元格的逻辑分隔到自己的类中来使视图更可读和可维护。 +许多应用程序都有一些小的视图片段,可以在页面之间重复使用,或者在页面的不同位置使用。这些通常是帮助框、导航控件、广告、登录表单等。CodeIgniter 允许您将这些呈现块的逻辑封装在视图单元中。它们基本上是可以包含在其他视图中的小视图。它们可以内置逻辑来处理任何特定于单元的显示逻辑。它们可以通过将每个单元的逻辑分离到自己的类中,使您的视图更易读和可维护。 -CodeIgniter 支持两种类型的视图单元格:简单和受控。简单视图单元格可以从你选择的任何类和方法生成,并不必遵循任何规则,只要它返回一个字符串即可。受控视图单元格必须从扩展 ``Codeigniter\View\Cells\Cell`` 类的类生成,该类提供了额外的功能,使你的视图单元格更灵活、更快速地使用。 +CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。简单单元可以从您选择的任何类和方法生成,并且不必遵循任何规则,只需返回一个字符串即可。受控单元必须从扩展 ``Codeigniter\View\Cells\Cell`` 类的类生成,该类提供了额外的功能,使您的视图单元更加灵活和快速。 .. contents:: :local: @@ -13,288 +13,143 @@ CodeIgniter 支持两种类型的视图单元格:简单和受控。简单视图 .. _app-cells: ******************* -调用视图单元格 +调用视图单元 ******************* -无论你使用哪种类型的视图单元格,都可以通过在任何视图中使用 ``view_cell()`` 辅助方法来调用它。第一个参数是要调用的类和方法的名称,第二个参数是要传递给该方法的参数数组。该方法必须返回一个字符串,该字符串将插入到调用 ``view_cell()`` 方法的视图中。 -:: +无论您使用哪种类型的视图单元,都可以使用 ``view_cell()`` 辅助函数从任何视图中调用它。 - 'value1', 'param2' => 'value2']) ?> +第一个参数是要调用的类和方法的名称,第二个参数是要传递给方法的参数数组: -如果你没有包含类的完整命名空间,它将假定可以在 ``App\Cells`` 命名空间中找到它。所以,以下示例将尝试在 ``app/Cells/MyClass.php`` 中找到 ``MyClass`` 类。如果没有找到,将扫描所有命名空间,直到找到它,在每个命名空间的 ``Cells`` 子目录中搜索。 -:: +.. literalinclude:: view_cells/001.php - 'value1', 'param2' => 'value2']) ?> +单元方法必须返回一个字符串,该字符串将插入到调用 ``view_cell()`` 函数的视图中。 -.. note:: 从 v4.3.0 和更高版本开始支持省略命名空间。 +省略命名空间 +================== -你也可以以键/值字符串的方式传递参数: -:: +.. versionadded:: 4.3.0 - +如果您没有包含类的完整命名空间,它将假定可以在 ``App\Cells`` 命名空间中找到。因此,以下示例将尝试在 **app/Cells/MyClass.php** 中查找 ``MyClass`` 类。如果在那里找不到,将扫描所有命名空间,直到找到为止,在每个命名空间的 **Cells** 子目录中搜索: -************ -简单单元格 -************ +.. literalinclude:: view_cells/002.php + +将参数作为键/值字符串传递 +====================================== -简单单元格是从选择的方法返回字符串的类。警报消息单元格的一个简单示例如下: -:: +您还可以将参数作为键/值字符串传递: - namespace App\Cells; +.. literalinclude:: view_cells/003.php - class AlertMessage - { - public function show(array $params): string - { - return "
{$params['message']}
"; - } - } +************ +简单单元 +************ -你可以在视图内这样调用它: -:: +简单单元是从所选方法返回字符串的类。一个简单的警告消息单元的示例可能如下所示: - 'success', 'message' => 'The user has been updated.']) ?> +.. literalinclude:: view_cells/004.php -另外,你可以使用与方法中的参数变量匹配的参数名称以提高可读性。 -以这种方式使用时,在视图单元格调用中必须始终指定所有参数:: +您可以在视图中这样调用它: - // 在视图中 - +.. literalinclude:: view_cells/005.php - // 在单元格中 - public function recentPosts(string $category, int $limit) - { - $posts = $this->blogModel->where('category', $category) - ->orderBy('published_on', 'desc') - ->limit($limit) - ->get(); +此外,您可以使用与方法中的参数变量匹配的参数名称以提高可读性。 +当您以这种方式使用时,视图单元调用中必须始终指定所有参数: - return view('recentPosts', ['posts' => $posts]); - } +.. literalinclude:: view_cells/006.php + +.. literalinclude:: view_cells/007.php .. _controlled-cells: **************** -受控单元格 +受控单元 **************** .. versionadded:: 4.3.0 -受控单元格主要有两个目标:尽可能快速地构建单元格,并在视图需要时为视图提供额外的逻辑和灵活性。该类必须扩展 ``CodeIgniter\View\Cells\Cell``。它们应该在同一文件夹中有一个视图文件。按照惯例,类名应采用 PascalCase 后缀为 ``Cell``,视图应该是类名的 snake_case 版本,没有后缀。例如,如果有一个 ``MyCell`` 类,视图文件应该是 ``my.php``。 +受控单元有两个主要目标:尽可能快地构建单元,并为视图提供额外的逻辑和灵活性(如果需要)。该类必须扩展 ``CodeIgniter\View\Cells\Cell``。它们应该在同一文件夹中有一个视图文件。按照惯例,类名应为 PascalCase,后缀为 ``Cell``,视图应为类名的 snake_case 版本,不包括后缀。例如,如果您有一个 ``MyCell`` 类,视图文件应为 ``my.php``。 -.. note:: 在 v4.3.5 之前的版本中,生成的视图文件以 ``_cell.php`` 结尾。尽管 v4.3.5 和更高版本将生成不带 ``_cell`` 后缀的视图文件,但现有的视图文件仍然会被定位和加载。 +.. note:: 在 v4.3.5 之前,生成的视图文件以 ``_cell.php`` 结尾。尽管 v4.3.5 及更高版本将生成不带 ``_cell`` 后缀的视图文件,但现有的视图文件仍将被定位和加载。 -创建受控单元格 +创建受控单元 ========================== -在最基本的级别上,你需要在类中实现的是公共属性。这些属性将自动供视图文件使用。将上面的 AlertMessage 作为受控单元格实现如下: -:: - - // app/Cells/AlertMessageCell.php - namespace App\Cells; +在类中实现的最基本的级别上,您只需要实现公共属性。这些属性将自动提供给视图文件。将上面的 AlertMessage 实现为受控单元将如下所示: - use CodeIgniter\View\Cells\Cell; +.. literalinclude:: view_cells/008.php - class AlertMessageCell extends Cell - { - public $type; - public $message; - } +.. literalinclude:: view_cells/009.php - // app/Cells/alert_message.php -
- -
- - // 在主视图中调用: - +.. literalinclude:: view_cells/010.php .. _generating-cell-via-command: -通过命令生成单元格 +通过命令生成单元 =========================== -你还可以通过内置命令从 CLI 生成受控单元格。该命令是 ``php spark make:cell``。它接受一个参数,要创建的单元格的名称。名称应采用 PascalCase,类将在 ``app/Cells`` 目录中创建。视图文件也将在 ``app/Cells`` 目录中创建。 +您还可以通过 CLI 中的内置命令创建受控单元。该命令是 ``php spark make:cell``。它接受一个参数,要创建的单元的名称。名称应为 PascalCase,类将在 **app/Cells** 目录中创建。视图文件也将在 **app/Cells** 目录中创建。 -:: +.. code-block:: console - > php spark make:cell AlertMessageCell + php spark make:cell AlertMessageCell 使用不同的视图 ====================== -你可以通过在类中设置 ``view`` 属性来指定自定义视图名称。视图的定位与正常视图相同。 - -:: - - namespace App\Cells; - - use CodeIgniter\View\Cells\Cell; +您可以通过在类中设置 ``view`` 属性来指定自定义视图名称。视图将像正常情况下一样被定位: - class AlertMessageCell extends Cell - { - public $type; - public $message; - - protected $view = 'my/custom/view'; - } +.. literalinclude:: view_cells/011.php 自定义渲染 ======================= -如果你需要更多地控制 HTML 的渲染,可以实现一个 ``render()`` 方法。此方法允许你执行其他逻辑并在需要时向视图传递额外的数据。 ``render()`` 方法必须返回一个字符串。要利用受控单元格的全部功能,你应该使用 ``$this->view()`` 代替正常的 ``view()`` 辅助函数。 -:: - - namespace App\Cells; - - use CodeIgniter\View\Cells\Cell; - - class AlertMessageCell extends Cell - { - public $type; - public $message; +如果您需要更多控制HTML的渲染过程,可以实现一个 ``render()`` 方法。该方法允许您执行其他逻辑并向视图传递额外的数据(如果需要)。``render()`` 方法必须返回一个字符串。为了充分利用受控单元的全部功能,您应该使用 ``$this->view()`` 而不是普通的 ``view()`` 辅助函数: - public function render(): string - { - return $this->view('my/custom/view', ['extra' => 'data']); - } - } +.. literalinclude:: view_cells/012.php 计算属性 =================== -如果你需要为一个或多个属性执行其他逻辑,可以使用计算属性。这需要将属性设置为 ``protected`` 或 ``private``,并实现一个由属性名称包围在 ``get`` 和 ``Property`` 之间的公共方法。 -:: +如果您需要为一个或多个属性执行其他逻辑,可以使用计算属性。这需要将属性设置为 ``protected`` 或 ``private``,并实现一个公共方法,该方法的名称由属性名称包围 ``get`` 和 ``Property`` 组成: - // 在视图中初始化受保护的属性 - view_cell('AlertMessageCell', ['type' => 'note', 'message' => 'test']); +.. literalinclude:: view_cells/013.php - // app/Cells/AlertMessageCell.php - namespace App\Cells; +.. literalinclude:: view_cells/014.php - use CodeIgniter\View\Cells\Cell; +.. literalinclude:: view_cells/015.php - class AlertMessageCell extends Cell - { - protected $type; - protected $message; - private $computed; +.. important:: 无法设置在单元初始化期间声明为私有的属性。 - public function mount() - { - $this->computed = sprintf('%s - %s', $this->type, $this->message); - } - - public function getComputedProperty(): string - { - return $this->computed; - } - - public function getTypeProperty(): string - { - return $this->type; - } - - public function getMessageProperty(): string - { - return $this->message; - } - } - - // app/Cells/alert_message.php -
-

type -

-

message -

-

computed:

-
- -.. important:: 在单元格初始化期间,你不能设置声明为私有的属性。 - -呈现方法 +演示方法 ==================== -有时你需要对视图执行其他逻辑,但你不想将其作为参数传递。你可以实现一个将从单元格的视图本身调用的方法。这可以帮助提高视图的可读性。 -:: - - // app/Cells/RecentPostsCell.php - namespace App\Cells; - - use CodeIgniter\View\Cells\Cell; +有时您需要为视图执行其他逻辑,但不想将其作为参数传递。您可以实现一个在单元的视图内部调用的方法。这可以提高视图的可读性: - class RecentPostsCell extends Cell - { - protected $posts; +.. literalinclude:: view_cells/016.php - public function linkPost($post) - { - return anchor('posts/' . $post->id, $post->title); - } - } - - // app/Cells/recent_posts.php -
    - -
  • linkPost($post) ?>
  • - -
+.. literalinclude:: view_cells/017.php 执行设置逻辑 ====================== -如果你需要在渲染视图之前执行其他逻辑,可以实现一个 ``mount()`` 方法。在类实例化后立即调用此方法,可用于设置其他属性或执行其他逻辑。 - -:: - - namespace App\Cells; - - use CodeIgniter\View\Cells\Cell; - - class RecentPostsCell extends Cell - { - protected $posts; - - public function mount() - { - $this->posts = model('PostModel')->getRecent(); - } - } - -你可以通过将它们作为数组传递给 ``view_cell()`` 辅助函数来向 ``mount()`` 方法传递其他参数。传递的与 ``mount`` 方法参数名称匹配的任何参数都将被传递进去。 -:: - - // app/Cells/RecentPostsCell.php - namespace App\Cells; +如果您需要在渲染视图之前执行其他逻辑,可以实现一个 ``mount()`` 方法。该方法将在类实例化后立即调用,并可用于设置其他属性或执行其他逻辑: - use CodeIgniter\View\Cells\Cell; +.. literalinclude:: view_cells/018.php - class RecentPostsCell extends Cell - { - protected $posts; +您可以通过将它们作为数组传递给 ``view_cell()`` 辅助函数来将其他参数传递给 ``mount()`` 方法。任何与 ``mount()`` 方法的参数名称匹配的参数将被传递进去: - public function mount(?int $categoryId) - { - $this->posts = model('PostModel') - ->when($categoryId, function ($query, $category) { - return $query->where('category_id', $categoryId); - }) - ->getRecent(); - } - } +.. literalinclude:: view_cells/019.php - // 在主视图中调用: - 5]) ?> +.. literalinclude:: view_cells/020.php ************ -单元格缓存 +单元缓存 ************ -你可以通过将要缓存数据的秒数作为第三个参数传入来缓存视图单元格调用的结果。这将使用当前配置的缓存引擎。 -:: +您可以通过将要缓存数据的秒数作为第三个参数传递来缓存视图单元调用的结果。这将使用当前配置的缓存引擎: - // 缓存视图 5 分钟 - +.. literalinclude:: view_cells/021.php -如果喜欢,你可以提供一个自定义名称代替自动生成的名称,方法是将新名称作为第四个参数传递:: +如果需要,您可以提供一个自定义名称,而不是自动生成的名称,通过将新名称作为第四个参数传递: - // 缓存视图 5 分钟 - +.. literalinclude:: view_cells/022.php diff --git a/source/outgoing/view_layouts.rst b/source/outgoing/view_layouts.rst index 65cd021a7..09dd6149f 100644 --- a/source/outgoing/view_layouts.rst +++ b/source/outgoing/view_layouts.rst @@ -8,6 +8,8 @@ CodeIgniter 支持一个简单且非常灵活的布局系统,可以轻松地在整个应用程序中使用一个或多个基本页面布局。布局支持可以从任何被渲染的视图中插入的内容部分。你可以创建不同的布局以支持单列、双列、博客存档页面等。布局从不直接渲染。相反,你渲染一个视图,它指定了它想要扩展的布局。 +.. _creating-a-layout: + ***************** 创建布局 ***************** @@ -26,7 +28,22 @@ CodeIgniter 支持一个简单且非常灵活的布局系统,可以轻松地在 -``renderSection()`` 方法只有一个参数 - 部分的名称。这样任何子视图都知道要命名内容部分的名称。 +``renderSection()`` 方法有两个参数:``$sectionName`` 和 ``$saveData``。``$sectionName`` 是任何子视图用来命名内容部分的部分名称。如果布尔参数 ``$saveData`` 设置为 true,该方法会保存数据以供后续调用使用。否则,该方法在显示内容后会清除数据。 + +例如 **app/Views/welcome_message.php**:: + + + + + <?= $this->renderSection('page_title', true) ?> + + +

renderSection('page_title') ?>

+

renderSection('content') ?>

+ + + +.. note:: ``$saveData`` 可以在 v4.4.0 版本之后使用。 ********************** 在视图中使用布局 diff --git a/source/outgoing/view_parser.rst b/source/outgoing/view_parser.rst index 7f55f71e5..eaa4b7098 100644 --- a/source/outgoing/view_parser.rst +++ b/source/outgoing/view_parser.rst @@ -356,18 +356,11 @@ upper 将字符串显示为全部大写。 自定义过滤器 -------------- -你可以通过编辑 **app/Config/View.php** 并向 ``$filters`` 数组添加新条目来轻松创建自己的过滤器。每个键是在视图中调用过滤器的名称,其值是任何有效的 PHP 可调用函数: +您可以通过编辑 **app/Config/View.php** 并向 ``$filters`` 数组中添加新条目来轻松创建自己的过滤器。每个键是视图中调用过滤器的名称,其值是任何有效的 PHP 可调用对象: .. literalinclude:: view_parser/012.php -将 PHP 原生函数用作过滤器 -------------------------------- - -你可以通过编辑 **app/Config/View.php** 并向 ``$filters`` 数组添加新条目,将原生的 PHP 函数用作过滤器。每个键是在视图中调用的原生 PHP 函数的名称,其值是任何有效的原生 PHP 函数,前缀为: - -.. literalinclude:: view_parser/013.php - -插件 +解析器插件 ============== 插件允许你扩展解析器,为每个项目添加自定义功能。它们可以是任何 PHP 可调用的,因此实现起来非常简单。在模板中,插件由 ``{+ +}`` 标记指定:: diff --git a/source/testing/controllers.rst b/source/testing/controllers.rst index 50158fd23..e3b17f9fe 100644 --- a/source/testing/controllers.rst +++ b/source/testing/controllers.rst @@ -88,6 +88,10 @@ withURI(string $uri) 在测试期间始终提供 URI 可以避免意外情况,这是一种好的实践。 +.. note:: 从 v4.4.0 版本开始,该方法使用 URI 创建一个新的 Request 实例。 + 因为 Request 实例应该具有 URI 实例。如果 URI 字符串中的主机名与 ``Config\App`` 中的设置不匹配, + 将会设置有效的主机名。 + withBody($body) --------------- diff --git a/source/testing/debugging.rst b/source/testing/debugging.rst index 82be67225..9c6ea551b 100644 --- a/source/testing/debugging.rst +++ b/source/testing/debugging.rst @@ -141,3 +141,18 @@ CodeIgniter 带有以下收集器: ``getVarData()`` 应返回包含要显示的键值对数组的数组。外部数组的键为 Vars 选项卡中的部分名称: .. literalinclude:: debugging/006.php + +.. _debug-toolbar-hot-reload: + +热重载 +============= + +.. versionadded:: 4.4.0 + +调试工具栏包含一个名为热重载的功能,它允许您对应用程序的代码进行更改,并在浏览器中自动重新加载,而无需刷新页面。这在开发过程中非常省时。 + +在开发过程中启用热重载,您可以点击工具栏左侧的按钮,它看起来像一个刷新图标。这将在所有页面上启用热重载,直到您禁用它。 + +热重载通过每秒扫描 **app** 目录中的文件并查找更改来工作。如果发现任何更改,它将向浏览器发送消息以重新加载页面。它不会扫描任何其他目录,因此如果您对 **app** 目录之外的文件进行更改,您需要手动刷新页面。 + +如果您需要监视 **app** 目录之外的文件,或者由于项目的大小而导致速度较慢,您可以在 **app/Config/Toolbar.php** 配置文件的 ``$watchedDirectories`` 和 ``$watchedExtensions`` 属性中指定要扫描的目录和文件扩展名。 diff --git a/source/testing/feature.rst b/source/testing/feature.rst index 5555d41aa..3fffd44bb 100644 --- a/source/testing/feature.rst +++ b/source/testing/feature.rst @@ -15,19 +15,29 @@ HTTP 功能测试 .. literalinclude:: feature/001.php +.. _feature-requesting-a-page: + 请求页面 ================= -从本质上讲,功能测试只是允许你在应用程序上调用一个端点并获取结果。要做到这一点,请使用 ``call()`` 方法。第一个参数是要使用的 HTTP 方法(最常见的是 GET 或 POST)。第二个参数是要测试的站点上的路径。第三个参数接受一个数组,用于填充与你使用的 HTTP 动词对应的全局变量。因此, **GET** 方法会填充 **$_GET** 变量, **post** 请求会填充 **$_POST** 数组。 +基本上,功能测试允许您调用应用程序上的一个端点,并获取结果返回。 +为此,您可以使用 ``call()`` 方法。 + +1. 第一个参数是要使用的 HTTP 方法(通常是 GET 或 POST)。 +2. 第二个参数是要测试的站点上的 URI 路径。 +3. 第三个参数 ``$params`` 接受一个数组,用于填充您正在使用的 HTTP 动词的超全局变量。因此,**GET** 方法将填充 **$_GET** 变量,而 **POST** 请求将填充 **$_POST** 数组。``$params`` 也用于 :ref:`feature-formatting-the-request`。 + + .. note:: ``$params`` 数组并不适用于每个 HTTP 动词,但为了保持一致性而包含在内。 .. literalinclude:: feature/002.php +缩写方法 +----------------- + 为每个 HTTP 动词提供了缩写方法,以减少输入并增加清晰度: .. literalinclude:: feature/003.php -.. note:: 并非每个 HTTP 动词都适合 ``$params`` 数组,但为了一致性而包含它。 - 设置不同的路由 ------------------------ @@ -58,17 +68,28 @@ HTTP 功能测试 .. literalinclude:: feature/007.php +.. _feature-formatting-the-request: + 格式化请求 ----------------------- -你可以使用 ``withBodyFormat()`` 方法设置请求正文的格式。当前,这支持 `json` 或 `xml`。这将获取传递到 ``call()``、``post()``、``get()`` 等中的参数,并以给定格式分配给请求正文。这也会相应地为请求设置 `Content-Type` 标头。当测试 JSON 或 XML API 时,这很有用,以便以控制器期望的形式设置请求。 +您可以使用 ``withBodyFormat()`` 方法设置请求体的格式。目前支持 ``json`` 或 ``xml``。 +这在测试 JSON 或 XML API 时非常有用,因为您可以设置请求的格式,以符合控制器的预期。 + +这将接收传递给 ``call()``, ``post()``, ``get()``... 的参数,并将它们分配给请求体,以给定的格式。 + +这还将相应地设置请求的 `Content-Type` 标头。 .. literalinclude:: feature/008.php -设置正文 +.. _feature-setting-the-body: + +设置 Body ---------------- -你可以使用 ``withBody()`` 方法设置请求的正文。这允许你按照想要的格式设置正文格式。如果要测试更复杂的 XML,建议使用此方法。这也不会为你设置 Content-Type 标头,如果需要,可以使用 ``withHeaders()`` 方法设置它。 +您可以使用 ``withBody()`` 方法设置请求的 Body。这允许您按照所需的格式设置请求 Body。如果您有更复杂的 XML 需要测试,建议使用此方法。 + +这不会为您设置 `Content-Type` 标头。如果需要,您可以使用 ``withHeaders()`` 方法设置它。 检查响应 ===================== diff --git a/source/testing/overview.rst b/source/testing/overview.rst index df2096649..19737f159 100644 --- a/source/testing/overview.rst +++ b/source/testing/overview.rst @@ -22,17 +22,23 @@ Composer 推荐的方法是使用 `Composer `__ 在项目中安装它。尽管可以全局安装,但我们不建议这样做,因为随着时间的推移,它可能与系统上的其他项目造成兼容性问题。 -确保系统中安装了 Composer。从项目根目录(包含应用程序和系统目录的目录)命令行输入以下命令:: +确保系统中安装了 Composer。从项目根目录(包含应用程序和系统目录的目录)命令行输入以下命令: - > composer require --dev phpunit/phpunit +.. code-block:: console -这将为当前 PHP 版本安装正确的版本。完成后,可以通过输入以下命令来运行此项目的所有测试:: + composer require --dev phpunit/phpunit - > vendor/bin/phpunit +这将为当前 PHP 版本安装正确的版本。完成后,可以通过输入以下命令来运行此项目的所有测试: -如果使用 Windows,请使用以下命令:: +.. code-block:: console - > vendor\bin\phpunit + vendor/bin/phpunit + +如果使用 Windows,请使用以下命令: + +.. code-block:: console + + vendor\bin\phpunit Phar ---- @@ -128,7 +134,7 @@ assertHeaderEmitted($header, $ignoreCase = false) .. literalinclude:: overview/009.php -.. note:: 带有此内容的测试用例应 `在 PHPunit 中作为单独进程运行 `_。 +.. note:: 带有此内容的测试用例应 `在 PHPunit 中作为单独进程运行 `_。 assertHeaderNotEmitted($header, $ignoreCase = false) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -137,7 +143,7 @@ assertHeaderNotEmitted($header, $ignoreCase = false) .. literalinclude:: overview/010.php -.. note:: 带有此内容的测试用例应 `在 PHPunit 中作为单独进程运行 `_。 +.. note:: 带有此内容的测试用例应 `在 PHPunit 中作为单独进程运行 `_。 assertCloseEnough($expected, $actual, $message = '', $tolerance = 1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -204,6 +210,8 @@ Services::reset() 你也可以使用 ``CIUnitTestCase`` 提供的 ``$this->resetServices()`` 方法。 +.. note:: 此方法会重置所有服务的状态,并且 ``RouteCollection`` 将不包含任何路由。如果您想要使用加载的路由,您需要调用 ``loadRoutes()`` 方法,例如 ``Services::routes()->loadRoutes()``。 + Services::resetSingle(string $name) ----------------------------------- diff --git a/source/testing/response.rst b/source/testing/response.rst index d74446fd9..2f35e4e1e 100644 --- a/source/testing/response.rst +++ b/source/testing/response.rst @@ -5,6 +5,7 @@ ``TestResponse`` 类提供了许多有用的函数来解析测试用例中的响应并对其进行测试。通常, ``TestResponse`` 将作为你的结果提供,:doc:`控制器测试 ` 或 :doc:`HTTP 功能测试 `,但你始终可以直接使用任何 ``ResponseInterface`` 创建自己的: .. literalinclude:: response/001.php + :lines: 2- .. contents:: :local: @@ -24,6 +25,7 @@ request() 如果在测试期间设置了请求,你可以直接访问请求对象: .. literalinclude:: response/002.php + :lines: 2- response() ---------- @@ -31,6 +33,7 @@ response() 这允许你直接访问响应对象: .. literalinclude:: response/003.php + :lines: 2- 检查响应状态 ======================== @@ -41,6 +44,7 @@ isOK() 根据响应是否被视为“正常”返回布尔值 true/false。这主要由 200 或 300 范围内的响应状态代码确定。如果重定向,空响应正文不被视为有效。 .. literalinclude:: response/004.php + :lines: 2- assertOK() ---------- @@ -48,6 +52,7 @@ assertOK() 此断言简单地使用 ``isOK()`` 方法来测试响应。``assertNotOK()`` 是此断言的逆。 .. literalinclude:: response/005.php + :lines: 2- isRedirect() ------------ @@ -55,6 +60,7 @@ isRedirect() 根据响应是否重定向返回布尔值 true/false。 .. literalinclude:: response/006.php + :lines: 2- assertRedirect() ---------------- @@ -62,6 +68,7 @@ assertRedirect() 断言响应是 RedirectResponse 的一个实例。``assertNotRedirect()`` 是此断言的逆。 .. literalinclude:: response/007.php + :lines: 2- assertRedirectTo() ------------------ @@ -69,6 +76,7 @@ assertRedirectTo() 断言响应是一个 RedirectResponse 实例,且目标与给定的 uri 匹配。 .. literalinclude:: response/008.php + :lines: 2- getRedirectUrl() ---------------- @@ -76,6 +84,7 @@ getRedirectUrl() 返回设置为 RedirectResponse 的 URL,如果失败则为 null。 .. literalinclude:: response/009.php + :lines: 2- assertStatus(int $code) ----------------------- @@ -83,6 +92,7 @@ assertStatus(int $code) 断言返回的 HTTP 状态码匹配 $code。 .. literalinclude:: response/010.php + :lines: 2- 会话断言 ================== @@ -93,6 +103,7 @@ assertSessionHas(string $key, $value = null) 断言结果会话中存在一个值。如果传递了 $value,还将断言变量的值与指定的相匹配。 .. literalinclude:: response/011.php + :lines: 2- assertSessionMissing(string $key) --------------------------------- @@ -100,6 +111,7 @@ assertSessionMissing(string $key) 断言结果会话不包括指定的 $key。 .. literalinclude:: response/012.php + :lines: 2- 标头断言 ================= @@ -110,6 +122,7 @@ assertHeader(string $key, $value = null) 断言响应中存在一个名为 ``$key`` 的标头。如果 ``$value`` 非空,还将断言值匹配。 .. literalinclude:: response/013.php + :lines: 2- assertHeaderMissing(string $key) -------------------------------- @@ -117,6 +130,7 @@ assertHeaderMissing(string $key) 断言响应中不存在名为 ``$key`` 的标头。 .. literalinclude:: response/014.php + :lines: 2- Cookie 断言 ================= @@ -127,6 +141,7 @@ assertCookie(string $key, $value = null, string $prefix = '') 断言响应中存在一个名为 ``$key`` 的 Cookie。如果 ``$value`` 非空,还将断言值匹配。如有必要,可以通过第三个参数传入前缀来设置 Cookie 前缀。 .. literalinclude:: response/015.php + :lines: 2- assertCookieMissing(string $key) -------------------------------- @@ -134,6 +149,7 @@ assertCookieMissing(string $key) 断言响应中不存在名为 ``$key`` 的 Cookie。 .. literalinclude:: response/016.php + :lines: 2- assertCookieExpired(string $key, string $prefix = '') ----------------------------------------------------- @@ -141,8 +157,9 @@ assertCookieExpired(string $key, string $prefix = '') 断言一个名为 ``$key`` 的 Cookie 存在,但已过期。如有必要,可以通过第二个参数传入前缀来设置 Cookie 前缀。 .. literalinclude:: response/017.php + :lines: 2- -DOM 帮助方法 +DOM 辅助函数 =============== 你得到的响应包含许多帮助方法来检查响应中的 HTML 输出。这些在测试中的断言中很有用。 @@ -150,13 +167,15 @@ DOM 帮助方法 see() ----- -``see()`` 方法检查页面上的文本,看它是否自身存在,或者更具体地说是在由类型、类或 id 指定的标记内存在: +根据页面上的文本是否存在,返回一个布尔值 true/false。可以通过 type、class 或 id 来指定文本所在的标签。 .. literalinclude:: response/018.php + :lines: 2- ``dontSee()`` 方法正好相反: .. literalinclude:: response/019.php + :lines: 2- seeElement() ------------ @@ -164,6 +183,7 @@ seeElement() ``seeElement()`` 和 ``dontSeeElement()`` 与前面的方法非常相似,但不检查元素的值。相反,它们仅检查元素是否存在于页面上: .. literalinclude:: response/020.php + :lines: 2- seeLink() --------- @@ -171,6 +191,7 @@ seeLink() 你可以使用 ``seeLink()`` 来确保页面上存在具有指定文本的链接: .. literalinclude:: response/021.php + :lines: 2- seeInField() ------------ @@ -178,6 +199,7 @@ seeInField() ``seeInField()`` 方法检查是否存在具有给定名称和值的输入标签: .. literalinclude:: response/022.php + :lines: 2- seeCheckboxIsChecked() ---------------------- @@ -185,6 +207,7 @@ seeCheckboxIsChecked() 最后,你可以使用 ``seeCheckboxIsChecked()`` 方法检查复选框是否存在并已被选中: .. literalinclude:: response/023.php + :lines: 2- DOM 断言 ============== @@ -197,6 +220,7 @@ assertSee(string $search = null, string $element = null) 断言文本/HTML 存在于页面上,无论是自身存在还是更具体地说是存在于由类型、类或 id 指定的标记内: .. literalinclude:: response/024.php + :lines: 2- assertDontSee(string $search = null, string $element = null) ------------------------------------------------------------ @@ -204,6 +228,7 @@ assertDontSee(string $search = null, string $element = null) 与 ``assertSee()`` 方法完全相反: .. literalinclude:: response/025.php + :lines: 2- assertSeeElement(string $search) -------------------------------- @@ -211,6 +236,7 @@ assertSeeElement(string $search) 类似于 ``assertSee()``,但是这只检查存在的元素。它不检查特定文本: .. literalinclude:: response/026.php + :lines: 2- assertDontSeeElement(string $search) ------------------------------------ @@ -218,6 +244,7 @@ assertDontSeeElement(string $search) 类似于 ``assertSee()``,但是这只检查缺失的现有元素。它不检查特定文本: .. literalinclude:: response/027.php + :lines: 2- assertSeeLink(string $text, string $details = null) --------------------------------------------------- @@ -225,6 +252,7 @@ assertSeeLink(string $text, string $details = null) 断言找到一个锚定标签,其标签体匹配 ``$text``: .. literalinclude:: response/028.php + :lines: 2- assertSeeInField(string $field, string $value = null) ----------------------------------------------------- @@ -232,6 +260,7 @@ assertSeeInField(string $field, string $value = null) 断言存在具有给定名称和值的输入标签: .. literalinclude:: response/029.php + :lines: 2- 使用 JSON ================= @@ -244,19 +273,22 @@ getJSON() 此方法将以 JSON 字符串的形式返回响应正文: .. literalinclude:: response/030.php + :lines: 2- 你可以使用此方法来确定 ``$response`` 是否确实包含 JSON 内容: .. literalinclude:: response/031.php + :lines: 2- .. note:: 请注意结果中的 JSON 字符串将美化打印。 assertJSONFragment(array $fragment) ----------------------------------- -断言 $fragment 在 JSON 响应中找到。它不需要匹配整个 JSON 值。 +断言 ``$fragment`` 在 JSON 响应中找到。它不需要匹配整个 JSON 值。 .. literalinclude:: response/032.php + :lines: 2- assertJSONExact($test) ---------------------- diff --git a/source/tutorial/create_news_items.rst b/source/tutorial/create_news_items.rst index 37dc6d778..bb95bd64a 100755 --- a/source/tutorial/create_news_items.rst +++ b/source/tutorial/create_news_items.rst @@ -3,7 +3,7 @@ .. contents:: :local: - :depth: 2 + :depth: 3 你现在已经知道如何使用 CodeIgniter 从数据库中读取数据,但是你还没有将任何信息写入数据库。在本节中,你将扩展之前创建的新闻控制器和模型,以包括此功能。 @@ -23,32 +23,30 @@ 因为 :ref:`auto-routing-legacy` 允许任何 HTTP 方法访问控制器。 使用你不期望的方法访问控制器可能会绕过过滤器。 -创建表单 -************* +添加路由规则 +******************** + +在您开始向 CodeIgniter 应用程序中添加新闻项目之前,您需要在 **app/Config/Routes.php** 文件中添加一个额外的规则。确保您的文件包含以下内容: -视图 -==== +.. literalinclude:: create_news_items/004.php -为了将数据输入数据库,你需要创建一个表单,在表单中你可以输入要存储的信息。这意味着你需要一个带有两个字段的表单,一个用于标题,一个用于文本。我们会在模型中从标题中派生 slug。在 **app/Views/news/create.php** 中创建一个新的视图:: +``'news/new'`` 的路由指令放置在 ``'news/(:segment)'`` 的指令之前,以确保显示创建新闻项目的表单。 -

+``$routes->post()`` 行定义了一个 POST 请求的路由器。它仅匹配 URI 路径 **/news** 的 POST 请求,并映射到 ``News`` 类的 ``create()`` 方法。 - getFlashdata('error') ?> - +您可以在 :ref:`defined-route-routing` 中了解更多关于不同路由类型的信息。 -
- +创建表单 +************* - - -
+创建 news/create 视图文件 +============================ - - -
+为了将数据输入数据库,你需要创建一个表单,在表单中你可以输入要存储的信息。这意味着你需要一个带有两个字段的表单,一个用于标题,一个用于文本。我们会在模型中从标题中派生 slug。 - -
+在 **app/Views/news/create.php** 中创建一个新的视图: + +.. literalinclude:: create_news_items/006.php 这里可能只有四件事看起来不太熟悉。 @@ -61,69 +59,85 @@ :php:func:`set_value()` 函数由 :doc:`../helpers/form_helper` 提供,用于在发生错误时显示旧输入数据。 -控制器 -========== +News 控制器 +=============== + +返回到您的 ``News`` 控制器。 + +添加 News::new() 方法以显示表单 +----------------------------------- -返回你的 **News** 控制器。你将在此做两件事,检查表单是否已提交以及提交的数据是否通过了验证规则。 -你将使用 :ref:`Controller 中的 validation 方法 ` 来完成此操作。 +首先,创建一个方法来显示您创建的 HTML 表单。 .. literalinclude:: create_news_items/002.php +我们使用 :php:func:`helper()` 函数加载 :doc:`Form 辅助函数 <../helpers/form_helper>`。大多数辅助函数在使用之前都需要加载辅助函数。 + +然后返回创建的表单视图。 + +添加 News::create() 以创建新闻项目 +---------------------------------------- + +接下来,创建一个方法来根据提交的数据创建新闻项目。 + +在这里,您将完成三件事: + +1. 检查提交的数据是否通过了验证规则。 +2. 将新闻项目保存到数据库中。 +3. 返回一个成功页面。 + +.. literalinclude:: create_news_items/005.php + 上面的代码添加了很多功能。 -首先,我们使用 :php:func:`helper()` 函数加载 :doc:`表单辅助函数 <../helpers/form_helper>`。 -大多数辅助函数需要在使用前加载辅助函数。 +验证数据 +^^^^^^^^^^^^^^^^^ -接下来,我们使用 :doc:`IncomingRequest <../incoming/incomingrequest>` 对象 ``$this->request`` 检查我们是否处理 **POST** 请求。 -它由框架在控制器中设置。 -:ref:`IncomingRequest::is() ` 方法检查请求的类型。 -由于 **create()** 端点的路由处理 **GET** 和 **POST** 请求,所以如果请求不是 POST,我们可以安全地假设它是 GET 类型, -表单被加载并返回以显示。 +您将使用控制器提供的辅助函数 :ref:`validate() ` 来验证提交的数据。 +在这种情况下,标题和正文字段是必填的,并且有特定的长度要求。 +CodeIgniter 提供了一个强大的验证库,如上所示。您可以阅读更多关于 :doc:`验证库 <../libraries/validation>` 的信息。 -然后,我们从 POST 数据中获取用户提交的必要项,并将它们设置在 ``$post`` 变量中。 -我们还使用 :doc:`IncomingRequest <../incoming/incomingrequest>` 对象 ``$this->request``。 +如果验证失败,我们调用刚刚创建的 ``new()`` 方法并返回 HTML 表单。 -之后,使用 Controller 提供的辅助函数 :ref:`validateData() ` 来验证 ``$post`` 数据。 -在这种情况下,标题和正文字段是必需的且长度在特定范围内。 -CodeIgniter 拥有强大的验证库,如上所示。你可以阅读更多关于 :doc:`验证库 <../libraries/validation>` 的信息。 +保存新闻项目 +^^^^^^^^^^^^^^^^^^ -如果验证失败,表单将被加载并返回以显示。 +如果验证通过了所有规则,我们通过 :ref:`$this->validator->getValidated() ` 获取验证后的数据,并将其设置在 ``$post`` 变量中。 -如果验证通过了所有规则, **NewsModel** 将被加载并调用。这负责将新闻项传递到模型中。:ref:`model-save` 方法会自动插入或更新记录,这取决于它是否找到与主键匹配的数组键。 +加载并调用 ``NewsModel``。这将负责将新闻项目传递给模型。根据是否找到与主键匹配的数组键,:ref:`model-save` 方法会自动处理插入或更新记录。 这包含一个新函数 :php:func:`url_title()`。这个函数由 :doc:`URL 辅助函数 <../helpers/url_helper>` 提供 - 它会剥离你传递给它的字符串,用破折号 (``-``) 替换所有空格,并确保所有内容都是小写。 这会给你一个不错的 slug,非常适合创建 URI。 +返回成功页面 +^^^^^^^^^^^^^^^^^^^ + 之后,视图文件被加载并返回以显示成功消息。在 **app/Views/news/success.php** 中创建一个视图,并编写成功消息。 这可以简单地写成::

新闻项目创建成功。

-更新模型 +更新 NewsModel ************** 唯一剩下的就是确保你的模型设置为允许数据被正确保存。 在使用的 ``save()`` 方法将确定信息应插入还是如果行已经存在则应更新,这取决于主键的存在。 -在这种情况下,没有传递 ``id`` 字段给它,所以它会在它的表格 **news** 中插入新行。 +在这种情况下,没有传递 ``id`` 字段给它,所以它会在它的表格 ``news`` 中插入新行。 但是,默认情况下,模型中的 insert 和 update 方法实际上不会保存任何数据,因为它不知道哪些字段是安全更新的。 -编辑 **NewsModel** 以在 ``$allowedFields`` 属性中为其提供可更新字段的列表。 +编辑 ``NewsModel`` 以在 ``$allowedFields`` 属性中为其提供可更新字段的列表。 .. literalinclude:: create_news_items/003.php 这个新属性现在包含我们允许保存到数据库的字段。请注意,我们排除了 ``id`` 字段?这是因为你几乎永远不需要这样做,因为它是一个数据库中的自动递增字段。 这有助于防止批量分配漏洞。如果你的模型处理了时间戳,你也会排除它们。 -路由 -******* - -在你可以开始将新闻添加到 CodeIgniter 应用程序之前,你必须在 **app/Config/Routes.php** 文件中添加一个额外的规则。确保你的文件包含以下内容。这可以确保 CodeIgniter 将 ``create()`` 视为一个方法,而不是新闻项的 slug。你可以在 :doc:`../incoming/routing` 中阅读有关不同路由类型的更多信息。 - -.. literalinclude:: create_news_items/004.php +创建新闻项目 +****************** -现在指向你安装了 CodeIgniter 的本地开发环境的浏览器,并在 URL 中添加 ``/news/create``。 +现在指向你安装了 CodeIgniter 的本地开发环境的浏览器,并在 URL 中添加 **/news/new**。 添加一些新闻并查看你创建的不同页面。 .. image:: ../images/tutorial3.png @@ -141,9 +155,28 @@ CodeIgniter 拥有强大的验证库,如上所示。你可以阅读更多关于 你刚刚完成了你的第一个 CodeIgniter4 应用程序! -下面的图像显示了你的项目的 **app** 文件夹, -你创建的所有文件显示为红色。 -两个已修改的配置文件(**Config/Routes.php** & **Config/Filters.php**)未显示。 - -.. image:: ../images/tutorial9.png - :align: left +下面的图表显示了您的项目的 **app** 文件夹,其中包含您创建或修改的所有文件。 + +.. code-block:: none + + app/ + ├── Config + │ ├── Filters.php (Modified) + │ └── Routes.php (Modified) + ├── Controllers + │ ├── News.php + │ └── Pages.php + ├── Models + │ └── NewsModel.php + └── Views + ├── news + │ ├── create.php + │ ├── index.php + │ ├── success.php + │ └── view.php + ├── pages + │ ├── about.php + │ └── home.php + └── templates + ├── footer.php + └── header.php diff --git a/source/tutorial/index.rst b/source/tutorial/index.rst index a4c53fa8a..ec249de7b 100755 --- a/source/tutorial/index.rst +++ b/source/tutorial/index.rst @@ -50,9 +50,11 @@ ====================== 你可以从网站手动下载版本,但是对于本教程,我们将使用推荐的方法,通过 Composer 安装 AppStarter 包。 -在命令行输入以下命令:: +在命令行输入以下命令: - > composer create-project codeigniter4/appstarter ci-news +.. code-block:: console + + composer create-project codeigniter4/appstarter ci-news 这将创建一个新文件夹 **ci-news**,其中包含你的应用程序代码,CodeIgniter 安装在 vendor 文件夹中。 @@ -62,7 +64,7 @@ ======================== 默认情况下,CodeIgniter 以生产模式启动。这是一个安全特性,以防止在站点上线后设置被搞乱。 -所以首先让我们解决这个问题。复制或重命名 ``env`` 文件为 ``.env``。打开它。 +所以首先让我们解决这个问题。复制或重命名 **env** 文件为 **.env**。打开它。 此文件包含服务器特定的设置。这意味着你永远不需要将任何敏感信息提交到版本控制系统。 它已经包含一些你想要输入的常见设置,不过都是注释掉的。因此,取消注释带有 ``CI_ENVIRONMENT`` 的那行,并将 ``production`` 更改为 ``development``:: @@ -72,9 +74,11 @@ 运行开发服务器 ========================== -搞定这些后,是时候在浏览器中查看你的应用程序了。你可以通过任何你选择的服务器提供服务,比如 Apache、Nginx 等,但是 CodeIgniter 提供了一个简单的命令,利用 PHP 的内置服务器快速在你的开发机器上启动并运行。在项目的根目录下在命令行输入以下命令:: +搞定这些后,是时候在浏览器中查看你的应用程序了。你可以通过任何你选择的服务器提供服务,比如 Apache、Nginx 等,但是 CodeIgniter 提供了一个简单的命令,利用 PHP 的内置服务器快速在你的开发机器上启动并运行。在项目的根目录下在命令行输入以下命令: + +.. code-block:: console - > php spark serve + php spark serve 欢迎页面 ****************** diff --git a/source/tutorial/news_section.rst b/source/tutorial/news_section.rst index cc07d8c9b..eaa5b1129 100755 --- a/source/tutorial/news_section.rst +++ b/source/tutorial/news_section.rst @@ -40,7 +40,7 @@ CodeIgniter 安装假定你已经按 :ref:`要求 db`` 对象使数据库类可用。 +添加 NewsModel::getNews() 方法 +=============================== + 现在数据库和模型已经设置好了,你需要一个从数据库中获取所有帖子的方法。为此,CodeIgniter 包含的数据库抽象层 :doc:`查询构建器 <../database/query_builder>` 在 ``CodeIgniter\Model`` 中使用。这使你可以编写一次'查询',并在 :doc:`所有支持的数据库系统 <../intro/requirements>` 上使用。Model 类也允许你轻松使用 Query Builder 并提供一些额外的工具,以简化使用数据。向模型添加以下代码。 .. literalinclude:: news_section/002.php @@ -66,12 +72,26 @@ CodeIgniter 安装假定你已经按 :ref:`要求 ` 会为你完成这一步。 -这里使用的两个方法 ``findAll()`` 和 ``first()`` 由 ``CodeIgniter\Model`` 类提供。它们已经知道基于我们早先在 **NewsModel** 类中设置的 ``$table`` 属性要使用的表。它们是使用 Query Builder 在当前表上运行命令的辅助方法,并以你选择的格式返回结果数组。在本示例中, ``findAll()`` 返回数组的数组。 +这里使用的两个方法 ``findAll()`` 和 ``first()`` 由 ``CodeIgniter\Model`` 类提供。它们已经知道基于我们早先在 ``NewsModel`` 类中设置的 ``$table`` 属性要使用的表。它们是使用 Query Builder 在当前表上运行命令的辅助方法,并以你选择的格式返回结果数组。在本示例中, ``findAll()`` 返回数组的数组。 显示新闻 **************** -现在查询已经编写好了,应该将模型与要显示新闻项的视图绑定。这可以在我们早先创建的 ``Pages`` 控制器中完成,但是为了清晰起见,定义了一个新的 ``News`` 控制器。在 **app/Controllers/News.php** 中创建新控制器。 +现在查询已经编写好了,应该将模型与要显示新闻项的视图绑定。这可以在我们早先创建的 ``Pages`` 控制器中完成,但是为了清晰起见,定义了一个新的 ``News`` 控制器。 + +添加路由规则 +==================== + +修改您的 **app/Config/Routes.php** 文件,使其如下所示: + +.. literalinclude:: news_section/008.php + +这样可以确保请求到达 ``News`` 控制器,而不是直接到达 ``Pages`` 控制器。第二个 ``$routes->get()`` 行将带有 slug 的 URI 路由到 ``News`` 控制器中的 ``show()`` 方法。 + +创建 News 控制器 +====================== + +在 **app/Controllers/News.php** 中创建新的控制器。 .. literalinclude:: news_section/003.php @@ -79,15 +99,23 @@ CodeIgniter 安装假定你已经按 :ref:`要求 ` 或第三方解析器。 -新闻概述页面现已完成,但是仍缺少页面来显示单个新闻条目。早期创建的模型以这样的方式制作,可以轻松地用于此功能。你只需要添加一些控制器代码并创建一个新视图。返回 ``News`` 控制器并使用以下内容更新 ``view()`` 方法: +完成 News::show() 方法 +============================ + +新闻概述页面现已完成,但是仍缺少页面来显示单个新闻条目。早期创建的模型以这样的方式制作,可以轻松地用于此功能。你只需要添加一些控制器代码并创建一个新视图。返回 ``News`` 控制器并使用以下内容更新 ``show()`` 方法: .. literalinclude:: news_section/006.php 不要忘记添加 ``use CodeIgniter\Exceptions\PageNotFoundException;`` 来导入 ``PageNotFoundException`` 类。 -与不带参数调用 ``getNews()`` 方法不同,传递了 ``$slug`` 变量,因此它将返回特定的新闻条目。唯一剩下的就是在 **app/Views/news/view.php** 中创建相应的视图。在此文件中放入以下代码。 +与不带参数调用 ``getNews()`` 方法不同,传递了 ``$slug`` 变量,因此它将返回特定的新闻条目。 -.. literalinclude:: news_section/007.php - -路由 -******* +创建 news/view 视图文件 +========================== -修改你的路由文件(**app/Config/Routes.php**),使其如下所示。这可以确保请求到达 ``News`` 控制器,而不是直接到达 ``Pages`` 控制器。第一行的路由将带 slug 的 URI 路由到 ``News`` 控制器中的 ``view()`` 方法。 +唯一剩下的就是在 **app/Views/news/view.php** 中创建相应的视图。在此文件中放入以下代码。 -.. literalinclude:: news_section/008.php +.. literalinclude:: news_section/007.php -将浏览器指向你的“新闻”页面,即 ``localhost:8080/news``,你应该看到新闻条目列表,每个条目都有一个链接只显示一篇文章。 +将浏览器指向您的 "news" 页面,即 **localhost:8080/news**,您应该会看到新闻项目的列表,每个项目都有一个链接,可以显示单独的文章。 .. image:: ../images/tutorial2.png :align: center diff --git a/source/tutorial/static_pages.rst b/source/tutorial/static_pages.rst index 55ab782e0..ebe1628e8 100755 --- a/source/tutorial/static_pages.rst +++ b/source/tutorial/static_pages.rst @@ -7,11 +7,42 @@ .. note:: 本教程假设你已经下载了 CodeIgniter 并在开发环境中 :doc:`安装了框架 <../installation/index>`。 -你要做的第一件事是设置一个 **控制器** 来处理静态页面。控制器只是一个帮助委派工作的类。它是你的 Web 应用程序的粘合剂。 +首先,您需要设置路由规则来处理静态页面。 + +设置路由规则 +********************* + +路由将 URI 关联到控制器的方法。控制器只是一个帮助委派工作的类。我们稍后将创建一个控制器。 + +让我们设置路由规则。打开位于 **app/Config/Routes.php** 的路由文件。 + +开始时,唯一的路由指令应该是: + +.. literalinclude:: static_pages/003.php + +该指令表示任何没有指定内容的传入请求应由 ``Home`` 控制器内的 ``index()`` 方法处理。 + +在 ``'/'`` 的路由指令之后,添加以下行。 + +.. literalinclude:: static_pages/004.php + :lines: 2- + +CodeIgniter 从上到下读取其路由规则,并将请求路由到第一个匹配的规则。每个规则都是一个正则表达式(左侧),映射到一个控制器和方法名称(右侧)。当请求到达时,CodeIgniter 查找第一个匹配项,并调用适当的控制器和方法,可能带有参数。 + +有关路由的更多信息,请参阅 :doc:`../incoming/routing`。 + +在这里,``$routes`` 对象中的第二个规则匹配到一个 GET 请求,URI 路径为 **/pages**,并映射到 ``Pages`` 类的 ``index()`` 方法。 + +``$routes`` 对象中的第三个规则匹配到一个 GET 请求,使用占位符 ``(:segment)``,并将参数传递给 ``Pages`` 类的 ``view()`` 方法。 让我们制作第一个控制器 ******************************* +接下来,您需要设置一个 **控制器** 来处理静态页面。控制器只是一个帮助委派工作的类,它是您的 Web 应用程序的粘合剂。 + +创建 Pages 控制器 +======================= + 在 **app/Controllers/Pages.php** 中创建一个带以下代码的文件。 .. important:: 你应该始终注意文件名的大小写。许多开发人员在 Windows 或 macOS 上的大小写不敏感的文件系统上开发。 @@ -29,6 +60,9 @@ **控制器将成为你的 Web 应用程序的每个请求的中心**。与任何 PHP 类一样,你可以在控制器中通过 ``$this`` 来引用它。 +创建视图 +============ + 既然你已经创建了第一个方法,是时候制作一些基本的页面模板了。我们将创建两个“视图”(页面模板)作为我们的页面页脚和页眉。 在 **app/Views/templates/header.php** 中创建页眉,并添加以下代码:: @@ -54,10 +88,18 @@ 向控制器添加逻辑 ****************************** -早些时候,你设置了一个带有 ``view()`` 方法的控制器。该方法接受一个参数,即要加载的页面的名称。静态页面正文将位于 **app/Views/pages/** 目录中。 +创建 home.php 和 about.php +============================= + +早些时候,你设置了一个带有 ``view()`` 方法的控制器。该方法接受一个参数,即要加载的页面的名称。 + +静态页面正文将位于 **app/Views/pages** 目录中。 在该目录中,创建两个名为 **home.php** 和 **about.php** 的文件。在这些文件中输入一些文本(任何你想要的),然后保存它们。如果你想特别原创,可以试试“Hello World!”。 +完成 Pages::view() 方法 +============================= + 为了加载这些页面,你将不得不检查请求的页面是否确实存在。这将是在上面创建的 ``Pages`` 控制器中的 ``view()`` 方法的主体: .. literalinclude:: static_pages/002.php @@ -78,44 +120,20 @@ .. note:: 传递给 :php:func:`view()` 函数的任何文件和目录名称必须匹配实际目录和文件本身的情况,否则系统将在区分大小写的平台上抛出错误。你可以在 :doc:`../outgoing/views` 中了解更多信息。 -路由 -******* - -我们已经制作了控制器。下一件事是设置路由规则。路由将 URI 与控制器的方法相关联。 - -让我们这样做。打开位于 **app/Config/Routes.php** 的路由文件,并查看配置文件中的“路由定义”部分。 - -唯一的未注释的行应该是: - -.. literalinclude:: static_pages/003.php - -此指令表示,任何不包含任何内容的传入请求都应由 ``Home`` 控制器中的 ``index()`` 方法处理。 - -在 '/' 的路由指令 **之后** 添加以下行。 - -.. literalinclude:: static_pages/004.php - :lines: 2- - -CodeIgniter 从上到下读取其路由规则,并将请求路由到第一个匹配的规则。每个规则都是正则表达式(左侧)映射到控制器和方法名(右侧)。当请求进来时,CodeIgniter 查找第一个匹配项,并调用适当的控制器和方法,可能带有参数。 - -有关路由的更多信息,请参阅 :doc:`../incoming/routing`。 - -这里, ``$routes`` 对象中的第二条规则匹配到 ``/pages`` URI 路径的 GET 请求,并将其映射到 ``Pages`` 类的 ``index()`` 方法。 - -``$routes`` 对象中的第三条规则匹配使用占位符 ``(:segment)`` 的 URI 段的 GET 请求,并将参数传递给 ``Pages`` 类的 ``view()`` 方法。 - 运行应用程序 *************** -准备测试了吗?你不能使用 PHP 的内置服务器运行应用程序,因为它不会正确处理 ``public`` 中提供的 ``.htaccess`` 规则,这些规则消除了在 URL 中指定 "**index.php/**" 的需要。不过 CodeIgniter 有自己的命令可以使用。 +准备测试了吗?你不能使用 PHP 的内置服务器运行应用程序,因为它不会正确处理 **public** 中提供的 **.htaccess** 规则,这些规则消除了在 URL 中指定 "**index.php/**" 的需要。不过 CodeIgniter 有自己的命令可以使用。 + +在项目的根目录下,在命令行中: -在项目的根目录下,在命令行中:: +.. code-block:: console - > php spark serve + php spark serve -将启动一个网页服务器,可以在 8080 端口上访问。如果你将浏览器的 location 字段设置为 ``localhost:8080``,则应该会看到 CodeIgniter 欢迎页面。 +将启动一个网页服务器,可以在 8080 端口上访问。如果你将浏览器的 location 字段设置为 **localhost:8080**,则应该会看到 CodeIgniter 欢迎页面。 -现在访问 ``localhost:8080/home``。是否正确路由到 ``Pages`` 控制器中的 ``view()`` 方法?太棒了! +现在访问 **localhost:8080/home**。是否正确路由到 ``Pages`` 控制器中的 ``view()`` 方法?太棒了! 你应该看到类似以下内容: From d256e22bba63f9b676bd2cc869464981adfd2878 Mon Sep 17 00:00:00 2001 From: Hex Date: Fri, 27 Oct 2023 17:38:44 +0800 Subject: [PATCH 3/5] update --- source/concepts/factories.rst | 2 ++ source/concepts/security.rst | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/source/concepts/factories.rst b/source/concepts/factories.rst index 528dfbc81..2678438bf 100644 --- a/source/concepts/factories.rst +++ b/source/concepts/factories.rst @@ -44,6 +44,8 @@ 静态方法名称称为 *component*。 +.. _factories-passing-classname-without-namespace: + 不带命名空间的类名 ----------------------------------- diff --git a/source/concepts/security.rst b/source/concepts/security.rst index d45e8857a..89affe3c3 100755 --- a/source/concepts/security.rst +++ b/source/concepts/security.rst @@ -139,7 +139,7 @@ CodeIgniter 对应措施 - 全局安全访问的配置(``Config\App::$forceGlobalSecureRequests``) - :php:func:`force_https()` 函数 - :doc:`../libraries/encryption` -- :ref:`数据库配置 `(``encrypt``) +- :ref:`数据库配置 ` (``encrypt``) **************************************** A7 缺少功能级访问控制 From 774f1c337c5afc8ba0c3b93f8500acf049be7411 Mon Sep 17 00:00:00 2001 From: Hex Date: Fri, 27 Oct 2023 17:48:24 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=82=A8=20->=20=E4=BD=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/changelogs/v4.3.7.rst | 2 +- source/changelogs/v4.4.0.rst | 18 +++---- source/cli/spark_commands.rst | 16 +++--- source/concepts/factories.rst | 18 +++---- source/dbmgmt/migration.rst | 2 +- source/extending/composer_packages.rst | 38 +++++++------- source/general/caching.rst | 4 +- source/general/common_functions.rst | 4 +- source/general/configuration.rst | 8 +-- source/general/errors.rst | 12 ++--- source/general/modules.rst | 4 +- source/helpers/array_helper.rst | 2 +- source/helpers/cookie_helper.rst | 2 +- source/helpers/form_helper.rst | 6 +-- source/incoming/controllers.rst | 4 +- source/incoming/filters.rst | 6 +-- source/incoming/incomingrequest.rst | 6 +-- source/incoming/routing.rst | 12 ++--- source/installation/installing_composer.rst | 12 ++--- source/installation/installing_manual.rst | 2 +- source/installation/running.rst | 56 ++++++++++----------- source/installation/upgrade_435.rst | 4 +- source/installation/upgrade_437.rst | 12 ++--- source/installation/upgrade_438.rst | 6 +-- source/installation/upgrade_440.rst | 52 +++++++++---------- source/installation/upgrade_441.rst | 4 +- source/installation/upgrade_442.rst | 4 +- source/intro/requirements.rst | 2 +- source/libraries/curlrequest.rst | 8 +-- source/libraries/pagination.rst | 10 ++-- source/libraries/sessions.rst | 10 ++-- source/libraries/uri.rst | 10 ++-- source/libraries/validation.rst | 2 +- source/models/entities.rst | 8 +-- source/models/model.rst | 8 +-- source/outgoing/table.rst | 4 +- source/outgoing/view_cells.rst | 38 +++++++------- source/outgoing/view_parser.rst | 2 +- source/testing/debugging.rst | 8 +-- source/testing/feature.rst | 14 +++--- source/testing/overview.rst | 2 +- source/tutorial/create_news_items.rst | 16 +++--- source/tutorial/news_section.rst | 4 +- source/tutorial/static_pages.rst | 4 +- 44 files changed, 233 insertions(+), 233 deletions(-) diff --git a/source/changelogs/v4.3.7.rst b/source/changelogs/v4.3.7.rst index 4e5e73e2f..beaeebd54 100644 --- a/source/changelogs/v4.3.7.rst +++ b/source/changelogs/v4.3.7.rst @@ -25,6 +25,6 @@ 已修复的错误 ************ -- **自动路由遗留功能:** 修复了一个问题,当您使用``$routes->add()``添加路由时,控制器的其他方法在Web浏览器中无法访问。 +- **自动路由遗留功能:** 修复了一个问题,当你使用``$routes->add()``添加路由时,控制器的其他方法在Web浏览器中无法访问。 请查看仓库的 `CHANGELOG.md `_ 以获取已修复错误的完整列表。 diff --git a/source/changelogs/v4.4.0.rst b/source/changelogs/v4.4.0.rst index 643d52132..2657d7fae 100644 --- a/source/changelogs/v4.4.0.rst +++ b/source/changelogs/v4.4.0.rst @@ -25,7 +25,7 @@ CodeIgniter4 的 4.4.0 版本发布 URI::setSegment() 和不存在的段 ------------------------------------------ -当您设置最后一个 ``+2`` 段时,现在会抛出异常。 +当你设置最后一个 ``+2`` 段时,现在会抛出异常。 在之前的版本中,只有当指定了最后一个段的 ``+3`` 或更多时才会抛出异常。请参阅 :ref:`upgrade-440-uri-setsegment`。 当前最后一个段的下一个段(``+1``)可以像以前一样设置。 @@ -40,7 +40,7 @@ URI::setSegment() 和不存在的段 现在,只有在请求 :ref:`不带命名空间的类名 ` 时,``preferApp`` 才起作用。 -例如,当您调用 ``model(\Myth\Auth\Models\UserModel::class)`` 或 +例如,当你调用 ``model(\Myth\Auth\Models\UserModel::class)`` 或 ``model('Myth\Auth\Models\UserModel')`` 时: - 之前: @@ -53,9 +53,9 @@ URI::setSegment() 和不存在的段 - 无论 ``preferApp`` 是否为 true(默认值),都返回 ``Myth\Auth\Models\UserModel`` - 如果在调用 ``model()`` 之前定义了 ``Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel')``,则返回 ``App\Models\UserModel`` -如果您错误地传递了一个不存在的类名,之前的版本会返回 ``App`` 或 ``Config`` 命名空间中的类实例,因为存在 ``preferApp`` 功能。 +如果你错误地传递了一个不存在的类名,之前的版本会返回 ``App`` 或 ``Config`` 命名空间中的类实例,因为存在 ``preferApp`` 功能。 -例如,在控制器(``namespace App\Controllers``)中,如果您错误地调用了 ``config(Config\App::class)``(注意类名缺少前导的 ``\``),实际上传递的是 ``App\Controllers\Config\App``。 +例如,在控制器(``namespace App\Controllers``)中,如果你错误地调用了 ``config(Config\App::class)``(注意类名缺少前导的 ``\``),实际上传递的是 ``App\Controllers\Config\App``。 但是该类不存在,因此 Factories 现在将返回 ``null``。 属性名称 @@ -90,7 +90,7 @@ getPath() ^^^^^^^^^ ``getPath()`` 方法现在始终返回带有前导 ``/`` 的完整 URI 路径。 -因此,当您的 baseURL 具有子目录并且您想获取相对于 baseURL 的路径时,必须使用新的 ``getRoutePath()`` 方法。 +因此,当你的 baseURL 具有子目录并且你想获取相对于 baseURL 的路径时,必须使用新的 ``getRoutePath()`` 方法。 例如:: @@ -116,7 +116,7 @@ SiteURI 类现在比以前更严格地规范化站点 URI,并修复了一些 接口更改 ================= -.. note:: 只要您没有扩展相关的 CodeIgniter 核心类或实现这些接口,所有这些更改都是向后兼容的,无需干预。 +.. note:: 只要你没有扩展相关的 CodeIgniter 核心类或实现这些接口,所有这些更改都是向后兼容的,无需干预。 - **Validation:** 在 ``ValidationInterface`` 中添加了 ``getValidated()`` 方法。 @@ -166,7 +166,7 @@ SiteURI 类现在比以前更严格地规范化站点 URI,并修复了一些 ======== - **spark routes:** - - 现在您可以在请求 URL 中指定主机。 + - 现在你可以在请求 URL 中指定主机。 请参阅 :ref:`routing-spark-routes-specify-host`。 - 它在 *Handler* 中显示 :ref:`view-routes` 的视图文件,如下所示: @@ -220,7 +220,7 @@ SiteURI 类现在比以前更严格地规范化站点 URI,并修复了一些 请参阅 :ref:`open-file-in-browser` 了解详细信息。 - **View:** 在 ``renderSection()`` 上添加了可选的第二个参数 ``$saveData``,以防止在显示后自动清除数据。请参阅 :ref:`View Layouts ` 了解详细信息。 - **自动路由(改进):** - - 现在您可以路由到模块。请参阅 :ref:`auto-routing-improved-module-routing` 了解详细信息。 + - 现在你可以路由到模块。请参阅 :ref:`auto-routing-improved-module-routing` 了解详细信息。 - 如果找到与 URI 段对应的控制器,并且该控制器没有为该 URI 段定义的方法,则将执行默认方法。这样可以更灵活地处理自动路由中的 URI。请参阅 :ref:`controller-default-method-fallback` 了解详细信息。 - **过滤器:** 现在可以在 :ref:`$filters 属性 ` 中使用过滤器参数。 - **请求:** 添加了 ``IncomingRequest::setValidLocales()`` 方法,用于设置有效的区域设置。 @@ -253,7 +253,7 @@ SiteURI 类现在比以前更严格地规范化站点 URI,并修复了一些 - **自动加载器:** - 在 v4.4.0 之前,CodeIgniter 的自动加载器不允许在某些操作系统上的文件名中使用特殊字符。 可以使用的符号是 ``/``、``_``、``.``、``:``、``\`` 和空格。 - 因此,如果您将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法工作。 + 因此,如果你将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法工作。 从 v4.4.0 开始,此限制已被移除。 - ``Autoloader::loadClass()`` 和 ``Autoloader::loadClassmap()`` 方法现在都标记为 ``@internal``。 - **RouteCollection:** 受保护属性 ``$routes`` 的数组结构已进行了修改以提高性能。 diff --git a/source/cli/spark_commands.rst b/source/cli/spark_commands.rst index 5eeda9ee0..bfcfc1870 100644 --- a/source/cli/spark_commands.rst +++ b/source/cli/spark_commands.rst @@ -36,7 +36,7 @@ spark list php spark list -您还可以使用 ``--simple`` 选项获取按字母顺序排序的所有可用命令的原始列表: +你还可以使用 ``--simple`` 选项获取按字母顺序排序的所有可用命令的原始列表: .. code-block:: console @@ -45,13 +45,13 @@ spark list 显示帮助 ------------ -您可以使用 ``help`` 命令获取有关任何 CLI 命令的帮助,如下所示: +你可以使用 ``help`` 命令获取有关任何 CLI 命令的帮助,如下所示: .. code-block:: console php spark help db:seed -自 v4.3.0 起,您还可以使用 ``--help`` 选项代替 ``help`` 命令: +自 v4.3.0 起,你还可以使用 ``--help`` 选项代替 ``help`` 命令: .. code-block:: console @@ -60,7 +60,7 @@ spark list 运行命令 ----------------- -您应该将命令的名称作为第一个参数传递以运行该命令: +你应该将命令的名称作为第一个参数传递以运行该命令: .. code-block:: console @@ -72,7 +72,7 @@ spark list php spark db:seed DevUserSeeder -对于 CodeIgniter 提供的所有命令,如果您没有提供所需的参数,系统将提示您提供运行所需的信息: +对于 CodeIgniter 提供的所有命令,如果你没有提供所需的参数,系统将提示你提供运行所需的信息: .. code-block:: console @@ -93,7 +93,7 @@ spark list Your environment is currently set as development. -您可以始终传递 ``--no-header`` 以抑制头部输出,这对于解析结果很有帮助: +你可以始终传递 ``--no-header`` 以抑制头部输出,这对于解析结果很有帮助: .. code-block:: console @@ -104,10 +104,10 @@ spark list 调用命令 ================ -命令也可以从您自己的代码中运行。这通常在控制器中用于 cron 任务,但可以随时使用。您可以使用 ``command()`` 函数来实现。该函数始终可用。 +命令也可以从你自己的代码中运行。这通常在控制器中用于 cron 任务,但可以随时使用。你可以使用 ``command()`` 函数来实现。该函数始终可用。 .. literalinclude:: cli_commands/001.php 唯一的参数是字符串,即所调用的命令和任何参数。它的使用方式与从命令行调用完全相同。 -当不从命令行运行时,所有运行的命令的输出都会被捕获。它会从命令中返回,以便您可以选择是否显示它。 +当不从命令行运行时,所有运行的命令的输出都会被捕获。它会从命令中返回,以便你可以选择是否显示它。 diff --git a/source/concepts/factories.rst b/source/concepts/factories.rst index 2678438bf..8e69a0fe2 100644 --- a/source/concepts/factories.rst +++ b/source/concepts/factories.rst @@ -49,18 +49,18 @@ 不带命名空间的类名 ----------------------------------- -如果您传递一个不带命名空间的类名,Factories 首先会在 ``App`` 命名空间中搜索与魔术静态方法名对应的路径。``Factories::models()`` 会搜索 **app/Models** 目录。 +如果你传递一个不带命名空间的类名,Factories 首先会在 ``App`` 命名空间中搜索与魔术静态方法名对应的路径。``Factories::models()`` 会搜索 **app/Models** 目录。 传递短类名 ^^^^^^^^^^^^^^^^^^^^^^^ -在下面的代码中,如果您有 ``App\Models\UserModel``,将返回该实例: +在下面的代码中,如果你有 ``App\Models\UserModel``,将返回该实例: .. literalinclude:: factories/001.php 如果没有 ``App\Models\UserModel``,它会在所有命名空间中搜索 ``Models\UserModel``。 -下次您在代码中的任何地方请求相同的类时,Factories 将确保您获得之前的实例: +下次你在代码中的任何地方请求相同的类时,Factories 将确保你获得之前的实例: .. literalinclude:: factories/003.php @@ -75,16 +75,16 @@ 传递完全限定类名 -------------------------------- -您还可以请求一个完全限定的类名: +你还可以请求一个完全限定的类名: .. literalinclude:: factories/002.php :lines: 2- 如果存在,它将返回 ``Blog\Models\UserModel`` 的实例。 -.. note:: 在 v4.4.0 之前,当您请求一个完全限定的类名时,如果只有 ``Blog\Models\UserModel``,将返回该实例。但是,如果同时存在 ``App\Models\UserModel`` 和 ``Blog\Models\UserModel``,将返回 ``App\Models\UserModel`` 的实例。 +.. note:: 在 v4.4.0 之前,当你请求一个完全限定的类名时,如果只有 ``Blog\Models\UserModel``,将返回该实例。但是,如果同时存在 ``App\Models\UserModel`` 和 ``Blog\Models\UserModel``,将返回 ``App\Models\UserModel`` 的实例。 - 如果您想获取 ``Blog\Models\UserModel``,您需要禁用选项 ``preferApp``: + 如果你想获取 ``Blog\Models\UserModel``,你需要禁用选项 ``preferApp``: .. literalinclude:: factories/010.php :lines: 2- @@ -117,7 +117,7 @@ model() .. versionadded:: 4.4.0 -您可以使用 ``Factories::define()`` 方法定义在加载类之前要加载的类名: +你可以使用 ``Factories::define()`` 方法定义在加载类之前要加载的类名: .. literalinclude:: factories/014.php :lines: 2- @@ -159,7 +159,7 @@ getShared boolean 是否返回类的共享实例或者加载一个新实 preferApp boolean 是否优先使用 App 命名空间中具有相同基本名称的类而不是其他明确的类请求。 ``true`` ========== ============== ======================================================================= =================================================== -.. note:: 自 v4.4.0 起,``preferApp`` 仅在您请求 :ref:`不带命名空间的类名 ` 时起作用。 +.. note:: 自 v4.4.0 起,``preferApp`` 仅在你请求 :ref:`不带命名空间的类名 ` 时起作用。 工厂行为 ****************** @@ -254,7 +254,7 @@ setOptions 方法 因此,如果要更新 Config 值,请更新 Config 文件或其环境变量,并且必须手动删除缓存文件。 -您可以使用 ``spark cache:clear`` 命令: +你可以使用 ``spark cache:clear`` 命令: .. code-block:: console diff --git a/source/dbmgmt/migration.rst b/source/dbmgmt/migration.rst index 115cbafcf..76d928d58 100644 --- a/source/dbmgmt/migration.rst +++ b/source/dbmgmt/migration.rst @@ -4,7 +4,7 @@ 迁移是一种以结构化和有序的方式修改数据库的便捷方法。你可以手工编辑 SQL 片段,但这样你就需要告知其他开发者他们需要运行这些片段。你也需要在下次部署到生产环境时跟踪哪些更改需要运行。 -数据库表 **migrations** 用于跟踪已经运行的迁移,因此您只需确保您的迁移文件已经准备好,并运行 ``spark migrate`` 命令将数据库更新到最新状态。您还可以使用 ``spark migrate --all`` 命令来包括所有命名空间的迁移。 +数据库表 **migrations** 用于跟踪已经运行的迁移,因此你只需确保你的迁移文件已经准备好,并运行 ``spark migrate`` 命令将数据库更新到最新状态。你还可以使用 ``spark migrate --all`` 命令来包括所有命名空间的迁移。 .. contents:: :local: diff --git a/source/extending/composer_packages.rst b/source/extending/composer_packages.rst index bb2d841c1..0622217ac 100644 --- a/source/extending/composer_packages.rst +++ b/source/extending/composer_packages.rst @@ -2,7 +2,7 @@ 创建 Composer 包 ########################## -您可以将您创建的 :doc:`../general/modules` 转换为 Composer 包,或者为 CodeIgniter 4 创建一个 Composer 包。 +你可以将你创建的 :doc:`../general/modules` 转换为 Composer 包,或者为 CodeIgniter 4 创建一个 Composer 包。 .. contents:: :local: @@ -29,9 +29,9 @@ 创建 composer.json ********************** -在您的包目录的根目录中,创建一个 **composer.json** 文件。该文件定义了关于您的包及其依赖项的元数据。 +在你的包目录的根目录中,创建一个 **composer.json** 文件。该文件定义了关于你的包及其依赖项的元数据。 -使用 ``composer init`` 命令可以帮助您创建它。 +使用 ``composer init`` 命令可以帮助你创建它。 例如,**composer.json** 可能如下所示:: @@ -52,7 +52,7 @@ } ], "require": { - // 在此处添加您的包所需的任何依赖项 + // 在此处添加你的包所需的任何依赖项 }, "require-dev": { // 在此处添加开发所需的任何依赖项(例如 PHPUnit) @@ -64,8 +64,8 @@ ``name`` 字段在这里非常重要。包名称通常以 "vendor-name/package-name" 的格式书写,全部小写。以下是一个常见的示例: -- ``your-vendor-name``:标识供应商(包的创建者)的名称,例如您的姓名或组织名称。 -- ``your-package-name``:您正在创建的包的名称。 +- ``your-vendor-name``:标识供应商(包的创建者)的名称,例如你的姓名或组织名称。 +- ``your-package-name``:你正在创建的包的名称。 因此,为了使名称唯一以区分其它包,使其与其他包区分开是非常重要的,尤其是在发布时。 @@ -74,7 +74,7 @@ 包名称决定了 ``autoload.psr4`` 中的供应商命名空间。 -如果您的包名称是 ``your-vendor/your-package``,那么供应商命名空间必须是 ``YourVendor``。因此,您需要像下面这样编写:: +如果你的包名称是 ``your-vendor/your-package``,那么供应商命名空间必须是 ``YourVendor``。因此,你需要像下面这样编写:: "autoload": { "psr-4": { @@ -82,23 +82,23 @@ } } -这个设置指示 Composer 自动加载您的包的源代码。 +这个设置指示 Composer 自动加载你的包的源代码。 选择许可证 ================ -如果您对开源许可证不熟悉,请参考 https://choosealicense.com/。许多 PHP 包,包括 CodeIgniter,使用 MIT 许可证。 +如果你对开源许可证不熟悉,请参考 https://choosealicense.com/。许多 PHP 包,包括 CodeIgniter,使用 MIT 许可证。 *************************** 准备开发工具 *************************** -有许多工具可以帮助确保代码质量。因此,您应该使用它们。您可以使用 `CodeIgniter DevKit `_ 轻松安装和配置此类工具。 +有许多工具可以帮助确保代码质量。因此,你应该使用它们。你可以使用 `CodeIgniter DevKit `_ 轻松安装和配置此类工具。 安装 DevKit ================= -在您的包目录的根目录中,运行以下命令: +在你的包目录的根目录中,运行以下命令: .. code-block:: console @@ -106,14 +106,14 @@ composer config prefer-stable true composer require --dev codeigniter4/devkit -DevKit 安装了各种 Composer 包,帮助您进行开发,并在 **vendor/codeigniter4/devkit/src/Template** 中为它们安装了模板。将其中的文件复制到您的项目根目录,并根据您的需求进行编辑。 +DevKit 安装了各种 Composer 包,帮助你进行开发,并在 **vendor/codeigniter4/devkit/src/Template** 中为它们安装了模板。将其中的文件复制到你的项目根目录,并根据你的需求进行编辑。 配置 Coding Standards Fixer ================================== DevKit 提供了基于 `PHP-CS-Fixer `_ 的 `CodeIgniter Coding Standard `_ 的 Coding Standards Fixer。 -将 **vendor/codeigniter4/devkit/src/Template/.php-cs-fixer.dist.php** 复制到您的项目根目录。 +将 **vendor/codeigniter4/devkit/src/Template/.php-cs-fixer.dist.php** 复制到你的项目根目录。 为缓存文件创建 **build** 文件夹:: @@ -121,7 +121,7 @@ DevKit 提供了基于 `PHP-CS-Fixer exclude([ -完成后,您可以运行 Coding Standards Fixer: +完成后,你可以运行 Coding Standards Fixer: .. code-block:: console vendor/bin/php-cs-fixer fix --ansi --verbose --diff -如果您在 **composer.json** 中添加了 ``scripts.cs-fix``,则可以使用 ``composer cs-fix`` 命令运行它:: +如果你在 **composer.json** 中添加了 ``scripts.cs-fix``,则可以使用 ``composer cs-fix`` 命令运行它:: { // ... @@ -158,20 +158,20 @@ DevKit 提供了基于 `PHP-CS-Fixer `。 +如果你需要在 **app/Config** 文件夹中覆盖或添加已知配置,可以使用 :ref:`Implicit Registrars `。 ********** 参考资料 ********** -我们已经发布了一些官方包。您可以在创建自己的包时使用这些包作为参考: +我们已经发布了一些官方包。你可以在创建自己的包时使用这些包作为参考: - https://github.com/codeigniter4/shield - https://github.com/codeigniter4/settings diff --git a/source/general/caching.rst b/source/general/caching.rst index 56f6ff501..c8dcab29f 100755 --- a/source/general/caching.rst +++ b/source/general/caching.rst @@ -23,12 +23,12 @@ CodeIgniter 允许你缓存网页以达到最大性能。 设置缓存引擎 -------------------- -在使用网页缓存之前,您必须通过编辑 **app/Config/Cache.php** 来设置缓存引擎。有关详细信息,请参阅 :ref:`libraries-caching-configuring-the-cache`。 +在使用网页缓存之前,你必须通过编辑 **app/Config/Cache.php** 来设置缓存引擎。有关详细信息,请参阅 :ref:`libraries-caching-configuring-the-cache`。 设置 $cacheQueryString ------------------------- -您可以使用 ``Config\Cache::$cacheQueryString`` 设置是否在生成缓存时包含查询字符串。 +你可以使用 ``Config\Cache::$cacheQueryString`` 设置是否在生成缓存时包含查询字符串。 有效选项为: diff --git a/source/general/common_functions.rst b/source/general/common_functions.rst index 34ef57a4c..b8ed1c316 100755 --- a/source/general/common_functions.rst +++ b/source/general/common_functions.rst @@ -134,7 +134,7 @@ CodeIgniter 提供了一些全局定义的函数和变量,在任何时候都可 .. literalinclude:: common_functions/002.php -.. note:: 如果您在 :doc:`表单辅助函数 ` 中使用了 :php:func:`set_value()`、:php:func:`set_select()`、:php:func:`set_checkbox()` 和 :php:func:`set_radio()` 函数,这个功能已经内置了。只有在不使用表单辅助函数时才需要使用此函数。 +.. note:: 如果你在 :doc:`表单辅助函数 ` 中使用了 :php:func:`set_value()`、:php:func:`set_select()`、:php:func:`set_checkbox()` 和 :php:func:`set_radio()` 函数,这个功能已经内置了。只有在不使用表单辅助函数时才需要使用此函数。 .. php:function:: session([$key]) @@ -262,7 +262,7 @@ CodeIgniter 提供了一些全局定义的函数和变量,在任何时候都可 检查当前页面是否通过 HTTPS 访问。如果是,则不执行任何操作。如果不是,则将用户重定向回当前 URI,但通过 HTTPS 进行访问。将设置 HTTP 严格传输安全(HTST)头,指示现代浏览器将任何 HTTP 请求自动修改为 HTTPS 请求,持续时间为 ``$duration``。 - .. note:: 当您将 ``Config\App:$forceGlobalSecureRequests`` 设置为 true 时,也会使用此函数。 + .. note:: 当你将 ``Config\App:$forceGlobalSecureRequests`` 设置为 true 时,也会使用此函数。 .. php:function:: function_usable($function_name) diff --git a/source/general/configuration.rst b/source/general/configuration.rst index cdf35cd02..b33c4dca1 100755 --- a/source/general/configuration.rst +++ b/source/general/configuration.rst @@ -40,7 +40,7 @@ CodeIgniter 提供的所有配置文件都使用 ``Config`` 命名空间。在 你可以通过使用不同的命名空间将配置文件放在任何你想要的文件夹中。这允许你在生产服务器上将配置文件放在一个不可公开访问的文件夹中,同时在开发期间保持其位于 **/app** 下方便访问。 -.. note:: 在 v4.4.0 之前,``config()`` 会在有与 shortname 相同的类时,在 **app/Config/** 中查找文件,即使您指定了完全限定的类名,如 ``config(\Acme\Blog\Config\Blog::class)``。在 v4.4.0 中修复了此行为,并返回指定的实例。 +.. note:: 在 v4.4.0 之前,``config()`` 会在有与 shortname 相同的类时,在 **app/Config/** 中查找文件,即使你指定了完全限定的类名,如 ``config(\Acme\Blog\Config\Blog::class)``。在 v4.4.0 中修复了此行为,并返回指定的实例。 获取配置属性 ========================= @@ -54,7 +54,7 @@ CodeIgniter 提供的所有配置文件都使用 ``Config`` 命名空间。在 当你需要一个新的配置时,首先在所需位置创建一个新文件。默认文件位置(大多数情况下推荐)是 **app/Config**。该类应使用适当的命名空间,并且它应扩展 ``CodeIgniter\Config\BaseConfig`` 以确保它可以接收特定环境的设置。 -您可以通过使用不同的命名空间将配置文件放置在任何 **Config** 文件夹中。 +你可以通过使用不同的命名空间将配置文件放置在任何 **Config** 文件夹中。 该类应使用适当的命名空间,并应扩展 ``CodeIgniter\Config\BaseConfig`` 以确保它可以接收特定于环境的设置。 @@ -196,7 +196,7 @@ CodeIgniter 期望 **.env** 文件与 **app** 目录一起位于项目的根目 例如,你不能只是在 **.env** 中放置 ``app.myNewConfig = foo`` 并期望你的 ``Config\App`` 在运行时神奇地拥有该属性和值。 -当你在 ``Config\Database`` 中有属性 ``$default = ['encrypt' => false]`` 时,即使你在 **.env** 中放置 ``database.default.encrypt.ssl_verify = true``,也不能将 ``encrypt`` 值更改为数组。如果您想这样做,请参阅 :ref:`Database Configuration `。 +当你在 ``Config\Database`` 中有属性 ``$default = ['encrypt' => false]`` 时,即使你在 **.env** 中放置 ``database.default.encrypt.ssl_verify = true``,也不能将 ``encrypt`` 值更改为数组。如果你想这样做,请参阅 :ref:`Database Configuration `。 将环境变量视为数组 ======================================== @@ -257,7 +257,7 @@ CodeIgniter 期望 **.env** 文件与 **app** 目录一起位于项目的根目 隐式注册器可以更改任何配置类的属性。 -任何命名空间都可以通过使用 **Config/Registrar.php** 文件定义隐式注册器。这些文件是类,其方法的名称与您希望扩展的每个配置类的名称相同。 +任何命名空间都可以通过使用 **Config/Registrar.php** 文件定义隐式注册器。这些文件是类,其方法的名称与你希望扩展的每个配置类的名称相同。 例如,第三方模块或 Composer 包可能希望为 ``Config\Pager`` 提供额外的模板,而不会覆盖开发人员已经配置的内容。在 **src/Config/Registrar.php** 中,将有一个名为 ``Registrar`` 的类,其中只有一个 ``Pager()`` 方法(注意大小写敏感): diff --git a/source/general/errors.rst b/source/general/errors.rst index 5b573a8fe..00ca4b263 100755 --- a/source/general/errors.rst +++ b/source/general/errors.rst @@ -45,7 +45,7 @@ Exceptions 简单来说就是在抛出异常时发生的事件。这将中止脚 .. important:: 禁用错误报告并不会停止在错误发生时写入日志。 -.. warning:: 请注意,**.env** 文件中的设置会添加到 ``$_SERVER`` 和 ``$_ENV`` 中。作为副作用,这意味着如果显示详细的错误报告,**您的安全凭据将被公开**。 +.. warning:: 请注意,**.env** 文件中的设置会添加到 ``$_SERVER`` 和 ``$_ENV`` 中。作为副作用,这意味着如果显示详细的错误报告,**你的安全凭据将被公开**。 记录 Exceptions ------------------ @@ -101,7 +101,7 @@ RedirectException .. literalinclude:: errors/010.php -``$uri`` 是相对于 baseURL 的 URI 路径。您还可以提供一个重定向代码,以替代默认值 (``302``, "temporary redirect"): +``$uri`` 是相对于 baseURL 的 URI 路径。你还可以提供一个重定向代码,以替代默认值 (``302``, "temporary redirect"): .. literalinclude:: errors/011.php @@ -165,12 +165,12 @@ RedirectException .. versionadded:: 4.4.0 -如果您需要更多地控制异常的显示方式,现在可以定义自己的处理程序并指定它们适用的情况。 +如果你需要更多地控制异常的显示方式,现在可以定义自己的处理程序并指定它们适用的情况。 定义新的处理程序 ------------------------ -第一步是创建一个新的类,该类实现了 ``CodeIgniter\Debug\ExceptionHandlerInterface`` 接口。您还可以扩展 ``CodeIgniter\Debug\BaseExceptionHandler`` 类。该类包含了许多在默认异常处理程序中使用的实用方法。新的处理程序必须实现一个方法:``handle()``: +第一步是创建一个新的类,该类实现了 ``CodeIgniter\Debug\ExceptionHandlerInterface`` 接口。你还可以扩展 ``CodeIgniter\Debug\BaseExceptionHandler`` 类。该类包含了许多在默认异常处理程序中使用的实用方法。新的处理程序必须实现一个方法:``handle()``: .. literalinclude:: errors/015.php @@ -179,10 +179,10 @@ RedirectException 配置新的处理程序 --------------------------- -告诉 CodeIgniter 使用您的新异常处理程序类是在 **app/Config/Exceptions.php** 配置文件的 ``handler()`` 方法中完成的: +告诉 CodeIgniter 使用你的新异常处理程序类是在 **app/Config/Exceptions.php** 配置文件的 ``handler()`` 方法中完成的: .. literalinclude:: errors/016.php -您可以使用任何逻辑来确定应用程序是否应该处理异常,但最常见的两种情况是检查 HTTP 状态码或异常的类型。如果您的类应该处理它,则返回一个新的实例: +你可以使用任何逻辑来确定应用程序是否应该处理异常,但最常见的两种情况是检查 HTTP 状态码或异常的类型。如果你的类应该处理它,则返回一个新的实例: .. literalinclude:: errors/017.php diff --git a/source/general/modules.rst b/source/general/modules.rst index 4a08f0177..6faf59c25 100755 --- a/source/general/modules.rst +++ b/source/general/modules.rst @@ -6,7 +6,7 @@ CodeIgniter 支持一种代码模块化形式,以帮助你创建可重用的代 框架支持的任何标准文件类型都受支持,如控制器、模型、视图、配置文件、辅助函数、语言文件等。模块可以包含尽可能少或多的这些文件。 -如果您想将一个模块创建为 Composer 包,请参阅 :doc:`../extending/composer_packages`。 +如果你想将一个模块创建为 Composer 包,请参阅 :doc:`../extending/composer_packages`。 .. contents:: :local: @@ -174,7 +174,7 @@ CodeIgniter 提供的另一种方法是像自动加载类一样自动加载这 .. note:: 我们不建议在模块中使用相同的短类名。需要覆盖或添加 **app/Config/** 中已知配置的模块应使用 :ref:`Implicit Registrars `。 -.. note:: 在 v4.4.0 之前,即使您指定了一个完全限定的类名,如 ``config(\Acme\Blog\Config\Blog::class)``,``config()`` 仍会在 **app/Config/** 中查找文件,只要存在与短类名相同的类。在 v4.4.0 中修复了这个行为,并返回指定的实例。 +.. note:: 在 v4.4.0 之前,即使你指定了一个完全限定的类名,如 ``config(\Acme\Blog\Config\Blog::class)``,``config()`` 仍会在 **app/Config/** 中查找文件,只要存在与短类名相同的类。在 v4.4.0 中修复了这个行为,并返回指定的实例。 迁移 ========== diff --git a/source/helpers/array_helper.rst b/source/helpers/array_helper.rst index 5d481d8fe..261f6d592 100644 --- a/source/helpers/array_helper.rst +++ b/source/helpers/array_helper.rst @@ -102,7 +102,7 @@ Array 辅助函数提供了几个函数来简化数组的更复杂用法。它 :rtype: array :returns: 按索引值分组的数组 - 该函数允许您按索引值将数据行分组在一起。返回的数组的深度等于作为参数传递的索引数。 + 该函数允许你按索引值将数据行分组在一起。返回的数组的深度等于作为参数传递的索引数。 以下示例显示了一些数据(例如从 API 加载的数据)和嵌套数组。 diff --git a/source/helpers/cookie_helper.rst b/source/helpers/cookie_helper.rst index d82044447..725a3de16 100755 --- a/source/helpers/cookie_helper.rst +++ b/source/helpers/cookie_helper.rst @@ -50,7 +50,7 @@ Cookie 辅助函数文件包含了帮助处理 cookie 的函数。 .. note:: 从 v4.2.1 开始,引入了第三个参数 ``$prefix``,并且由于一个错误修复,行为发生了一些变化。详见 :ref:`升级 `。 - 这个辅助函数为您提供了更友好的语法来获取浏览器的 Cookie。有关其使用的详细描述,请参考 :doc:`IncomingRequest 库 `,因为这个函数的行为与 :php:meth:`CodeIgniter\\HTTP\\IncomingRequest::getCookie()` 非常相似,只是它还会在前面添加您在 **app/Config/Cookie.php** 文件中设置的 ``Config\Cookie::$prefix``。 + 这个辅助函数为你提供了更友好的语法来获取浏览器的 Cookie。有关其使用的详细描述,请参考 :doc:`IncomingRequest 库 `,因为这个函数的行为与 :php:meth:`CodeIgniter\\HTTP\\IncomingRequest::getCookie()` 非常相似,只是它还会在前面添加你在 **app/Config/Cookie.php** 文件中设置的 ``Config\Cookie::$prefix``。 .. warning:: 使用 XSS 过滤是一个不好的做法。它不能完美地防止 XSS 攻击。在视图中建议使用正确 ``$context`` 的 :php:func:`esc()`。 diff --git a/source/helpers/form_helper.rst b/source/helpers/form_helper.rst index 07ddd9cbb..77dcd3bfc 100755 --- a/source/helpers/form_helper.rst +++ b/source/helpers/form_helper.rst @@ -465,7 +465,7 @@ 返回的数组与 ``Validation::getErrors()`` 相同。详见 :ref:`验证 `。 - .. note:: 此函数与 :ref:`in-model-validation` 不兼容。如果您想在模型验证中获取验证错误,请参阅 :ref:`model-getting-validation-errors`。 + .. note:: 此函数与 :ref:`in-model-validation` 不兼容。如果你想在模型验证中获取验证错误,请参阅 :ref:`model-getting-validation-errors`。 示例:: @@ -485,7 +485,7 @@ 此函数在内部使用 :php:func:`validation_errors()`。 - .. note:: 此函数与 :ref:`in-model-validation` 不兼容。如果您想在模型验证中获取验证错误,请参阅 :ref:`model-getting-validation-errors`。 + .. note:: 此函数与 :ref:`in-model-validation` 不兼容。如果你想在模型验证中获取验证错误,请参阅 :ref:`model-getting-validation-errors`。 示例:: @@ -506,7 +506,7 @@ 此函数在内部使用 :php:func:`validation_errors()`。 - .. note:: 此函数与 :ref:`in-model-validation` 不兼容。如果您想在模型验证中获取验证错误,请参阅 :ref:`model-getting-validation-errors`。 + .. note:: 此函数与 :ref:`in-model-validation` 不兼容。如果你想在模型验证中获取验证错误,请参阅 :ref:`model-getting-validation-errors`。 示例:: diff --git a/source/incoming/controllers.rst b/source/incoming/controllers.rst index 89109dba0..46c9a1db5 100755 --- a/source/incoming/controllers.rst +++ b/source/incoming/controllers.rst @@ -92,7 +92,7 @@ $this->validate() .. literalinclude:: controllers/004.php -.. warning:: 当您使用 ``validate()`` 方法时,应该使用 :ref:`getValidated() ` 方法来获取经过验证的数据。因为 ``validate()`` 方法在内部使用了 :ref:`Validation::withRequest() ` 方法,并且它会验证来自 :ref:`$request->getJSON() `、:ref:`$request->getRawInput() ` 或 :ref:`$request->getVar() ` 的数据,而攻击者可能会更改要验证的数据。 +.. warning:: 当你使用 ``validate()`` 方法时,应该使用 :ref:`getValidated() ` 方法来获取经过验证的数据。因为 ``validate()`` 方法在内部使用了 :ref:`Validation::withRequest() ` 方法,并且它会验证来自 :ref:`$request->getJSON() `、:ref:`$request->getRawInput() ` 或 :ref:`$request->getVar() ` 的数据,而攻击者可能会更改要验证的数据。 .. note:: 自 v4.4.0 版本开始,可以使用 :ref:`$this->validator->getValidated() ` 方法。 @@ -299,7 +299,7 @@ URI 的第二段通常确定控制器中的哪个方法被调用。 如果与控制器名的 URI 段对应的控制器不存在,并且如果默认控制器(默认为 ``Home``)存在于目录中,则剩余的 URI 段将传递给默认控制器的默认方法。 -例如,当您在 **app/Controllers/News** 目录中有以下默认控制器 ``Home`` 时: +例如,当你在 **app/Controllers/News** 目录中有以下默认控制器 ``Home`` 时: .. literalinclude:: controllers/025.php diff --git a/source/incoming/filters.rst b/source/incoming/filters.rst index 6f8fea49d..eabab8b4b 100644 --- a/source/incoming/filters.rst +++ b/source/incoming/filters.rst @@ -6,7 +6,7 @@ :local: :depth: 2 -控制器过滤器允许您在控制器执行之前或之后执行操作。与 :doc:`事件 <../extending/events>` 不同,您可以选择将过滤器应用于特定的 URI 或路由。前置过滤器可以修改请求,而后置过滤器可以对响应进行操作甚至修改,从而提供了很大的灵活性和功能。 +控制器过滤器允许你在控制器执行之前或之后执行操作。与 :doc:`事件 <../extending/events>` 不同,你可以选择将过滤器应用于特定的 URI 或路由。前置过滤器可以修改请求,而后置过滤器可以对响应进行操作甚至修改,从而提供了很大的灵活性和功能。 使用过滤器可以执行的一些常见任务示例: @@ -64,13 +64,13 @@ After 过滤器与 Before 过滤器几乎完全相同,只是你只能返回 ``$r 配置过滤器运行时有两种方法。一种是在 **app/Config/Filters.php** 中进行配置,另一种是在 **app/Config/Routes.php** 中进行配置。 -如果您想为特定的路由指定过滤器,请使用 **app/Config/Routes.php** 并参考 :ref:`URI Routing `。 +如果你想为特定的路由指定过滤器,请使用 **app/Config/Routes.php** 并参考 :ref:`URI Routing `。 在路由中指定的过滤器(在 **app/Config/Routes.php** 中)会在 **app/Config/Filters.php** 中指定的过滤器之前执行。 .. note:: 最安全的应用过滤器方法是 :ref:`禁用自动路由 `,并 :ref:`设置过滤器到路由 `。 -**app/Config/Filters.php** 文件包含四个属性,允许您精确配置过滤器的运行时机。 +**app/Config/Filters.php** 文件包含四个属性,允许你精确配置过滤器的运行时机。 .. warning:: 建议你在过滤器设置中的 URI 末尾始终添加 ``*``。因为控制器方法可能比你想象的通过不同的 URL 访问。例如,当启用 :ref:`auto-routing-legacy` 时,如果你有 ``Blog::index``,它可以通过 ``blog``、``blog/index`` 和 ``blog/index/1`` 等方式访问。 diff --git a/source/incoming/incomingrequest.rst b/source/incoming/incomingrequest.rst index b369f0b14..8b6b61713 100755 --- a/source/incoming/incomingrequest.rst +++ b/source/incoming/incomingrequest.rst @@ -194,9 +194,9 @@ getMethod() .. literalinclude:: incomingrequest/021.php -您可以使用 ``getRoutePath()`` 方法来处理当前 URI 字符串(相对于您的 baseURL 的路径)。 +你可以使用 ``getRoutePath()`` 方法来处理当前 URI 字符串(相对于你的 baseURL 的路径)。 -.. note:: 自 v4.4.0 版本开始,可以使用 ``getRoutePath()`` 方法。在 v4.4.0 之前,``getPath()`` 方法返回相对于您的 baseURL 的路径。 +.. note:: 自 v4.4.0 版本开始,可以使用 ``getRoutePath()`` 方法。在 v4.4.0 之前,``getPath()`` 方法返回相对于你的 baseURL 的路径。 上传的文件 ************** @@ -437,4 +437,4 @@ getMethod() :returns: 此传入请求 :rtype: IncomingRequest - .. note:: 在 v4.4.0 之前,主要用于测试目的,这允许您设置当前请求的相对路径值,而不是依赖于 URI 检测。这也会更新底层的 ``URI`` 实例的新路径。 + .. note:: 在 v4.4.0 之前,主要用于测试目的,这允许你设置当前请求的相对路径值,而不是依赖于 URI 检测。这也会更新底层的 ``URI`` 实例的新路径。 diff --git a/source/incoming/routing.rst b/source/incoming/routing.rst index 90f1fbf31..cff8882d0 100755 --- a/source/incoming/routing.rst +++ b/source/incoming/routing.rst @@ -523,7 +523,7 @@ HTTP 动词路由 路由配置选项 **************************** -RoutesCollection 类提供了几个选项,可以影响所有路由,并且可以根据您的应用程序需求进行修改。这些选项可以在 **app/Config/Routing.php** 文件中找到。 +RoutesCollection 类提供了几个选项,可以影响所有路由,并且可以根据你的应用程序需求进行修改。这些选项可以在 **app/Config/Routing.php** 文件中找到。 .. note:: 配置文件 **app/Config/Routing.php** 自 v4.4.0 版本开始添加。 在之前的版本中,使用 **app/Config/Routes.php** 中的 setter 方法来更改设置。 @@ -547,7 +547,7 @@ RoutesCollection 类提供了几个选项,可以影响所有路由,并且可 转换 URI 中的破折号 ==================== -该选项允许您在使用自动路由时,自动将控制器和方法的 URI 段中的破折号(``-``)替换为下划线,从而节省了额外的路由条目。这是必需的,因为破折号不是有效的类或方法名称字符,如果您尝试使用它,将会导致致命错误: +该选项允许你在使用自动路由时,自动将控制器和方法的 URI 段中的破折号(``-``)替换为下划线,从而节省了额外的路由条目。这是必需的,因为破折号不是有效的类或方法名称字符,如果你尝试使用它,将会导致致命错误: .. literalinclude:: routing/049.php @@ -579,7 +579,7 @@ RoutesCollection 类提供了几个选项,可以影响所有路由,并且可 .. literalinclude:: routing/051.php -在路由配置文件中使用 ``$override404`` 属性,您可以使用闭包函数。在路由文件中定义覆盖是限制在类或方法对上的。 +在路由配置文件中使用 ``$override404`` 属性,你可以使用闭包函数。在路由文件中定义覆盖是限制在类或方法对上的。 .. note:: ``set404Override()`` 方法不会将响应状态码更改为 ``404``。如果你不在设置的控制器中设置状态码, 将返回默认状态码 ``200``。有关如何设置状态码的信息,请参阅 @@ -692,7 +692,7 @@ URI 段 .. versionadded:: 4.4.0 -即使您使用 :doc:`../general/modules` 并将控制器放置在不同的命名空间中,您仍可以使用自动路由。 +即使你使用 :doc:`../general/modules` 并将控制器放置在不同的命名空间中,你仍可以使用自动路由。 要路由到一个模块,必须在 **app/Config/Routing.php** 中设置 ``$moduleRoutes`` 属性:: @@ -702,7 +702,7 @@ URI 段 键是模块的第一个 URI 段,值是控制器的命名空间。在上述配置中,**http://localhost:8080/blog/foo/bar** 将被路由到 ``Acme\Blog\Controllers\Foo::getBar()``。 -.. note:: 如果您定义了 ``$moduleRoutes``,模块的路由将优先生效。在上面的示例中,即使您有 ``App\Controllers\Blog`` 控制器,**http://localhost:8080/blog** 也将被路由到默认控制器 ``Acme\Blog\Controllers\Home``。 +.. note:: 如果你定义了 ``$moduleRoutes``,模块的路由将优先生效。在上面的示例中,即使你有 ``App\Controllers\Blog`` 控制器,**http://localhost:8080/blog** 也将被路由到默认控制器 ``Acme\Blog\Controllers\Home``。 .. _auto-routing-legacy: @@ -873,7 +873,7 @@ spark 路由 .. versionadded:: 4.4.0 -您可以使用 ``--host`` 选项在请求 URL 中指定主机: +你可以使用 ``--host`` 选项在请求 URL 中指定主机: .. code-block:: console diff --git a/source/installation/installing_composer.rst b/source/installation/installing_composer.rst index b7491caba..296dc3130 100644 --- a/source/installation/installing_composer.rst +++ b/source/installation/installing_composer.rst @@ -38,7 +38,7 @@ App Starter 如果省略“项目根目录”参数,该命令将创建一个“appstarter”文件夹,可以根据需要重命名。 -.. note:: 在 v4.4.0 之前,CodeIgniter 的自动加载器不允许在某些操作系统上的文件名中使用非法的特殊字符。可以使用的符号包括 ``/``、``_``、``.``、``:``、``\`` 和空格。因此,如果您将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法正常工作。从 v4.4.0 开始,这个限制已经被移除。 +.. note:: 在 v4.4.0 之前,CodeIgniter 的自动加载器不允许在某些操作系统上的文件名中使用非法的特殊字符。可以使用的符号包括 ``/``、``_``、``.``、``:``、``\`` 和空格。因此,如果你将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法正常工作。从 v4.4.0 开始,这个限制已经被移除。 .. important:: 当你将应用部署到生产服务器时,不要忘记运行以下命令: @@ -98,7 +98,7 @@ App Starter 仓库带有 ``builds`` 脚本,可在当前稳定版本和框架的 最新开发版更新 ^^^^^^^^^^^^^^^^^^^^^ -在您的项目根目录中执行以下命令: +在你的项目根目录中执行以下命令: .. code-block:: console @@ -106,21 +106,21 @@ App Starter 仓库带有 ``builds`` 脚本,可在当前稳定版本和框架的 上述命令将更新 **composer.json**,将其指向工作仓库的 ``develop`` 分支,并更新配置文件和 XML 文件中的相应路径。 -使用 ``builds`` 命令后,请确保运行 ``composer update``,以使您的 vendor 文件夹与最新的目标构建同步。然后,根据需要检查 :doc:`upgrading` 并更新项目文件。 +使用 ``builds`` 命令后,请确保运行 ``composer update``,以使你的 vendor 文件夹与最新的目标构建同步。然后,根据需要检查 :doc:`upgrading` 并更新项目文件。 下一个次要版本 ^^^^^^^^^^^^^^^^^^ -如果您想使用下一个次要版本的分支,在使用 ``builds`` 命令后手动编辑 **composer.json**。 +如果你想使用下一个次要版本的分支,在使用 ``builds`` 命令后手动编辑 **composer.json**。 -如果您尝试使用 ``4.4`` 分支,请将版本更改为 ``4.4.x-dev``:: +如果你尝试使用 ``4.4`` 分支,请将版本更改为 ``4.4.x-dev``:: "require": { "php": "^7.4 || ^8.0", "codeigniter4/codeigniter4": "4.4.x-dev" }, -然后运行 ``composer update``,以使您的 vendor 文件夹与最新的目标构建同步。然后,根据需要检查升级指南(**user_guide_src/source/installation/upgrade_{version}.rst**)并更新项目文件。 +然后运行 ``composer update``,以使你的 vendor 文件夹与最新的目标构建同步。然后,根据需要检查升级指南(**user_guide_src/source/installation/upgrade_{version}.rst**)并更新项目文件。 恢复到稳定版本 ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/source/installation/installing_manual.rst b/source/installation/installing_manual.rst index ba72e3624..3792c3d90 100644 --- a/source/installation/installing_manual.rst +++ b/source/installation/installing_manual.rst @@ -21,7 +21,7 @@ 下载 `最新版本 `__, 并将其提取到成为项目根目录。 -.. note:: 在 v4.4.0 之前,CodeIgniter 的自动加载器不允许在某些操作系统上的文件名中使用非法的特殊字符。可以使用的符号包括 ``/``、``_``、``.``、``:``、``\`` 和空格。因此,如果您将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法正常工作。从 v4.4.0 开始,这个限制已经被移除。 +.. note:: 在 v4.4.0 之前,CodeIgniter 的自动加载器不允许在某些操作系统上的文件名中使用非法的特殊字符。可以使用的符号包括 ``/``、``_``、``.``、``:``、``\`` 和空格。因此,如果你将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法正常工作。从 v4.4.0 开始,这个限制已经被移除。 初始配置 ===================== diff --git a/source/installation/running.rst b/source/installation/running.rst index 5b6371974..69ff700ef 100644 --- a/source/installation/running.rst +++ b/source/installation/running.rst @@ -1,5 +1,5 @@ ################ -运行您的应用程序 +运行你的应用程序 ################ .. contents:: @@ -10,7 +10,7 @@ CodeIgniter 4 应用程序可以以多种不同的方式运行:托管在 Web .. important:: 在文件名的大小写方面应始终小心。许多开发人员在 Windows 或 macOS 上使用不区分大小写的文件系统进行开发。然而,大多数服务器环境使用区分大小写的文件系统。如果文件名大小写不正确,本地上正常工作的代码在服务器上将无法正常工作。 -如果您是 CodeIgniter 的新手,请阅读用户指南的 :doc:`入门 ` 部分,开始学习如何构建动态的 PHP 应用程序。祝您使用愉快! +如果你是 CodeIgniter 的新手,请阅读用户指南的 :doc:`入门 ` 部分,开始学习如何构建动态的 PHP 应用程序。祝你使用愉快! .. _initial-configuration: @@ -18,25 +18,25 @@ CodeIgniter 4 应用程序可以以多种不同的方式运行:托管在 Web 初始配置 ********************* -为您的站点 URI 进行配置 +为你的站点 URI 进行配置 ============================ 使用文本编辑器打开 **app/Config/App.php** 文件。 #. $baseURL - 将您的基本 URL 设置为 ``$baseURL``。如果您需要更大的灵活性,可以在 :ref:`.env ` 文件中设置 baseURL,例如 ``app.baseURL = 'http://example.com/'``。**始终在基本 URL 的末尾使用斜杠!** + 将你的基本 URL 设置为 ``$baseURL``。如果你需要更大的灵活性,可以在 :ref:`.env ` 文件中设置 baseURL,例如 ``app.baseURL = 'http://example.com/'``。**始终在基本 URL 的末尾使用斜杠!** - .. note:: 如果您没有正确设置 ``baseURL``,在开发模式下,调试工具栏可能无法正确加载,网页可能需要更长的时间才能显示。 + .. note:: 如果你没有正确设置 ``baseURL``,在开发模式下,调试工具栏可能无法正确加载,网页可能需要更长的时间才能显示。 #. $indexPage - 如果您不想在站点 URI 中包含 **index.php**,请将 ``$indexPage`` 设置为 ``''``。当框架生成您的站点 URI 时,将使用此设置。 + 如果你不想在站点 URI 中包含 **index.php**,请将 ``$indexPage`` 设置为 ``''``。当框架生成你的站点 URI 时,将使用此设置。 - .. note:: 您可能需要配置您的 Web 服务器以访问不包含 **index.php** 的 URL。请参阅 :ref:`CodeIgniter URLs `。 + .. note:: 你可能需要配置你的 Web 服务器以访问不包含 **index.php** 的 URL。请参阅 :ref:`CodeIgniter URLs `。 配置数据库连接设置 ====================================== -如果您打算使用数据库,请使用文本编辑器打开 **app/Config/Database.php** 文件,并设置您的数据库设置。或者,您可以在 **.env** 文件中设置这些设置。 +如果你打算使用数据库,请使用文本编辑器打开 **app/Config/Database.php** 文件,并设置你的数据库设置。或者,你可以在 **.env** 文件中设置这些设置。 设置为开发模式 ======================= @@ -48,39 +48,39 @@ CodeIgniter 4 应用程序可以以多种不同的方式运行:托管在 Web 设置可写文件夹权限 ============================== -如果您将使用 Web 服务器(例如 Apache 或 nginx)运行您的站点,您需要修改项目中的 **writable** 文件夹的权限,以便它可以被您的 Web 服务器使用的用户或帐户写入。 +如果你将使用 Web 服务器(例如 Apache 或 nginx)运行你的站点,你需要修改项目中的 **writable** 文件夹的权限,以便它可以被你的 Web 服务器使用的用户或帐户写入。 ************************ 本地开发服务器 ************************ -CodeIgniter 4 自带一个本地开发服务器,利用 PHP 的内置 Web 服务器和 CodeIgniter 的路由功能。您可以使用以下命令在主目录中启动它: +CodeIgniter 4 自带一个本地开发服务器,利用 PHP 的内置 Web 服务器和 CodeIgniter 的路由功能。你可以使用以下命令在主目录中启动它: .. code-block:: console php spark serve -这将启动服务器,您现在可以在浏览器中通过 http://localhost:8080 查看您的应用程序。 +这将启动服务器,你现在可以在浏览器中通过 http://localhost:8080 查看你的应用程序。 .. note:: 内置的开发服务器只应在本地开发机器上使用。它绝不能在生产服务器上使用。 -如果您需要在除 localhost 之外的主机上运行站点,您首先需要将主机添加到您的 **hosts** 文件中。文件的确切位置因每个主要操作系统而异,但所有的类 Unix 类型的系统(包括 macOS)通常将文件保存在 **/etc/hosts** 中。 +如果你需要在除 localhost 之外的主机上运行站点,你首先需要将主机添加到你的 **hosts** 文件中。文件的确切位置因每个主要操作系统而异,但所有的类 Unix 类型的系统(包括 macOS)通常将文件保存在 **/etc/hosts** 中。 本地开发服务器可以使用三个命令行选项进行自定义: -- 您可以使用 ``--host`` CLI 选项指定要运行应用程序的不同主机: +- 你可以使用 ``--host`` CLI 选项指定要运行应用程序的不同主机: .. code-block:: console php spark serve --host example.dev -- 默认情况下,服务器在端口 8080 上运行,但您可能有多个站点正在运行,或者已经有其他应用程序使用该端口。您可以使用 ``--port`` CLI 选项指定不同的端口: +- 默认情况下,服务器在端口 8080 上运行,但你可能有多个站点正在运行,或者已经有其他应用程序使用该端口。你可以使用 ``--port`` CLI 选项指定不同的端口: .. code-block:: console php spark serve --port 8081 -- 您还可以使用 ``--php`` CLI 选项指定要使用的特定版本的 PHP,将其值设置为您要使用的 PHP 可执行文件的路径: +- 你还可以使用 ``--php`` CLI 选项指定要使用的特定版本的 PHP,将其值设置为你要使用的 PHP 可执行文件的路径: .. code-block:: console @@ -124,7 +124,7 @@ Apache 与许多平台捆绑在一起,但也可以从 `Bitnami `` 元素,用于您的 Web 应用程序,例如 **apache2/conf/extra/httpd-vhost.conf**: +在虚拟主机配置中添加一个 ```` 元素,用于你的 Web 应用程序,例如 **apache2/conf/extra/httpd-vhost.conf**: .. code-block:: apache @@ -177,19 +177,19 @@ Apache 与许多平台捆绑在一起,但也可以从 `Bitnami `_。 -由于 CodeIgniter4 默认情况下期望服务器在 **public/index.php** 中找到框架前端控制器,因此您必须指定此位置作为替代位置以搜索请求(即使 CodeIgniter4 安装在每个用户的 Web 目录中)。 +由于 CodeIgniter4 默认情况下期望服务器在 **public/index.php** 中找到框架前端控制器,因此你必须指定此位置作为替代位置以搜索请求(即使 CodeIgniter4 安装在每个用户的 Web 目录中)。 默认的用户 Web 目录 **~/public_html** 由 ``UserDir`` 指令指定,通常位于 **apache2/mods-available/userdir.conf** 或 **apache2/conf/extra/httpd-userdir.conf** 中: @@ -266,7 +266,7 @@ Apache 与许多平台捆绑在一起,但也可以从 `Bitnami setRules([ 'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,{id}]', ]); -您需要为 ``{id}`` 添加规则:: +你需要为 ``{id}`` 添加规则:: $validation->setRules([ 'id' => 'max_length[19]|is_natural_no_zero', // Add this diff --git a/source/installation/upgrade_437.rst b/source/installation/upgrade_437.rst index a531979e6..ff8401ac6 100644 --- a/source/installation/upgrade_437.rst +++ b/source/installation/upgrade_437.rst @@ -2,7 +2,7 @@ 从 4.3.6 升级到 4.3.7 ############################# -请参考与您的安装方法相对应的升级说明。 +请参考与你的安装方法相对应的升级说明。 - :ref:`使用 Composer 安装的应用程序启动器升级 ` - :ref:`使用 Composer 安装的将 CodeIgniter4 添加到现有项目中升级 ` @@ -20,13 +20,13 @@ 功能测试请求体 ============================ -如果您调用了以下方法: +如果你调用了以下方法: 1. :ref:`withBody() ` 2. 并且 :ref:`withBodyFormat() ` 3. 并将 ``$params`` 传递给 :ref:`call() ` (或简写方法) -则请求体的优先级已更改。如果您的测试代码受到此更改的影响,请进行修改。 +则请求体的优先级已更改。如果你的测试代码受到此更改的影响,请进行修改。 例如,现在使用 ``$params`` 来构建请求体,而不使用 ``$body``:: @@ -39,7 +39,7 @@ Validation::loadRuleGroup() 的返回值 ``Validation::loadRuleGroup()`` 的返回值已从 "**rules 数组**" 更改为 "**rules 数组** 和 **customErrors 数组**" 的 "**数组**"(``[rules, customErrors]``)。 -如果您使用了该方法,请将代码更新如下:: +如果你使用了该方法,请将代码更新如下:: $rules = $this->validation->loadRuleGroup($rules); ↓ @@ -48,14 +48,14 @@ Validation::loadRuleGroup() 的返回值 项目文件 ************* -**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **系统** 范围之外,因此不会在没有您干预的情况下进行更改。 +**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **系统** 范围之外,因此不会在没有你干预的情况下进行更改。 有一些第三方 CodeIgniter 模块可用于帮助合并对项目空间的更改:`在 Packagist 上查看 `_。 内容更改 =============== -以下文件已经进行了重大更改(包括弃用或视觉调整),建议您将更新后的版本与您的应用程序合并: +以下文件已经进行了重大更改(包括弃用或视觉调整),建议你将更新后的版本与你的应用程序合并: 配置 ------ diff --git a/source/installation/upgrade_438.rst b/source/installation/upgrade_438.rst index 13bac86d2..2c0a00953 100644 --- a/source/installation/upgrade_438.rst +++ b/source/installation/upgrade_438.rst @@ -2,7 +2,7 @@ 从 4.3.7 升级到 4.3.8 ############################# -请参考与您的安装方法相对应的升级说明。 +请参考与你的安装方法相对应的升级说明。 - :ref:`使用 Composer 安装的应用程序启动器升级 ` - :ref:`使用 Composer 安装的将 CodeIgniter4 添加到现有项目中升级 ` @@ -15,14 +15,14 @@ 项目文件 ************* -**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,因此不会在没有您干预的情况下进行更改。 +**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,因此不会在没有你干预的情况下进行更改。 有一些第三方 CodeIgniter 模块可用于帮助合并对项目空间的更改:`在 Packagist 上查看 `_。 内容更改 =============== -以下文件已经进行了重大更改(包括弃用或视觉调整),建议您将更新后的版本与您的应用程序合并: +以下文件已经进行了重大更改(包括弃用或视觉调整),建议你将更新后的版本与你的应用程序合并: 配置 ------ diff --git a/source/installation/upgrade_440.rst b/source/installation/upgrade_440.rst index f161360fc..d6ab9811a 100644 --- a/source/installation/upgrade_440.rst +++ b/source/installation/upgrade_440.rst @@ -2,7 +2,7 @@ 从 4.3.8 升级到 4.4.0 ############################## -请参考与您的安装方法对应的升级说明。 +请参考与你的安装方法对应的升级说明。 - :ref:`使用 Composer 安装 App Starter 升级 ` - :ref:`使用 Composer 安装将 CodeIgniter4 添加到现有项目并进行升级 ` @@ -23,7 +23,7 @@ 已添加 :ref:`Validation::getValidated() ` 方法,以确保获取已验证数据。 -因此,在您的 Controllers 中使用 ``$this->validate()`` 时,应使用新的 ``Validation::getValidated()`` 方法获取已验证的数据。 +因此,在你的 Controllers 中使用 ``$this->validate()`` 时,应使用新的 ``Validation::getValidated()`` 方法获取已验证的数据。 .. literalinclude:: ../libraries/validation/045.php :lines: 2- @@ -38,7 +38,7 @@ URI::setSegment() 更改 由于以前版本中没有抛出异常,如果指定了最后一个段 ``+2``,此错误已经修复。 -如果您的代码依赖于此错误,请修复段编号。 +如果你的代码依赖于此错误,请修复段编号。 .. literalinclude:: upgrade_440/002.php :lines: 2- @@ -46,17 +46,17 @@ URI::setSegment() 更改 站点 URI 更改 ================ -- 由于对当前 URI 确定进行了重新制定,框架可能以与以前版本不同的方式返回站点 URI 或 URI 路径。这可能会破坏您的测试代码。如果现有测试失败,请更新断言。 -- 如果您的 baseURL 具有子目录,并且通过 ``URI::getPath()`` 方法获取当前 URI 的相对路径到 baseURL,您必须改用新的 ``SiteURI::getRoutePath()`` 方法。 +- 由于对当前 URI 确定进行了重新制定,框架可能以与以前版本不同的方式返回站点 URI 或 URI 路径。这可能会破坏你的测试代码。如果现有测试失败,请更新断言。 +- 如果你的 baseURL 具有子目录,并且通过 ``URI::getPath()`` 方法获取当前 URI 的相对路径到 baseURL,你必须改用新的 ``SiteURI::getRoutePath()`` 方法。 有关详细信息,请参见 :ref:`v440-site-uri-changes`。 -当您扩展异常时 +当你扩展异常时 ========================== -如果您扩展了 ``CodeIgniter\Debug\Exceptions`` 并且未覆盖 ``exceptionHandler()`` 方法,那么在 **app/Config/Exceptions.php** 中定义新的 ``Config\Exceptions::handler()`` 方法将导致执行指定的异常处理程序。 +如果你扩展了 ``CodeIgniter\Debug\Exceptions`` 并且未覆盖 ``exceptionHandler()`` 方法,那么在 **app/Config/Exceptions.php** 中定义新的 ``Config\Exceptions::handler()`` 方法将导致执行指定的异常处理程序。 -您的覆盖代码将不再执行,因此请通过定义自己的异常处理程序进行必要的更改。 +你的覆盖代码将不再执行,因此请通过定义自己的异常处理程序进行必要的更改。 请参阅 :ref:`custom-exception-handlers` 了解详细信息。 @@ -67,15 +67,15 @@ URI::setSegment() 更改 此错误已经修复,现在不再支持下划线 URI(**foo_bar**)。 -如果您有指向下划线 URI(**foo_bar**)的链接,请将其更新为破折号 URI(**foo-bar**)。 +如果你有指向下划线 URI(**foo_bar**)的链接,请将其更新为破折号 URI(**foo-bar**)。 传递带有命名空间的类名到工厂时 ================================================== 传递带有命名空间的类名到工厂的行为已更改。有关详细信息,请参见 :ref:`ChangeLog `。 -如果您有类似于 ``model(\Myth\Auth\Models\UserModel::class)`` 或 -``model('Myth\Auth\Models\UserModel')`` 的代码(代码可能在第三方包中),并且希望加载您的 ``App\Models\UserModel``,您需要在加载该类之前定义要加载的类名:: +如果你有类似于 ``model(\Myth\Auth\Models\UserModel::class)`` 或 +``model('Myth\Auth\Models\UserModel')`` 的代码(代码可能在第三方包中),并且希望加载你的 ``App\Models\UserModel``,你需要在加载该类之前定义要加载的类名:: Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel'); @@ -91,14 +91,14 @@ URI::setSegment() 更改 已进行了一些方法签名更改。扩展它们的类应该更新其 API 以反映更改。有关详细信息,请参见 :ref:`v440-method-signature-changes`。 -此外,某些构造函数和 ``Services::security()`` 的参数类型已更改。如果您使用这些参数调用它们,请更改参数值。有关详细信息,请参见 :ref:`v440-parameter-type-changes`。 +此外,某些构造函数和 ``Services::security()`` 的参数类型已更改。如果你使用这些参数调用它们,请更改参数值。有关详细信息,请参见 :ref:`v440-parameter-type-changes`。 RouteCollection::$routes ======================== 受保护属性 ``$routes`` 的数组结构已进行了修改以提高性能。 -如果您扩展了 ``RouteCollection`` 并使用了 ``$routes``,请更新您的代码以匹配新的数组结构。 +如果你扩展了 ``RouteCollection`` 并使用了 ``$routes``,请更新你的代码以匹配新的数组结构。 必要的文件更改 ********************** @@ -106,12 +106,12 @@ RouteCollection::$routes index.php 和 spark =================== -以下文件已经接收到重大更改,**您必须将更新后的版本与您的应用程序合并**: +以下文件已经接收到重大更改,**你必须将更新后的版本与你的应用程序合并**: - ``public/index.php`` (还请参阅 :ref:`v440-codeigniter-and-exit` ) - ``spark`` -.. important:: 如果您不更新上述文件,运行 ``composer update`` 后 CodeIgniter 将无法正常工作。 +.. important:: 如果你不更新上述文件,运行 ``composer update`` 后 CodeIgniter 将无法正常工作。 升级过程,例如如下: @@ -127,7 +127,7 @@ index.php 和 spark app/Config/App.php ------------------ -属性 ``$proxyIPs`` 必须是数组。如果您不使用代理服务器,则它必须为 ``public array $proxyIPs = [];``。 +属性 ``$proxyIPs`` 必须是数组。如果你不使用代理服务器,则它必须为 ``public array $proxyIPs = [];``。 .. _upgrade-440-config-routing: @@ -140,16 +140,16 @@ app/Config/Routing.php - **app/Config/Routes.php** 文件经过简化,仅包含路由,没有设置和冗余的内容。 - 不再自动加载特定于环境的路由文件。 -因此,您需要执行以下操作: +因此,你需要执行以下操作: -1. 从新框架中复制 **app/Config/Routing.php** 到您的 **app/Config** 目录,并进行配置。 +1. 从新框架中复制 **app/Config/Routing.php** 到你的 **app/Config** 目录,并进行配置。 2. 删除不再需要的 **app/Config/Routes.php** 中的所有设置。 3. 如果使用特定于环境的路由文件,请将它们添加到 **app/Config/Routing.php** 中的 ``$routeFiles`` 属性中。 app/Config/Toolbar.php ---------------------- -您需要添加新属性 ``$watchedDirectories`` 和 ``$watchedExtensions`` 以进行 :ref:`debug-toolbar-hot-reload`:: +你需要添加新属性 ``$watchedDirectories`` 和 ``$watchedExtensions`` 以进行 :ref:`debug-toolbar-hot-reload`:: --- a/app/Config/Toolbar.php +++ b/app/Config/Toolbar.php @@ -189,7 +189,7 @@ app/Config/Toolbar.php app/Config/Events.php --------------------- -您需要添加代码以为 :ref:`debug-toolbar-hot-reload` 添加一个路由:: +你需要添加代码以为 :ref:`debug-toolbar-hot-reload` 添加一个路由:: --- a/app/Config/Events.php +++ b/app/Config/Events.php @@ -219,7 +219,7 @@ app/Config/Cookie.php **app/Config/App.php** 中的 Cookie 配置项不再使用。 -1. 从新框架中复制 **app/Config/Cookie.php** 到您的 **app/Config** 目录,并进行配置。 +1. 从新框架中复制 **app/Config/Cookie.php** 到你的 **app/Config** 目录,并进行配置。 2. 删除 **app/Config/App.php** 中的属性(从 ``$cookiePrefix`` 到 ``$cookieSameSite``)。 app/Config/Security.php @@ -227,7 +227,7 @@ app/Config/Security.php **app/Config/App.php** 中的 CSRF 配置项不再使用。 -1. 从新框架中复制 **app/Config/Security.php** 到您的 **app/Config** 目录,并进行配置。 +1. 从新框架中复制 **app/Config/Security.php** 到你的 **app/Config** 目录,并进行配置。 2. 删除 **app/Config/App.php** 中的属性(从 ``$CSRFTokenName`` 到 ``$CSRFSameSite``)。 app/Config/Session.php @@ -235,7 +235,7 @@ app/Config/Session.php **app/Config/App.php** 中的 Session 配置项不再使用。 -1. 从新框架中复制 **app/Config/Session.php** 到您的 **app/Config** 目录,并进行配置。 +1. 从新框架中复制 **app/Config/Session.php** 到你的 **app/Config** 目录,并进行配置。 2. 删除 **app/Config/App.php** 中的属性(从 ``$sessionDriver`` 到 ``$sessionDBGroup``)。 重大改进 @@ -247,14 +247,14 @@ app/Config/Session.php 项目文件 ************* -**项目空间** 中的一些文件(根目录、app、public、writable)已接收到更新。由于这些文件位于 **系统** 范围之外,它们将不会在没有您干预的情况下更改。 +**项目空间** 中的一些文件(根目录、app、public、writable)已接收到更新。由于这些文件位于 **系统** 范围之外,它们将不会在没有你干预的情况下更改。 -有一些第三方 CodeIgniter 模块可帮助您合并对项目空间的更改:[Packagist 上探索](https://packagist.org/explore/?query=codeigniter4%20updates)。 +有一些第三方 CodeIgniter 模块可帮助你合并对项目空间的更改:[Packagist 上探索](https://packagist.org/explore/?query=codeigniter4%20updates)。 内容更改 =============== -以下文件已接收到重大更改(包括弃用或视觉调整),建议您将更新后的版本与您的应用程序合并: +以下文件已接收到重大更改(包括弃用或视觉调整),建议你将更新后的版本与你的应用程序合并: 配置 ------ diff --git a/source/installation/upgrade_441.rst b/source/installation/upgrade_441.rst index f91930fa4..7b0607e68 100644 --- a/source/installation/upgrade_441.rst +++ b/source/installation/upgrade_441.rst @@ -2,7 +2,7 @@ 从 4.4.0 升级到 4.4.1 ############################# -请参考与您的安装方法相对应的升级说明。 +请参考与你的安装方法相对应的升级说明。 - :ref:`使用 Composer 安装 App Starter 升级 ` - :ref:`使用 Composer 安装将 CodeIgniter4 添加到现有项目并进行升级 ` @@ -15,7 +15,7 @@ 项目文件 ************* -**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有您的干预,它们将不会更改。 +**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有你的干预,它们将不会更改。 有一些第三方的 CodeIgniter 模块可用于帮助合并项目空间的更改:`在 Packagist 上查看 `_。 diff --git a/source/installation/upgrade_442.rst b/source/installation/upgrade_442.rst index 6f841d93d..f9a4fa4dd 100644 --- a/source/installation/upgrade_442.rst +++ b/source/installation/upgrade_442.rst @@ -2,7 +2,7 @@ 从 4.4.1 升级到 4.4.2 ############################# -请参考与您的安装方法相对应的升级说明。 +请参考与你的安装方法相对应的升级说明。 - :ref:`使用 Composer 安装 App Starter 升级 ` - :ref:`使用 Composer 安装将 CodeIgniter4 添加到现有项目并进行升级 ` @@ -15,7 +15,7 @@ 项目文件 ************* -**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有您的干预,它们将不会更改。 +**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有你的干预,它们将不会更改。 有一些第三方的 CodeIgniter 模块可用于帮助合并项目空间的更改:`在 Packagist 上查看 `_。 diff --git a/source/intro/requirements.rst b/source/intro/requirements.rst index 7a373fbc2..1e226a958 100755 --- a/source/intro/requirements.rst +++ b/source/intro/requirements.rst @@ -16,7 +16,7 @@ PHP 及所需扩展 - `mbstring `_ - `json `_ -.. warning:: PHP 7.4 的生命周期结束日期是 2022 年 11 月 28 日。如果您仍在使用 PHP 7.4,应立即升级。PHP 8.0 的生命周期结束日期将是 2023 年 11 月 26 日。 +.. warning:: PHP 7.4 的生命周期结束日期是 2022 年 11 月 28 日。如果你仍在使用 PHP 7.4,应立即升级。PHP 8.0 的生命周期结束日期将是 2023 年 11 月 26 日。 *********************** 可选的 PHP 扩展 diff --git a/source/libraries/curlrequest.rst b/source/libraries/curlrequest.rst index b26bf5269..12d6fdc52 100755 --- a/source/libraries/curlrequest.rst +++ b/source/libraries/curlrequest.rst @@ -23,11 +23,11 @@ CURLRequest 配置 .. note:: 自 v4.4.0 起,默认值已更改为 ``false``。此设置仅用于向后兼容。新用户无需更改此设置。 -如果您想在多个请求之间共享所有选项,请在 **app/Config/CURLRequest.php** 中将 ``$shareOptions`` 设置为 ``true``: +如果你想在多个请求之间共享所有选项,请在 **app/Config/CURLRequest.php** 中将 ``$shareOptions`` 设置为 ``true``: .. literalinclude:: curlrequest/001.php -如果您使用该类的实例发送多个请求,此行为可能会导致发送不必要的头部和正文的错误请求。 +如果你使用该类的实例发送多个请求,此行为可能会导致发送不必要的头部和正文的错误请求。 .. note:: 在 v4.2.0 之前,即使 ``$shareOptions`` 为 false,由于一个 bug,请求消息体也不会被重置。 @@ -225,7 +225,7 @@ http_errors 默认情况下,如果返回的 HTTP 状态码大于等于 400,CURLRequest 将抛出 ``HTTPException`` 异常。 -如果您想查看响应正文,可以将 ``http_errors`` 设置为 ``false``,以返回内容而不是抛出异常: +如果你想查看响应正文,可以将 ``http_errors`` 设置为 ``false``,以返回内容而不是抛出异常: .. literalinclude:: curlrequest/026.php @@ -255,7 +255,7 @@ proxy .. versionadded:: 4.4.0 -您可以通过将关联数组作为 ``proxy`` 选项来设置代理: +你可以通过将关联数组作为 ``proxy`` 选项来设置代理: .. literalinclude:: curlrequest/035.php diff --git a/source/libraries/pagination.rst b/source/libraries/pagination.rst index f8ca6a293..545432de0 100755 --- a/source/libraries/pagination.rst +++ b/source/libraries/pagination.rst @@ -33,17 +33,17 @@ CodeIgniter 提供了一个非常简单但灵活的分页库,它易于主题化, 自定义分页查询 ================ -要在模型中自定义分页查询,您可以在 ``paginate()`` 方法之前添加 :doc:`查询构建器 <../database/query_builder>` 方法。 +要在模型中自定义分页查询,你可以在 ``paginate()`` 方法之前添加 :doc:`查询构建器 <../database/query_builder>` 方法。 添加 WHERE ------------ -如果您想添加 WHERE 条件,可以直接指定条件: +如果你想添加 WHERE 条件,可以直接指定条件: .. literalinclude:: pagination/003.php :lines: 2- -您还可以将条件移动到单独的方法中: +你还可以将条件移动到单独的方法中: .. literalinclude:: pagination/017.php @@ -53,13 +53,13 @@ CodeIgniter 提供了一个非常简单但灵活的分页库,它易于主题化, 添加 JOIN --------- -您可以连接另一个表: +你可以连接另一个表: .. literalinclude:: pagination/016.php .. important:: 需要理解的重要一点是,``Model::paginate()`` 方法使用了 **模型** 和模型中的 **查询构建器** 实例。因此,尝试使用 ``Model::paginate()`` 与 :ref:`db-query` **不起作用**,因为 ``$db->query()`` 会立即执行查询,并且与查询构建器没有关联。 -如果您需要一个无法使用查询构建器编写的复杂 SQL 查询,请尝试使用 :ref:`db-query` 和 `手动分页`_。 +如果你需要一个无法使用查询构建器编写的复杂 SQL 查询,请尝试使用 :ref:`db-query` 和 `手动分页`_。 显示分页链接 ====================== diff --git a/source/libraries/sessions.rst b/source/libraries/sessions.rst index d045d139a..1a105a9ef 100755 --- a/source/libraries/sessions.rst +++ b/source/libraries/sessions.rst @@ -272,7 +272,7 @@ close() .. literalinclude:: sessions/044.php -您不必手动关闭 Session,PHP 会在脚本终止后自动关闭它。但是,由于 Session 数据被锁定以防止并发写入,因此一次只能有一个请求操作 Session。通过在所有对 Session 数据的更改完成后立即关闭 Session,可以提高网站性能。 +你不必手动关闭 Session,PHP 会在脚本终止后自动关闭它。但是,由于 Session 数据被锁定以防止并发写入,因此一次只能有一个请求操作 Session。通过在所有对 Session 数据的更改完成后立即关闭 Session,可以提高网站性能。 此方法的工作方式与 PHP 的 `session_write_close() `_ 函数完全相同。 @@ -293,7 +293,7 @@ destroy() 这必须是在同一请求中进行的最后一个与 Session 相关的操作。 所有 Session 数据(包括 flashdata 和 tempdata)将被永久销毁。 -.. note:: 您不必在常规代码中调用此方法。清理 Session 数据而不是销毁会话。 +.. note:: 你不必在常规代码中调用此方法。清理 Session 数据而不是销毁会话。 .. _session-stop: @@ -471,7 +471,7 @@ DatabaseHandler 驱动程序 添加主键 ^^^^^^^^^^^^^^^^^^ -**根据您的 $matchIP 设置**,您还需要添加一个主键。以下示例适用于 MySQL 和 PostgreSQL:: +**根据你的 $matchIP 设置**,你还需要添加一个主键。以下示例适用于 MySQL 和 PostgreSQL:: // 当 $matchIP = true 时 ALTER TABLE ci_sessions ADD PRIMARY KEY (id, ip_address); @@ -482,7 +482,7 @@ DatabaseHandler 驱动程序 // 删除先前创建的主键(更改设置时使用) ALTER TABLE ci_sessions DROP PRIMARY KEY; -.. important:: 如果您没有添加正确的主键, +.. important:: 如果你没有添加正确的主键, 可能会出现以下错误:: Uncaught mysqli_sql_exception: Duplicate entry 'ci_session:***' for key 'ci_sessions.PRIMARY' @@ -491,7 +491,7 @@ DatabaseHandler 驱动程序 ^^^^^^^^^^^^^^^^^^^^^^^ 默认情况下使用默认数据库组。 -您可以通过更改 **app/Config/Session.php** 文件中的 ``$DBGroup`` 属性为要使用的组的名称来更改数据库组: +你可以通过更改 **app/Config/Session.php** 文件中的 ``$DBGroup`` 属性为要使用的组的名称来更改数据库组: .. literalinclude:: sessions/040.php diff --git a/source/libraries/uri.rst b/source/libraries/uri.rst index 1375c20ac..0e543f0a3 100755 --- a/source/libraries/uri.rst +++ b/source/libraries/uri.rst @@ -14,7 +14,7 @@ CodeIgniter 提供了面向对象的方式来在你的应用中使用 URI。这 创建一个 URI 实例就像创建一个新的类实例一样简单。 -当您创建新实例时,可以在构造函数中传递完整或部分 URL,并将其解析为相应的部分: +当你创建新实例时,可以在构造函数中传递完整或部分 URL,并将其解析为相应的部分: .. literalinclude:: uri/001.php :lines: 2- @@ -24,17 +24,17 @@ CodeIgniter 提供了面向对象的方式来在你的应用中使用 URI。这 .. literalinclude:: uri/003.php :lines: 2- -自 v4.4.0 起,如果您没有传递 URL,则返回当前的 URI: +自 v4.4.0 起,如果你没有传递 URL,则返回当前的 URI: .. literalinclude:: uri/002.php :lines: 2- -.. note:: 上述代码返回 ``SiteURI`` 实例,它扩展了 ``URI`` 类。``URI`` 类用于一般的 URI,而 ``SiteURI`` 类用于您的站点 URI。 +.. note:: 上述代码返回 ``SiteURI`` 实例,它扩展了 ``URI`` 类。``URI`` 类用于一般的 URI,而 ``SiteURI`` 类用于你的站点 URI。 当前 URI --------------- -很多时候,您只需要一个表示当前请求的 URL 的对象。您可以使用 :doc:`../helpers/url_helper` 中提供的 :php:func:`current_url()` 函数: +很多时候,你只需要一个表示当前请求的 URL 的对象。你可以使用 :doc:`../helpers/url_helper` 中提供的 :php:func:`current_url()` 函数: .. literalinclude:: uri/004.php :lines: 2- @@ -43,7 +43,7 @@ CodeIgniter 提供了面向对象的方式来在你的应用中使用 URI。这 这个 URI 基于当前请求对象和你在 ``Config\App`` 中的设置(``baseURL``、``indexPage`` 和 ``forceGlobalSecureRequests``)确定的相对路径。 -假设您在一个扩展了 ``CodeIgniter\Controller`` 的控制器中,您还可以获取当前的 SiteURI 实例: +假设你在一个扩展了 ``CodeIgniter\Controller`` 的控制器中,你还可以获取当前的 SiteURI 实例: .. literalinclude:: uri/005.php :lines: 2- diff --git a/source/libraries/validation.rst b/source/libraries/validation.rst index 11aeb67d6..159036f27 100755 --- a/source/libraries/validation.rst +++ b/source/libraries/validation.rst @@ -296,7 +296,7 @@ withRequest() .. literalinclude:: validation/008.php :lines: 2- -.. warning:: 当您使用此方法时,应使用 :ref:`getValidated() ` 方法获取经过验证的数据。因为该方法从 :ref:`$request->getJSON() ` 获取 JSON 数据(当请求是 JSON 请求时,``Content-Type: application/json``),或者从 :ref:`$request->getRawInput() ` 获取原始数据(当请求是 PUT、PATCH、DELETE 请求且不是 HTML 表单提交时,``Content-Type: multipart/form-data``),或者从 :ref:`$request->getVar() ` 获取数据,并且攻击者可以更改要验证的数据。 +.. warning:: 当你使用此方法时,应使用 :ref:`getValidated() ` 方法获取经过验证的数据。因为该方法从 :ref:`$request->getJSON() ` 获取 JSON 数据(当请求是 JSON 请求时,``Content-Type: application/json``),或者从 :ref:`$request->getRawInput() ` 获取原始数据(当请求是 PUT、PATCH、DELETE 请求且不是 HTML 表单提交时,``Content-Type: multipart/form-data``),或者从 :ref:`$request->getVar() ` 获取数据,并且攻击者可以更改要验证的数据。 .. note:: 自 v4.4.0 起,可以使用 :ref:`getValidated() ` 方法。 diff --git a/source/models/entities.rst b/source/models/entities.rst index ca60e7f6f..870598278 100644 --- a/source/models/entities.rst +++ b/source/models/entities.rst @@ -104,11 +104,11 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 .. versionadded:: 4.4.0 -例如,如果您的实体的父类已经定义了一个名为 ``getParent()`` 的方法,并且您的实体还有一个名为 ``parent`` 的列,当您尝试在实体类中为 ``getParent()`` 方法添加业务逻辑时,该方法已经被定义了。 +例如,如果你的实体的父类已经定义了一个名为 ``getParent()`` 的方法,并且你的实体还有一个名为 ``parent`` 的列,当你尝试在实体类中为 ``getParent()`` 方法添加业务逻辑时,该方法已经被定义了。 -在这种情况下,您可以使用特殊的 getter/setter。而不是使用 ``getX()``/``setX()``,使用 ``_getX()``/``_setX()``。 +在这种情况下,你可以使用特殊的 getter/setter。而不是使用 ``getX()``/``setX()``,使用 ``_getX()``/``_setX()``。 -在上面的示例中,如果您的实体有一个名为 ``_getParent()`` 的方法,当您获取 ``$entity->parent`` 时将使用该方法,当您设置 ``$entity->parent`` 时将使用 ``_setParent()`` 方法。 +在上面的示例中,如果你的实体有一个名为 ``_getParent()`` 的方法,当你获取 ``$entity->parent`` 时将使用该方法,当你设置 ``$entity->parent`` 时将使用 ``_setParent()`` 方法。 ************ 数据映射 @@ -154,7 +154,7 @@ CodeIgniter 在其数据库层全面支持实体类,同时保持它们的完全 属性转换 ================ -您可以使用 ``$casts`` 属性指定实体中的属性应该转换为常见的数据类型。 +你可以使用 ``$casts`` 属性指定实体中的属性应该转换为常见的数据类型。 该选项应该是一个数组,其中键是类属性的名称,值是应该转换为的数据类型。 属性转换影响读取(获取)和写入(设置),但某些类型只影响读取(获取)。 diff --git a/source/models/model.rst b/source/models/model.rst index aa44fc738..e2ae53c63 100644 --- a/source/models/model.rst +++ b/source/models/model.rst @@ -400,7 +400,7 @@ purgeDeleted() .. literalinclude:: model/027.php -如果您更喜欢在验证配置文件中组织您的规则和错误消息,您可以这样做,并将 ``$validationRules`` 设置为您创建的验证规则组的名称: +如果你更喜欢在验证配置文件中组织你的规则和错误消息,你可以这样做,并将 ``$validationRules`` 设置为你创建的验证规则组的名称: .. literalinclude:: model/034.php @@ -457,14 +457,14 @@ purgeDeleted() 获取验证结果 ------------------------- -现在,每当您调用 ``insert()``、``update()`` 或 ``save()`` 方法时,数据将被验证。如果验证失败,模型将返回布尔值 **false**。 +现在,每当你调用 ``insert()``、``update()`` 或 ``save()`` 方法时,数据将被验证。如果验证失败,模型将返回布尔值 **false**。 .. _model-getting-validation-errors: 获取验证错误 ------------------------- -您可以使用 ``errors()`` 方法来检索验证错误: +你可以使用 ``errors()`` 方法来检索验证错误: .. literalinclude:: model/032.php @@ -494,7 +494,7 @@ purgeDeleted() .. literalinclude:: model/038.php -.. note:: 自 v4.3.5 起,您必须为占位符字段(``id``)设置验证规则。 +.. note:: 自 v4.3.5 起,你必须为占位符字段(``id``)设置验证规则。 在这组规则中,它说明电子邮件地址在数据库中应该是唯一的,除了具有与占位符的值匹配的 id 的行。假设表单 POST 数据如下: diff --git a/source/outgoing/table.rst b/source/outgoing/table.rst index 90d4c54b0..8a1dc70c1 100644 --- a/source/outgoing/table.rst +++ b/source/outgoing/table.rst @@ -62,13 +62,13 @@ Table 类允许你设置一个表格模板来指定布局设计。下面是模 .. versionadded:: 4.4.0 -``setSyncRowsWithHeading(true)`` 方法使得每个数据值都放置在与 ``setHeading()`` 中定义的相同列中,如果参数使用了关联数组。这在处理通过 REST API 加载的数据时特别有用,因为其顺序可能不符合您的要求,或者如果 API 返回了过多的数据。 +``setSyncRowsWithHeading(true)`` 方法使得每个数据值都放置在与 ``setHeading()`` 中定义的相同列中,如果参数使用了关联数组。这在处理通过 REST API 加载的数据时特别有用,因为其顺序可能不符合你的要求,或者如果 API 返回了过多的数据。 如果数据行包含一个在标题中不存在的键,则其值将被过滤。相反,如果数据行中没有列在标题中列出的键,则会在其位置放置一个空单元格。 .. literalinclude:: table/019.php -.. important:: 您必须在通过 ``addRow([...])`` 添加任何行之前调用 ``setSyncRowsWithHeading(true)`` 和 ``setHeading([...])``,以进行列的重新排列。 +.. important:: 你必须在通过 ``addRow([...])`` 添加任何行之前调用 ``setSyncRowsWithHeading(true)`` 和 ``setHeading([...])``,以进行列的重新排列。 使用数组作为 ``generate()`` 的输入会产生相同的结果: diff --git a/source/outgoing/view_cells.rst b/source/outgoing/view_cells.rst index 98fb0ce62..8a0935cf5 100644 --- a/source/outgoing/view_cells.rst +++ b/source/outgoing/view_cells.rst @@ -2,9 +2,9 @@ 视图单元 ########## -许多应用程序都有一些小的视图片段,可以在页面之间重复使用,或者在页面的不同位置使用。这些通常是帮助框、导航控件、广告、登录表单等。CodeIgniter 允许您将这些呈现块的逻辑封装在视图单元中。它们基本上是可以包含在其他视图中的小视图。它们可以内置逻辑来处理任何特定于单元的显示逻辑。它们可以通过将每个单元的逻辑分离到自己的类中,使您的视图更易读和可维护。 +许多应用程序都有一些小的视图片段,可以在页面之间重复使用,或者在页面的不同位置使用。这些通常是帮助框、导航控件、广告、登录表单等。CodeIgniter 允许你将这些呈现块的逻辑封装在视图单元中。它们基本上是可以包含在其他视图中的小视图。它们可以内置逻辑来处理任何特定于单元的显示逻辑。它们可以通过将每个单元的逻辑分离到自己的类中,使你的视图更易读和可维护。 -CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。简单单元可以从您选择的任何类和方法生成,并且不必遵循任何规则,只需返回一个字符串即可。受控单元必须从扩展 ``Codeigniter\View\Cells\Cell`` 类的类生成,该类提供了额外的功能,使您的视图单元更加灵活和快速。 +CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。简单单元可以从你选择的任何类和方法生成,并且不必遵循任何规则,只需返回一个字符串即可。受控单元必须从扩展 ``Codeigniter\View\Cells\Cell`` 类的类生成,该类提供了额外的功能,使你的视图单元更加灵活和快速。 .. contents:: :local: @@ -16,7 +16,7 @@ CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。 调用视图单元 ******************* -无论您使用哪种类型的视图单元,都可以使用 ``view_cell()`` 辅助函数从任何视图中调用它。 +无论你使用哪种类型的视图单元,都可以使用 ``view_cell()`` 辅助函数从任何视图中调用它。 第一个参数是要调用的类和方法的名称,第二个参数是要传递给方法的参数数组: @@ -29,14 +29,14 @@ CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。 .. versionadded:: 4.3.0 -如果您没有包含类的完整命名空间,它将假定可以在 ``App\Cells`` 命名空间中找到。因此,以下示例将尝试在 **app/Cells/MyClass.php** 中查找 ``MyClass`` 类。如果在那里找不到,将扫描所有命名空间,直到找到为止,在每个命名空间的 **Cells** 子目录中搜索: +如果你没有包含类的完整命名空间,它将假定可以在 ``App\Cells`` 命名空间中找到。因此,以下示例将尝试在 **app/Cells/MyClass.php** 中查找 ``MyClass`` 类。如果在那里找不到,将扫描所有命名空间,直到找到为止,在每个命名空间的 **Cells** 子目录中搜索: .. literalinclude:: view_cells/002.php 将参数作为键/值字符串传递 ====================================== -您还可以将参数作为键/值字符串传递: +你还可以将参数作为键/值字符串传递: .. literalinclude:: view_cells/003.php @@ -48,12 +48,12 @@ CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。 .. literalinclude:: view_cells/004.php -您可以在视图中这样调用它: +你可以在视图中这样调用它: .. literalinclude:: view_cells/005.php -此外,您可以使用与方法中的参数变量匹配的参数名称以提高可读性。 -当您以这种方式使用时,视图单元调用中必须始终指定所有参数: +此外,你可以使用与方法中的参数变量匹配的参数名称以提高可读性。 +当你以这种方式使用时,视图单元调用中必须始终指定所有参数: .. literalinclude:: view_cells/006.php @@ -67,14 +67,14 @@ CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。 .. versionadded:: 4.3.0 -受控单元有两个主要目标:尽可能快地构建单元,并为视图提供额外的逻辑和灵活性(如果需要)。该类必须扩展 ``CodeIgniter\View\Cells\Cell``。它们应该在同一文件夹中有一个视图文件。按照惯例,类名应为 PascalCase,后缀为 ``Cell``,视图应为类名的 snake_case 版本,不包括后缀。例如,如果您有一个 ``MyCell`` 类,视图文件应为 ``my.php``。 +受控单元有两个主要目标:尽可能快地构建单元,并为视图提供额外的逻辑和灵活性(如果需要)。该类必须扩展 ``CodeIgniter\View\Cells\Cell``。它们应该在同一文件夹中有一个视图文件。按照惯例,类名应为 PascalCase,后缀为 ``Cell``,视图应为类名的 snake_case 版本,不包括后缀。例如,如果你有一个 ``MyCell`` 类,视图文件应为 ``my.php``。 .. note:: 在 v4.3.5 之前,生成的视图文件以 ``_cell.php`` 结尾。尽管 v4.3.5 及更高版本将生成不带 ``_cell`` 后缀的视图文件,但现有的视图文件仍将被定位和加载。 创建受控单元 ========================== -在类中实现的最基本的级别上,您只需要实现公共属性。这些属性将自动提供给视图文件。将上面的 AlertMessage 实现为受控单元将如下所示: +在类中实现的最基本的级别上,你只需要实现公共属性。这些属性将自动提供给视图文件。将上面的 AlertMessage 实现为受控单元将如下所示: .. literalinclude:: view_cells/008.php @@ -87,7 +87,7 @@ CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。 通过命令生成单元 =========================== -您还可以通过 CLI 中的内置命令创建受控单元。该命令是 ``php spark make:cell``。它接受一个参数,要创建的单元的名称。名称应为 PascalCase,类将在 **app/Cells** 目录中创建。视图文件也将在 **app/Cells** 目录中创建。 +你还可以通过 CLI 中的内置命令创建受控单元。该命令是 ``php spark make:cell``。它接受一个参数,要创建的单元的名称。名称应为 PascalCase,类将在 **app/Cells** 目录中创建。视图文件也将在 **app/Cells** 目录中创建。 .. code-block:: console @@ -96,21 +96,21 @@ CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。 使用不同的视图 ====================== -您可以通过在类中设置 ``view`` 属性来指定自定义视图名称。视图将像正常情况下一样被定位: +你可以通过在类中设置 ``view`` 属性来指定自定义视图名称。视图将像正常情况下一样被定位: .. literalinclude:: view_cells/011.php 自定义渲染 ======================= -如果您需要更多控制HTML的渲染过程,可以实现一个 ``render()`` 方法。该方法允许您执行其他逻辑并向视图传递额外的数据(如果需要)。``render()`` 方法必须返回一个字符串。为了充分利用受控单元的全部功能,您应该使用 ``$this->view()`` 而不是普通的 ``view()`` 辅助函数: +如果你需要更多控制HTML的渲染过程,可以实现一个 ``render()`` 方法。该方法允许你执行其他逻辑并向视图传递额外的数据(如果需要)。``render()`` 方法必须返回一个字符串。为了充分利用受控单元的全部功能,你应该使用 ``$this->view()`` 而不是普通的 ``view()`` 辅助函数: .. literalinclude:: view_cells/012.php 计算属性 =================== -如果您需要为一个或多个属性执行其他逻辑,可以使用计算属性。这需要将属性设置为 ``protected`` 或 ``private``,并实现一个公共方法,该方法的名称由属性名称包围 ``get`` 和 ``Property`` 组成: +如果你需要为一个或多个属性执行其他逻辑,可以使用计算属性。这需要将属性设置为 ``protected`` 或 ``private``,并实现一个公共方法,该方法的名称由属性名称包围 ``get`` 和 ``Property`` 组成: .. literalinclude:: view_cells/013.php @@ -123,7 +123,7 @@ CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。 演示方法 ==================== -有时您需要为视图执行其他逻辑,但不想将其作为参数传递。您可以实现一个在单元的视图内部调用的方法。这可以提高视图的可读性: +有时你需要为视图执行其他逻辑,但不想将其作为参数传递。你可以实现一个在单元的视图内部调用的方法。这可以提高视图的可读性: .. literalinclude:: view_cells/016.php @@ -132,11 +132,11 @@ CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。 执行设置逻辑 ====================== -如果您需要在渲染视图之前执行其他逻辑,可以实现一个 ``mount()`` 方法。该方法将在类实例化后立即调用,并可用于设置其他属性或执行其他逻辑: +如果你需要在渲染视图之前执行其他逻辑,可以实现一个 ``mount()`` 方法。该方法将在类实例化后立即调用,并可用于设置其他属性或执行其他逻辑: .. literalinclude:: view_cells/018.php -您可以通过将它们作为数组传递给 ``view_cell()`` 辅助函数来将其他参数传递给 ``mount()`` 方法。任何与 ``mount()`` 方法的参数名称匹配的参数将被传递进去: +你可以通过将它们作为数组传递给 ``view_cell()`` 辅助函数来将其他参数传递给 ``mount()`` 方法。任何与 ``mount()`` 方法的参数名称匹配的参数将被传递进去: .. literalinclude:: view_cells/019.php @@ -146,10 +146,10 @@ CodeIgniter 支持两种类型的视图单元:简单单元和受控单元。 单元缓存 ************ -您可以通过将要缓存数据的秒数作为第三个参数传递来缓存视图单元调用的结果。这将使用当前配置的缓存引擎: +你可以通过将要缓存数据的秒数作为第三个参数传递来缓存视图单元调用的结果。这将使用当前配置的缓存引擎: .. literalinclude:: view_cells/021.php -如果需要,您可以提供一个自定义名称,而不是自动生成的名称,通过将新名称作为第四个参数传递: +如果需要,你可以提供一个自定义名称,而不是自动生成的名称,通过将新名称作为第四个参数传递: .. literalinclude:: view_cells/022.php diff --git a/source/outgoing/view_parser.rst b/source/outgoing/view_parser.rst index eaa4b7098..afb899846 100644 --- a/source/outgoing/view_parser.rst +++ b/source/outgoing/view_parser.rst @@ -356,7 +356,7 @@ upper 将字符串显示为全部大写。 自定义过滤器 -------------- -您可以通过编辑 **app/Config/View.php** 并向 ``$filters`` 数组中添加新条目来轻松创建自己的过滤器。每个键是视图中调用过滤器的名称,其值是任何有效的 PHP 可调用对象: +你可以通过编辑 **app/Config/View.php** 并向 ``$filters`` 数组中添加新条目来轻松创建自己的过滤器。每个键是视图中调用过滤器的名称,其值是任何有效的 PHP 可调用对象: .. literalinclude:: view_parser/012.php diff --git a/source/testing/debugging.rst b/source/testing/debugging.rst index 9c6ea551b..b8aa7c622 100644 --- a/source/testing/debugging.rst +++ b/source/testing/debugging.rst @@ -149,10 +149,10 @@ CodeIgniter 带有以下收集器: .. versionadded:: 4.4.0 -调试工具栏包含一个名为热重载的功能,它允许您对应用程序的代码进行更改,并在浏览器中自动重新加载,而无需刷新页面。这在开发过程中非常省时。 +调试工具栏包含一个名为热重载的功能,它允许你对应用程序的代码进行更改,并在浏览器中自动重新加载,而无需刷新页面。这在开发过程中非常省时。 -在开发过程中启用热重载,您可以点击工具栏左侧的按钮,它看起来像一个刷新图标。这将在所有页面上启用热重载,直到您禁用它。 +在开发过程中启用热重载,你可以点击工具栏左侧的按钮,它看起来像一个刷新图标。这将在所有页面上启用热重载,直到你禁用它。 -热重载通过每秒扫描 **app** 目录中的文件并查找更改来工作。如果发现任何更改,它将向浏览器发送消息以重新加载页面。它不会扫描任何其他目录,因此如果您对 **app** 目录之外的文件进行更改,您需要手动刷新页面。 +热重载通过每秒扫描 **app** 目录中的文件并查找更改来工作。如果发现任何更改,它将向浏览器发送消息以重新加载页面。它不会扫描任何其他目录,因此如果你对 **app** 目录之外的文件进行更改,你需要手动刷新页面。 -如果您需要监视 **app** 目录之外的文件,或者由于项目的大小而导致速度较慢,您可以在 **app/Config/Toolbar.php** 配置文件的 ``$watchedDirectories`` 和 ``$watchedExtensions`` 属性中指定要扫描的目录和文件扩展名。 +如果你需要监视 **app** 目录之外的文件,或者由于项目的大小而导致速度较慢,你可以在 **app/Config/Toolbar.php** 配置文件的 ``$watchedDirectories`` 和 ``$watchedExtensions`` 属性中指定要扫描的目录和文件扩展名。 diff --git a/source/testing/feature.rst b/source/testing/feature.rst index 3fffd44bb..7678f559f 100644 --- a/source/testing/feature.rst +++ b/source/testing/feature.rst @@ -20,12 +20,12 @@ HTTP 功能测试 请求页面 ================= -基本上,功能测试允许您调用应用程序上的一个端点,并获取结果返回。 -为此,您可以使用 ``call()`` 方法。 +基本上,功能测试允许你调用应用程序上的一个端点,并获取结果返回。 +为此,你可以使用 ``call()`` 方法。 1. 第一个参数是要使用的 HTTP 方法(通常是 GET 或 POST)。 2. 第二个参数是要测试的站点上的 URI 路径。 -3. 第三个参数 ``$params`` 接受一个数组,用于填充您正在使用的 HTTP 动词的超全局变量。因此,**GET** 方法将填充 **$_GET** 变量,而 **POST** 请求将填充 **$_POST** 数组。``$params`` 也用于 :ref:`feature-formatting-the-request`。 +3. 第三个参数 ``$params`` 接受一个数组,用于填充你正在使用的 HTTP 动词的超全局变量。因此,**GET** 方法将填充 **$_GET** 变量,而 **POST** 请求将填充 **$_POST** 数组。``$params`` 也用于 :ref:`feature-formatting-the-request`。 .. note:: ``$params`` 数组并不适用于每个 HTTP 动词,但为了保持一致性而包含在内。 @@ -73,8 +73,8 @@ HTTP 功能测试 格式化请求 ----------------------- -您可以使用 ``withBodyFormat()`` 方法设置请求体的格式。目前支持 ``json`` 或 ``xml``。 -这在测试 JSON 或 XML API 时非常有用,因为您可以设置请求的格式,以符合控制器的预期。 +你可以使用 ``withBodyFormat()`` 方法设置请求体的格式。目前支持 ``json`` 或 ``xml``。 +这在测试 JSON 或 XML API 时非常有用,因为你可以设置请求的格式,以符合控制器的预期。 这将接收传递给 ``call()``, ``post()``, ``get()``... 的参数,并将它们分配给请求体,以给定的格式。 @@ -87,9 +87,9 @@ HTTP 功能测试 设置 Body ---------------- -您可以使用 ``withBody()`` 方法设置请求的 Body。这允许您按照所需的格式设置请求 Body。如果您有更复杂的 XML 需要测试,建议使用此方法。 +你可以使用 ``withBody()`` 方法设置请求的 Body。这允许你按照所需的格式设置请求 Body。如果你有更复杂的 XML 需要测试,建议使用此方法。 -这不会为您设置 `Content-Type` 标头。如果需要,您可以使用 ``withHeaders()`` 方法设置它。 +这不会为你设置 `Content-Type` 标头。如果需要,你可以使用 ``withHeaders()`` 方法设置它。 检查响应 ===================== diff --git a/source/testing/overview.rst b/source/testing/overview.rst index 19737f159..90a1a718d 100644 --- a/source/testing/overview.rst +++ b/source/testing/overview.rst @@ -210,7 +210,7 @@ Services::reset() 你也可以使用 ``CIUnitTestCase`` 提供的 ``$this->resetServices()`` 方法。 -.. note:: 此方法会重置所有服务的状态,并且 ``RouteCollection`` 将不包含任何路由。如果您想要使用加载的路由,您需要调用 ``loadRoutes()`` 方法,例如 ``Services::routes()->loadRoutes()``。 +.. note:: 此方法会重置所有服务的状态,并且 ``RouteCollection`` 将不包含任何路由。如果你想要使用加载的路由,你需要调用 ``loadRoutes()`` 方法,例如 ``Services::routes()->loadRoutes()``。 Services::resetSingle(string $name) ----------------------------------- diff --git a/source/tutorial/create_news_items.rst b/source/tutorial/create_news_items.rst index bb95bd64a..cfa18ea32 100755 --- a/source/tutorial/create_news_items.rst +++ b/source/tutorial/create_news_items.rst @@ -26,7 +26,7 @@ 添加路由规则 ******************** -在您开始向 CodeIgniter 应用程序中添加新闻项目之前,您需要在 **app/Config/Routes.php** 文件中添加一个额外的规则。确保您的文件包含以下内容: +在你开始向 CodeIgniter 应用程序中添加新闻项目之前,你需要在 **app/Config/Routes.php** 文件中添加一个额外的规则。确保你的文件包含以下内容: .. literalinclude:: create_news_items/004.php @@ -34,7 +34,7 @@ ``$routes->post()`` 行定义了一个 POST 请求的路由器。它仅匹配 URI 路径 **/news** 的 POST 请求,并映射到 ``News`` 类的 ``create()`` 方法。 -您可以在 :ref:`defined-route-routing` 中了解更多关于不同路由类型的信息。 +你可以在 :ref:`defined-route-routing` 中了解更多关于不同路由类型的信息。 创建表单 ************* @@ -62,12 +62,12 @@ News 控制器 =============== -返回到您的 ``News`` 控制器。 +返回到你的 ``News`` 控制器。 添加 News::new() 方法以显示表单 ----------------------------------- -首先,创建一个方法来显示您创建的 HTML 表单。 +首先,创建一个方法来显示你创建的 HTML 表单。 .. literalinclude:: create_news_items/002.php @@ -80,7 +80,7 @@ News 控制器 接下来,创建一个方法来根据提交的数据创建新闻项目。 -在这里,您将完成三件事: +在这里,你将完成三件事: 1. 检查提交的数据是否通过了验证规则。 2. 将新闻项目保存到数据库中。 @@ -93,9 +93,9 @@ News 控制器 验证数据 ^^^^^^^^^^^^^^^^^ -您将使用控制器提供的辅助函数 :ref:`validate() ` 来验证提交的数据。 +你将使用控制器提供的辅助函数 :ref:`validate() ` 来验证提交的数据。 在这种情况下,标题和正文字段是必填的,并且有特定的长度要求。 -CodeIgniter 提供了一个强大的验证库,如上所示。您可以阅读更多关于 :doc:`验证库 <../libraries/validation>` 的信息。 +CodeIgniter 提供了一个强大的验证库,如上所示。你可以阅读更多关于 :doc:`验证库 <../libraries/validation>` 的信息。 如果验证失败,我们调用刚刚创建的 ``new()`` 方法并返回 HTML 表单。 @@ -155,7 +155,7 @@ CodeIgniter 提供了一个强大的验证库,如上所示。您可以阅读 你刚刚完成了你的第一个 CodeIgniter4 应用程序! -下面的图表显示了您的项目的 **app** 文件夹,其中包含您创建或修改的所有文件。 +下面的图表显示了你的项目的 **app** 文件夹,其中包含你创建或修改的所有文件。 .. code-block:: none diff --git a/source/tutorial/news_section.rst b/source/tutorial/news_section.rst index eaa5b1129..4080c829b 100755 --- a/source/tutorial/news_section.rst +++ b/source/tutorial/news_section.rst @@ -82,7 +82,7 @@ CodeIgniter 安装假定你已经按 :ref:`要求 `。 -首先,您需要设置路由规则来处理静态页面。 +首先,你需要设置路由规则来处理静态页面。 设置路由规则 ********************* @@ -38,7 +38,7 @@ CodeIgniter 从上到下读取其路由规则,并将请求路由到第一个 让我们制作第一个控制器 ******************************* -接下来,您需要设置一个 **控制器** 来处理静态页面。控制器只是一个帮助委派工作的类,它是您的 Web 应用程序的粘合剂。 +接下来,你需要设置一个 **控制器** 来处理静态页面。控制器只是一个帮助委派工作的类,它是你的 Web 应用程序的粘合剂。 创建 Pages 控制器 ======================= From 493ff474ebbabe8a59d9ca0cc07bd8539326577d Mon Sep 17 00:00:00 2001 From: Hex Date: Fri, 27 Oct 2023 23:17:30 +0800 Subject: [PATCH 5/5] update --- source/changelogs/v4.3.7.rst | 4 ++-- source/changelogs/v4.4.0.rst | 2 +- source/database/configuration.rst | 2 +- source/installation/upgrade_437.rst | 2 +- source/installation/upgrade_438.rst | 2 +- source/installation/upgrade_440.rst | 2 +- source/installation/upgrade_441.rst | 2 +- source/installation/upgrade_442.rst | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/source/changelogs/v4.3.7.rst b/source/changelogs/v4.3.7.rst index beaeebd54..661392fe5 100644 --- a/source/changelogs/v4.3.7.rst +++ b/source/changelogs/v4.3.7.rst @@ -15,7 +15,7 @@ - **路由集合 (RouteCollection):** 在 ``RouteCollection::getRoutes()`` 方法中添加了第二个参数 ``bool $includeWildcard = true``。 - **AutoRouting Legacy:** ``AutoRouter::__construct()`` 的第一个参数从 ``$protectedControllers`` 更改为 ``$cliRoutes``。 - **FeatureTestTrait:** 当使用 :ref:`withBodyFormat() ` 时,请求正文的优先级已更改。详情请参考 :ref:`升级指南 `。 -- **验证 (Validation):** ``Validation::loadRuleGroup()`` 的返回值从“**规则数组**” 更改为“**规则数组**和**自定义错误数组**的**数组**” (``[rules, customErrors]``)。 +- **验证 (Validation):** ``Validation::loadRuleGroup()`` 的返回值从“**规则数组**”更改为“**规则数组** 和* *自定义错误数组** 的 **数组**” (``[rules, customErrors]``)。 变更 ******* @@ -25,6 +25,6 @@ 已修复的错误 ************ -- **自动路由遗留功能:** 修复了一个问题,当你使用``$routes->add()``添加路由时,控制器的其他方法在Web浏览器中无法访问。 +- **自动路由遗留功能:** 修复了一个问题,当你使用 ``$routes->add()`` 添加路由时,控制器的其他方法在Web浏览器中无法访问。 请查看仓库的 `CHANGELOG.md `_ 以获取已修复错误的完整列表。 diff --git a/source/changelogs/v4.4.0.rst b/source/changelogs/v4.4.0.rst index 2657d7fae..77a2b8672 100644 --- a/source/changelogs/v4.4.0.rst +++ b/source/changelogs/v4.4.0.rst @@ -55,7 +55,7 @@ URI::setSegment() 和不存在的段 如果你错误地传递了一个不存在的类名,之前的版本会返回 ``App`` 或 ``Config`` 命名空间中的类实例,因为存在 ``preferApp`` 功能。 -例如,在控制器(``namespace App\Controllers``)中,如果你错误地调用了 ``config(Config\App::class)``(注意类名缺少前导的 ``\``),实际上传递的是 ``App\Controllers\Config\App``。 +例如,在控制器(``namespace App\Controllers``)中,如果你错误地调用了 ``config(Config\App::class)`` (注意类名缺少前导的 ``\``),实际上传递的是 ``App\Controllers\Config\App``。 但是该类不存在,因此 Factories 现在将返回 ``null``。 属性名称 diff --git a/source/database/configuration.rst b/source/database/configuration.rst index 5ca8b5760..dcdd9237a 100755 --- a/source/database/configuration.rst +++ b/source/database/configuration.rst @@ -144,7 +144,7 @@ DSN * ``ssl_verify`` - true/false; 是否验证服务器证书 (``MySQLi`` 仅) **compress** 是否使用客户端压缩(``MySQLi`` 仅)。 **strictOn** true/false (布尔值)- 是否强制“严格模式”连接,有助于开发应用程序时确保严格的 SQL (``MySQLi`` 仅)。 -**port** 数据库端口号 - 默认端口为空字符串 ``''``(或使用 ``SQLSRV`` 动态端口)。 +**port** 数据库端口号 - 默认端口为空字符串 ``''`` (或使用 ``SQLSRV`` 动态端口)。 **foreignKeys** true/false (布尔值)- 是否启用外键约束(``SQLite3`` 仅)。 .. important:: SQLite3 外键约束默认关闭。 diff --git a/source/installation/upgrade_437.rst b/source/installation/upgrade_437.rst index ff8401ac6..222366875 100644 --- a/source/installation/upgrade_437.rst +++ b/source/installation/upgrade_437.rst @@ -48,7 +48,7 @@ Validation::loadRuleGroup() 的返回值 项目文件 ************* -**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **系统** 范围之外,因此不会在没有你干预的情况下进行更改。 +**项目空间** (根目录、app、public、writable) 中的一些文件已经更新。由于这些文件位于 **system** 范围之外,因此不会在没有你干预的情况下进行更改。 有一些第三方 CodeIgniter 模块可用于帮助合并对项目空间的更改:`在 Packagist 上查看 `_。 diff --git a/source/installation/upgrade_438.rst b/source/installation/upgrade_438.rst index 2c0a00953..8b8fa5632 100644 --- a/source/installation/upgrade_438.rst +++ b/source/installation/upgrade_438.rst @@ -15,7 +15,7 @@ 项目文件 ************* -**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,因此不会在没有你干预的情况下进行更改。 +**项目空间** (根目录、app、public、writable) 中的一些文件已经更新。由于这些文件位于 **system** 范围之外,因此不会在没有你干预的情况下进行更改。 有一些第三方 CodeIgniter 模块可用于帮助合并对项目空间的更改:`在 Packagist 上查看 `_。 diff --git a/source/installation/upgrade_440.rst b/source/installation/upgrade_440.rst index d6ab9811a..2c5a03a40 100644 --- a/source/installation/upgrade_440.rst +++ b/source/installation/upgrade_440.rst @@ -247,7 +247,7 @@ app/Config/Session.php 项目文件 ************* -**项目空间** 中的一些文件(根目录、app、public、writable)已接收到更新。由于这些文件位于 **系统** 范围之外,它们将不会在没有你干预的情况下更改。 +**项目空间** 中的一些文件(根目录、app、public、writable)已接收到更新。由于这些文件位于 **system** 范围之外,它们将不会在没有你干预的情况下更改。 有一些第三方 CodeIgniter 模块可帮助你合并对项目空间的更改:[Packagist 上探索](https://packagist.org/explore/?query=codeigniter4%20updates)。 diff --git a/source/installation/upgrade_441.rst b/source/installation/upgrade_441.rst index 7b0607e68..8a3d0417c 100644 --- a/source/installation/upgrade_441.rst +++ b/source/installation/upgrade_441.rst @@ -15,7 +15,7 @@ 项目文件 ************* -**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有你的干预,它们将不会更改。 +**项目空间** (根目录、app、public、writable) 中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有你的干预,它们将不会更改。 有一些第三方的 CodeIgniter 模块可用于帮助合并项目空间的更改:`在 Packagist 上查看 `_。 diff --git a/source/installation/upgrade_442.rst b/source/installation/upgrade_442.rst index f9a4fa4dd..87e5c3ac7 100644 --- a/source/installation/upgrade_442.rst +++ b/source/installation/upgrade_442.rst @@ -15,7 +15,7 @@ 项目文件 ************* -**项目空间**(根目录、app、public、writable)中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有你的干预,它们将不会更改。 +**项目空间** (根目录、app、public、writable) 中的一些文件已经更新。由于这些文件位于 **system** 范围之外,如果没有你的干预,它们将不会更改。 有一些第三方的 CodeIgniter 模块可用于帮助合并项目空间的更改:`在 Packagist 上查看 `_。