From 35c89aaff0b9c221bf6a8ede5c84fef96d88c019 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 19:12:52 -0600
Subject: [PATCH 001/191] reverting back to true/false
---
.github/workflows/deploy-documents.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index 1708e6d0d..7da7ab99c 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -25,7 +25,7 @@ jobs:
if [[ "${{ github.event_name }}" == "push" || ( "${{ github.event_name }}" == "create" && "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX ) ]]; then
RESULT="true"
else
- RESULT="true"
+ RESULT="false"
fi
echo "result=$RESULT" >> $GITHUB_OUTPUT
From 3961e8814a7ebfade3434078389697eb1f4437e5 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 19:14:00 -0600
Subject: [PATCH 002/191] debugging code
---
.github/workflows/deploy-documents.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index 7da7ab99c..a9381ac41 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -29,6 +29,7 @@ jobs:
fi
echo "result=$RESULT" >> $GITHUB_OUTPUT
+ echo "Deploy documents: $RESULT"
publish:
runs-on: ubuntu-latest
From 555543ba7609c5b095a3bf639408c371e3e76605 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 19:14:37 -0600
Subject: [PATCH 003/191] correcting variable
---
.github/workflows/deploy-documents.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index a9381ac41..e2e9856e4 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -34,7 +34,7 @@ jobs:
publish:
runs-on: ubuntu-latest
needs: pre-publish
- if: needs.publish-determination.outputs.result == 'true'
+ if: needs.pre-publish.outputs.result == 'true'
steps:
- name: Checkout repository
From 1d20337041cf09cd2c0db9e9b583a2f2c679dab2 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 20:00:32 -0600
Subject: [PATCH 004/191] again correcting version
---
.github/workflows/deploy-documents.yml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index e2e9856e4..121cd4921 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -55,12 +55,13 @@ jobs:
- name: Determine versioning parameters
id: determine-versioning
- run: echo "data={"version":"5.4.0", "alias"="latest"}" >> $GITHUB_OUTPUT
+ run: echo "data={"version":"5.4", "alias"="latest"}" >> $GITHUB_OUTPUT
- name: Deploy
if: fromJson(steps.determine-versioning.outputs.data).version != null
run: |
- # Publishing implies creating a git commit on the gh-pages branch, we let @ArduinoBot own these commits.
+ # Publishing implies creating a git commit on the production branch,
+ # we let @phalconbot own these commits.
git config --global user.email "deploy@phalcon.io"
git config --global user.name "Phalcon Team Deploy Bot"
git fetch --no-tags --prune --depth=1 origin +refs/heads/production:refs/remotes/origin/production
From 06a8e86cf8a39f39c6f4502e2777963c2f893947 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 20:02:15 -0600
Subject: [PATCH 005/191] correcting json set
---
.github/workflows/deploy-documents.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index 121cd4921..af507c5d6 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -55,7 +55,7 @@ jobs:
- name: Determine versioning parameters
id: determine-versioning
- run: echo "data={"version":"5.4", "alias"="latest"}" >> $GITHUB_OUTPUT
+ run: echo "data={"version":"5.4", "alias":"latest"}" >> $GITHUB_OUTPUT
- name: Deploy
if: fromJson(steps.determine-versioning.outputs.data).version != null
From 1b88bf6484430ab492ad98957104954a2ee656b5 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 20:04:17 -0600
Subject: [PATCH 006/191] correcting escape chars in json
---
.github/workflows/deploy-documents.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index af507c5d6..a06ed8c64 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -55,7 +55,7 @@ jobs:
- name: Determine versioning parameters
id: determine-versioning
- run: echo "data={"version":"5.4", "alias":"latest"}" >> $GITHUB_OUTPUT
+ run: echo 'data={"version":"5.4", "alias":"latest"}' >> $GITHUB_OUTPUT
- name: Deploy
if: fromJson(steps.determine-versioning.outputs.data).version != null
From 48a1258be48d0eb3e37d8dcb063c798763a12503 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 20:06:05 -0600
Subject: [PATCH 007/191] correcting mike command
---
.github/workflows/deploy-documents.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index a06ed8c64..cad0d68e3 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -65,7 +65,7 @@ jobs:
git config --global user.email "deploy@phalcon.io"
git config --global user.name "Phalcon Team Deploy Bot"
git fetch --no-tags --prune --depth=1 origin +refs/heads/production:refs/remotes/origin/production
- poetry run mike deploy \
+ mike deploy \
--update-aliases \
--push \
--remote origin \
From 988e3a28649ece0cccdcc1579e4d9e578385498b Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 20:14:59 -0600
Subject: [PATCH 008/191] trying deploy as me
---
.github/workflows/deploy-documents.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index cad0d68e3..2145dd06a 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -62,7 +62,7 @@ jobs:
run: |
# Publishing implies creating a git commit on the production branch,
# we let @phalconbot own these commits.
- git config --global user.email "deploy@phalcon.io"
+ git config --global user.email "nikos@niden.net"
git config --global user.name "Phalcon Team Deploy Bot"
git fetch --no-tags --prune --depth=1 origin +refs/heads/production:refs/remotes/origin/production
mike deploy \
From 50a2bd55361758f086fa388397e42818dad082fa Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 20:18:53 -0600
Subject: [PATCH 009/191] changing the gh user
---
.github/workflows/deploy-documents.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index 2145dd06a..5d9ceabcd 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -62,8 +62,8 @@ jobs:
run: |
# Publishing implies creating a git commit on the production branch,
# we let @phalconbot own these commits.
- git config --global user.email "nikos@niden.net"
- git config --global user.name "Phalcon Team Deploy Bot"
+ git config user.name github-actions
+ git config user.email github-actions@github.com
git fetch --no-tags --prune --depth=1 origin +refs/heads/production:refs/remotes/origin/production
mike deploy \
--update-aliases \
From 0b62994311342108cdc9455511de49f76cd7d3f4 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 20:26:27 -0600
Subject: [PATCH 010/191] trying to commit as me again
---
.github/workflows/deploy-documents.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index 5d9ceabcd..a7923a7a9 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -62,8 +62,8 @@ jobs:
run: |
# Publishing implies creating a git commit on the production branch,
# we let @phalconbot own these commits.
- git config user.name github-actions
- git config user.email github-actions@github.com
+ git config user.name niden
+ git config user.email nikos@niden.net
git fetch --no-tags --prune --depth=1 origin +refs/heads/production:refs/remotes/origin/production
mike deploy \
--update-aliases \
From d1b6a65085def4dc3fa0722aaa7b7fd3f36036e1 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 16 Dec 2023 20:29:51 -0600
Subject: [PATCH 011/191] changing branch name
---
.github/workflows/deploy-documents.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index a7923a7a9..8d3357e52 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -64,7 +64,7 @@ jobs:
# we let @phalconbot own these commits.
git config user.name niden
git config user.email nikos@niden.net
- git fetch --no-tags --prune --depth=1 origin +refs/heads/production:refs/remotes/origin/production
+ git fetch --no-tags --prune --depth=1 origin +refs/heads/gh-pages:refs/remotes/origin/gh-pages
mike deploy \
--update-aliases \
--push \
From b3566be72957eccf276a89fba2c915b5f53e66f4 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sun, 17 Dec 2023 08:32:34 -0600
Subject: [PATCH 012/191] corrections to response/cookies url
---
docs/response.md | 4 ++--
mkdocs.yml | 6 +++---
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/docs/response.md b/docs/response.md
index 625f7435b..00972eea1 100644
--- a/docs/response.md
+++ b/docs/response.md
@@ -682,7 +682,7 @@ $eTag = sha1($mostRecentDate);
$response->setHeader('E-Tag', $eTag);
```
-### `304`
+### Not Modified - `304`
Generating a `not-modified` response also helps with caching, by instructing the browser that the contents have not been modified, and therefore the locally cached copy of the data on the browser should be used.
@@ -719,7 +719,7 @@ class PostsController extends Controller
return $this
->response
->setStatusCode(404, 'Not Found')
- ->setContent("Sorry, the page doesn't exist")
+ ->setContent("Sorry, the page does not exist")
->send();
}
}
diff --git a/mkdocs.yml b/mkdocs.yml
index 23a50637e..181c9ba91 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -217,12 +217,12 @@ nav:
- Cache: cache.md
- Config: config.md
- Escaper: html-escaper.md
+ - Loader: autoload.md
+ - Logger: logger.md
- HTTP:
- - Cookies: response.md#cookies
+ - Cookies: response/#cookies
- Request: request.md
- Response: response.md
- - Loader: autoload.md
- - Logger: logger.md
- i18n:
- Internationalization: i18n.md
- Translate: translate.md
From e74feb1a4cbb7d14d48ade73cae688e302f8cdcf Mon Sep 17 00:00:00 2001
From: niden
Date: Mon, 18 Dec 2023 15:22:52 -0600
Subject: [PATCH 013/191] updating latest version
---
.github/workflows/deploy-documents.yml | 31 ++++++++++++++++++--------
VERSION | 1 +
2 files changed, 23 insertions(+), 9 deletions(-)
create mode 100644 VERSION
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index 8d3357e52..bdda734c2 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -50,24 +50,37 @@ jobs:
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
- - name: Create all generated documentation content
- run: mkdocs build
-
+ # - name: Create all generated documentation content
+ # run: mkdocs build
+ #
- name: Determine versioning parameters
id: determine-versioning
- run: echo 'data={"version":"5.4", "alias":"latest"}' >> $GITHUB_OUTPUT
+ run: |
+ # Read the first line from the VERSION file
+ LINE=$(head -n 1 ./VERSION)
+
+ # Extract version and alias using parameter expansion
+ VERSION="${LINE%%|*}"
+ ALIAS="${LINE#*|}"
+
+ # Print the extracted values for verification
+ echo "Version: $VERSION"
+ echo "Alias: $ALIAS"
+
+ echo "PH_DOCS_VERSION=$VERSION" >> $GITHUB_ENV
+ echo "PH_DOCS_ALIAS=$ALIAS" >> $GITHUB_ENV
- name: Deploy
- if: fromJson(steps.determine-versioning.outputs.data).version != null
+ if: ${{ env.PH_DOCS_VERSION }} != null
run: |
# Publishing implies creating a git commit on the production branch,
# we let @phalconbot own these commits.
git config user.name niden
git config user.email nikos@niden.net
- git fetch --no-tags --prune --depth=1 origin +refs/heads/gh-pages:refs/remotes/origin/gh-pages
+ git fetch --no-tags --prune --depth=1 origin +refs/heads/production:refs/remotes/origin/production
mike deploy \
--update-aliases \
+ --branch production \
--push \
- --remote origin \
- ${{ fromJson(steps.determine-versioning.outputs.data).version }} \
- ${{ fromJson(steps.determine-versioning.outputs.data).alias }}
+ ${{ env.PH_DOCS_VERSION }} \
+ ${{ env.PH_DOCS_ALIAS }}
diff --git a/VERSION b/VERSION
new file mode 100644
index 000000000..5c803c742
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+5.5|latest
From b35152c8ef24ac91a9ef36b37f613e35fd5fccc0 Mon Sep 17 00:00:00 2001
From: niden
Date: Mon, 18 Dec 2023 15:25:16 -0600
Subject: [PATCH 014/191] minor change
---
docs/testing-environment.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/testing-environment.md b/docs/testing-environment.md
index c9c796d29..3f00eca1e 100644
--- a/docs/testing-environment.md
+++ b/docs/testing-environment.md
@@ -30,6 +30,7 @@ git clone git@github.com:niden/cphalcon
## Build the environment
Once you are in `cphalcon` folder (or wherever you cloned the repository), you will need to build the containers
+
```bash
docker compose build
```
From fc674be1e5991331a255a50ee52768ebd9e7f17f Mon Sep 17 00:00:00 2001
From: niden
Date: Mon, 18 Dec 2023 18:15:51 -0600
Subject: [PATCH 015/191] added include plugin
---
mkdocs.yml | 3 ++-
requirements.txt | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/mkdocs.yml b/mkdocs.yml
index 181c9ba91..dae76f7d4 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -17,7 +17,7 @@ copyright: Copyright © 2012 - present Phalcon Team
# Configuration
theme:
name: material
- # custom_dir: material/overrides
+ custom_dir: overrides
features:
- announce.dismiss
- content.action.edit
@@ -71,6 +71,7 @@ theme:
# Plugins
plugins:
+ - include
- search:
separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'
- minify:
diff --git a/requirements.txt b/requirements.txt
index 98deb3960..3f3461281 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,5 @@
mkdocs
+mkdocs-include
mkdocs-material
mkdocs-material-extensions
mkdocs-minify-plugin
From 6e8040a7fd4cb2ed6d0cc6841a3acbaa41bb9221 Mon Sep 17 00:00:00 2001
From: niden
Date: Mon, 18 Dec 2023 22:18:23 -0600
Subject: [PATCH 016/191] cosmetic changes
---
docs/api/phalcon_acl.md | 49 +++++++++++++++++++++++++++++++++--------
1 file changed, 40 insertions(+), 9 deletions(-)
diff --git a/docs/api/phalcon_acl.md b/docs/api/phalcon_acl.md
index f7796d953..36549865b 100644
--- a/docs/api/phalcon_acl.md
+++ b/docs/api/phalcon_acl.md
@@ -118,17 +118,29 @@ Sets the default access level (Phalcon\Acl\Enum::ALLOW or Phalcon\Acl\Enum::DENY
-Interface Phalcon\Acl\Adapter\AdapterInterface
+## Acl\Adapter\AdapterInterface
[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/Adapter/AdapterInterface.zep)
-| Namespace | Phalcon\Acl\Adapter |
-| Uses | Phalcon\Acl\ComponentInterface, Phalcon\Acl\RoleInterface |
+- __Namespace__
+
+ - `Phalcon\Acl\Adapter`
+
+- __Uses__
+
+ - `Phalcon\Acl\ComponentInterface`
+ - `Phalcon\Acl\RoleInterface`
+
+- __Extends__
+
+
+- __Implements__
+
Interface for Phalcon\Acl adapters
-## Methods
+### Methods
```php
public function addComponent( mixed $componentValue, mixed $accessList ): bool;
@@ -262,14 +274,33 @@ accessKey
-
-Class Phalcon\Acl\Adapter\Memory
+## Acl\Adapter\Memory
[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/Adapter/Memory.zep)
-| Namespace | Phalcon\Acl\Adapter |
-| Uses | Phalcon\Acl\Enum, Phalcon\Acl\Role, Phalcon\Acl\RoleInterface, Phalcon\Acl\Component, Phalcon\Acl\Exception, Phalcon\Acl\RoleAwareInterface, Phalcon\Acl\ComponentAwareInterface, Phalcon\Acl\ComponentInterface, ReflectionClass, ReflectionFunction |
-| Extends | AbstractAdapter |
+- __Namespace__
+
+ - `Phalcon\Acl\Adapter`
+
+- __Uses__
+
+ - `Phalcon\Acl\Component`
+ - `Phalcon\Acl\ComponentAwareInterface`
+ - `Phalcon\Acl\ComponentInterface`
+ - `Phalcon\Acl\Enum`
+ - `Phalcon\Acl\Exception`
+ - `Phalcon\Acl\Role`
+ - `Phalcon\Acl\RoleInterface`
+ - `Phalcon\Acl\RoleAwareInterface`
+ - `ReflectionClass`
+ - `ReflectionFunction`
+
+- __Extends__
+
+ `AbstractAdapter`
+
+- __Implements__
+
Manages ACL lists in memory
From 4e73da4329be86a17ccd34f47448f60c3981533f Mon Sep 17 00:00:00 2001
From: niden
Date: Mon, 18 Dec 2023 22:21:52 -0600
Subject: [PATCH 017/191] committing overrides folder
---
overrides/.gitkeep | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 overrides/.gitkeep
diff --git a/overrides/.gitkeep b/overrides/.gitkeep
new file mode 100644
index 000000000..e69de29bb
From 1a86a69315709b40a318889afc20da38c2135bae Mon Sep 17 00:00:00 2001
From: niden
Date: Mon, 18 Dec 2023 22:25:57 -0600
Subject: [PATCH 018/191] trying api index at the top
---
mkdocs.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mkdocs.yml b/mkdocs.yml
index dae76f7d4..dcbe0e38d 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -168,13 +168,13 @@ nav:
- Use case: use-case.md
- Performance: performance.md
- Core:
+ - API Index: api/index.md
- Application: application.md
- Micro: application-micro.md
- CLI: application-cli.md
- DI Container: di.md
- MVC: mvc.md
- Namespaces: namespaces.md
- - API Index: api/index.md
- Database:
- Layer: db-layer.md
- PHQL: db-phql.md
From 7727879b1344931609b8105e1e0a837a12734582 Mon Sep 17 00:00:00 2001
From: niden
Date: Mon, 18 Dec 2023 22:29:43 -0600
Subject: [PATCH 019/191] reverting - api index at the end
---
mkdocs.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mkdocs.yml b/mkdocs.yml
index dcbe0e38d..dae76f7d4 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -168,13 +168,13 @@ nav:
- Use case: use-case.md
- Performance: performance.md
- Core:
- - API Index: api/index.md
- Application: application.md
- Micro: application-micro.md
- CLI: application-cli.md
- DI Container: di.md
- MVC: mvc.md
- Namespaces: namespaces.md
+ - API Index: api/index.md
- Database:
- Layer: db-layer.md
- PHQL: db-phql.md
From d12fe8b6f60d940632ef3232508bdc76a59cf247 Mon Sep 17 00:00:00 2001
From: niden
Date: Mon, 18 Dec 2023 22:32:13 -0600
Subject: [PATCH 020/191] version for github; adjustments to api/acl
---
docs/api/phalcon_acl.md | 32 ++----
docs/api/phalcon_annotations.md | 24 ++---
docs/api/phalcon_application.md | 4 +-
docs/api/phalcon_assets.md | 28 +++---
docs/api/phalcon_autoload.md | 4 +-
docs/api/phalcon_cache.md | 28 +++---
docs/api/phalcon_cli.md | 24 ++---
docs/api/phalcon_config.md | 18 ++--
docs/api/phalcon_datamapper.md | 42 ++++----
docs/api/phalcon_db.md | 52 +++++-----
docs/api/phalcon_di.md | 28 +++---
docs/api/phalcon_dispatcher.md | 6 +-
docs/api/phalcon_domain.md | 12 +--
docs/api/phalcon_encryption.md | 60 ++++++------
docs/api/phalcon_events.md | 14 +--
docs/api/phalcon_factory.md | 6 +-
docs/api/phalcon_filter.md | 132 ++++++++++++-------------
docs/api/phalcon_flash.md | 10 +-
docs/api/phalcon_forms.md | 34 +++----
docs/api/phalcon_html.md | 134 +++++++++++++-------------
docs/api/phalcon_http.md | 34 +++----
docs/api/phalcon_image.md | 14 +--
docs/api/phalcon_logger.md | 34 +++----
docs/api/phalcon_messages.md | 8 +-
docs/api/phalcon_mvc.md | 166 ++++++++++++++++----------------
docs/api/phalcon_paginator.md | 18 ++--
docs/api/phalcon_session.md | 20 ++--
docs/api/phalcon_storage.md | 54 +++++------
docs/api/phalcon_support.md | 146 ++++++++++++++--------------
docs/api/phalcon_tag.md | 6 +-
docs/api/phalcon_translate.md | 22 ++---
31 files changed, 601 insertions(+), 613 deletions(-)
diff --git a/docs/api/phalcon_acl.md b/docs/api/phalcon_acl.md
index 36549865b..6dabb19c3 100644
--- a/docs/api/phalcon_acl.md
+++ b/docs/api/phalcon_acl.md
@@ -7,18 +7,6 @@ hide:
All classes are prefixed with `Phalcon`
-* [Phalcon\Acl\Adapter\AbstractAdapter](#acl-adapter-abstractadapter)
-* [Phalcon\Acl\Adapter\AdapterInterface](#acl-adapter-adapterinterface)
-* [Phalcon\Acl\Adapter\Memory](#acl-adapter-memory)
-* [Phalcon\Acl\Component](#acl-component)
-* [Phalcon\Acl\ComponentAwareInterface](#acl-componentawareinterface)
-* [Phalcon\Acl\ComponentInterface](#acl-componentinterface)
-* [Phalcon\Acl\Enum](#acl-enum)
-* [Phalcon\Acl\Exception](#acl-exception)
-* [Phalcon\Acl\Role](#acl-role)
-* [Phalcon\Acl\RoleAwareInterface](#acl-roleawareinterface)
-* [Phalcon\Acl\RoleInterface](#acl-roleinterface)
-
## Acl\Adapter\AbstractAdapter
- __Namespace__
@@ -120,7 +108,7 @@ Sets the default access level (Phalcon\Acl\Enum::ALLOW or Phalcon\Acl\Enum::DENY
## Acl\Adapter\AdapterInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/Adapter/AdapterInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/Adapter/AdapterInterface.zep)
- __Namespace__
@@ -276,7 +264,7 @@ accessKey
## Acl\Adapter\Memory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/Adapter/Memory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/Adapter/Memory.zep)
- __Namespace__
@@ -652,7 +640,7 @@ accessKey
Class Phalcon\Acl\Component
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/Component.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/Component.zep)
| Namespace | Phalcon\Acl |
| Implements | ComponentInterface |
@@ -708,7 +696,7 @@ public function getName(): string;
Interface Phalcon\Acl\ComponentAwareInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/ComponentAwareInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/ComponentAwareInterface.zep)
| Namespace | Phalcon\Acl |
@@ -727,7 +715,7 @@ Returns component name
Interface Phalcon\Acl\ComponentInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/ComponentInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/ComponentInterface.zep)
| Namespace | Phalcon\Acl |
@@ -758,7 +746,7 @@ Returns the component name
Class Phalcon\Acl\Enum
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/Enum.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/Enum.zep)
| Namespace | Phalcon\Acl |
@@ -774,7 +762,7 @@ const DENY = 0;
Class Phalcon\Acl\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/Exception.zep)
| Namespace | Phalcon\Acl |
| Extends | \Exception |
@@ -785,7 +773,7 @@ Class for exceptions thrown by Phalcon\Acl
Class Phalcon\Acl\Role
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/Role.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/Role.zep)
| Namespace | Phalcon\Acl |
| Implements | RoleInterface |
@@ -841,7 +829,7 @@ public function getName(): string;
Interface Phalcon\Acl\RoleAwareInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/RoleAwareInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/RoleAwareInterface.zep)
| Namespace | Phalcon\Acl |
@@ -860,7 +848,7 @@ Returns role name
Interface Phalcon\Acl\RoleInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Acl/RoleInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Acl/RoleInterface.zep)
| Namespace | Phalcon\Acl |
diff --git a/docs/api/phalcon_annotations.md b/docs/api/phalcon_annotations.md
index 74c8fc623..cb2d943df 100644
--- a/docs/api/phalcon_annotations.md
+++ b/docs/api/phalcon_annotations.md
@@ -14,7 +14,7 @@
Abstract Class Phalcon\Annotations\Adapter\AbstractAdapter
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Adapter/AbstractAdapter.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Adapter/AbstractAdapter.zep)
| Namespace | Phalcon\Annotations\Adapter |
| Uses | Phalcon\Annotations\Reader, Phalcon\Annotations\Exception, Phalcon\Annotations\Collection, Phalcon\Annotations\Reflection, Phalcon\Annotations\ReaderInterface |
@@ -97,7 +97,7 @@ Sets the annotations parser
Interface Phalcon\Annotations\Adapter\AdapterInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Adapter/AdapterInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Adapter/AdapterInterface.zep)
| Namespace | Phalcon\Annotations\Adapter |
| Uses | Phalcon\Annotations\Reflection, Phalcon\Annotations\Collection, Phalcon\Annotations\ReaderInterface |
@@ -165,7 +165,7 @@ Sets the annotations parser
Class Phalcon\Annotations\Adapter\Apcu
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Adapter/Apcu.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Adapter/Apcu.zep)
| Namespace | Phalcon\Annotations\Adapter |
| Uses | Phalcon\Annotations\Reflection |
@@ -218,7 +218,7 @@ Writes parsed annotations to APCu
Class Phalcon\Annotations\Adapter\Memory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Adapter/Memory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Adapter/Memory.zep)
| Namespace | Phalcon\Annotations\Adapter |
| Uses | Phalcon\Annotations\Reflection |
@@ -255,7 +255,7 @@ Writes parsed annotations to memory
Class Phalcon\Annotations\Adapter\Stream
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Adapter/Stream.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Adapter/Stream.zep)
| Namespace | Phalcon\Annotations\Adapter |
| Uses | Phalcon\Annotations\Reflection, Phalcon\Annotations\Exception, RuntimeException |
@@ -307,7 +307,7 @@ Writes parsed annotations to files
Class Phalcon\Annotations\Annotation
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Annotation.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Annotation.zep)
| Namespace | Phalcon\Annotations |
@@ -405,7 +405,7 @@ Returns the number of arguments that the annotation has
Class Phalcon\Annotations\AnnotationsFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/AnnotationsFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/AnnotationsFactory.zep)
| Namespace | Phalcon\Annotations |
| Uses | Phalcon\Annotations\Adapter\AdapterInterface, Phalcon\Factory\AbstractFactory, Phalcon\Support\Helper\Arr\Get |
@@ -450,7 +450,7 @@ Returns the available adapters
Class Phalcon\Annotations\Collection
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Collection.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Collection.zep)
| Namespace | Phalcon\Annotations |
| Uses | Countable, Iterator |
@@ -559,7 +559,7 @@ Check if the current annotation in the iterator is valid
Class Phalcon\Annotations\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Exception.zep)
| Namespace | Phalcon\Annotations |
| Extends | \Exception |
@@ -570,7 +570,7 @@ Class for exceptions thrown by Phalcon\Annotations
Class Phalcon\Annotations\Reader
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Reader.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Reader.zep)
| Namespace | Phalcon\Annotations |
| Uses | ReflectionClass |
@@ -597,7 +597,7 @@ Parses a raw doc block returning the annotations found
Interface Phalcon\Annotations\ReaderInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/ReaderInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/ReaderInterface.zep)
| Namespace | Phalcon\Annotations |
@@ -622,7 +622,7 @@ Parses a raw docblock returning the annotations found
Class Phalcon\Annotations\Reflection
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Annotations/Reflection.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Annotations/Reflection.zep)
| Namespace | Phalcon\Annotations |
diff --git a/docs/api/phalcon_application.md b/docs/api/phalcon_application.md
index ef067b568..a2c556e41 100644
--- a/docs/api/phalcon_application.md
+++ b/docs/api/phalcon_application.md
@@ -4,7 +4,7 @@
Abstract Class Phalcon\Application\AbstractApplication
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Application/AbstractApplication.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Application/AbstractApplication.zep)
| Namespace | Phalcon\Application |
| Uses | Phalcon\Di\DiInterface, Phalcon\Di\Injectable, Phalcon\Events\EventsAwareInterface, Phalcon\Events\ManagerInterface |
@@ -107,7 +107,7 @@ Sets the events manager
Class Phalcon\Application\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Application/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Application/Exception.zep)
| Namespace | Phalcon\Application |
| Extends | \Exception |
diff --git a/docs/api/phalcon_assets.md b/docs/api/phalcon_assets.md
index f326a6388..10528b06f 100644
--- a/docs/api/phalcon_assets.md
+++ b/docs/api/phalcon_assets.md
@@ -16,7 +16,7 @@
Class Phalcon\Assets\Asset
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Asset.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Asset.zep)
| Namespace | Phalcon\Assets |
| Implements | AssetInterface |
@@ -259,7 +259,7 @@ protected function phpFileGetContents( string $filename );
Class Phalcon\Assets\Asset\Css
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Asset/Css.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Asset/Css.zep)
| Namespace | Phalcon\Assets\Asset |
| Uses | Phalcon\Assets\Asset |
@@ -280,7 +280,7 @@ Phalcon\Assets\Asset\Css constructor
Class Phalcon\Assets\Asset\Js
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Asset/Js.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Asset/Js.zep)
| Namespace | Phalcon\Assets\Asset |
| Uses | Phalcon\Assets\Asset |
@@ -301,7 +301,7 @@ Phalcon\Assets\Asset\Js constructor
Interface Phalcon\Assets\AssetInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/AssetInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/AssetInterface.zep)
| Namespace | Phalcon\Assets |
@@ -356,7 +356,7 @@ Sets the asset's type.
Class Phalcon\Assets\Collection
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Collection.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Collection.zep)
| Namespace | Phalcon\Assets |
| Uses | ArrayIterator, Countable, IteratorAggregate |
@@ -674,7 +674,7 @@ Adds an asset or inline-code to the collection
Class Phalcon\Assets\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Exception.zep)
| Namespace | Phalcon\Assets |
| Extends | \Exception |
@@ -685,7 +685,7 @@ Exceptions thrown in Phalcon\Assets will use this class
Interface Phalcon\Assets\FilterInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/FilterInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/FilterInterface.zep)
| Namespace | Phalcon\Assets |
@@ -704,7 +704,7 @@ Filters the content returning a string with the filtered content
Class Phalcon\Assets\Filters\Cssmin
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Filters/CssMin.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Filters/CssMin.zep)
| Namespace | Phalcon\Assets\Filters |
| Uses | Phalcon\Assets\FilterInterface |
@@ -730,7 +730,7 @@ Filters the content using CSSMIN
Class Phalcon\Assets\Filters\Jsmin
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Filters/JsMin.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Filters/JsMin.zep)
| Namespace | Phalcon\Assets\Filters |
| Uses | Phalcon\Assets\FilterInterface |
@@ -757,7 +757,7 @@ Filters the content using JSMIN
Class Phalcon\Assets\Filters\None
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Filters/None.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Filters/None.zep)
| Namespace | Phalcon\Assets\Filters |
| Uses | Phalcon\Assets\FilterInterface |
@@ -778,7 +778,7 @@ Returns the content as is
Class Phalcon\Assets\Inline
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Inline.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Inline.zep)
| Namespace | Phalcon\Assets |
| Implements | AssetInterface |
@@ -874,7 +874,7 @@ Sets the inline's type
Class Phalcon\Assets\Inline\Css
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Inline/Css.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Inline/Css.zep)
| Namespace | Phalcon\Assets\Inline |
| Uses | Phalcon\Assets\Inline |
@@ -895,7 +895,7 @@ Phalcon\Assets\Inline\Css constructor
Class Phalcon\Assets\Inline\Js
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Inline/Js.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Inline/Js.zep)
| Namespace | Phalcon\Assets\Inline |
| Uses | Phalcon\Assets\Inline |
@@ -916,7 +916,7 @@ Phalcon\Assets\Inline\Js constructor
Class Phalcon\Assets\Manager
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Assets/Manager.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Assets/Manager.zep)
| Namespace | Phalcon\Assets |
| Uses | Phalcon\Assets\Asset\Css, Phalcon\Assets\Asset\Js, Phalcon\Assets\Inline\Css, Phalcon\Assets\Inline\Js, Phalcon\Di\AbstractInjectionAware, Phalcon\Html\Helper\Element, Phalcon\Html\Helper\Link, Phalcon\Html\Helper\Script, Phalcon\Html\TagFactory |
diff --git a/docs/api/phalcon_autoload.md b/docs/api/phalcon_autoload.md
index a9490b19c..81d905466 100644
--- a/docs/api/phalcon_autoload.md
+++ b/docs/api/phalcon_autoload.md
@@ -4,7 +4,7 @@
Class Phalcon\Autoload\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Autoload/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Autoload/Exception.zep)
| Namespace | Phalcon\Autoload |
| Extends | \Exception |
@@ -15,7 +15,7 @@ Exceptions thrown in Phalcon\Autoload will use this class
Class Phalcon\Autoload\Loader
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Autoload/Loader.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Autoload/Loader.zep)
| Namespace | Phalcon\Autoload |
| Uses | Phalcon\Events\AbstractEventsAware |
diff --git a/docs/api/phalcon_cache.md b/docs/api/phalcon_cache.md
index 901b26ac7..6e7799dab 100644
--- a/docs/api/phalcon_cache.md
+++ b/docs/api/phalcon_cache.md
@@ -16,7 +16,7 @@
Abstract Class Phalcon\Cache\AbstractCache
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/AbstractCache.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/AbstractCache.zep)
| Namespace | Phalcon\Cache |
| Uses | DateInterval, Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Cache\Exception\InvalidArgumentException, Traversable |
@@ -121,7 +121,7 @@ Returns the exception class that will be used for exceptions thrown
Interface Phalcon\Cache\Adapter\AdapterInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Adapter/AdapterInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Adapter/AdapterInterface.zep)
| Namespace | Phalcon\Cache\Adapter |
| Uses | Phalcon\Storage\Adapter\AdapterInterface |
@@ -133,7 +133,7 @@ Interface for Phalcon\Cache adapters
Class Phalcon\Cache\Adapter\Apcu
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Adapter/Apcu.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Adapter/Apcu.zep)
| Namespace | Phalcon\Cache\Adapter |
| Uses | Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Storage\Adapter\Apcu |
@@ -146,7 +146,7 @@ Apcu adapter
Class Phalcon\Cache\Adapter\Libmemcached
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Adapter/Libmemcached.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Adapter/Libmemcached.zep)
| Namespace | Phalcon\Cache\Adapter |
| Uses | Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Storage\Adapter\Libmemcached |
@@ -159,7 +159,7 @@ Libmemcached adapter
Class Phalcon\Cache\Adapter\Memory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Adapter/Memory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Adapter/Memory.zep)
| Namespace | Phalcon\Cache\Adapter |
| Uses | Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Storage\Adapter\Memory |
@@ -172,7 +172,7 @@ Memory adapter
Class Phalcon\Cache\Adapter\Redis
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Adapter/Redis.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Adapter/Redis.zep)
| Namespace | Phalcon\Cache\Adapter |
| Uses | Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Storage\Adapter\Redis |
@@ -185,7 +185,7 @@ Redis adapter
Class Phalcon\Cache\Adapter\Stream
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Adapter/Stream.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Adapter/Stream.zep)
| Namespace | Phalcon\Cache\Adapter |
| Uses | Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Storage\Adapter\Stream |
@@ -198,7 +198,7 @@ Stream adapter
Class Phalcon\Cache\Adapter\Weak
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Adapter/Weak.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Adapter/Weak.zep)
| Namespace | Phalcon\Cache\Adapter |
| Uses | Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Storage\Adapter\Weak |
@@ -211,7 +211,7 @@ Stream adapter
Class Phalcon\Cache\AdapterFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/AdapterFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/AdapterFactory.zep)
| Namespace | Phalcon\Cache |
| Uses | Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Cache\Exception\Exception, Phalcon\Factory\AbstractFactory, Phalcon\Storage\SerializerFactory |
@@ -259,7 +259,7 @@ Returns the available adapters
Class Phalcon\Cache\Cache
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Cache.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Cache.zep)
| Namespace | Phalcon\Cache |
| Uses | DateInterval, Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Cache\Exception\InvalidArgumentException |
@@ -329,7 +329,7 @@ Returns the exception class that will be used for exceptions thrown
Class Phalcon\Cache\CacheFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/CacheFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/CacheFactory.zep)
| Namespace | Phalcon\Cache |
| Uses | Phalcon\Cache\Adapter\AdapterInterface, Phalcon\Cache\Cache, Phalcon\Cache\Exception\Exception, Phalcon\Config\ConfigInterface, Phalcon\Factory\AbstractConfigFactory |
@@ -377,7 +377,7 @@ protected function getExceptionClass(): string;
Interface Phalcon\Cache\CacheInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/CacheInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/CacheInterface.zep)
| Namespace | Phalcon\Cache |
| Uses | DateInterval, Phalcon\Cache\Exception\InvalidArgumentException |
@@ -440,7 +440,7 @@ Persists a set of key => value pairs in the cache, with an optional TTL.
Class Phalcon\Cache\Exception\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Exception/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Exception/Exception.zep)
| Namespace | Phalcon\Cache\Exception |
| Extends | \Exception |
@@ -451,7 +451,7 @@ Exceptions thrown in Phalcon\Cache will use this class
Class Phalcon\Cache\Exception\InvalidArgumentException
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cache/Exception/InvalidArgumentException.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cache/Exception/InvalidArgumentException.zep)
| Namespace | Phalcon\Cache\Exception |
| Extends | \Exception |
diff --git a/docs/api/phalcon_cli.md b/docs/api/phalcon_cli.md
index ff6d14311..828c0059d 100644
--- a/docs/api/phalcon_cli.md
+++ b/docs/api/phalcon_cli.md
@@ -14,7 +14,7 @@
Class Phalcon\Cli\Console
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/Console.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/Console.zep)
| Namespace | Phalcon\Cli |
| Uses | Phalcon\Application\AbstractApplication, Phalcon\Cli\Router\Route, Phalcon\Cli\Console\Exception, Phalcon\Di\DiInterface, Phalcon\Events\ManagerInterface |
@@ -55,7 +55,7 @@ Set an specific argument
Class Phalcon\Cli\Console\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/Console/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/Console/Exception.zep)
| Namespace | Phalcon\Cli\Console |
| Extends | \Phalcon\Application\Exception |
@@ -66,7 +66,7 @@ Exceptions thrown in Phalcon\Cli\Console will use this class
Class Phalcon\Cli\Dispatcher
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/Dispatcher.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/Dispatcher.zep)
| Namespace | Phalcon\Cli |
| Uses | Phalcon\Cli\Dispatcher\Exception, Phalcon\Dispatcher\AbstractDispatcher, Phalcon\Events\ManagerInterface, Phalcon\Filter\FilterInterface |
@@ -207,7 +207,7 @@ Throws an internal exception
Class Phalcon\Cli\Dispatcher\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/Dispatcher/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/Dispatcher/Exception.zep)
| Namespace | Phalcon\Cli\Dispatcher |
| Extends | \Phalcon\Dispatcher\Exception |
@@ -218,7 +218,7 @@ Exceptions thrown in Phalcon\Cli\Dispatcher will use this class
Interface Phalcon\Cli\DispatcherInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/DispatcherInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/DispatcherInterface.zep)
| Namespace | Phalcon\Cli |
| Uses | Phalcon\Dispatcher\DispatcherInterface |
@@ -287,7 +287,7 @@ Sets the default task suffix
Class Phalcon\Cli\Router
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/Router.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/Router.zep)
| Namespace | Phalcon\Cli |
| Uses | Phalcon\Di\DiInterface, Phalcon\Di\AbstractInjectionAware, Phalcon\Cli\Router\Route, Phalcon\Cli\Router\Exception, Phalcon\Cli\Router\RouteInterface |
@@ -508,7 +508,7 @@ Checks if the router matches any of the defined routes
Class Phalcon\Cli\Router\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/Router/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/Router/Exception.zep)
| Namespace | Phalcon\Cli\Router |
| Extends | \Exception |
@@ -519,7 +519,7 @@ Exceptions thrown in Phalcon\Cli\Router will use this class
Class Phalcon\Cli\Router\Route
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/Router/Route.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/Router/Route.zep)
| Namespace | Phalcon\Cli\Router |
| Implements | RouteInterface |
@@ -730,7 +730,7 @@ $router->add(
Interface Phalcon\Cli\Router\RouteInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/Router/RouteInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/Router/RouteInterface.zep)
| Namespace | Phalcon\Cli\Router |
@@ -828,7 +828,7 @@ Sets the route's name
Interface Phalcon\Cli\RouterInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/RouterInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/RouterInterface.zep)
| Namespace | Phalcon\Cli |
| Uses | Phalcon\Cli\Router\RouteInterface |
@@ -945,7 +945,7 @@ Check if the router matches any of the defined routes
Class Phalcon\Cli\Task
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/Task.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/Task.zep)
| Namespace | Phalcon\Cli |
| Uses | Phalcon\Di\Injectable, Phalcon\Events\EventsAwareInterface, Phalcon\Events\ManagerInterface |
@@ -1009,7 +1009,7 @@ Sets the events manager
Interface Phalcon\Cli\TaskInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Cli/TaskInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Cli/TaskInterface.zep)
| Namespace | Phalcon\Cli |
diff --git a/docs/api/phalcon_config.md b/docs/api/phalcon_config.md
index b2e84368c..52db3c2a2 100644
--- a/docs/api/phalcon_config.md
+++ b/docs/api/phalcon_config.md
@@ -11,7 +11,7 @@
Class Phalcon\Config\Adapter\Grouped
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Config/Adapter/Grouped.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Config/Adapter/Grouped.zep)
| Namespace | Phalcon\Config\Adapter |
| Uses | Phalcon\Config\Config, Phalcon\Config\ConfigFactory, Phalcon\Config\ConfigInterface, Phalcon\Config\Exception, Phalcon\Factory\Exception |
@@ -80,7 +80,7 @@ Phalcon\Config\Adapter\Grouped constructor
Class Phalcon\Config\Adapter\Ini
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Config/Adapter/Ini.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Config/Adapter/Ini.zep)
| Namespace | Phalcon\Config\Adapter |
| Uses | Phalcon\Config\Config, Phalcon\Config\Exception, Phalcon\Support\Traits\PhpFileTrait |
@@ -165,7 +165,7 @@ protected function phpParseIniFile( string $filename, bool $processSections = bo
Class Phalcon\Config\Adapter\Json
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Config/Adapter/Json.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Config/Adapter/Json.zep)
| Namespace | Phalcon\Config\Adapter |
| Uses | Phalcon\Config\Config, Phalcon\Support\Helper\Json\Decode |
@@ -203,7 +203,7 @@ Phalcon\Config\Adapter\Json constructor
Class Phalcon\Config\Adapter\Php
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Config/Adapter/Php.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Config/Adapter/Php.zep)
| Namespace | Phalcon\Config\Adapter |
| Uses | Phalcon\Config\Config |
@@ -256,7 +256,7 @@ Phalcon\Config\Adapter\Php constructor
Class Phalcon\Config\Adapter\Yaml
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Config/Adapter/Yaml.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Config/Adapter/Yaml.zep)
| Namespace | Phalcon\Config\Adapter |
| Uses | Phalcon\Config\Config, Phalcon\Config\Exception |
@@ -323,7 +323,7 @@ protected function phpYamlParseFile( mixed $filename, mixed $pos = int, mixed $n
Class Phalcon\Config\Config
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Config/Config.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Config/Config.zep)
| Namespace | Phalcon\Config |
| Uses | Phalcon\Support\Collection |
@@ -439,7 +439,7 @@ Sets the collection data
Class Phalcon\Config\ConfigFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Config/ConfigFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Config/ConfigFactory.zep)
| Namespace | Phalcon\Config |
| Uses | Phalcon\Config\Config, Phalcon\Config\ConfigInterface, Phalcon\Factory\AbstractFactory |
@@ -502,7 +502,7 @@ protected function parseConfig( mixed $config ): array;
Interface Phalcon\Config\ConfigInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Config/ConfigInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Config/ConfigInterface.zep)
| Namespace | Phalcon\Config |
| Uses | Phalcon\Support\Collection\CollectionInterface |
@@ -543,7 +543,7 @@ public function setPathDelimiter( string $delimiter = null ): ConfigInterface;
Class Phalcon\Config\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Config/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Config/Exception.zep)
| Namespace | Phalcon\Config |
| Extends | \Exception |
diff --git a/docs/api/phalcon_datamapper.md b/docs/api/phalcon_datamapper.md
index 6651895f3..704059a96 100644
--- a/docs/api/phalcon_datamapper.md
+++ b/docs/api/phalcon_datamapper.md
@@ -23,7 +23,7 @@
Class Phalcon\DataMapper\Pdo\Connection
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Connection.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Connection.zep)
| Namespace | Phalcon\DataMapper\Pdo |
| Uses | InvalidArgumentException, Phalcon\DataMapper\Pdo\Connection\AbstractConnection, Phalcon\DataMapper\Pdo\Profiler\Profiler, Phalcon\DataMapper\Pdo\Profiler\ProfilerInterface |
@@ -75,7 +75,7 @@ Disconnects from the database.
Abstract Class Phalcon\DataMapper\Pdo\Connection\AbstractConnection
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Connection/AbstractConnection.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Connection/AbstractConnection.zep)
| Namespace | Phalcon\DataMapper\Pdo\Connection |
| Uses | BadMethodCallException, Phalcon\DataMapper\Pdo\Exception\CannotBindValue, Phalcon\DataMapper\Pdo\Profiler\ProfilerInterface |
@@ -358,7 +358,7 @@ Bind a value using the proper PDO::PARAM_* type.
Interface Phalcon\DataMapper\Pdo\Connection\ConnectionInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Connection/ConnectionInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Connection/ConnectionInterface.zep)
| Namespace | Phalcon\DataMapper\Pdo\Connection |
| Uses | Phalcon\DataMapper\Pdo\Exception\CannotBindValue, Phalcon\DataMapper\Pdo\Parser\ParserInterface, Phalcon\DataMapper\Pdo\Profiler\ProfilerInterface |
@@ -502,7 +502,7 @@ Sets the Profiler instance.
Class Phalcon\DataMapper\Pdo\Connection\Decorated
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Connection/Decorated.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Connection/Decorated.zep)
| Namespace | Phalcon\DataMapper\Pdo\Connection |
| Uses | Phalcon\DataMapper\Pdo\Exception\CannotDisconnect, Phalcon\DataMapper\Pdo\Profiler\Profiler, Phalcon\DataMapper\Pdo\Profiler\ProfilerInterface |
@@ -540,7 +540,7 @@ Disconnects from the database; disallowed with decorated PDO connections.
Interface Phalcon\DataMapper\Pdo\Connection\PdoInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Connection/PdoInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Connection/PdoInterface.zep)
| Namespace | Phalcon\DataMapper\Pdo\Connection |
@@ -647,7 +647,7 @@ Set a database connection attribute
Class Phalcon\DataMapper\Pdo\ConnectionLocator
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/ConnectionLocator.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/ConnectionLocator.zep)
| Namespace | Phalcon\DataMapper\Pdo |
| Uses | Phalcon\DataMapper\Pdo\Connection\ConnectionInterface, Phalcon\DataMapper\Pdo\Exception\ConnectionNotFound |
@@ -746,7 +746,7 @@ Returns a connection by name.
Interface Phalcon\DataMapper\Pdo\ConnectionLocatorInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/ConnectionLocatorInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/ConnectionLocatorInterface.zep)
| Namespace | Phalcon\DataMapper\Pdo |
| Uses | Phalcon\DataMapper\Pdo\Connection\ConnectionInterface |
@@ -800,7 +800,7 @@ Sets a write connection registry entry by name.
Class Phalcon\DataMapper\Pdo\Exception\CannotDisconnect
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Exception/CannotDisconnect.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Exception/CannotDisconnect.zep)
| Namespace | Phalcon\DataMapper\Pdo\Exception |
| Extends | Exception |
@@ -812,7 +812,7 @@ created externally and then injected.
Class Phalcon\DataMapper\Pdo\Exception\ConnectionNotFound
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Exception/ConnectionNotFound.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Exception/ConnectionNotFound.zep)
| Namespace | Phalcon\DataMapper\Pdo\Exception |
| Extends | Exception |
@@ -823,7 +823,7 @@ Locator could not find a named connection.
Class Phalcon\DataMapper\Pdo\Exception\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Exception/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Exception/Exception.zep)
| Namespace | Phalcon\DataMapper\Pdo\Exception |
| Extends | \Exception |
@@ -834,7 +834,7 @@ Base Exception class
Class Phalcon\DataMapper\Pdo\Profiler\MemoryLogger
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Profiler/MemoryLogger.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Profiler/MemoryLogger.zep)
| Namespace | Phalcon\DataMapper\Pdo\Profiler |
| Uses | Phalcon\Logger\Enum, Phalcon\Logger\Adapter\AdapterInterface, Phalcon\Logger\Adapter\Noop, Phalcon\Logger\LoggerInterface |
@@ -942,7 +942,7 @@ public function warning( string $message, array $context = [] ): void;
Class Phalcon\DataMapper\Pdo\Profiler\Profiler
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Profiler/Profiler.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Profiler/Profiler.zep)
| Namespace | Phalcon\DataMapper\Pdo\Profiler |
| Uses | Phalcon\DataMapper\Pdo\Exception\Exception, Phalcon\Logger\Enum, Phalcon\Logger\LoggerInterface, Phalcon\Support\Helper\Json\Encode |
@@ -1051,7 +1051,7 @@ Starts a profile entry.
Interface Phalcon\DataMapper\Pdo\Profiler\ProfilerInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Pdo/Profiler/ProfilerInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Pdo/Profiler/ProfilerInterface.zep)
| Namespace | Phalcon\DataMapper\Pdo\Profiler |
| Uses | Phalcon\Logger\LoggerInterface |
@@ -1119,7 +1119,7 @@ Starts a profile entry.
Abstract Class Phalcon\DataMapper\Query\AbstractConditions
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Query/AbstractConditions.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Query/AbstractConditions.zep)
| Namespace | Phalcon\DataMapper\Query |
| Extends | AbstractQuery |
@@ -1235,7 +1235,7 @@ Processes a value (array or string) and merges it with the store
Abstract Class Phalcon\DataMapper\Query\AbstractQuery
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Query/AbstractQuery.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Query/AbstractQuery.zep)
| Namespace | Phalcon\DataMapper\Query |
| Uses | Phalcon\DataMapper\Pdo\Connection |
@@ -1346,7 +1346,7 @@ Indents a collection
Class Phalcon\DataMapper\Query\Bind
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Query/Bind.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Query/Bind.zep)
| Namespace | Phalcon\DataMapper\Query |
@@ -1415,7 +1415,7 @@ Processes an array - if passed as an `inline` parameter
Class Phalcon\DataMapper\Query\Delete
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Query/Delete.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Query/Delete.zep)
| Namespace | Phalcon\DataMapper\Query |
| Uses | Phalcon\DataMapper\Pdo\Connection |
@@ -1460,7 +1460,7 @@ Adds the `RETURNING` clause
Class Phalcon\DataMapper\Query\Insert
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Query/Insert.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Query/Insert.zep)
| Namespace | Phalcon\DataMapper\Query |
| Uses | Phalcon\DataMapper\Pdo\Connection |
@@ -1529,7 +1529,7 @@ Sets a column = value condition
Class Phalcon\DataMapper\Query\QueryFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Query/QueryFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Query/QueryFactory.zep)
| Namespace | Phalcon\DataMapper\Query |
| Uses | Phalcon\DataMapper\Pdo\Connection |
@@ -1588,7 +1588,7 @@ Create a new Update object
Class Phalcon\DataMapper\Query\Select
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Query/Select.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Query/Select.zep)
| Namespace | Phalcon\DataMapper\Query |
| Uses | BadMethodCallException |
@@ -1746,7 +1746,7 @@ Statement builder
Class Phalcon\DataMapper\Query\Update
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/DataMapper/Query/Update.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/DataMapper/Query/Update.zep)
| Namespace | Phalcon\DataMapper\Query |
| Uses | Phalcon\DataMapper\Pdo\Connection |
diff --git a/docs/api/phalcon_db.md b/docs/api/phalcon_db.md
index badaf8b5a..d73fccbe8 100644
--- a/docs/api/phalcon_db.md
+++ b/docs/api/phalcon_db.md
@@ -28,7 +28,7 @@
Abstract Class Phalcon\Db\AbstractDb
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/AbstractDb.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/AbstractDb.zep)
| Namespace | Phalcon\Db |
| Uses | \PDO |
@@ -88,7 +88,7 @@ Enables/disables options in the Database component
Abstract Class Phalcon\Db\Adapter\AbstractAdapter
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Adapter/AbstractAdapter.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Adapter/AbstractAdapter.zep)
| Namespace | Phalcon\Db\Adapter |
| Uses | Phalcon\Db\DialectInterface, Phalcon\Db\ColumnInterface, Phalcon\Db\Enum, Phalcon\Db\Exception, Phalcon\Db\Index, Phalcon\Db\IndexInterface, Phalcon\Db\Reference, Phalcon\Db\ReferenceInterface, Phalcon\Db\RawValue, Phalcon\Events\EventsAwareInterface, Phalcon\Events\ManagerInterface |
@@ -778,7 +778,7 @@ var_dump(
Interface Phalcon\Db\Adapter\AdapterInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Adapter/AdapterInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Adapter/AdapterInterface.zep)
| Namespace | Phalcon\Db\Adapter |
| Uses | Phalcon\Db\DialectInterface, Phalcon\Db\ResultInterface, Phalcon\Db\ColumnInterface, Phalcon\Db\IndexInterface, Phalcon\Db\RawValue, Phalcon\Db\ReferenceInterface |
@@ -1266,7 +1266,7 @@ Generates SQL checking for the existence of a schema.view
Abstract Class Phalcon\Db\Adapter\Pdo\AbstractPdo
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Adapter/Pdo/AbstractPdo.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Adapter/Pdo/AbstractPdo.zep)
| Namespace | Phalcon\Db\Adapter\Pdo |
| Uses | Phalcon\Db\Adapter\AbstractAdapter, Phalcon\Db\Column, Phalcon\Db\Exception, Phalcon\Db\Result\PdoResult, Phalcon\Db\ResultInterface, Phalcon\Events\ManagerInterface |
@@ -1581,7 +1581,7 @@ Constructs the SQL statement (with parameters)
Class Phalcon\Db\Adapter\Pdo\Mysql
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Adapter/Pdo/Mysql.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Adapter/Pdo/Mysql.zep)
| Namespace | Phalcon\Db\Adapter\Pdo |
| Uses | Phalcon\Db\Adapter\Pdo\AbstractPdo, Phalcon\Db\Column, Phalcon\Db\ColumnInterface, Phalcon\Db\Enum, Phalcon\Db\Exception, Phalcon\Db\Index, Phalcon\Db\IndexInterface, Phalcon\Db\Reference, Phalcon\Db\ReferenceInterface |
@@ -1678,7 +1678,7 @@ Returns PDO adapter DSN defaults as a key-value map.
Class Phalcon\Db\Adapter\Pdo\Postgresql
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Adapter/Pdo/Postgresql.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Adapter/Pdo/Postgresql.zep)
| Namespace | Phalcon\Db\Adapter\Pdo |
| Uses | Phalcon\Db\Adapter\Pdo\AbstractPdo, Phalcon\Db\Column, Phalcon\Db\ColumnInterface, Phalcon\Db\Enum, Phalcon\Db\Exception, Phalcon\Db\RawValue, Phalcon\Db\Reference, Phalcon\Db\ReferenceInterface, Throwable |
@@ -1813,7 +1813,7 @@ Returns PDO adapter DSN defaults as a key-value map.
Class Phalcon\Db\Adapter\Pdo\Sqlite
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Adapter/Pdo/Sqlite.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Adapter/Pdo/Sqlite.zep)
| Namespace | Phalcon\Db\Adapter\Pdo |
| Uses | Phalcon\Db\Adapter\Pdo\AbstractPdo, Phalcon\Db\Column, Phalcon\Db\ColumnInterface, Phalcon\Db\Enum, Phalcon\Db\Exception, Phalcon\Db\Index, Phalcon\Db\IndexInterface, Phalcon\Db\RawValue, Phalcon\Db\Reference, Phalcon\Db\ReferenceInterface |
@@ -1938,7 +1938,7 @@ Returns PDO adapter DSN defaults as a key-value map.
Class Phalcon\Db\Adapter\PdoFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Adapter/PdoFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Adapter/PdoFactory.zep)
| Namespace | Phalcon\Db\Adapter |
| Uses | Phalcon\Factory\AbstractFactory, Phalcon\Support\Helper\Arr\Get |
@@ -1988,7 +1988,7 @@ Returns the available adapters
Class Phalcon\Db\Column
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Column.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Column.zep)
| Namespace | Phalcon\Db |
| Implements | ColumnInterface |
@@ -2289,7 +2289,7 @@ Returns true if number column is unsigned
Interface Phalcon\Db\ColumnInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/ColumnInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/ColumnInterface.zep)
| Namespace | Phalcon\Db |
@@ -2398,7 +2398,7 @@ Returns true if number column is unsigned
Abstract Class Phalcon\Db\Dialect
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Dialect.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Dialect.zep)
| Namespace | Phalcon\Db |
| Implements | DialectInterface |
@@ -2703,7 +2703,7 @@ Prepares table for this RDBMS
Class Phalcon\Db\Dialect\Mysql
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Dialect/Mysql.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Dialect/Mysql.zep)
| Namespace | Phalcon\Db\Dialect |
| Uses | Phalcon\Db\Dialect, Phalcon\Db\Column, Phalcon\Db\Exception, Phalcon\Db\IndexInterface, Phalcon\Db\ColumnInterface, Phalcon\Db\ReferenceInterface, Phalcon\Db\DialectInterface |
@@ -2907,7 +2907,7 @@ Generates SQL to add the table creation options
Class Phalcon\Db\Dialect\Postgresql
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Dialect/Postgresql.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Dialect/Postgresql.zep)
| Namespace | Phalcon\Db\Dialect |
| Uses | Phalcon\Db\Dialect, Phalcon\Db\Column, Phalcon\Db\Exception, Phalcon\Db\IndexInterface, Phalcon\Db\ColumnInterface, Phalcon\Db\ReferenceInterface, Phalcon\Db\DialectInterface |
@@ -3106,7 +3106,7 @@ protected function getTableOptions( array $definition ): string;
Class Phalcon\Db\Dialect\Sqlite
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Dialect/Sqlite.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Dialect/Sqlite.zep)
| Namespace | Phalcon\Db\Dialect |
| Uses | Phalcon\Db\Column, Phalcon\Db\Exception, Phalcon\Db\IndexInterface, Phalcon\Db\Dialect, Phalcon\Db\DialectInterface, Phalcon\Db\ColumnInterface, Phalcon\Db\ReferenceInterface |
@@ -3318,7 +3318,7 @@ Generates SQL checking for the existence of a schema.view
Interface Phalcon\Db\DialectInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/DialectInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/DialectInterface.zep)
| Namespace | Phalcon\Db |
@@ -3536,7 +3536,7 @@ Generates SQL checking for the existence of a schema.view
Class Phalcon\Db\Enum
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Enum.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Enum.zep)
| Namespace | Phalcon\Db |
@@ -3569,7 +3569,7 @@ const FETCH_UNIQUE;
Class Phalcon\Db\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Exception.zep)
| Namespace | Phalcon\Db |
| Extends | \Exception |
@@ -3580,7 +3580,7 @@ Exceptions thrown in Phalcon\Db will use this class
Class Phalcon\Db\Index
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Index.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Index.zep)
| Namespace | Phalcon\Db |
| Implements | IndexInterface |
@@ -3669,7 +3669,7 @@ Index type
Interface Phalcon\Db\IndexInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/IndexInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/IndexInterface.zep)
| Namespace | Phalcon\Db |
@@ -3700,7 +3700,7 @@ Gets the index type
Class Phalcon\Db\Profiler
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Profiler.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Profiler.zep)
| Namespace | Phalcon\Db |
| Uses | Phalcon\Db\Profiler\Item |
@@ -3841,7 +3841,7 @@ Stops the active profile
Class Phalcon\Db\Profiler\Item
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Profiler/Item.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Profiler/Item.zep)
| Namespace | Phalcon\Db\Profiler |
@@ -3971,7 +3971,7 @@ Return the SQL variables related to the profile
Class Phalcon\Db\RawValue
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/RawValue.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/RawValue.zep)
| Namespace | Phalcon\Db |
@@ -4024,7 +4024,7 @@ public function getValue(): string;
Class Phalcon\Db\Reference
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Reference.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Reference.zep)
| Namespace | Phalcon\Db |
| Implements | ReferenceInterface |
@@ -4170,7 +4170,7 @@ Schema name
Interface Phalcon\Db\ReferenceInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/ReferenceInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/ReferenceInterface.zep)
| Namespace | Phalcon\Db |
@@ -4231,7 +4231,7 @@ Gets the schema where referenced table is
Class Phalcon\Db\Result\PdoResult
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/Result/PdoResult.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Result/PdoResult.zep)
| Namespace | Phalcon\Db\Result |
| Uses | Phalcon\Db\Enum, Phalcon\Db\ResultInterface, Phalcon\Db\Adapter\AdapterInterface |
@@ -4444,7 +4444,7 @@ $result->setFetchMode(
Interface Phalcon\Db\ResultInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Db/ResultInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/ResultInterface.zep)
| Namespace | Phalcon\Db |
diff --git a/docs/api/phalcon_di.md b/docs/api/phalcon_di.md
index 6c478ae23..c659e2392 100644
--- a/docs/api/phalcon_di.md
+++ b/docs/api/phalcon_di.md
@@ -16,7 +16,7 @@
Abstract Class Phalcon\Di\AbstractInjectionAware
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/AbstractInjectionAware.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/AbstractInjectionAware.zep)
| Namespace | Phalcon\Di |
| Implements | InjectionAwareInterface |
@@ -53,7 +53,7 @@ Sets the dependency injector
Class Phalcon\Di\Di
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/Di.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/Di.zep)
| Namespace | Phalcon\Di |
| Uses | Phalcon\Di\Service, Phalcon\Di\DiInterface, Phalcon\Di\Exception, Phalcon\Di\Exception\ServiceResolutionException, Phalcon\Config\Adapter\Php, Phalcon\Config\Adapter\Yaml, Phalcon\Config\ConfigInterface, Phalcon\Di\ServiceInterface, Phalcon\Events\ManagerInterface, Phalcon\Di\InitializationAwareInterface, Phalcon\Di\InjectionAwareInterface, Phalcon\Di\ServiceProviderInterface |
@@ -381,7 +381,7 @@ Loads services from a Config object.
Interface Phalcon\Di\DiInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/DiInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/DiInterface.zep)
| Namespace | Phalcon\Di |
| Uses | ArrayAccess |
@@ -483,7 +483,7 @@ Registers an "always shared" service in the services container
Class Phalcon\Di\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/Exception.zep)
| Namespace | Phalcon\Di |
| Extends | \Exception |
@@ -494,7 +494,7 @@ Exceptions thrown in Phalcon\Di will use this class
Class Phalcon\Di\Exception\ServiceResolutionException
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/Exception/ServiceResolutionException.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/Exception/ServiceResolutionException.zep)
| Namespace | Phalcon\Di\Exception |
| Extends | \Phalcon\Di\Exception |
@@ -505,7 +505,7 @@ Phalcon\Di\Exception\ServiceResolutionException
Class Phalcon\Di\FactoryDefault
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/FactoryDefault.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/FactoryDefault.zep)
| Namespace | Phalcon\Di |
| Uses | Phalcon\Filter\FilterFactory |
@@ -529,7 +529,7 @@ Phalcon\Di\FactoryDefault constructor
Class Phalcon\Di\FactoryDefault\Cli
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/FactoryDefault/Cli.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/FactoryDefault/Cli.zep)
| Namespace | Phalcon\Di\FactoryDefault |
| Uses | Phalcon\Di\FactoryDefault, Phalcon\Di\Service, Phalcon\Filter\FilterFactory |
@@ -555,7 +555,7 @@ Phalcon\Di\FactoryDefault\Cli constructor
Interface Phalcon\Di\InitializationAwareInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/InitializationAwareInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/InitializationAwareInterface.zep)
| Namespace | Phalcon\Di |
@@ -574,7 +574,7 @@ public function initialize(): void;
Abstract Class Phalcon\Di\Injectable
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/Injectable.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/Injectable.zep)
| Namespace | Phalcon\Di |
| Uses | stdClass, Phalcon\Di\Di, Phalcon\Session\BagInterface |
@@ -625,7 +625,7 @@ Sets the dependency injector
Interface Phalcon\Di\InjectionAwareInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/InjectionAwareInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/InjectionAwareInterface.zep)
| Namespace | Phalcon\Di |
@@ -651,7 +651,7 @@ Sets the dependency injector
Class Phalcon\Di\Service
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/Service.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/Service.zep)
| Namespace | Phalcon\Di |
| Uses | Closure, Phalcon\Di\Exception\ServiceResolutionException, Phalcon\Di\Service\Builder |
@@ -759,7 +759,7 @@ Sets/Resets the shared instance related to the service
Class Phalcon\Di\Service\Builder
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/Service/Builder.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/Service/Builder.zep)
| Namespace | Phalcon\Di\Service |
| Uses | Phalcon\Di\DiInterface, Phalcon\Di\Exception |
@@ -781,7 +781,7 @@ Builds a service using a complex service definition
Interface Phalcon\Di\ServiceInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/ServiceInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/ServiceInterface.zep)
| Namespace | Phalcon\Di |
@@ -842,7 +842,7 @@ Sets if the service is shared or not
Interface Phalcon\Di\ServiceProviderInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Di/ServiceProviderInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Di/ServiceProviderInterface.zep)
| Namespace | Phalcon\Di |
diff --git a/docs/api/phalcon_dispatcher.md b/docs/api/phalcon_dispatcher.md
index fa9927ecc..40be2f523 100644
--- a/docs/api/phalcon_dispatcher.md
+++ b/docs/api/phalcon_dispatcher.md
@@ -5,7 +5,7 @@
Abstract Class Phalcon\Dispatcher\AbstractDispatcher
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Dispatcher/AbstractDispatcher.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Dispatcher/AbstractDispatcher.zep)
| Namespace | Phalcon\Dispatcher |
| Uses | Exception, Phalcon\Di\DiInterface, Phalcon\Di\AbstractInjectionAware, Phalcon\Dispatcher\Exception, Phalcon\Events\EventsAwareInterface, Phalcon\Events\ManagerInterface, Phalcon\Filter\FilterInterface, Phalcon\Mvc\Model\Binder, Phalcon\Mvc\Model\BinderInterface |
@@ -431,7 +431,7 @@ protected function toCamelCase( string $input ): string;
Interface Phalcon\Dispatcher\DispatcherInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Dispatcher/DispatcherInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Dispatcher/DispatcherInterface.zep)
| Namespace | Phalcon\Dispatcher |
@@ -571,7 +571,7 @@ Sets action params to be dispatched
Class Phalcon\Dispatcher\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Dispatcher/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Dispatcher/Exception.zep)
| Namespace | Phalcon\Dispatcher |
| Extends | \Exception |
diff --git a/docs/api/phalcon_domain.md b/docs/api/phalcon_domain.md
index 73a66cf60..451b0adf6 100644
--- a/docs/api/phalcon_domain.md
+++ b/docs/api/phalcon_domain.md
@@ -8,7 +8,7 @@
Class Phalcon\Domain\Payload\Payload
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Domain/Payload/Payload.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Domain/Payload/Payload.zep)
| Namespace | Phalcon\Domain\Payload |
| Uses | Throwable |
@@ -141,7 +141,7 @@ Sets the payload status.
Class Phalcon\Domain\Payload\PayloadFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Domain/Payload/PayloadFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Domain/Payload/PayloadFactory.zep)
| Namespace | Phalcon\Domain\Payload |
@@ -160,7 +160,7 @@ Instantiate a new object
Interface Phalcon\Domain\Payload\PayloadInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Domain/Payload/PayloadInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Domain/Payload/PayloadInterface.zep)
| Namespace | Phalcon\Domain\Payload |
| Extends | ReadableInterface |
@@ -171,7 +171,7 @@ This interface is used for consumers
Interface Phalcon\Domain\Payload\ReadableInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Domain/Payload/ReadableInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Domain/Payload/ReadableInterface.zep)
| Namespace | Phalcon\Domain\Payload |
| Uses | Throwable |
@@ -221,7 +221,7 @@ Gets the status of this payload.
Class Phalcon\Domain\Payload\Status
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Domain/Payload/Status.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Domain/Payload/Status.zep)
| Namespace | Phalcon\Domain\Payload |
@@ -264,7 +264,7 @@ Instantiation not allowed.
Interface Phalcon\Domain\Payload\WriteableInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Domain/Payload/WriteableInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Domain/Payload/WriteableInterface.zep)
| Namespace | Phalcon\Domain\Payload |
| Uses | Throwable |
diff --git a/docs/api/phalcon_encryption.md b/docs/api/phalcon_encryption.md
index f0b349219..4ab925b00 100644
--- a/docs/api/phalcon_encryption.md
+++ b/docs/api/phalcon_encryption.md
@@ -32,7 +32,7 @@
Class Phalcon\Encryption\Crypt
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt.zep)
| Namespace | Phalcon\Encryption |
| Uses | Phalcon\Encryption\Crypt\CryptInterface, Phalcon\Encryption\Crypt\Exception\Exception, Phalcon\Encryption\Crypt\Exception\Mismatch, Phalcon\Encryption\Crypt\PadFactory |
@@ -372,7 +372,7 @@ protected function phpOpensslRandomPseudoBytes( int $length );
Interface Phalcon\Encryption\Crypt\CryptInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/CryptInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/CryptInterface.zep)
| Namespace | Phalcon\Encryption\Crypt |
@@ -487,7 +487,7 @@ Sets if the calculating message digest must be used.
Class Phalcon\Encryption\Crypt\Exception\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Exception/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Exception/Exception.zep)
| Namespace | Phalcon\Encryption\Crypt\Exception |
| Extends | \Exception |
@@ -498,7 +498,7 @@ Exceptions thrown in Phalcon\Crypt use this class
Class Phalcon\Encryption\Crypt\Exception\Mismatch
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Exception/Mismatch.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Exception/Mismatch.zep)
| Namespace | Phalcon\Encryption\Crypt\Exception |
| Extends | Exception |
@@ -509,7 +509,7 @@ Exceptions thrown in Phalcon\Crypt will use this class.
Class Phalcon\Encryption\Crypt\PadFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/PadFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/PadFactory.zep)
| Namespace | Phalcon\Encryption\Crypt |
| Uses | Phalcon\Encryption\Crypt, Phalcon\Encryption\Crypt\Padding\PadInterface, Phalcon\Factory\AbstractFactory, Phalcon\Support\Helper\Arr\Get |
@@ -560,7 +560,7 @@ protected function getServices(): array;
Class Phalcon\Encryption\Crypt\Padding\Ansi
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Padding/Ansi.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Padding/Ansi.zep)
| Namespace | Phalcon\Encryption\Crypt\Padding |
| Implements | PadInterface |
@@ -588,7 +588,7 @@ public function unpad( string $input, int $blockSize ): int;
Class Phalcon\Encryption\Crypt\Padding\Iso10126
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Padding/Iso10126.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Padding/Iso10126.zep)
| Namespace | Phalcon\Encryption\Crypt\Padding |
| Implements | PadInterface |
@@ -616,7 +616,7 @@ public function unpad( string $input, int $blockSize ): int;
Class Phalcon\Encryption\Crypt\Padding\IsoIek
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Padding/IsoIek.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Padding/IsoIek.zep)
| Namespace | Phalcon\Encryption\Crypt\Padding |
| Implements | PadInterface |
@@ -644,7 +644,7 @@ public function unpad( string $input, int $blockSize ): int;
Class Phalcon\Encryption\Crypt\Padding\Noop
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Padding/Noop.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Padding/Noop.zep)
| Namespace | Phalcon\Encryption\Crypt\Padding |
| Implements | PadInterface |
@@ -672,7 +672,7 @@ public function unpad( string $input, int $blockSize ): int;
Interface Phalcon\Encryption\Crypt\Padding\PadInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Padding/PadInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Padding/PadInterface.zep)
| Namespace | Phalcon\Encryption\Crypt\Padding |
@@ -697,7 +697,7 @@ public function unpad( string $input, int $blockSize ): int;
Class Phalcon\Encryption\Crypt\Padding\Pkcs7
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Padding/Pkcs7.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Padding/Pkcs7.zep)
| Namespace | Phalcon\Encryption\Crypt\Padding |
| Implements | PadInterface |
@@ -725,7 +725,7 @@ public function unpad( string $input, int $blockSize ): int;
Class Phalcon\Encryption\Crypt\Padding\Space
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Padding/Space.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Padding/Space.zep)
| Namespace | Phalcon\Encryption\Crypt\Padding |
| Implements | PadInterface |
@@ -753,7 +753,7 @@ public function unpad( string $input, int $blockSize ): int;
Class Phalcon\Encryption\Crypt\Padding\Zero
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Crypt/Padding/Zero.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Crypt/Padding/Zero.zep)
| Namespace | Phalcon\Encryption\Crypt\Padding |
| Implements | PadInterface |
@@ -781,7 +781,7 @@ public function unpad( string $input, int $blockSize ): int;
Class Phalcon\Encryption\Security
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security.zep)
| Namespace | Phalcon\Encryption |
| Uses | Phalcon\Di\DiInterface, Phalcon\Di\AbstractInjectionAware, Phalcon\Http\RequestInterface, Phalcon\Encryption\Security\Random, Phalcon\Encryption\Security\Exception, Phalcon\Session\ManagerInterface |
@@ -1019,7 +1019,7 @@ protected function getLocalService( string $name, string $property );
Class Phalcon\Encryption\Security\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/Exception.zep)
| Namespace | Phalcon\Encryption\Security |
| Extends | \Exception |
@@ -1032,7 +1032,7 @@ Exceptions thrown in Phalcon\Security will use this class
Class Phalcon\Encryption\Security\JWT\Builder
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Builder.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Builder.zep)
| Namespace | Phalcon\Encryption\Security\JWT |
| Uses | Phalcon\Encryption\Security\JWT\Exceptions\ValidatorException, Phalcon\Encryption\Security\JWT\Signer\SignerInterface, Phalcon\Encryption\Security\JWT\Token\Enum, Phalcon\Encryption\Security\JWT\Token\Item, Phalcon\Encryption\Security\JWT\Token\Signature, Phalcon\Encryption\Security\JWT\Token\Token, Phalcon\Support\Collection, Phalcon\Support\Collection\CollectionInterface, Phalcon\Support\Helper\Json\Encode |
@@ -1274,7 +1274,7 @@ Sets a registered claim
Class Phalcon\Encryption\Security\JWT\Exceptions\UnsupportedAlgorithmException
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Exceptions/UnsupportedAlgorithmException.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Exceptions/UnsupportedAlgorithmException.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Exceptions |
| Uses | Exception |
@@ -1286,7 +1286,7 @@ Exception thrown when the algorithm is not supported for JWT
Class Phalcon\Encryption\Security\JWT\Exceptions\ValidatorException
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Exceptions/ValidatorException.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Exceptions/ValidatorException.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Exceptions |
| Uses | Exception |
@@ -1298,7 +1298,7 @@ Exception thrown when the validation does not pass for JWT
Abstract Class Phalcon\Encryption\Security\JWT\Signer\AbstractSigner
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Signer/AbstractSigner.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Signer/AbstractSigner.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Signer |
| Implements | SignerInterface |
@@ -1327,7 +1327,7 @@ public function getAlgorithm(): string;
Class Phalcon\Encryption\Security\JWT\Signer\Hmac
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Signer/Hmac.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Signer/Hmac.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Signer |
| Uses | Phalcon\Encryption\Security\JWT\Exceptions\UnsupportedAlgorithmException |
@@ -1366,7 +1366,7 @@ Verify a passed source with a payload and passphrase
Class Phalcon\Encryption\Security\JWT\Signer\None
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Signer/None.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Signer/None.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Signer |
| Implements | SignerInterface |
@@ -1404,7 +1404,7 @@ Verify a passed source with a payload and passphrase
Interface Phalcon\Encryption\Security\JWT\Signer\SignerInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Signer/SignerInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Signer/SignerInterface.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Signer |
@@ -1441,7 +1441,7 @@ Verify a passed source with a payload and passphrase
Abstract Class Phalcon\Encryption\Security\JWT\Token\AbstractItem
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Token/AbstractItem.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Token/AbstractItem.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Token |
@@ -1469,7 +1469,7 @@ public function getEncoded(): string;
Class Phalcon\Encryption\Security\JWT\Token\Enum
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Token/Enum.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Token/Enum.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Token |
@@ -1495,7 +1495,7 @@ const TYPE = typ;
Class Phalcon\Encryption\Security\JWT\Token\Item
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Token/Item.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Token/Item.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Token |
| Extends | AbstractItem |
@@ -1533,7 +1533,7 @@ public function has( string $name ): bool;
Class Phalcon\Encryption\Security\JWT\Token\Parser
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Token/Parser.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Token/Parser.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Token |
| Uses | InvalidArgumentException, Phalcon\Support\Helper\Json\Decode |
@@ -1572,7 +1572,7 @@ Parse a token and return it
Class Phalcon\Encryption\Security\JWT\Token\Signature
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Token/Signature.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Token/Signature.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Token |
| Extends | AbstractItem |
@@ -1598,7 +1598,7 @@ public function getHash(): string;
Class Phalcon\Encryption\Security\JWT\Token\Token
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Token/Token.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Token/Token.zep)
| Namespace | Phalcon\Encryption\Security\JWT\Token |
| Uses | Phalcon\Encryption\Security\JWT\Signer\SignerInterface, Phalcon\Encryption\Security\JWT\Validator |
@@ -1684,7 +1684,7 @@ Verify the signature
Class Phalcon\Encryption\Security\JWT\Validator
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/JWT/Validator.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/JWT/Validator.zep)
| Namespace | Phalcon\Encryption\Security\JWT |
| Uses | Phalcon\Encryption\Security\JWT\Exceptions\ValidatorException, Phalcon\Encryption\Security\JWT\Signer\SignerInterface, Phalcon\Encryption\Security\JWT\Token\Enum, Phalcon\Encryption\Security\JWT\Token\Token |
@@ -1794,7 +1794,7 @@ Validate the signature of the token
Class Phalcon\Encryption\Security\Random
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Encryption/Security/Random.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Encryption/Security/Random.zep)
| Namespace | Phalcon\Encryption\Security |
diff --git a/docs/api/phalcon_events.md b/docs/api/phalcon_events.md
index f1908ec42..7c62fdd9e 100644
--- a/docs/api/phalcon_events.md
+++ b/docs/api/phalcon_events.md
@@ -8,7 +8,7 @@
Abstract Class Phalcon\Events\AbstractEventsAware
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Events/AbstractEventsAware.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Events/AbstractEventsAware.zep)
| Namespace | Phalcon\Events |
| Uses | Phalcon\Events\ManagerInterface |
@@ -49,7 +49,7 @@ Helper method to fire an event
Class Phalcon\Events\Event
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Events/Event.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Events/Event.zep)
| Namespace | Phalcon\Events |
| Implements | EventInterface |
@@ -178,7 +178,7 @@ if ($event->isCancelable()) {
Interface Phalcon\Events\EventInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Events/EventInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Events/EventInterface.zep)
| Namespace | Phalcon\Events |
@@ -233,7 +233,7 @@ Stops the event preventing propagation
Interface Phalcon\Events\EventsAwareInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Events/EventsAwareInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Events/EventsAwareInterface.zep)
| Namespace | Phalcon\Events |
@@ -259,7 +259,7 @@ Sets the events manager
Class Phalcon\Events\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Events/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Events/Exception.zep)
| Namespace | Phalcon\Events |
| Extends | \Exception |
@@ -270,7 +270,7 @@ Exceptions thrown in Phalcon\Events will use this class
Class Phalcon\Events\Manager
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Events/Manager.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Events/Manager.zep)
| Namespace | Phalcon\Events |
| Uses | Closure, SplPriorityQueue |
@@ -411,7 +411,7 @@ public function isValidHandler( mixed $handler ): bool;
Interface Phalcon\Events\ManagerInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Events/ManagerInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Events/ManagerInterface.zep)
| Namespace | Phalcon\Events |
diff --git a/docs/api/phalcon_factory.md b/docs/api/phalcon_factory.md
index 61c7dad12..47df47ee2 100644
--- a/docs/api/phalcon_factory.md
+++ b/docs/api/phalcon_factory.md
@@ -5,7 +5,7 @@
Abstract Class Phalcon\Factory\AbstractConfigFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Factory/AbstractConfigFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Factory/AbstractConfigFactory.zep)
| Namespace | Phalcon\Factory |
| Uses | Phalcon\Config\ConfigInterface |
@@ -48,7 +48,7 @@ protected function getExceptionClass(): string;
Abstract Class Phalcon\Factory\AbstractFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Factory/AbstractFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Factory/AbstractFactory.zep)
| Namespace | Phalcon\Factory |
| Uses | Phalcon\Config\ConfigInterface |
@@ -100,7 +100,7 @@ Initialize services/add new services
Class Phalcon\Factory\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Factory/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Factory/Exception.zep)
| Namespace | Phalcon\Factory |
| Extends | \Exception |
diff --git a/docs/api/phalcon_filter.md b/docs/api/phalcon_filter.md
index a425b48d7..70f66f1b8 100644
--- a/docs/api/phalcon_filter.md
+++ b/docs/api/phalcon_filter.md
@@ -68,7 +68,7 @@
Class Phalcon\Filter\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Exception.zep)
| Namespace | Phalcon\Filter |
| Extends | \Exception |
@@ -81,7 +81,7 @@ Exceptions thrown in Phalcon\Filter will use this class
Class Phalcon\Filter\Filter
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Filter.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Filter.zep)
| Namespace | Phalcon\Filter |
| Implements | FilterInterface |
@@ -177,7 +177,7 @@ Loads the objects in the internal mapper array
Class Phalcon\Filter\FilterFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/FilterFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/FilterFactory.zep)
| Namespace | Phalcon\Filter |
| Uses | Phalcon\Filter\Filter |
@@ -206,7 +206,7 @@ Returns the available adapters
Interface Phalcon\Filter\FilterInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/FilterInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/FilterInterface.zep)
| Namespace | Phalcon\Filter |
@@ -225,7 +225,7 @@ Sanitizes a value with a specified single or set of sanitizers
Class Phalcon\Filter\Sanitize\AbsInt
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/AbsInt.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/AbsInt.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -246,7 +246,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Sanitize\Alnum
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Alnum.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Alnum.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -267,7 +267,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Sanitize\Alpha
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Alpha.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Alpha.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -288,7 +288,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Sanitize\BoolVal
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/BoolVal.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/BoolVal.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -309,7 +309,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Sanitize\Email
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Email.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Email.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -330,7 +330,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Sanitize\FloatVal
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/FloatVal.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/FloatVal.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -351,7 +351,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Sanitize\IntVal
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/IntVal.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/IntVal.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -372,7 +372,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Sanitize\Lower
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Lower.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Lower.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -393,7 +393,7 @@ public function __invoke( string $input );
Class Phalcon\Filter\Sanitize\LowerFirst
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/LowerFirst.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/LowerFirst.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -414,7 +414,7 @@ public function __invoke( string $input );
Class Phalcon\Filter\Sanitize\Regex
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Regex.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Regex.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -435,7 +435,7 @@ public function __invoke( mixed $input, mixed $pattern, mixed $replace );
Class Phalcon\Filter\Sanitize\Remove
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Remove.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Remove.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -456,7 +456,7 @@ public function __invoke( mixed $input, mixed $replace );
Class Phalcon\Filter\Sanitize\Replace
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Replace.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Replace.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -477,7 +477,7 @@ public function __invoke( mixed $input, mixed $from, mixed $to );
Class Phalcon\Filter\Sanitize\Special
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Special.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Special.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -498,7 +498,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Sanitize\SpecialFull
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/SpecialFull.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/SpecialFull.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -519,7 +519,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Sanitize\StringVal
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/StringVal.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/StringVal.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -538,7 +538,7 @@ public function __invoke( string $input, int $flags = int ): string;
Class Phalcon\Filter\Sanitize\StringValLegacy
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/StringValLegacy.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/StringValLegacy.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -560,7 +560,7 @@ public function __invoke( mixed $input );
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Striptags.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Striptags.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -581,7 +581,7 @@ public function __invoke( string $input );
Class Phalcon\Filter\Sanitize\Trim
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Trim.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Trim.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -602,7 +602,7 @@ public function __invoke( string $input );
Class Phalcon\Filter\Sanitize\Upper
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Upper.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Upper.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -623,7 +623,7 @@ public function __invoke( string $input );
Class Phalcon\Filter\Sanitize\UpperFirst
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/UpperFirst.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/UpperFirst.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -644,7 +644,7 @@ public function __invoke( string $input );
Class Phalcon\Filter\Sanitize\UpperWords
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/UpperWords.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/UpperWords.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -665,7 +665,7 @@ public function __invoke( string $input );
Class Phalcon\Filter\Sanitize\Url
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Sanitize/Url.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Sanitize/Url.zep)
| Namespace | Phalcon\Filter\Sanitize |
@@ -686,7 +686,7 @@ public function __invoke( mixed $input );
Class Phalcon\Filter\Validation
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation.zep)
| Namespace | Phalcon\Filter |
| Uses | Phalcon\Di\Di, Phalcon\Di\DiInterface, Phalcon\Di\Injectable, Phalcon\Filter\FilterInterface, Phalcon\Messages\MessageInterface, Phalcon\Messages\Messages, Phalcon\Filter\Validation\ValidationInterface, Phalcon\Filter\Validation\Exception, Phalcon\Filter\Validation\ValidatorInterface, Phalcon\Filter\Validation\AbstractCombinedFieldsValidator |
@@ -877,7 +877,7 @@ Internal validations, if it returns true, then skip the current validator
Abstract Class Phalcon\Filter\Validation\AbstractCombinedFieldsValidator
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/AbstractCombinedFieldsValidator.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/AbstractCombinedFieldsValidator.zep)
| Namespace | Phalcon\Filter\Validation |
| Extends | AbstractValidator |
@@ -888,7 +888,7 @@ This is a base class for combined fields validators
Abstract Class Phalcon\Filter\Validation\AbstractValidator
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/AbstractValidator.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/AbstractValidator.zep)
| Namespace | Phalcon\Filter\Validation |
| Uses | Phalcon\Support\Helper\Arr\Whitelist, Phalcon\Messages\Message, Phalcon\Filter\Validation |
@@ -1009,7 +1009,7 @@ Prepares a label for the field.
Abstract Class Phalcon\Filter\Validation\AbstractValidatorComposite
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/AbstractValidatorComposite.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/AbstractValidatorComposite.zep)
| Namespace | Phalcon\Filter\Validation |
| Uses | Phalcon\Filter\Validation |
@@ -1046,7 +1046,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Exception.zep)
| Namespace | Phalcon\Filter\Validation |
| Extends | \Exception |
@@ -1057,7 +1057,7 @@ Exceptions thrown in Phalcon\Filter\Validation\* classes will use this class
Interface Phalcon\Filter\Validation\ValidationInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/ValidationInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/ValidationInterface.zep)
| Namespace | Phalcon\Filter\Validation |
| Uses | Phalcon\Di\Injectable, Phalcon\Messages\MessageInterface, Phalcon\Messages\Messages |
@@ -1156,7 +1156,7 @@ Validate a set of data according to a set of rules
Class Phalcon\Filter\Validation\Validator\Alnum
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Alnum.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Alnum.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -1221,7 +1221,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Alpha
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Alpha.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Alpha.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -1286,7 +1286,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Between
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Between.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Between.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -1362,7 +1362,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Callback
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Callback.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Callback.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\ValidatorInterface, Phalcon\Filter\Validation\AbstractValidator |
@@ -1437,7 +1437,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Confirmation
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Confirmation.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Confirmation.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\Exception, Phalcon\Filter\Validation\AbstractValidator |
@@ -1513,7 +1513,7 @@ Compare strings
Class Phalcon\Filter\Validation\Validator\CreditCard
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/CreditCard.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/CreditCard.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -1578,7 +1578,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Date
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Date.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Date.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | DateTime, Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -1648,7 +1648,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Digit
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Digit.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Digit.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -1713,7 +1713,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Email
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Email.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Email.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -1778,7 +1778,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Exception.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Extends | \Exception |
@@ -1790,7 +1790,7 @@ class
Class Phalcon\Filter\Validation\Validator\ExclusionIn
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/ExclusionIn.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/ExclusionIn.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator, Phalcon\Filter\Validation\Exception |
@@ -1866,7 +1866,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\File
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/File.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/File.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Support\Helper\Arr\Get, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidatorComposite, Phalcon\Filter\Validation\Validator\File\MimeType, Phalcon\Filter\Validation\Validator\File\Resolution\Equal, Phalcon\Filter\Validation\Validator\File\Resolution\Max, Phalcon\Filter\Validation\Validator\File\Resolution\Min, Phalcon\Filter\Validation\Validator\File\Size\Equal, Phalcon\Filter\Validation\Validator\File\Size\Max, Phalcon\Filter\Validation\Validator\File\Size\Min |
@@ -1954,7 +1954,7 @@ Constructor
Abstract Class Phalcon\Filter\Validation\Validator\File\AbstractFile
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/File/AbstractFile.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/File/AbstractFile.zep)
| Namespace | Phalcon\Filter\Validation\Validator\File |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -2119,7 +2119,7 @@ overriden in a subclass if you do not want to check uploaded files
Class Phalcon\Filter\Validation\Validator\File\MimeType
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/File/MimeType.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/File/MimeType.zep)
| Namespace | Phalcon\Filter\Validation\Validator\File |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\Exception |
@@ -2192,7 +2192,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\File\Resolution\Equal
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/File/Resolution/Equal.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/File/Resolution/Equal.zep)
| Namespace | Phalcon\Filter\Validation\Validator\File\Resolution |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\Validator\File\AbstractFile |
@@ -2262,7 +2262,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\File\Resolution\Max
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/File/Resolution/Max.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/File/Resolution/Max.zep)
| Namespace | Phalcon\Filter\Validation\Validator\File\Resolution |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\Validator\File\AbstractFile |
@@ -2337,7 +2337,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\File\Resolution\Min
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/File/Resolution/Min.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/File/Resolution/Min.zep)
| Namespace | Phalcon\Filter\Validation\Validator\File\Resolution |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\Validator\File\AbstractFile |
@@ -2412,7 +2412,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\File\Size\Equal
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/File/Size/Equal.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/File/Size/Equal.zep)
| Namespace | Phalcon\Filter\Validation\Validator\File\Size |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\Validator\File\AbstractFile |
@@ -2487,7 +2487,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\File\Size\Max
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/File/Size/Max.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/File/Size/Max.zep)
| Namespace | Phalcon\Filter\Validation\Validator\File\Size |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\Validator\File\AbstractFile |
@@ -2562,7 +2562,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\File\Size\Min
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/File/Size/Min.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/File/Size/Min.zep)
| Namespace | Phalcon\Filter\Validation\Validator\File\Size |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\Validator\File\AbstractFile |
@@ -2637,7 +2637,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Identical
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Identical.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Identical.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -2707,7 +2707,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\InclusionIn
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/InclusionIn.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/InclusionIn.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator, Phalcon\Filter\Validation\Exception |
@@ -2777,7 +2777,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Ip
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Ip.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Ip.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator, Phalcon\Messages\Message |
@@ -2865,7 +2865,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Numericality
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Numericality.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Numericality.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -2930,7 +2930,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\PresenceOf
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/PresenceOf.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/PresenceOf.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -2995,7 +2995,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Regex
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Regex.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Regex.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -3065,7 +3065,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\StringLength
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/StringLength.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/StringLength.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation\AbstractValidator, Phalcon\Filter\Validation\AbstractValidatorComposite, Phalcon\Filter\Validation\Validator\StringLength\Max, Phalcon\Filter\Validation\Validator\StringLength\Min, Phalcon\Filter\Validation\Exception |
@@ -3145,7 +3145,7 @@ Constructor
Class Phalcon\Filter\Validation\Validator\StringLength\Max
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/StringLength/Max.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/StringLength/Max.zep)
| Namespace | Phalcon\Filter\Validation\Validator\StringLength |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator, Phalcon\Filter\Validation\Exception |
@@ -3222,7 +3222,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\StringLength\Min
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/StringLength/Min.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/StringLength/Min.zep)
| Namespace | Phalcon\Filter\Validation\Validator\StringLength |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator, Phalcon\Filter\Validation\Exception |
@@ -3299,7 +3299,7 @@ Executes the validation
Class Phalcon\Filter\Validation\Validator\Uniqueness
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Uniqueness.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Uniqueness.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Mvc\Model, Phalcon\Mvc\ModelInterface, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractCombinedFieldsValidator, Phalcon\Filter\Validation\Exception |
@@ -3423,7 +3423,7 @@ Uniqueness method used for model
Class Phalcon\Filter\Validation\Validator\Url
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/Validator/Url.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/Validator/Url.zep)
| Namespace | Phalcon\Filter\Validation\Validator |
| Uses | Phalcon\Messages\Message, Phalcon\Filter\Validation, Phalcon\Filter\Validation\AbstractValidator |
@@ -3488,7 +3488,7 @@ Executes the validation
Interface Phalcon\Filter\Validation\ValidatorCompositeInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/ValidatorCompositeInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/ValidatorCompositeInterface.zep)
| Namespace | Phalcon\Filter\Validation |
| Uses | Phalcon\Filter\Validation |
@@ -3514,7 +3514,7 @@ Executes the validation
Class Phalcon\Filter\Validation\ValidatorFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/ValidatorFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/ValidatorFactory.zep)
| Namespace | Phalcon\Filter\Validation |
| Uses | Phalcon\Factory\AbstractFactory |
@@ -3558,7 +3558,7 @@ Returns the available adapters
Interface Phalcon\Filter\Validation\ValidatorInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Filter/Validation/ValidatorInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Filter/Validation/ValidatorInterface.zep)
| Namespace | Phalcon\Filter\Validation |
| Uses | Phalcon\Filter\Validation |
diff --git a/docs/api/phalcon_flash.md b/docs/api/phalcon_flash.md
index ad88fa36d..435f70b1b 100644
--- a/docs/api/phalcon_flash.md
+++ b/docs/api/phalcon_flash.md
@@ -7,7 +7,7 @@
Abstract Class Phalcon\Flash\AbstractFlash
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Flash/AbstractFlash.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Flash/AbstractFlash.zep)
| Namespace | Phalcon\Flash |
| Uses | Phalcon\Di\Di, Phalcon\Di\DiInterface, Phalcon\Di\AbstractInjectionAware, Phalcon\Html\Escaper\EscaperInterface, Phalcon\Session\ManagerInterface, Phalcon\Support\Helper\Str\Interpolate |
@@ -228,7 +228,7 @@ $flash->warning("Hey, this is important");
Class Phalcon\Flash\Direct
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Flash/Direct.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Flash/Direct.zep)
| Namespace | Phalcon\Flash |
| Extends | AbstractFlash |
@@ -256,7 +256,7 @@ Prints the messages accumulated in the flasher
Class Phalcon\Flash\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Flash/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Flash/Exception.zep)
| Namespace | Phalcon\Flash |
| Extends | \Exception |
@@ -267,7 +267,7 @@ Exceptions thrown in Phalcon\Flash classes will use this class
Interface Phalcon\Flash\FlashInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Flash/FlashInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Flash/FlashInterface.zep)
| Namespace | Phalcon\Flash |
@@ -312,7 +312,7 @@ Shows a HTML warning message
Class Phalcon\Flash\Session
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Flash/Session.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Flash/Session.zep)
| Namespace | Phalcon\Flash |
| Uses | Phalcon\Session\ManagerInterface |
diff --git a/docs/api/phalcon_forms.md b/docs/api/phalcon_forms.md
index b34245a35..35b33e75e 100644
--- a/docs/api/phalcon_forms.md
+++ b/docs/api/phalcon_forms.md
@@ -19,7 +19,7 @@
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/AbstractElement.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/AbstractElement.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | InvalidArgumentException, Phalcon\Di\DiInterface, Phalcon\Di\Di, Phalcon\Filter\Validation\ValidatorInterface, Phalcon\Forms\Form, Phalcon\Forms\Exception, Phalcon\Html\Escaper, Phalcon\Html\TagFactory, Phalcon\Messages\MessageInterface, Phalcon\Messages\Messages |
@@ -305,7 +305,7 @@ Returns the tagFactory; throws exception if not present
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Check.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Check.zep)
| Namespace | Phalcon\Forms\Element |
| Extends | AbstractElement |
@@ -325,7 +325,7 @@ protected method = inputCheckbox;
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Date.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Date.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag |
@@ -346,7 +346,7 @@ protected method = inputDate;
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/ElementInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/ElementInterface.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Forms\Form, Phalcon\Messages\MessageInterface, Phalcon\Messages\Messages, Phalcon\Filter\Validation\ValidatorInterface |
@@ -542,7 +542,7 @@ Sets options for the element
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Email.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Email.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag |
@@ -563,7 +563,7 @@ protected method = inputEmail;
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/File.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/File.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag |
@@ -584,7 +584,7 @@ protected method = inputFile;
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Hidden.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Hidden.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag |
@@ -605,7 +605,7 @@ protected method = inputHidden;
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Numeric.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Numeric.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag |
@@ -626,7 +626,7 @@ protected method = inputNumeric;
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Password.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Password.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag |
@@ -647,7 +647,7 @@ protected method = inputPassword;
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Radio.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Radio.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag |
@@ -668,7 +668,7 @@ protected method = inputRadio;
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Select.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Select.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag\Select |
@@ -729,7 +729,7 @@ helpers according to the element parameters
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Submit.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Submit.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag |
@@ -750,7 +750,7 @@ protected method = inputSubmit;
Class Phalcon\Forms\Element\Text
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/Text.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/Text.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Forms\Exception |
@@ -762,7 +762,7 @@ Component INPUT[type=text] for forms
Class Phalcon\Forms\Element\TextArea
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Element/TextArea.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Element/TextArea.zep)
| Namespace | Phalcon\Forms\Element |
| Uses | Phalcon\Tag |
@@ -783,7 +783,7 @@ protected method = inputTextarea;
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Exception.zep)
| Namespace | Phalcon\Forms |
| Extends | \Exception |
@@ -794,7 +794,7 @@ Exceptions thrown in Phalcon\Forms will use this class
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Form.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Form.zep)
| Namespace | Phalcon\Forms |
| Uses | Countable, Iterator, Phalcon\Di\Injectable, Phalcon\Di\DiInterface, Phalcon\Filter\FilterInterface, Phalcon\Forms\Element\ElementInterface, Phalcon\Html\Attributes, Phalcon\Html\Attributes\AttributesInterface, Phalcon\Html\TagFactory, Phalcon\Messages\Messages, Phalcon\Tag, Phalcon\Filter\Validation, Phalcon\Filter\Validation\ValidationInterface |
@@ -1120,7 +1120,7 @@ Check if the current element in the iterator is valid
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Forms/Manager.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Forms/Manager.zep)
| Namespace | Phalcon\Forms |
diff --git a/docs/api/phalcon_html.md b/docs/api/phalcon_html.md
index e3553e4d7..ad4b642bb 100644
--- a/docs/api/phalcon_html.md
+++ b/docs/api/phalcon_html.md
@@ -69,7 +69,7 @@
Class Phalcon\Html\Attributes
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Attributes.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Attributes.zep)
| Namespace | Phalcon\Html |
| Uses | Phalcon\Support\Collection, Phalcon\Html\Attributes\RenderInterface |
@@ -103,7 +103,7 @@ protected function renderAttributes( array $attributes ): string;
Interface Phalcon\Html\Attributes\AttributesInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Attributes/AttributesInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Attributes/AttributesInterface.zep)
| Namespace | Phalcon\Html\Attributes |
| Uses | Phalcon\Html\Attributes |
@@ -131,7 +131,7 @@ Set Attributes
Interface Phalcon\Html\Attributes\RenderInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Attributes/RenderInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Attributes/RenderInterface.zep)
| Namespace | Phalcon\Html\Attributes |
@@ -152,7 +152,7 @@ Generate a string represetation
Class Phalcon\Html\Breadcrumbs
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Breadcrumbs.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Breadcrumbs.zep)
| Namespace | Phalcon\Html |
| Uses | Phalcon\Di\DiInterface |
@@ -260,7 +260,7 @@ Returns the internal breadcrumbs array
Class Phalcon\Html\Escaper
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Escaper.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Escaper.zep)
| Namespace | Phalcon\Html |
| Uses | Phalcon\Html\Escaper\EscaperInterface |
@@ -453,7 +453,7 @@ Proxy method for testing
Interface Phalcon\Html\Escaper\EscaperInterface
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Escaper/EscaperInterface.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Escaper/EscaperInterface.zep)
| Namespace | Phalcon\Html\Escaper |
@@ -516,7 +516,7 @@ Escapes a URL. Internally uses rawurlencode
Class Phalcon\Html\Escaper\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Escaper/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Escaper/Exception.zep)
| Namespace | Phalcon\Html\Escaper |
| Extends | \Exception |
@@ -527,7 +527,7 @@ Exceptions thrown in Phalcon\Html\Escaper will use this class
Class Phalcon\Html\EscaperFactory
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/EscaperFactory.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/EscaperFactory.zep)
| Namespace | Phalcon\Html |
@@ -546,7 +546,7 @@ Create a new instance of the object
Class Phalcon\Html\Exception
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Exception.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Exception.zep)
| Namespace | Phalcon\Html |
| Extends | \Exception |
@@ -559,7 +559,7 @@ Exceptions thrown in Phalcon\Html\Tag will use this class
Abstract Class Phalcon\Html\Helper\AbstractHelper
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/AbstractHelper.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/AbstractHelper.zep)
| Namespace | Phalcon\Html\Helper |
| Uses | Phalcon\Html\Escaper\EscaperInterface, Phalcon\Html\Exception |
@@ -655,7 +655,7 @@ Produces a self close tag i.e.
Abstract Class Phalcon\Html\Helper\AbstractList
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/AbstractList.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/AbstractList.zep)
| Namespace | Phalcon\Html\Helper |
| Uses | Phalcon\Html\Exception |
@@ -707,7 +707,7 @@ Returns the tag name.
Abstract Class Phalcon\Html\Helper\AbstractSeries
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/AbstractSeries.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/AbstractSeries.zep)
| Namespace | Phalcon\Html\Helper |
| Extends | AbstractHelper |
@@ -750,7 +750,7 @@ Returns the tag name.
Class Phalcon\Html\Helper\Anchor
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/Anchor.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/Anchor.zep)
| Namespace | Phalcon\Html\Helper |
| Uses | Phalcon\Html\Exception |
@@ -777,7 +777,7 @@ protected function processAttributes( string $href, array $attributes ): array;
Class Phalcon\Html\Helper\Base
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/Base.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/Base.zep)
| Namespace | Phalcon\Html\Helper |
| Uses | Phalcon\Html\Exception |
@@ -798,7 +798,7 @@ Produce a ` ` tag.
Class Phalcon\Html\Helper\Body
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/Body.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/Body.zep)
| Namespace | Phalcon\Html\Helper |
| Uses | Phalcon\Html\Exception |
@@ -819,7 +819,7 @@ Produce a `` tag.
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/Button.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/Button.zep)
| Namespace | Phalcon\Html\Helper |
| Uses | Phalcon\Html\Exception |
@@ -840,7 +840,7 @@ Produce a `` tag.
Class Phalcon\Html\Helper\Close
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/Close.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/Close.zep)
| Namespace | Phalcon\Html\Helper |
| Extends | AbstractHelper |
@@ -860,7 +860,7 @@ Produce a `` tag.
Class Phalcon\Html\Helper\Doctype
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/Doctype.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/Doctype.zep)
| Namespace | Phalcon\Html\Helper |
@@ -920,7 +920,7 @@ public function __toString(): string;
Class Phalcon\Html\Helper\Element
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/Element.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/Element.zep)
| Namespace | Phalcon\Html\Helper |
| Uses | Phalcon\Html\Exception |
@@ -941,7 +941,7 @@ Produce a tag.
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/{{ pageVersion }}.x/phalcon/Html/Helper/Form.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Html/Helper/Form.zep)
| Namespace | Phalcon\Html\Helper |
| Uses | Phalcon\Html\Exception |
@@ -962,7 +962,7 @@ Produce a `
-
- Hosting By:
-
-
-
-
-
-
Official [Phalcon][0] documentation website.
-[](https://app.netlify.com/sites/phalcon-docs/deploys)
-
## Documentation
* Official documentation is [located here][1]
-* Translations must be sent to [Crowdin project][2]
## Community
* Follow us on [GitHub][3], [Facebook][4], [Twitter][5] or [Gab.ai][6]
-* Get Phalcon support on [Discord][7] and [Official Forums][8]
+* Get Phalcon support on [Discord][7] and [Official Discussions][8]
## Contributing
@@ -51,12 +40,11 @@ This work licensed under the New BSD License. See the [LICENSE][10] file for mor
[0]: https://phalcon.io
[1]: https://docs.phalcon.io
-[2]: https://crowdin.com/project/phalcon-documentation
[3]: https://github.com/phalcon/cphalcon
[4]: https://phalcon.io/fb
[5]: https://phalcon.io/t
[6]: https://phalcon.io/gab
[7]: https://phalcon.io/discord
-[8]: https://forum.phalcon.io
+[8]: https://phalcon.io/discussions
[9]: https://github.com/phalcon/cphalcon/blob/master/CONTRIBUTING.md
[10]: https://github.com/phalcon/cphalcon/blob/master/LICENSE.txt
From 8cc54e39d1fe0d40479f9bbaf9256695baf88b2b Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 22 Dec 2023 13:20:21 -0600
Subject: [PATCH 033/191] trying to set the sponsors
---
.github/workflows/deploy-documents.yml | 7 +++++++
docs/assets/sponsors.md | 1 +
docs/sponsors.md | 2 +-
mkdocs.yml | 3 ++-
requirements.txt | 2 +-
5 files changed, 12 insertions(+), 3 deletions(-)
create mode 100644 docs/assets/sponsors.md
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index 155aabc75..8253d5a68 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -53,6 +53,13 @@ jobs:
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
+ - name: Get sponsors and fanart
+ run: |
+ wget -O docs/assets/sponsors.md \
+ https://raw.githubusercontent.com/phalcon/assets/master/phalcon/sponsors-fragment.html
+ wget -O docs/assets/fanart.md \
+ https://raw.githubusercontent.com/phalcon/assets/master/phalcon/sponsors-fanart.html
+
- name: Determine versioning parameters
id: determine-versioning
run: |
diff --git a/docs/assets/sponsors.md b/docs/assets/sponsors.md
new file mode 100644
index 000000000..ae487191c
--- /dev/null
+++ b/docs/assets/sponsors.md
@@ -0,0 +1 @@
+sponsors
diff --git a/docs/sponsors.md b/docs/sponsors.md
index 9620e7cdf..5ab85b575 100644
--- a/docs/sponsors.md
+++ b/docs/sponsors.md
@@ -4,4 +4,4 @@ For those that wish to sponsor our work and further the development of Phalcon,
# Sponsors and Supporters
-{% include sponsors.html %}
+{!assets/sponsors.md!}
diff --git a/mkdocs.yml b/mkdocs.yml
index 4403e79fe..b54729f14 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -73,7 +73,6 @@ theme:
# Plugins
plugins:
- - include
- search:
separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'
- minify:
@@ -113,6 +112,8 @@ markdown_extensions:
- admonition
- attr_list
- footnotes
+ - markdown_include.include:
+ base_path: docs
- md_in_html
- pymdownx.inlinehilite
- pymdownx.snippets
diff --git a/requirements.txt b/requirements.txt
index 3f3461281..6b56fe238 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,7 @@
mkdocs
-mkdocs-include
mkdocs-material
mkdocs-material-extensions
mkdocs-minify-plugin
mkdocs-redirects
+markdown-include
mike
From 331841b15df7e08d58fca8c40a89742c2098ee95 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 22 Dec 2023 13:21:59 -0600
Subject: [PATCH 034/191] correcting wget
---
.github/workflows/deploy-documents.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index 8253d5a68..e0f67a82b 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -58,7 +58,7 @@ jobs:
wget -O docs/assets/sponsors.md \
https://raw.githubusercontent.com/phalcon/assets/master/phalcon/sponsors-fragment.html
wget -O docs/assets/fanart.md \
- https://raw.githubusercontent.com/phalcon/assets/master/phalcon/sponsors-fanart.html
+ https://raw.githubusercontent.com/phalcon/assets/master/phalcon/fanart-fragment.html
- name: Determine versioning parameters
id: determine-versioning
From 9223a31aa6c14d92ef010ea9e7225799c96419de Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 22 Dec 2023 13:26:11 -0600
Subject: [PATCH 035/191] trying to fix the sponsors
---
docs/assets/css/extra.css | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index d7c702b2b..fd6442615 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -3,3 +3,11 @@
--md-primary-fg-color--light: #4b6786;
--md-primary-fg-color--dark: #0c1015;
}
+
+.phalcon-blog__sponsors-items img {
+ margin-bottom: 0;
+}
+
+.phalcon-blog__sponsors-items a:hover {
+ border-bottom-color: #273646;
+}
From 35f55a6ae843ec07d855cdfbae178671e2a433c9 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 22 Dec 2023 13:43:47 -0600
Subject: [PATCH 036/191] switching color
---
docs/assets/css/extra.css | 4 ++--
mkdocs.yml | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index fd6442615..41241c7b6 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -1,7 +1,7 @@
:root {
--md-primary-fg-color: #273646;
- --md-primary-fg-color--light: #4b6786;
- --md-primary-fg-color--dark: #0c1015;
+ --md-primary-fg-color--light: #374c62;
+ --md-primary-fg-color--dark: #1c2631;
}
.phalcon-blog__sponsors-items img {
diff --git a/mkdocs.yml b/mkdocs.yml
index b54729f14..588768160 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -53,14 +53,14 @@ theme:
name: Switch to light mode
- media: "(prefers-color-scheme: light)"
scheme: default
- primary: teal
+ primary: custom
accent: teal
toggle:
icon: material/toggle-switch
name: Switch to dark mode
- media: "(prefers-color-scheme: dark)"
scheme: slate
- primary: black
+ primary: custom
accent: teal
toggle:
icon: material/toggle-switch-off
From adf94becd8efdde8598ac67271c4ecff28fbb82e Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 22 Dec 2023 13:46:40 -0600
Subject: [PATCH 037/191] trying to get the sponsors aligned
---
docs/assets/css/extra.css | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 41241c7b6..dfa6ce282 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -4,6 +4,12 @@
--md-primary-fg-color--dark: #1c2631;
}
+.phalcon-blog__sponsors-items img {
+ box-sizing: border-box;
+ display: flex;
+ flex-wrap: wrap;
+}
+
.phalcon-blog__sponsors-items img {
margin-bottom: 0;
}
From 6c80d4ac18da20245a175a2d9353f9fcb06f6278 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 22 Dec 2023 18:27:55 -0600
Subject: [PATCH 038/191] added fanart, social icons and sponsors
---
.github/workflows/deploy-documents.yml | 2 +-
docs/assets/fanart.md | 48 ++++++++++++++++++++++++++
docs/assets/sponsors.md | 41 +++++++++++++++++++++-
mkdocs.yml | 29 ++++++++++++++--
overrides/fanart.md | 48 ++++++++++++++++++++++++++
overrides/main.html | 8 +++++
6 files changed, 171 insertions(+), 5 deletions(-)
create mode 100644 docs/assets/fanart.md
create mode 100644 overrides/fanart.md
create mode 100644 overrides/main.html
diff --git a/.github/workflows/deploy-documents.yml b/.github/workflows/deploy-documents.yml
index e0f67a82b..2bfa90fee 100644
--- a/.github/workflows/deploy-documents.yml
+++ b/.github/workflows/deploy-documents.yml
@@ -57,7 +57,7 @@ jobs:
run: |
wget -O docs/assets/sponsors.md \
https://raw.githubusercontent.com/phalcon/assets/master/phalcon/sponsors-fragment.html
- wget -O docs/assets/fanart.md \
+ wget -O overrides/fanart.md \
https://raw.githubusercontent.com/phalcon/assets/master/phalcon/fanart-fragment.html
- name: Determine versioning parameters
diff --git a/docs/assets/fanart.md b/docs/assets/fanart.md
new file mode 100644
index 000000000..d3b5bbb5f
--- /dev/null
+++ b/docs/assets/fanart.md
@@ -0,0 +1,48 @@
+
diff --git a/docs/assets/sponsors.md b/docs/assets/sponsors.md
index ae487191c..9329322de 100644
--- a/docs/assets/sponsors.md
+++ b/docs/assets/sponsors.md
@@ -1 +1,40 @@
-sponsors
+
diff --git a/mkdocs.yml b/mkdocs.yml
index 588768160..eadbad934 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -99,10 +99,33 @@ extra:
annotate:
json: [ .s2 ]
social:
+ - icon: fontawesome/brands/discord
+ link: https://phalcon.io/discord
+ name: Discord
+ - icon: material/comment
+ link: https://phalcon.io/discussions
+ name: GitHub Discussions
- icon: fontawesome/brands/github
- link: https://github.com/phalcon
- - icon: fontawesome/brands/twitter
- link: https://twitter.com/phalconphp
+ link: https://phalcon.io/github
+ name: GitHub Project
+ - icon: fontawesome/brands/telegram
+ link: https://phalcon.io/telegram
+ name: Telegram
+ - icon: fontawesome/solid/frog
+ link: https://phalcon.io/gab
+ name: Gab
+ - icon: fontawesome/brands/x-twitter
+ link: https://phalcon.io/t
+ name: Twitter
+ - icon: fontawesome/brands/facebook
+ link: https://phalcon.io/fb
+ name: Facebook
+ - icon: fontawesome/brands/linkedin
+ link: https://phalcon.io/linkedin
+ name: LinkedIn
+ - icon: fontawesome/brands/youtube
+ link: https://phalcon.io/youtube
+ name: LinkedIn
extra_css:
- assets/css/extra.css
diff --git a/overrides/fanart.md b/overrides/fanart.md
new file mode 100644
index 000000000..d3b5bbb5f
--- /dev/null
+++ b/overrides/fanart.md
@@ -0,0 +1,48 @@
+
diff --git a/overrides/main.html b/overrides/main.html
new file mode 100644
index 000000000..1d339fdda
--- /dev/null
+++ b/overrides/main.html
@@ -0,0 +1,8 @@
+{% extends "base.html" %}
+
+{% block extrahead %}
+
+{% include 'fanart.md' %}
+
+{{ super() }}
+{% endblock %}
From 4564d596ef81cdb01b3dbb816266475cee3fe9c8 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 22 Dec 2023 18:41:43 -0600
Subject: [PATCH 039/191] correcting readme
---
README.md | 2 +-
mkdocs.yml | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 10423a61f..a51ad3349 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ for details about contributions to this repository.
## Sponsors
-Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/phalcon#sponsor)]
+Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/phalcon#sponsor)]
diff --git a/mkdocs.yml b/mkdocs.yml
index eadbad934..53889c414 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -177,6 +177,7 @@ nav:
- Backtrace Generation: generating-backtrace.md
- Reproducible Tests: reproducible-tests.md
- Testing environment: testing-environment.md
+ - Coding Standard: coding-standard.md
- Sponsoring: sponsors.md
- Getting Started:
- Installation: installation.md
From cf28e3e8a2dd8bb7f579516af588f755b2e31f99 Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi
Date: Sat, 23 Dec 2023 15:47:43 +0200
Subject: [PATCH 040/191] fix sponsors block (#1)
---
docs/assets/css/extra.css | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index dfa6ce282..147ae0bd9 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -4,14 +4,19 @@
--md-primary-fg-color--dark: #1c2631;
}
-.phalcon-blog__sponsors-items img {
- box-sizing: border-box;
+.phalcon-blog__sponsors-items {
display: flex;
flex-wrap: wrap;
}
.phalcon-blog__sponsors-items img {
- margin-bottom: 0;
+ max-width: 140px;
+ width: 100%;
+}
+
+.phalcon-blog__sponsors-items a {
+ margin-bottom: 30px;
+ margin-right: 20px;
}
.phalcon-blog__sponsors-items a:hover {
From 873fda3fedb5d0fd9ef5dbc5a84deb861951e9ea Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi
Date: Sun, 24 Dec 2023 00:47:11 +0200
Subject: [PATCH 041/191] update sponsors block (#4)
---
docs/assets/css/extra.css | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 147ae0bd9..098e7b536 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -7,6 +7,7 @@
.phalcon-blog__sponsors-items {
display: flex;
flex-wrap: wrap;
+ justify-content: center;
}
.phalcon-blog__sponsors-items img {
@@ -16,7 +17,22 @@
.phalcon-blog__sponsors-items a {
margin-bottom: 30px;
- margin-right: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid rgba(39,54,70,.4);
+ padding: 10px 15px;
+ border-radius: 4px;
+ width: 46%;
+ margin-right: 10px;
+ margin-left: 10px;
+}
+
+@media screen and (max-width: 600px) {
+ .phalcon-blog__sponsors-items a {
+ width: 100%;
+ margin-bottom: 20px;
+ }
}
.phalcon-blog__sponsors-items a:hover {
From 2d5086a7b701d1c3cbcd773f33301f16105205c2 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Mon, 25 Dec 2023 12:43:35 -0600
Subject: [PATCH 042/191] updating api
---
docs/api/phalcon_acl.md | 2 ++
docs/api/phalcon_cli.md | 4 +++-
docs/api/phalcon_config.md | 2 +-
docs/api/phalcon_di.md | 2 +-
docs/api/phalcon_messages.md | 2 +-
docs/api/phalcon_mvc.md | 4 ++--
docs/api/phalcon_session.md | 18 +++++++++---------
docs/api/phalcon_support.md | 4 ++--
docs/api/phalcon_translate.md | 6 ------
9 files changed, 21 insertions(+), 23 deletions(-)
diff --git a/docs/api/phalcon_acl.md b/docs/api/phalcon_acl.md
index 9a2dd2389..feef8e0e9 100644
--- a/docs/api/phalcon_acl.md
+++ b/docs/api/phalcon_acl.md
@@ -978,3 +978,5 @@ Returns role description
public function getName(): string;
```
Returns the role name
+
+
diff --git a/docs/api/phalcon_cli.md b/docs/api/phalcon_cli.md
index a822b7829..af6ca4bcc 100644
--- a/docs/api/phalcon_cli.md
+++ b/docs/api/phalcon_cli.md
@@ -137,7 +137,9 @@ $handle = $dispatcher->dispatch();
### Properties
```php
-//
+/**
+ * @var string
+ */
protected $defaultHandler = main;
/**
diff --git a/docs/api/phalcon_config.md b/docs/api/phalcon_config.md
index 7994ea6d5..6d2a67cb4 100644
--- a/docs/api/phalcon_config.md
+++ b/docs/api/phalcon_config.md
@@ -167,7 +167,7 @@ Ini constructor.
```php
-protected function cast( mixed $ini ): bool | null | double | int | string;
+protected function cast( mixed $ini ): mixed;
```
We have to cast values manually because parse_ini_file() has a poor
implementation.
diff --git a/docs/api/phalcon_di.md b/docs/api/phalcon_di.md
index 61c883f7b..7e4397d81 100644
--- a/docs/api/phalcon_di.md
+++ b/docs/api/phalcon_di.md
@@ -318,7 +318,7 @@ var_dump($di["request"]);
```php
-public function offsetSet( mixed $name, mixed $definition ): void;
+public function offsetSet( mixed $offset, mixed $value ): void;
```
Allows to register a shared service using the array syntax
diff --git a/docs/api/phalcon_messages.md b/docs/api/phalcon_messages.md
index c11e0480b..e5dcd0310 100644
--- a/docs/api/phalcon_messages.md
+++ b/docs/api/phalcon_messages.md
@@ -402,7 +402,7 @@ print_r(
```php
-public function offsetSet( mixed $index, mixed $message ): void;
+public function offsetSet( mixed $offset, mixed $value ): void;
```
Sets an attribute using the array-syntax
diff --git a/docs/api/phalcon_mvc.md b/docs/api/phalcon_mvc.md
index 8003ba7c5..3f15f1ba2 100644
--- a/docs/api/phalcon_mvc.md
+++ b/docs/api/phalcon_mvc.md
@@ -8823,7 +8823,7 @@ Gets row in a specific position of the resultset
```php
-public function offsetSet( mixed $index, mixed $value ): void;
+public function offsetSet( mixed $offset, mixed $value ): void;
```
Resultsets cannot be changed. It has only been implemented to meet the definition of the ArrayAccess interface
@@ -9248,7 +9248,7 @@ Gets a record in a specific position of the row
```php
-public function offsetSet( mixed $index, mixed $value ): void;
+public function offsetSet( mixed $offset, mixed $value ): void;
```
Rows cannot be changed. It has only been implemented to meet the definition of the ArrayAccess interface
diff --git a/docs/api/phalcon_session.md b/docs/api/phalcon_session.md
index a56549c76..1e735db3f 100644
--- a/docs/api/phalcon_session.md
+++ b/docs/api/phalcon_session.md
@@ -62,13 +62,13 @@ Destroy
```php
-public function gc( int $maxlifetime ): int | bool;
+public function gc( int $maxlifetime ): int | false;
```
Garbage Collector
```php
-public function open( mixed $savePath, mixed $sessionName ): bool;
+public function open( mixed $path, mixed $name ): bool;
```
Open
@@ -80,7 +80,7 @@ Read
```php
-public function write( mixed $sessionId, mixed $data ): bool;
+public function write( mixed $id, mixed $data ): bool;
```
Write
@@ -215,13 +215,13 @@ Destroy
```php
-public function gc( int $maxlifetime ): int | bool;
+public function gc( int $maxlifetime ): int | false;
```
Garbage Collector
```php
-public function open( mixed $savePath, mixed $sessionName ): bool;
+public function open( mixed $path, mixed $name ): bool;
```
Open
@@ -233,7 +233,7 @@ Read
```php
-public function write( mixed $sessionId, mixed $data ): bool;
+public function write( mixed $id, mixed $data ): bool;
```
Write
@@ -347,13 +347,13 @@ public function destroy( mixed $sessionId ): bool;
```php
-public function gc( int $maxlifetime ): int | bool;
+public function gc( int $maxlifetime ): int | false;
```
Garbage Collector
```php
-public function open( mixed $savePath, mixed $sessionName ): bool;
+public function open( mixed $path, mixed $name ): bool;
```
Ignore the savePath and use local defined path
@@ -367,7 +367,7 @@ Reads data from the adapter
```php
-public function write( mixed $sessionId, mixed $data ): bool;
+public function write( mixed $id, mixed $data ): bool;
```
diff --git a/docs/api/phalcon_support.md b/docs/api/phalcon_support.md
index a3bf030d8..fe3e5de73 100644
--- a/docs/api/phalcon_support.md
+++ b/docs/api/phalcon_support.md
@@ -192,7 +192,7 @@ See [offsetGet](https://php.net/manual/en/arrayaccess.offsetget.php)
```php
-public function offsetSet( mixed $element, mixed $value ): void;
+public function offsetSet( mixed $offset, mixed $value ): void;
```
Offset to set
See [offsetSet](https://php.net/manual/en/arrayaccess.offsetset.php)
@@ -3199,7 +3199,7 @@ Offset to retrieve
```php
-final public function offsetSet( mixed $element, mixed $value ): void;
+final public function offsetSet( mixed $offset, mixed $value ): void;
```
Offset to set
diff --git a/docs/api/phalcon_translate.md b/docs/api/phalcon_translate.md
index cab53af85..e411bbd92 100644
--- a/docs/api/phalcon_translate.md
+++ b/docs/api/phalcon_translate.md
@@ -173,12 +173,6 @@ Returns the translation string of the given key
- `ArrayAccess`
-Class Csv
-
-@package Phalcon\Translate\Adapter
-
-@property array $translate
-
### Properties
```php
From 7bbe5d5e67846d613bd6725a0f261def3b178331 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Tue, 26 Dec 2023 08:15:56 -0600
Subject: [PATCH 043/191] redirects for 5.5
---
mkdocs.yml | 2176 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 2176 insertions(+)
diff --git a/mkdocs.yml b/mkdocs.yml
index 53889c414..e3f8a0801 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -85,6 +85,2182 @@ plugins:
'helper.md': 'support-helper.md'
'registry.md': 'support-registry.md'
'version.md': 'support-version.md'
+ 'en/acl.md': acl.md
+ 'en/annotations.md': annotations.md
+ 'en/api/index.md': api/index.md
+ 'en/api/phalcon_acl.md': api/phalcon_acl.md
+ 'en/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'en/api/phalcon_application.md': api/phalcon_application.md
+ 'en/api/phalcon_assets.md': api/phalcon_assets.md
+ 'en/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'en/api/phalcon_cache.md': api/phalcon_cache.md
+ 'en/api/phalcon_cli.md': api/phalcon_cli.md
+ 'en/api/phalcon_config.md': api/phalcon_config.md
+ 'en/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'en/api/phalcon_db.md': api/phalcon_db.md
+ 'en/api/phalcon_di.md': api/phalcon_di.md
+ 'en/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'en/api/phalcon_domain.md': api/phalcon_domain.md
+ 'en/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'en/api/phalcon_events.md': api/phalcon_events.md
+ 'en/api/phalcon_factory.md': api/phalcon_factory.md
+ 'en/api/phalcon_filter.md': api/phalcon_filter.md
+ 'en/api/phalcon_flash.md': api/phalcon_flash.md
+ 'en/api/phalcon_forms.md': api/phalcon_forms.md
+ 'en/api/phalcon_html.md': api/phalcon_html.md
+ 'en/api/phalcon_http.md': api/phalcon_http.md
+ 'en/api/phalcon_image.md': api/phalcon_image.md
+ 'en/api/phalcon_logger.md': api/phalcon_logger.md
+ 'en/api/phalcon_messages.md': api/phalcon_messages.md
+ 'en/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'en/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'en/api/phalcon_session.md': api/phalcon_session.md
+ 'en/api/phalcon_storage.md': api/phalcon_storage.md
+ 'en/api/phalcon_support.md': api/phalcon_support.md
+ 'en/api/phalcon_tag.md': api/phalcon_tag.md
+ 'en/api/phalcon_translate.md': api/phalcon_translate.md
+ 'en/application-cli.md': application-cli.md
+ 'en/application.md': application.md
+ 'en/application-micro.md': application-micro.md
+ 'en/assets.md': assets.md
+ 'en/autoload.md': autoload.md
+ 'en/cache.md': cache.md
+ 'en/coding-standard.md': coding-standard.md
+ 'en/config.md': config.md
+ 'en/contributions.md': contributions.md
+ 'en/controllers.md': controllers.md
+ 'en/datamapper.md': datamapper.md
+ 'en/db-layer.md': db-layer.md
+ 'en/db-migrations.md': db-migrations.md
+ 'en/db-models-behaviors.md': db-models-behaviors.md
+ 'en/db-models-cache.md': db-models-cache.md
+ 'en/db-models-events.md': db-models-events.md
+ 'en/db-models.md': db-models.md
+ 'en/db-models-metadata.md': db-models-metadata.md
+ 'en/db-models-relationships.md': db-models-relationships.md
+ 'en/db-models-transactions.md': db-models-transactions.md
+ 'en/db-models-validation.md': db-models-validation.md
+ 'en/db-odm.md': db-odm.md
+ 'en/db-pagination.md': db-pagination.md
+ 'en/db-phql.md': db-phql.md
+ 'en/devtools.md': devtools.md
+ 'en/di.md': di.md
+ 'en/dispatcher.md': dispatcher.md
+ 'en/domain.md': domain.md
+ 'en/encryption-crypt.md': encryption-crypt.md
+ 'en/encryption-security-jwt.md': encryption-security-jwt.md
+ 'en/encryption-security.md': encryption-security.md
+ 'en/environments-devilbox.md': environments-devilbox.md
+ 'en/environments-nanobox.md': environments-nanobox.md
+ 'en/events.md': events.md
+ 'en/filter-filter.md': filter-filter.md
+ 'en/filter-validation.md': filter-validation.md
+ 'en/flash.md': flash.md
+ 'en/forms.md': forms.md
+ 'en/generating-backtrace.md': generating-backtrace.md
+ 'en/html-attributes.md': html-attributes.md
+ 'en/html-breadcrumbs.md': html-breadcrumbs.md
+ 'en/html-escaper.md': html-escaper.md
+ 'en/html-link.md': html-link.md
+ 'en/html.md': html.md
+ 'en/html-tagfactory.md': html-tagfactory.md
+ 'en/http-factories.md': http-factories.md
+ 'en/http-request.md': http-request.md
+ 'en/http-response.md': http-response.md
+ 'en/http-server-request.md': http-server-request.md
+ 'en/http-stream.md': http-stream.md
+ 'en/http-uploaded-file.md': http-uploaded-file.md
+ 'en/http-uri.md': http-uri.md
+ 'en/i18n.md': i18n.md
+ 'en/image.md': image.md
+ 'en/index.md': introduction.md
+ 'en/installation.md': installation.md
+ 'en/introduction.md': introduction.md
+ 'en/logger.md': logger.md
+ 'en/meta-home.json': meta-home.json
+ 'en/meta-topics.json': meta-topics.json
+ 'en/mvc.md': mvc.md
+ 'en/mvc-url.md': mvc-url.md
+ 'en/namespaces.md': namespaces.md
+ 'en/new-feature-request-list.md': new-feature-request-list.md
+ 'en/new-feature-request.md': new-feature-request.md
+ 'en/new-pull-request.md': new-pull-request.md
+ 'en/performance.md': performance.md
+ 'en/queue.md': queue.md
+ 'en/reproducible-tests.md': reproducible-tests.md
+ 'en/request.md': request.md
+ 'en/response.md': response.md
+ 'en/routing.md': routing.md
+ 'en/session.md': session.md
+ 'en/sponsors.md': sponsors.md
+ 'en/static-analysis.md': static-analysis.md
+ 'en/storage.md': storage.md
+ 'en/support-collection.md': support-collection.md
+ 'en/support-debug.md': support-debug.md
+ 'en/support-helper.md': support-helper.md
+ 'en/support-registry.md': support-registry.md
+ 'en/support-version.md': support-version.md
+ 'en/tag.md': tag.md
+ 'en/testing-environment.md': testing-environment.md
+ 'en/translate.md': translate.md
+ 'en/tutorial-basic.md': tutorial-basic.md
+ 'en/tutorial-invo.md': tutorial-invo.md
+ 'en/tutorial-rest.md': tutorial-rest.md
+ 'en/tutorial-vokuro.md': tutorial-vokuro.md
+ 'en/unit-testing.md': unit-testing.md
+ 'en/upgrade.md': upgrade.md
+ 'en/use-case.md': use-case.md
+ 'en/views.md': views.md
+ 'en/volt.md': volt.md
+ 'en/webserver-setup.md': webserver-setup.md
+ 'cs-cz/acl.md': acl.md
+ 'cs-cz/annotations.md': annotations.md
+ 'cs-cz/api/index.md': api/index.md
+ 'cs-cz/api/phalcon_acl.md': api/phalcon_acl.md
+ 'cs-cz/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'cs-cz/api/phalcon_application.md': api/phalcon_application.md
+ 'cs-cz/api/phalcon_assets.md': api/phalcon_assets.md
+ 'cs-cz/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'cs-cz/api/phalcon_cache.md': api/phalcon_cache.md
+ 'cs-cz/api/phalcon_cli.md': api/phalcon_cli.md
+ 'cs-cz/api/phalcon_config.md': api/phalcon_config.md
+ 'cs-cz/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'cs-cz/api/phalcon_db.md': api/phalcon_db.md
+ 'cs-cz/api/phalcon_di.md': api/phalcon_di.md
+ 'cs-cz/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'cs-cz/api/phalcon_domain.md': api/phalcon_domain.md
+ 'cs-cz/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'cs-cz/api/phalcon_events.md': api/phalcon_events.md
+ 'cs-cz/api/phalcon_factory.md': api/phalcon_factory.md
+ 'cs-cz/api/phalcon_filter.md': api/phalcon_filter.md
+ 'cs-cz/api/phalcon_flash.md': api/phalcon_flash.md
+ 'cs-cz/api/phalcon_forms.md': api/phalcon_forms.md
+ 'cs-cz/api/phalcon_html.md': api/phalcon_html.md
+ 'cs-cz/api/phalcon_http.md': api/phalcon_http.md
+ 'cs-cz/api/phalcon_image.md': api/phalcon_image.md
+ 'cs-cz/api/phalcon_logger.md': api/phalcon_logger.md
+ 'cs-cz/api/phalcon_messages.md': api/phalcon_messages.md
+ 'cs-cz/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'cs-cz/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'cs-cz/api/phalcon_session.md': api/phalcon_session.md
+ 'cs-cz/api/phalcon_storage.md': api/phalcon_storage.md
+ 'cs-cz/api/phalcon_support.md': api/phalcon_support.md
+ 'cs-cz/api/phalcon_tag.md': api/phalcon_tag.md
+ 'cs-cz/api/phalcon_translate.md': api/phalcon_translate.md
+ 'cs-cz/application-cli.md': application-cli.md
+ 'cs-cz/application.md': application.md
+ 'cs-cz/application-micro.md': application-micro.md
+ 'cs-cz/assets.md': assets.md
+ 'cs-cz/autoload.md': autoload.md
+ 'cs-cz/cache.md': cache.md
+ 'cs-cz/coding-standard.md': coding-standard.md
+ 'cs-cz/config.md': config.md
+ 'cs-cz/contributions.md': contributions.md
+ 'cs-cz/controllers.md': controllers.md
+ 'cs-cz/datamapper.md': datamapper.md
+ 'cs-cz/db-layer.md': db-layer.md
+ 'cs-cz/db-migrations.md': db-migrations.md
+ 'cs-cz/db-models-behaviors.md': db-models-behaviors.md
+ 'cs-cz/db-models-cache.md': db-models-cache.md
+ 'cs-cz/db-models-events.md': db-models-events.md
+ 'cs-cz/db-models.md': db-models.md
+ 'cs-cz/db-models-metadata.md': db-models-metadata.md
+ 'cs-cz/db-models-relationships.md': db-models-relationships.md
+ 'cs-cz/db-models-transactions.md': db-models-transactions.md
+ 'cs-cz/db-models-validation.md': db-models-validation.md
+ 'cs-cz/db-odm.md': db-odm.md
+ 'cs-cz/db-pagination.md': db-pagination.md
+ 'cs-cz/db-phql.md': db-phql.md
+ 'cs-cz/devtools.md': devtools.md
+ 'cs-cz/di.md': di.md
+ 'cs-cz/dispatcher.md': dispatcher.md
+ 'cs-cz/domain.md': domain.md
+ 'cs-cz/encryption-crypt.md': encryption-crypt.md
+ 'cs-cz/encryption-security-jwt.md': encryption-security-jwt.md
+ 'cs-cz/encryption-security.md': encryption-security.md
+ 'cs-cz/environments-devilbox.md': environments-devilbox.md
+ 'cs-cz/environments-nanobox.md': environments-nanobox.md
+ 'cs-cz/events.md': events.md
+ 'cs-cz/filter-filter.md': filter-filter.md
+ 'cs-cz/filter-validation.md': filter-validation.md
+ 'cs-cz/flash.md': flash.md
+ 'cs-cz/forms.md': forms.md
+ 'cs-cz/generating-backtrace.md': generating-backtrace.md
+ 'cs-cz/html-attributes.md': html-attributes.md
+ 'cs-cz/html-breadcrumbs.md': html-breadcrumbs.md
+ 'cs-cz/html-escaper.md': html-escaper.md
+ 'cs-cz/html-link.md': html-link.md
+ 'cs-cz/html.md': html.md
+ 'cs-cz/html-tagfactory.md': html-tagfactory.md
+ 'cs-cz/http-factories.md': http-factories.md
+ 'cs-cz/http-request.md': http-request.md
+ 'cs-cz/http-response.md': http-response.md
+ 'cs-cz/http-server-request.md': http-server-request.md
+ 'cs-cz/http-stream.md': http-stream.md
+ 'cs-cz/http-uploaded-file.md': http-uploaded-file.md
+ 'cs-cz/http-uri.md': http-uri.md
+ 'cs-cz/i18n.md': i18n.md
+ 'cs-cz/image.md': image.md
+ 'cs-cz/index.md': introduction.md
+ 'cs-cz/installation.md': installation.md
+ 'cs-cz/introduction.md': introduction.md
+ 'cs-cz/logger.md': logger.md
+ 'cs-cz/meta-home.json': meta-home.json
+ 'cs-cz/meta-topics.json': meta-topics.json
+ 'cs-cz/mvc.md': mvc.md
+ 'cs-cz/mvc-url.md': mvc-url.md
+ 'cs-cz/namespaces.md': namespaces.md
+ 'cs-cz/new-feature-request-list.md': new-feature-request-list.md
+ 'cs-cz/new-feature-request.md': new-feature-request.md
+ 'cs-cz/new-pull-request.md': new-pull-request.md
+ 'cs-cz/performance.md': performance.md
+ 'cs-cz/queue.md': queue.md
+ 'cs-cz/reproducible-tests.md': reproducible-tests.md
+ 'cs-cz/request.md': request.md
+ 'cs-cz/response.md': response.md
+ 'cs-cz/routing.md': routing.md
+ 'cs-cz/session.md': session.md
+ 'cs-cz/sponsors.md': sponsors.md
+ 'cs-cz/static-analysis.md': static-analysis.md
+ 'cs-cz/storage.md': storage.md
+ 'cs-cz/support-collection.md': support-collection.md
+ 'cs-cz/support-debug.md': support-debug.md
+ 'cs-cz/support-helper.md': support-helper.md
+ 'cs-cz/support-registry.md': support-registry.md
+ 'cs-cz/support-version.md': support-version.md
+ 'cs-cz/tag.md': tag.md
+ 'cs-cz/testing-environment.md': testing-environment.md
+ 'cs-cz/translate.md': translate.md
+ 'cs-cz/tutorial-basic.md': tutorial-basic.md
+ 'cs-cz/tutorial-invo.md': tutorial-invo.md
+ 'cs-cz/tutorial-rest.md': tutorial-rest.md
+ 'cs-cz/tutorial-vokuro.md': tutorial-vokuro.md
+ 'cs-cz/unit-testing.md': unit-testing.md
+ 'cs-cz/upgrade.md': upgrade.md
+ 'cs-cz/use-case.md': use-case.md
+ 'cs-cz/views.md': views.md
+ 'cs-cz/volt.md': volt.md
+ 'cs-cz/webserver-setup.md': webserver-setup.md
+ 'de-de/acl.md': acl.md
+ 'de-de/annotations.md': annotations.md
+ 'de-de/api/index.md': api/index.md
+ 'de-de/api/phalcon_acl.md': api/phalcon_acl.md
+ 'de-de/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'de-de/api/phalcon_application.md': api/phalcon_application.md
+ 'de-de/api/phalcon_assets.md': api/phalcon_assets.md
+ 'de-de/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'de-de/api/phalcon_cache.md': api/phalcon_cache.md
+ 'de-de/api/phalcon_cli.md': api/phalcon_cli.md
+ 'de-de/api/phalcon_config.md': api/phalcon_config.md
+ 'de-de/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'de-de/api/phalcon_db.md': api/phalcon_db.md
+ 'de-de/api/phalcon_di.md': api/phalcon_di.md
+ 'de-de/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'de-de/api/phalcon_domain.md': api/phalcon_domain.md
+ 'de-de/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'de-de/api/phalcon_events.md': api/phalcon_events.md
+ 'de-de/api/phalcon_factory.md': api/phalcon_factory.md
+ 'de-de/api/phalcon_filter.md': api/phalcon_filter.md
+ 'de-de/api/phalcon_flash.md': api/phalcon_flash.md
+ 'de-de/api/phalcon_forms.md': api/phalcon_forms.md
+ 'de-de/api/phalcon_html.md': api/phalcon_html.md
+ 'de-de/api/phalcon_http.md': api/phalcon_http.md
+ 'de-de/api/phalcon_image.md': api/phalcon_image.md
+ 'de-de/api/phalcon_logger.md': api/phalcon_logger.md
+ 'de-de/api/phalcon_messages.md': api/phalcon_messages.md
+ 'de-de/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'de-de/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'de-de/api/phalcon_session.md': api/phalcon_session.md
+ 'de-de/api/phalcon_storage.md': api/phalcon_storage.md
+ 'de-de/api/phalcon_support.md': api/phalcon_support.md
+ 'de-de/api/phalcon_tag.md': api/phalcon_tag.md
+ 'de-de/api/phalcon_translate.md': api/phalcon_translate.md
+ 'de-de/application-cli.md': application-cli.md
+ 'de-de/application.md': application.md
+ 'de-de/application-micro.md': application-micro.md
+ 'de-de/assets.md': assets.md
+ 'de-de/autoload.md': autoload.md
+ 'de-de/cache.md': cache.md
+ 'de-de/coding-standard.md': coding-standard.md
+ 'de-de/config.md': config.md
+ 'de-de/contributions.md': contributions.md
+ 'de-de/controllers.md': controllers.md
+ 'de-de/datamapper.md': datamapper.md
+ 'de-de/db-layer.md': db-layer.md
+ 'de-de/db-migrations.md': db-migrations.md
+ 'de-de/db-models-behaviors.md': db-models-behaviors.md
+ 'de-de/db-models-cache.md': db-models-cache.md
+ 'de-de/db-models-events.md': db-models-events.md
+ 'de-de/db-models.md': db-models.md
+ 'de-de/db-models-metadata.md': db-models-metadata.md
+ 'de-de/db-models-relationships.md': db-models-relationships.md
+ 'de-de/db-models-transactions.md': db-models-transactions.md
+ 'de-de/db-models-validation.md': db-models-validation.md
+ 'de-de/db-odm.md': db-odm.md
+ 'de-de/db-pagination.md': db-pagination.md
+ 'de-de/db-phql.md': db-phql.md
+ 'de-de/devtools.md': devtools.md
+ 'de-de/di.md': di.md
+ 'de-de/dispatcher.md': dispatcher.md
+ 'de-de/domain.md': domain.md
+ 'de-de/encryption-crypt.md': encryption-crypt.md
+ 'de-de/encryption-security-jwt.md': encryption-security-jwt.md
+ 'de-de/encryption-security.md': encryption-security.md
+ 'de-de/environments-devilbox.md': environments-devilbox.md
+ 'de-de/environments-nanobox.md': environments-nanobox.md
+ 'de-de/events.md': events.md
+ 'de-de/filter-filter.md': filter-filter.md
+ 'de-de/filter-validation.md': filter-validation.md
+ 'de-de/flash.md': flash.md
+ 'de-de/forms.md': forms.md
+ 'de-de/generating-backtrace.md': generating-backtrace.md
+ 'de-de/html-attributes.md': html-attributes.md
+ 'de-de/html-breadcrumbs.md': html-breadcrumbs.md
+ 'de-de/html-escaper.md': html-escaper.md
+ 'de-de/html-link.md': html-link.md
+ 'de-de/html.md': html.md
+ 'de-de/html-tagfactory.md': html-tagfactory.md
+ 'de-de/http-factories.md': http-factories.md
+ 'de-de/http-request.md': http-request.md
+ 'de-de/http-response.md': http-response.md
+ 'de-de/http-server-request.md': http-server-request.md
+ 'de-de/http-stream.md': http-stream.md
+ 'de-de/http-uploaded-file.md': http-uploaded-file.md
+ 'de-de/http-uri.md': http-uri.md
+ 'de-de/i18n.md': i18n.md
+ 'de-de/image.md': image.md
+ 'de-de/index.md': introduction.md
+ 'de-de/installation.md': installation.md
+ 'de-de/introduction.md': introduction.md
+ 'de-de/logger.md': logger.md
+ 'de-de/meta-home.json': meta-home.json
+ 'de-de/meta-topics.json': meta-topics.json
+ 'de-de/mvc.md': mvc.md
+ 'de-de/mvc-url.md': mvc-url.md
+ 'de-de/namespaces.md': namespaces.md
+ 'de-de/new-feature-request-list.md': new-feature-request-list.md
+ 'de-de/new-feature-request.md': new-feature-request.md
+ 'de-de/new-pull-request.md': new-pull-request.md
+ 'de-de/performance.md': performance.md
+ 'de-de/queue.md': queue.md
+ 'de-de/reproducible-tests.md': reproducible-tests.md
+ 'de-de/request.md': request.md
+ 'de-de/response.md': response.md
+ 'de-de/routing.md': routing.md
+ 'de-de/session.md': session.md
+ 'de-de/sponsors.md': sponsors.md
+ 'de-de/static-analysis.md': static-analysis.md
+ 'de-de/storage.md': storage.md
+ 'de-de/support-collection.md': support-collection.md
+ 'de-de/support-debug.md': support-debug.md
+ 'de-de/support-helper.md': support-helper.md
+ 'de-de/support-registry.md': support-registry.md
+ 'de-de/support-version.md': support-version.md
+ 'de-de/tag.md': tag.md
+ 'de-de/testing-environment.md': testing-environment.md
+ 'de-de/translate.md': translate.md
+ 'de-de/tutorial-basic.md': tutorial-basic.md
+ 'de-de/tutorial-invo.md': tutorial-invo.md
+ 'de-de/tutorial-rest.md': tutorial-rest.md
+ 'de-de/tutorial-vokuro.md': tutorial-vokuro.md
+ 'de-de/unit-testing.md': unit-testing.md
+ 'de-de/upgrade.md': upgrade.md
+ 'de-de/use-case.md': use-case.md
+ 'de-de/views.md': views.md
+ 'de-de/volt.md': volt.md
+ 'de-de/webserver-setup.md': webserver-setup.md
+ 'el-gr/acl.md': acl.md
+ 'el-gr/annotations.md': annotations.md
+ 'el-gr/api/index.md': api/index.md
+ 'el-gr/api/phalcon_acl.md': api/phalcon_acl.md
+ 'el-gr/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'el-gr/api/phalcon_application.md': api/phalcon_application.md
+ 'el-gr/api/phalcon_assets.md': api/phalcon_assets.md
+ 'el-gr/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'el-gr/api/phalcon_cache.md': api/phalcon_cache.md
+ 'el-gr/api/phalcon_cli.md': api/phalcon_cli.md
+ 'el-gr/api/phalcon_config.md': api/phalcon_config.md
+ 'el-gr/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'el-gr/api/phalcon_db.md': api/phalcon_db.md
+ 'el-gr/api/phalcon_di.md': api/phalcon_di.md
+ 'el-gr/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'el-gr/api/phalcon_domain.md': api/phalcon_domain.md
+ 'el-gr/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'el-gr/api/phalcon_events.md': api/phalcon_events.md
+ 'el-gr/api/phalcon_factory.md': api/phalcon_factory.md
+ 'el-gr/api/phalcon_filter.md': api/phalcon_filter.md
+ 'el-gr/api/phalcon_flash.md': api/phalcon_flash.md
+ 'el-gr/api/phalcon_forms.md': api/phalcon_forms.md
+ 'el-gr/api/phalcon_html.md': api/phalcon_html.md
+ 'el-gr/api/phalcon_http.md': api/phalcon_http.md
+ 'el-gr/api/phalcon_image.md': api/phalcon_image.md
+ 'el-gr/api/phalcon_logger.md': api/phalcon_logger.md
+ 'el-gr/api/phalcon_messages.md': api/phalcon_messages.md
+ 'el-gr/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'el-gr/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'el-gr/api/phalcon_session.md': api/phalcon_session.md
+ 'el-gr/api/phalcon_storage.md': api/phalcon_storage.md
+ 'el-gr/api/phalcon_support.md': api/phalcon_support.md
+ 'el-gr/api/phalcon_tag.md': api/phalcon_tag.md
+ 'el-gr/api/phalcon_translate.md': api/phalcon_translate.md
+ 'el-gr/application-cli.md': application-cli.md
+ 'el-gr/application.md': application.md
+ 'el-gr/application-micro.md': application-micro.md
+ 'el-gr/assets.md': assets.md
+ 'el-gr/autoload.md': autoload.md
+ 'el-gr/cache.md': cache.md
+ 'el-gr/coding-standard.md': coding-standard.md
+ 'el-gr/config.md': config.md
+ 'el-gr/contributions.md': contributions.md
+ 'el-gr/controllers.md': controllers.md
+ 'el-gr/datamapper.md': datamapper.md
+ 'el-gr/db-layer.md': db-layer.md
+ 'el-gr/db-migrations.md': db-migrations.md
+ 'el-gr/db-models-behaviors.md': db-models-behaviors.md
+ 'el-gr/db-models-cache.md': db-models-cache.md
+ 'el-gr/db-models-events.md': db-models-events.md
+ 'el-gr/db-models.md': db-models.md
+ 'el-gr/db-models-metadata.md': db-models-metadata.md
+ 'el-gr/db-models-relationships.md': db-models-relationships.md
+ 'el-gr/db-models-transactions.md': db-models-transactions.md
+ 'el-gr/db-models-validation.md': db-models-validation.md
+ 'el-gr/db-odm.md': db-odm.md
+ 'el-gr/db-pagination.md': db-pagination.md
+ 'el-gr/db-phql.md': db-phql.md
+ 'el-gr/devtools.md': devtools.md
+ 'el-gr/di.md': di.md
+ 'el-gr/dispatcher.md': dispatcher.md
+ 'el-gr/domain.md': domain.md
+ 'el-gr/encryption-crypt.md': encryption-crypt.md
+ 'el-gr/encryption-security-jwt.md': encryption-security-jwt.md
+ 'el-gr/encryption-security.md': encryption-security.md
+ 'el-gr/environments-devilbox.md': environments-devilbox.md
+ 'el-gr/environments-nanobox.md': environments-nanobox.md
+ 'el-gr/events.md': events.md
+ 'el-gr/filter-filter.md': filter-filter.md
+ 'el-gr/filter-validation.md': filter-validation.md
+ 'el-gr/flash.md': flash.md
+ 'el-gr/forms.md': forms.md
+ 'el-gr/generating-backtrace.md': generating-backtrace.md
+ 'el-gr/html-attributes.md': html-attributes.md
+ 'el-gr/html-breadcrumbs.md': html-breadcrumbs.md
+ 'el-gr/html-escaper.md': html-escaper.md
+ 'el-gr/html-link.md': html-link.md
+ 'el-gr/html.md': html.md
+ 'el-gr/html-tagfactory.md': html-tagfactory.md
+ 'el-gr/http-factories.md': http-factories.md
+ 'el-gr/http-request.md': http-request.md
+ 'el-gr/http-response.md': http-response.md
+ 'el-gr/http-server-request.md': http-server-request.md
+ 'el-gr/http-stream.md': http-stream.md
+ 'el-gr/http-uploaded-file.md': http-uploaded-file.md
+ 'el-gr/http-uri.md': http-uri.md
+ 'el-gr/i18n.md': i18n.md
+ 'el-gr/image.md': image.md
+ 'el-gr/index.md': introduction.md
+ 'el-gr/installation.md': installation.md
+ 'el-gr/introduction.md': introduction.md
+ 'el-gr/logger.md': logger.md
+ 'el-gr/meta-home.json': meta-home.json
+ 'el-gr/meta-topics.json': meta-topics.json
+ 'el-gr/mvc.md': mvc.md
+ 'el-gr/mvc-url.md': mvc-url.md
+ 'el-gr/namespaces.md': namespaces.md
+ 'el-gr/new-feature-request-list.md': new-feature-request-list.md
+ 'el-gr/new-feature-request.md': new-feature-request.md
+ 'el-gr/new-pull-request.md': new-pull-request.md
+ 'el-gr/performance.md': performance.md
+ 'el-gr/queue.md': queue.md
+ 'el-gr/reproducible-tests.md': reproducible-tests.md
+ 'el-gr/request.md': request.md
+ 'el-gr/response.md': response.md
+ 'el-gr/routing.md': routing.md
+ 'el-gr/session.md': session.md
+ 'el-gr/sponsors.md': sponsors.md
+ 'el-gr/static-analysis.md': static-analysis.md
+ 'el-gr/storage.md': storage.md
+ 'el-gr/support-collection.md': support-collection.md
+ 'el-gr/support-debug.md': support-debug.md
+ 'el-gr/support-helper.md': support-helper.md
+ 'el-gr/support-registry.md': support-registry.md
+ 'el-gr/support-version.md': support-version.md
+ 'el-gr/tag.md': tag.md
+ 'el-gr/testing-environment.md': testing-environment.md
+ 'el-gr/translate.md': translate.md
+ 'el-gr/tutorial-basic.md': tutorial-basic.md
+ 'el-gr/tutorial-invo.md': tutorial-invo.md
+ 'el-gr/tutorial-rest.md': tutorial-rest.md
+ 'el-gr/tutorial-vokuro.md': tutorial-vokuro.md
+ 'el-gr/unit-testing.md': unit-testing.md
+ 'el-gr/upgrade.md': upgrade.md
+ 'el-gr/use-case.md': use-case.md
+ 'el-gr/views.md': views.md
+ 'el-gr/volt.md': volt.md
+ 'el-gr/webserver-setup.md': webserver-setup.md
+ 'es-es/acl.md': acl.md
+ 'es-es/annotations.md': annotations.md
+ 'es-es/api/index.md': api/index.md
+ 'es-es/api/phalcon_acl.md': api/phalcon_acl.md
+ 'es-es/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'es-es/api/phalcon_application.md': api/phalcon_application.md
+ 'es-es/api/phalcon_assets.md': api/phalcon_assets.md
+ 'es-es/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'es-es/api/phalcon_cache.md': api/phalcon_cache.md
+ 'es-es/api/phalcon_cli.md': api/phalcon_cli.md
+ 'es-es/api/phalcon_config.md': api/phalcon_config.md
+ 'es-es/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'es-es/api/phalcon_db.md': api/phalcon_db.md
+ 'es-es/api/phalcon_di.md': api/phalcon_di.md
+ 'es-es/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'es-es/api/phalcon_domain.md': api/phalcon_domain.md
+ 'es-es/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'es-es/api/phalcon_events.md': api/phalcon_events.md
+ 'es-es/api/phalcon_factory.md': api/phalcon_factory.md
+ 'es-es/api/phalcon_filter.md': api/phalcon_filter.md
+ 'es-es/api/phalcon_flash.md': api/phalcon_flash.md
+ 'es-es/api/phalcon_forms.md': api/phalcon_forms.md
+ 'es-es/api/phalcon_html.md': api/phalcon_html.md
+ 'es-es/api/phalcon_http.md': api/phalcon_http.md
+ 'es-es/api/phalcon_image.md': api/phalcon_image.md
+ 'es-es/api/phalcon_logger.md': api/phalcon_logger.md
+ 'es-es/api/phalcon_messages.md': api/phalcon_messages.md
+ 'es-es/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'es-es/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'es-es/api/phalcon_session.md': api/phalcon_session.md
+ 'es-es/api/phalcon_storage.md': api/phalcon_storage.md
+ 'es-es/api/phalcon_support.md': api/phalcon_support.md
+ 'es-es/api/phalcon_tag.md': api/phalcon_tag.md
+ 'es-es/api/phalcon_translate.md': api/phalcon_translate.md
+ 'es-es/application-cli.md': application-cli.md
+ 'es-es/application.md': application.md
+ 'es-es/application-micro.md': application-micro.md
+ 'es-es/assets.md': assets.md
+ 'es-es/autoload.md': autoload.md
+ 'es-es/cache.md': cache.md
+ 'es-es/coding-standard.md': coding-standard.md
+ 'es-es/config.md': config.md
+ 'es-es/contributions.md': contributions.md
+ 'es-es/controllers.md': controllers.md
+ 'es-es/datamapper.md': datamapper.md
+ 'es-es/db-layer.md': db-layer.md
+ 'es-es/db-migrations.md': db-migrations.md
+ 'es-es/db-models-behaviors.md': db-models-behaviors.md
+ 'es-es/db-models-cache.md': db-models-cache.md
+ 'es-es/db-models-events.md': db-models-events.md
+ 'es-es/db-models.md': db-models.md
+ 'es-es/db-models-metadata.md': db-models-metadata.md
+ 'es-es/db-models-relationships.md': db-models-relationships.md
+ 'es-es/db-models-transactions.md': db-models-transactions.md
+ 'es-es/db-models-validation.md': db-models-validation.md
+ 'es-es/db-odm.md': db-odm.md
+ 'es-es/db-pagination.md': db-pagination.md
+ 'es-es/db-phql.md': db-phql.md
+ 'es-es/devtools.md': devtools.md
+ 'es-es/di.md': di.md
+ 'es-es/dispatcher.md': dispatcher.md
+ 'es-es/domain.md': domain.md
+ 'es-es/encryption-crypt.md': encryption-crypt.md
+ 'es-es/encryption-security-jwt.md': encryption-security-jwt.md
+ 'es-es/encryption-security.md': encryption-security.md
+ 'es-es/environments-devilbox.md': environments-devilbox.md
+ 'es-es/environments-nanobox.md': environments-nanobox.md
+ 'es-es/events.md': events.md
+ 'es-es/filter-filter.md': filter-filter.md
+ 'es-es/filter-validation.md': filter-validation.md
+ 'es-es/flash.md': flash.md
+ 'es-es/forms.md': forms.md
+ 'es-es/generating-backtrace.md': generating-backtrace.md
+ 'es-es/html-attributes.md': html-attributes.md
+ 'es-es/html-breadcrumbs.md': html-breadcrumbs.md
+ 'es-es/html-escaper.md': html-escaper.md
+ 'es-es/html-link.md': html-link.md
+ 'es-es/html.md': html.md
+ 'es-es/html-tagfactory.md': html-tagfactory.md
+ 'es-es/http-factories.md': http-factories.md
+ 'es-es/http-request.md': http-request.md
+ 'es-es/http-response.md': http-response.md
+ 'es-es/http-server-request.md': http-server-request.md
+ 'es-es/http-stream.md': http-stream.md
+ 'es-es/http-uploaded-file.md': http-uploaded-file.md
+ 'es-es/http-uri.md': http-uri.md
+ 'es-es/i18n.md': i18n.md
+ 'es-es/image.md': image.md
+ 'es-es/index.md': introduction.md
+ 'es-es/installation.md': installation.md
+ 'es-es/introduction.md': introduction.md
+ 'es-es/logger.md': logger.md
+ 'es-es/meta-home.json': meta-home.json
+ 'es-es/meta-topics.json': meta-topics.json
+ 'es-es/mvc.md': mvc.md
+ 'es-es/mvc-url.md': mvc-url.md
+ 'es-es/namespaces.md': namespaces.md
+ 'es-es/new-feature-request-list.md': new-feature-request-list.md
+ 'es-es/new-feature-request.md': new-feature-request.md
+ 'es-es/new-pull-request.md': new-pull-request.md
+ 'es-es/performance.md': performance.md
+ 'es-es/queue.md': queue.md
+ 'es-es/reproducible-tests.md': reproducible-tests.md
+ 'es-es/request.md': request.md
+ 'es-es/response.md': response.md
+ 'es-es/routing.md': routing.md
+ 'es-es/session.md': session.md
+ 'es-es/sponsors.md': sponsors.md
+ 'es-es/static-analysis.md': static-analysis.md
+ 'es-es/storage.md': storage.md
+ 'es-es/support-collection.md': support-collection.md
+ 'es-es/support-debug.md': support-debug.md
+ 'es-es/support-helper.md': support-helper.md
+ 'es-es/support-registry.md': support-registry.md
+ 'es-es/support-version.md': support-version.md
+ 'es-es/tag.md': tag.md
+ 'es-es/testing-environment.md': testing-environment.md
+ 'es-es/translate.md': translate.md
+ 'es-es/tutorial-basic.md': tutorial-basic.md
+ 'es-es/tutorial-invo.md': tutorial-invo.md
+ 'es-es/tutorial-rest.md': tutorial-rest.md
+ 'es-es/tutorial-vokuro.md': tutorial-vokuro.md
+ 'es-es/unit-testing.md': unit-testing.md
+ 'es-es/upgrade.md': upgrade.md
+ 'es-es/use-case.md': use-case.md
+ 'es-es/views.md': views.md
+ 'es-es/volt.md': volt.md
+ 'es-es/webserver-setup.md': webserver-setup.md
+ 'fa-ir/acl.md': acl.md
+ 'fa-ir/annotations.md': annotations.md
+ 'fa-ir/api/index.md': api/index.md
+ 'fa-ir/api/phalcon_acl.md': api/phalcon_acl.md
+ 'fa-ir/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'fa-ir/api/phalcon_application.md': api/phalcon_application.md
+ 'fa-ir/api/phalcon_assets.md': api/phalcon_assets.md
+ 'fa-ir/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'fa-ir/api/phalcon_cache.md': api/phalcon_cache.md
+ 'fa-ir/api/phalcon_cli.md': api/phalcon_cli.md
+ 'fa-ir/api/phalcon_config.md': api/phalcon_config.md
+ 'fa-ir/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'fa-ir/api/phalcon_db.md': api/phalcon_db.md
+ 'fa-ir/api/phalcon_di.md': api/phalcon_di.md
+ 'fa-ir/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'fa-ir/api/phalcon_domain.md': api/phalcon_domain.md
+ 'fa-ir/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'fa-ir/api/phalcon_events.md': api/phalcon_events.md
+ 'fa-ir/api/phalcon_factory.md': api/phalcon_factory.md
+ 'fa-ir/api/phalcon_filter.md': api/phalcon_filter.md
+ 'fa-ir/api/phalcon_flash.md': api/phalcon_flash.md
+ 'fa-ir/api/phalcon_forms.md': api/phalcon_forms.md
+ 'fa-ir/api/phalcon_html.md': api/phalcon_html.md
+ 'fa-ir/api/phalcon_http.md': api/phalcon_http.md
+ 'fa-ir/api/phalcon_image.md': api/phalcon_image.md
+ 'fa-ir/api/phalcon_logger.md': api/phalcon_logger.md
+ 'fa-ir/api/phalcon_messages.md': api/phalcon_messages.md
+ 'fa-ir/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'fa-ir/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'fa-ir/api/phalcon_session.md': api/phalcon_session.md
+ 'fa-ir/api/phalcon_storage.md': api/phalcon_storage.md
+ 'fa-ir/api/phalcon_support.md': api/phalcon_support.md
+ 'fa-ir/api/phalcon_tag.md': api/phalcon_tag.md
+ 'fa-ir/api/phalcon_translate.md': api/phalcon_translate.md
+ 'fa-ir/application-cli.md': application-cli.md
+ 'fa-ir/application.md': application.md
+ 'fa-ir/application-micro.md': application-micro.md
+ 'fa-ir/assets.md': assets.md
+ 'fa-ir/autoload.md': autoload.md
+ 'fa-ir/cache.md': cache.md
+ 'fa-ir/coding-standard.md': coding-standard.md
+ 'fa-ir/config.md': config.md
+ 'fa-ir/contributions.md': contributions.md
+ 'fa-ir/controllers.md': controllers.md
+ 'fa-ir/datamapper.md': datamapper.md
+ 'fa-ir/db-layer.md': db-layer.md
+ 'fa-ir/db-migrations.md': db-migrations.md
+ 'fa-ir/db-models-behaviors.md': db-models-behaviors.md
+ 'fa-ir/db-models-cache.md': db-models-cache.md
+ 'fa-ir/db-models-events.md': db-models-events.md
+ 'fa-ir/db-models.md': db-models.md
+ 'fa-ir/db-models-metadata.md': db-models-metadata.md
+ 'fa-ir/db-models-relationships.md': db-models-relationships.md
+ 'fa-ir/db-models-transactions.md': db-models-transactions.md
+ 'fa-ir/db-models-validation.md': db-models-validation.md
+ 'fa-ir/db-odm.md': db-odm.md
+ 'fa-ir/db-pagination.md': db-pagination.md
+ 'fa-ir/db-phql.md': db-phql.md
+ 'fa-ir/devtools.md': devtools.md
+ 'fa-ir/di.md': di.md
+ 'fa-ir/dispatcher.md': dispatcher.md
+ 'fa-ir/domain.md': domain.md
+ 'fa-ir/encryption-crypt.md': encryption-crypt.md
+ 'fa-ir/encryption-security-jwt.md': encryption-security-jwt.md
+ 'fa-ir/encryption-security.md': encryption-security.md
+ 'fa-ir/environments-devilbox.md': environments-devilbox.md
+ 'fa-ir/environments-nanobox.md': environments-nanobox.md
+ 'fa-ir/events.md': events.md
+ 'fa-ir/filter-filter.md': filter-filter.md
+ 'fa-ir/filter-validation.md': filter-validation.md
+ 'fa-ir/flash.md': flash.md
+ 'fa-ir/forms.md': forms.md
+ 'fa-ir/generating-backtrace.md': generating-backtrace.md
+ 'fa-ir/html-attributes.md': html-attributes.md
+ 'fa-ir/html-breadcrumbs.md': html-breadcrumbs.md
+ 'fa-ir/html-escaper.md': html-escaper.md
+ 'fa-ir/html-link.md': html-link.md
+ 'fa-ir/html.md': html.md
+ 'fa-ir/html-tagfactory.md': html-tagfactory.md
+ 'fa-ir/http-factories.md': http-factories.md
+ 'fa-ir/http-request.md': http-request.md
+ 'fa-ir/http-response.md': http-response.md
+ 'fa-ir/http-server-request.md': http-server-request.md
+ 'fa-ir/http-stream.md': http-stream.md
+ 'fa-ir/http-uploaded-file.md': http-uploaded-file.md
+ 'fa-ir/http-uri.md': http-uri.md
+ 'fa-ir/i18n.md': i18n.md
+ 'fa-ir/image.md': image.md
+ 'fa-ir/index.md': introduction.md
+ 'fa-ir/installation.md': installation.md
+ 'fa-ir/introduction.md': introduction.md
+ 'fa-ir/logger.md': logger.md
+ 'fa-ir/meta-home.json': meta-home.json
+ 'fa-ir/meta-topics.json': meta-topics.json
+ 'fa-ir/mvc.md': mvc.md
+ 'fa-ir/mvc-url.md': mvc-url.md
+ 'fa-ir/namespaces.md': namespaces.md
+ 'fa-ir/new-feature-request-list.md': new-feature-request-list.md
+ 'fa-ir/new-feature-request.md': new-feature-request.md
+ 'fa-ir/new-pull-request.md': new-pull-request.md
+ 'fa-ir/performance.md': performance.md
+ 'fa-ir/queue.md': queue.md
+ 'fa-ir/reproducible-tests.md': reproducible-tests.md
+ 'fa-ir/request.md': request.md
+ 'fa-ir/response.md': response.md
+ 'fa-ir/routing.md': routing.md
+ 'fa-ir/session.md': session.md
+ 'fa-ir/sponsors.md': sponsors.md
+ 'fa-ir/static-analysis.md': static-analysis.md
+ 'fa-ir/storage.md': storage.md
+ 'fa-ir/support-collection.md': support-collection.md
+ 'fa-ir/support-debug.md': support-debug.md
+ 'fa-ir/support-helper.md': support-helper.md
+ 'fa-ir/support-registry.md': support-registry.md
+ 'fa-ir/support-version.md': support-version.md
+ 'fa-ir/tag.md': tag.md
+ 'fa-ir/testing-environment.md': testing-environment.md
+ 'fa-ir/translate.md': translate.md
+ 'fa-ir/tutorial-basic.md': tutorial-basic.md
+ 'fa-ir/tutorial-invo.md': tutorial-invo.md
+ 'fa-ir/tutorial-rest.md': tutorial-rest.md
+ 'fa-ir/tutorial-vokuro.md': tutorial-vokuro.md
+ 'fa-ir/unit-testing.md': unit-testing.md
+ 'fa-ir/upgrade.md': upgrade.md
+ 'fa-ir/use-case.md': use-case.md
+ 'fa-ir/views.md': views.md
+ 'fa-ir/volt.md': volt.md
+ 'fa-ir/webserver-setup.md': webserver-setup.md
+ 'fr-fr/acl.md': acl.md
+ 'fr-fr/annotations.md': annotations.md
+ 'fr-fr/api/index.md': api/index.md
+ 'fr-fr/api/phalcon_acl.md': api/phalcon_acl.md
+ 'fr-fr/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'fr-fr/api/phalcon_application.md': api/phalcon_application.md
+ 'fr-fr/api/phalcon_assets.md': api/phalcon_assets.md
+ 'fr-fr/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'fr-fr/api/phalcon_cache.md': api/phalcon_cache.md
+ 'fr-fr/api/phalcon_cli.md': api/phalcon_cli.md
+ 'fr-fr/api/phalcon_config.md': api/phalcon_config.md
+ 'fr-fr/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'fr-fr/api/phalcon_db.md': api/phalcon_db.md
+ 'fr-fr/api/phalcon_di.md': api/phalcon_di.md
+ 'fr-fr/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'fr-fr/api/phalcon_domain.md': api/phalcon_domain.md
+ 'fr-fr/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'fr-fr/api/phalcon_events.md': api/phalcon_events.md
+ 'fr-fr/api/phalcon_factory.md': api/phalcon_factory.md
+ 'fr-fr/api/phalcon_filter.md': api/phalcon_filter.md
+ 'fr-fr/api/phalcon_flash.md': api/phalcon_flash.md
+ 'fr-fr/api/phalcon_forms.md': api/phalcon_forms.md
+ 'fr-fr/api/phalcon_html.md': api/phalcon_html.md
+ 'fr-fr/api/phalcon_http.md': api/phalcon_http.md
+ 'fr-fr/api/phalcon_image.md': api/phalcon_image.md
+ 'fr-fr/api/phalcon_logger.md': api/phalcon_logger.md
+ 'fr-fr/api/phalcon_messages.md': api/phalcon_messages.md
+ 'fr-fr/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'fr-fr/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'fr-fr/api/phalcon_session.md': api/phalcon_session.md
+ 'fr-fr/api/phalcon_storage.md': api/phalcon_storage.md
+ 'fr-fr/api/phalcon_support.md': api/phalcon_support.md
+ 'fr-fr/api/phalcon_tag.md': api/phalcon_tag.md
+ 'fr-fr/api/phalcon_translate.md': api/phalcon_translate.md
+ 'fr-fr/application-cli.md': application-cli.md
+ 'fr-fr/application.md': application.md
+ 'fr-fr/application-micro.md': application-micro.md
+ 'fr-fr/assets.md': assets.md
+ 'fr-fr/autoload.md': autoload.md
+ 'fr-fr/cache.md': cache.md
+ 'fr-fr/coding-standard.md': coding-standard.md
+ 'fr-fr/config.md': config.md
+ 'fr-fr/contributions.md': contributions.md
+ 'fr-fr/controllers.md': controllers.md
+ 'fr-fr/datamapper.md': datamapper.md
+ 'fr-fr/db-layer.md': db-layer.md
+ 'fr-fr/db-migrations.md': db-migrations.md
+ 'fr-fr/db-models-behaviors.md': db-models-behaviors.md
+ 'fr-fr/db-models-cache.md': db-models-cache.md
+ 'fr-fr/db-models-events.md': db-models-events.md
+ 'fr-fr/db-models.md': db-models.md
+ 'fr-fr/db-models-metadata.md': db-models-metadata.md
+ 'fr-fr/db-models-relationships.md': db-models-relationships.md
+ 'fr-fr/db-models-transactions.md': db-models-transactions.md
+ 'fr-fr/db-models-validation.md': db-models-validation.md
+ 'fr-fr/db-odm.md': db-odm.md
+ 'fr-fr/db-pagination.md': db-pagination.md
+ 'fr-fr/db-phql.md': db-phql.md
+ 'fr-fr/devtools.md': devtools.md
+ 'fr-fr/di.md': di.md
+ 'fr-fr/dispatcher.md': dispatcher.md
+ 'fr-fr/domain.md': domain.md
+ 'fr-fr/encryption-crypt.md': encryption-crypt.md
+ 'fr-fr/encryption-security-jwt.md': encryption-security-jwt.md
+ 'fr-fr/encryption-security.md': encryption-security.md
+ 'fr-fr/environments-devilbox.md': environments-devilbox.md
+ 'fr-fr/environments-nanobox.md': environments-nanobox.md
+ 'fr-fr/events.md': events.md
+ 'fr-fr/filter-filter.md': filter-filter.md
+ 'fr-fr/filter-validation.md': filter-validation.md
+ 'fr-fr/flash.md': flash.md
+ 'fr-fr/forms.md': forms.md
+ 'fr-fr/generating-backtrace.md': generating-backtrace.md
+ 'fr-fr/html-attributes.md': html-attributes.md
+ 'fr-fr/html-breadcrumbs.md': html-breadcrumbs.md
+ 'fr-fr/html-escaper.md': html-escaper.md
+ 'fr-fr/html-link.md': html-link.md
+ 'fr-fr/html.md': html.md
+ 'fr-fr/html-tagfactory.md': html-tagfactory.md
+ 'fr-fr/http-factories.md': http-factories.md
+ 'fr-fr/http-request.md': http-request.md
+ 'fr-fr/http-response.md': http-response.md
+ 'fr-fr/http-server-request.md': http-server-request.md
+ 'fr-fr/http-stream.md': http-stream.md
+ 'fr-fr/http-uploaded-file.md': http-uploaded-file.md
+ 'fr-fr/http-uri.md': http-uri.md
+ 'fr-fr/i18n.md': i18n.md
+ 'fr-fr/image.md': image.md
+ 'fr-fr/index.md': introduction.md
+ 'fr-fr/installation.md': installation.md
+ 'fr-fr/introduction.md': introduction.md
+ 'fr-fr/logger.md': logger.md
+ 'fr-fr/meta-home.json': meta-home.json
+ 'fr-fr/meta-topics.json': meta-topics.json
+ 'fr-fr/mvc.md': mvc.md
+ 'fr-fr/mvc-url.md': mvc-url.md
+ 'fr-fr/namespaces.md': namespaces.md
+ 'fr-fr/new-feature-request-list.md': new-feature-request-list.md
+ 'fr-fr/new-feature-request.md': new-feature-request.md
+ 'fr-fr/new-pull-request.md': new-pull-request.md
+ 'fr-fr/performance.md': performance.md
+ 'fr-fr/queue.md': queue.md
+ 'fr-fr/reproducible-tests.md': reproducible-tests.md
+ 'fr-fr/request.md': request.md
+ 'fr-fr/response.md': response.md
+ 'fr-fr/routing.md': routing.md
+ 'fr-fr/session.md': session.md
+ 'fr-fr/sponsors.md': sponsors.md
+ 'fr-fr/static-analysis.md': static-analysis.md
+ 'fr-fr/storage.md': storage.md
+ 'fr-fr/support-collection.md': support-collection.md
+ 'fr-fr/support-debug.md': support-debug.md
+ 'fr-fr/support-helper.md': support-helper.md
+ 'fr-fr/support-registry.md': support-registry.md
+ 'fr-fr/support-version.md': support-version.md
+ 'fr-fr/tag.md': tag.md
+ 'fr-fr/testing-environment.md': testing-environment.md
+ 'fr-fr/translate.md': translate.md
+ 'fr-fr/tutorial-basic.md': tutorial-basic.md
+ 'fr-fr/tutorial-invo.md': tutorial-invo.md
+ 'fr-fr/tutorial-rest.md': tutorial-rest.md
+ 'fr-fr/tutorial-vokuro.md': tutorial-vokuro.md
+ 'fr-fr/unit-testing.md': unit-testing.md
+ 'fr-fr/upgrade.md': upgrade.md
+ 'fr-fr/use-case.md': use-case.md
+ 'fr-fr/views.md': views.md
+ 'fr-fr/volt.md': volt.md
+ 'fr-fr/webserver-setup.md': webserver-setup.md
+ 'id-id/acl.md': acl.md
+ 'id-id/annotations.md': annotations.md
+ 'id-id/api/index.md': api/index.md
+ 'id-id/api/phalcon_acl.md': api/phalcon_acl.md
+ 'id-id/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'id-id/api/phalcon_application.md': api/phalcon_application.md
+ 'id-id/api/phalcon_assets.md': api/phalcon_assets.md
+ 'id-id/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'id-id/api/phalcon_cache.md': api/phalcon_cache.md
+ 'id-id/api/phalcon_cli.md': api/phalcon_cli.md
+ 'id-id/api/phalcon_config.md': api/phalcon_config.md
+ 'id-id/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'id-id/api/phalcon_db.md': api/phalcon_db.md
+ 'id-id/api/phalcon_di.md': api/phalcon_di.md
+ 'id-id/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'id-id/api/phalcon_domain.md': api/phalcon_domain.md
+ 'id-id/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'id-id/api/phalcon_events.md': api/phalcon_events.md
+ 'id-id/api/phalcon_factory.md': api/phalcon_factory.md
+ 'id-id/api/phalcon_filter.md': api/phalcon_filter.md
+ 'id-id/api/phalcon_flash.md': api/phalcon_flash.md
+ 'id-id/api/phalcon_forms.md': api/phalcon_forms.md
+ 'id-id/api/phalcon_html.md': api/phalcon_html.md
+ 'id-id/api/phalcon_http.md': api/phalcon_http.md
+ 'id-id/api/phalcon_image.md': api/phalcon_image.md
+ 'id-id/api/phalcon_logger.md': api/phalcon_logger.md
+ 'id-id/api/phalcon_messages.md': api/phalcon_messages.md
+ 'id-id/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'id-id/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'id-id/api/phalcon_session.md': api/phalcon_session.md
+ 'id-id/api/phalcon_storage.md': api/phalcon_storage.md
+ 'id-id/api/phalcon_support.md': api/phalcon_support.md
+ 'id-id/api/phalcon_tag.md': api/phalcon_tag.md
+ 'id-id/api/phalcon_translate.md': api/phalcon_translate.md
+ 'id-id/application-cli.md': application-cli.md
+ 'id-id/application.md': application.md
+ 'id-id/application-micro.md': application-micro.md
+ 'id-id/assets.md': assets.md
+ 'id-id/autoload.md': autoload.md
+ 'id-id/cache.md': cache.md
+ 'id-id/coding-standard.md': coding-standard.md
+ 'id-id/config.md': config.md
+ 'id-id/contributions.md': contributions.md
+ 'id-id/controllers.md': controllers.md
+ 'id-id/datamapper.md': datamapper.md
+ 'id-id/db-layer.md': db-layer.md
+ 'id-id/db-migrations.md': db-migrations.md
+ 'id-id/db-models-behaviors.md': db-models-behaviors.md
+ 'id-id/db-models-cache.md': db-models-cache.md
+ 'id-id/db-models-events.md': db-models-events.md
+ 'id-id/db-models.md': db-models.md
+ 'id-id/db-models-metadata.md': db-models-metadata.md
+ 'id-id/db-models-relationships.md': db-models-relationships.md
+ 'id-id/db-models-transactions.md': db-models-transactions.md
+ 'id-id/db-models-validation.md': db-models-validation.md
+ 'id-id/db-odm.md': db-odm.md
+ 'id-id/db-pagination.md': db-pagination.md
+ 'id-id/db-phql.md': db-phql.md
+ 'id-id/devtools.md': devtools.md
+ 'id-id/di.md': di.md
+ 'id-id/dispatcher.md': dispatcher.md
+ 'id-id/domain.md': domain.md
+ 'id-id/encryption-crypt.md': encryption-crypt.md
+ 'id-id/encryption-security-jwt.md': encryption-security-jwt.md
+ 'id-id/encryption-security.md': encryption-security.md
+ 'id-id/environments-devilbox.md': environments-devilbox.md
+ 'id-id/environments-nanobox.md': environments-nanobox.md
+ 'id-id/events.md': events.md
+ 'id-id/filter-filter.md': filter-filter.md
+ 'id-id/filter-validation.md': filter-validation.md
+ 'id-id/flash.md': flash.md
+ 'id-id/forms.md': forms.md
+ 'id-id/generating-backtrace.md': generating-backtrace.md
+ 'id-id/html-attributes.md': html-attributes.md
+ 'id-id/html-breadcrumbs.md': html-breadcrumbs.md
+ 'id-id/html-escaper.md': html-escaper.md
+ 'id-id/html-link.md': html-link.md
+ 'id-id/html.md': html.md
+ 'id-id/html-tagfactory.md': html-tagfactory.md
+ 'id-id/http-factories.md': http-factories.md
+ 'id-id/http-request.md': http-request.md
+ 'id-id/http-response.md': http-response.md
+ 'id-id/http-server-request.md': http-server-request.md
+ 'id-id/http-stream.md': http-stream.md
+ 'id-id/http-uploaded-file.md': http-uploaded-file.md
+ 'id-id/http-uri.md': http-uri.md
+ 'id-id/i18n.md': i18n.md
+ 'id-id/image.md': image.md
+ 'id-id/index.md': introduction.md
+ 'id-id/installation.md': installation.md
+ 'id-id/introduction.md': introduction.md
+ 'id-id/logger.md': logger.md
+ 'id-id/meta-home.json': meta-home.json
+ 'id-id/meta-topics.json': meta-topics.json
+ 'id-id/mvc.md': mvc.md
+ 'id-id/mvc-url.md': mvc-url.md
+ 'id-id/namespaces.md': namespaces.md
+ 'id-id/new-feature-request-list.md': new-feature-request-list.md
+ 'id-id/new-feature-request.md': new-feature-request.md
+ 'id-id/new-pull-request.md': new-pull-request.md
+ 'id-id/performance.md': performance.md
+ 'id-id/queue.md': queue.md
+ 'id-id/reproducible-tests.md': reproducible-tests.md
+ 'id-id/request.md': request.md
+ 'id-id/response.md': response.md
+ 'id-id/routing.md': routing.md
+ 'id-id/session.md': session.md
+ 'id-id/sponsors.md': sponsors.md
+ 'id-id/static-analysis.md': static-analysis.md
+ 'id-id/storage.md': storage.md
+ 'id-id/support-collection.md': support-collection.md
+ 'id-id/support-debug.md': support-debug.md
+ 'id-id/support-helper.md': support-helper.md
+ 'id-id/support-registry.md': support-registry.md
+ 'id-id/support-version.md': support-version.md
+ 'id-id/tag.md': tag.md
+ 'id-id/testing-environment.md': testing-environment.md
+ 'id-id/translate.md': translate.md
+ 'id-id/tutorial-basic.md': tutorial-basic.md
+ 'id-id/tutorial-invo.md': tutorial-invo.md
+ 'id-id/tutorial-rest.md': tutorial-rest.md
+ 'id-id/tutorial-vokuro.md': tutorial-vokuro.md
+ 'id-id/unit-testing.md': unit-testing.md
+ 'id-id/upgrade.md': upgrade.md
+ 'id-id/use-case.md': use-case.md
+ 'id-id/views.md': views.md
+ 'id-id/volt.md': volt.md
+ 'id-id/webserver-setup.md': webserver-setup.md
+ 'it-it/acl.md': acl.md
+ 'it-it/annotations.md': annotations.md
+ 'it-it/api/index.md': api/index.md
+ 'it-it/api/phalcon_acl.md': api/phalcon_acl.md
+ 'it-it/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'it-it/api/phalcon_application.md': api/phalcon_application.md
+ 'it-it/api/phalcon_assets.md': api/phalcon_assets.md
+ 'it-it/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'it-it/api/phalcon_cache.md': api/phalcon_cache.md
+ 'it-it/api/phalcon_cli.md': api/phalcon_cli.md
+ 'it-it/api/phalcon_config.md': api/phalcon_config.md
+ 'it-it/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'it-it/api/phalcon_db.md': api/phalcon_db.md
+ 'it-it/api/phalcon_di.md': api/phalcon_di.md
+ 'it-it/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'it-it/api/phalcon_domain.md': api/phalcon_domain.md
+ 'it-it/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'it-it/api/phalcon_events.md': api/phalcon_events.md
+ 'it-it/api/phalcon_factory.md': api/phalcon_factory.md
+ 'it-it/api/phalcon_filter.md': api/phalcon_filter.md
+ 'it-it/api/phalcon_flash.md': api/phalcon_flash.md
+ 'it-it/api/phalcon_forms.md': api/phalcon_forms.md
+ 'it-it/api/phalcon_html.md': api/phalcon_html.md
+ 'it-it/api/phalcon_http.md': api/phalcon_http.md
+ 'it-it/api/phalcon_image.md': api/phalcon_image.md
+ 'it-it/api/phalcon_logger.md': api/phalcon_logger.md
+ 'it-it/api/phalcon_messages.md': api/phalcon_messages.md
+ 'it-it/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'it-it/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'it-it/api/phalcon_session.md': api/phalcon_session.md
+ 'it-it/api/phalcon_storage.md': api/phalcon_storage.md
+ 'it-it/api/phalcon_support.md': api/phalcon_support.md
+ 'it-it/api/phalcon_tag.md': api/phalcon_tag.md
+ 'it-it/api/phalcon_translate.md': api/phalcon_translate.md
+ 'it-it/application-cli.md': application-cli.md
+ 'it-it/application.md': application.md
+ 'it-it/application-micro.md': application-micro.md
+ 'it-it/assets.md': assets.md
+ 'it-it/autoload.md': autoload.md
+ 'it-it/cache.md': cache.md
+ 'it-it/coding-standard.md': coding-standard.md
+ 'it-it/config.md': config.md
+ 'it-it/contributions.md': contributions.md
+ 'it-it/controllers.md': controllers.md
+ 'it-it/datamapper.md': datamapper.md
+ 'it-it/db-layer.md': db-layer.md
+ 'it-it/db-migrations.md': db-migrations.md
+ 'it-it/db-models-behaviors.md': db-models-behaviors.md
+ 'it-it/db-models-cache.md': db-models-cache.md
+ 'it-it/db-models-events.md': db-models-events.md
+ 'it-it/db-models.md': db-models.md
+ 'it-it/db-models-metadata.md': db-models-metadata.md
+ 'it-it/db-models-relationships.md': db-models-relationships.md
+ 'it-it/db-models-transactions.md': db-models-transactions.md
+ 'it-it/db-models-validation.md': db-models-validation.md
+ 'it-it/db-odm.md': db-odm.md
+ 'it-it/db-pagination.md': db-pagination.md
+ 'it-it/db-phql.md': db-phql.md
+ 'it-it/devtools.md': devtools.md
+ 'it-it/di.md': di.md
+ 'it-it/dispatcher.md': dispatcher.md
+ 'it-it/domain.md': domain.md
+ 'it-it/encryption-crypt.md': encryption-crypt.md
+ 'it-it/encryption-security-jwt.md': encryption-security-jwt.md
+ 'it-it/encryption-security.md': encryption-security.md
+ 'it-it/environments-devilbox.md': environments-devilbox.md
+ 'it-it/environments-nanobox.md': environments-nanobox.md
+ 'it-it/events.md': events.md
+ 'it-it/filter-filter.md': filter-filter.md
+ 'it-it/filter-validation.md': filter-validation.md
+ 'it-it/flash.md': flash.md
+ 'it-it/forms.md': forms.md
+ 'it-it/generating-backtrace.md': generating-backtrace.md
+ 'it-it/html-attributes.md': html-attributes.md
+ 'it-it/html-breadcrumbs.md': html-breadcrumbs.md
+ 'it-it/html-escaper.md': html-escaper.md
+ 'it-it/html-link.md': html-link.md
+ 'it-it/html.md': html.md
+ 'it-it/html-tagfactory.md': html-tagfactory.md
+ 'it-it/http-factories.md': http-factories.md
+ 'it-it/http-request.md': http-request.md
+ 'it-it/http-response.md': http-response.md
+ 'it-it/http-server-request.md': http-server-request.md
+ 'it-it/http-stream.md': http-stream.md
+ 'it-it/http-uploaded-file.md': http-uploaded-file.md
+ 'it-it/http-uri.md': http-uri.md
+ 'it-it/i18n.md': i18n.md
+ 'it-it/image.md': image.md
+ 'it-it/index.md': introduction.md
+ 'it-it/installation.md': installation.md
+ 'it-it/introduction.md': introduction.md
+ 'it-it/logger.md': logger.md
+ 'it-it/meta-home.json': meta-home.json
+ 'it-it/meta-topics.json': meta-topics.json
+ 'it-it/mvc.md': mvc.md
+ 'it-it/mvc-url.md': mvc-url.md
+ 'it-it/namespaces.md': namespaces.md
+ 'it-it/new-feature-request-list.md': new-feature-request-list.md
+ 'it-it/new-feature-request.md': new-feature-request.md
+ 'it-it/new-pull-request.md': new-pull-request.md
+ 'it-it/performance.md': performance.md
+ 'it-it/queue.md': queue.md
+ 'it-it/reproducible-tests.md': reproducible-tests.md
+ 'it-it/request.md': request.md
+ 'it-it/response.md': response.md
+ 'it-it/routing.md': routing.md
+ 'it-it/session.md': session.md
+ 'it-it/sponsors.md': sponsors.md
+ 'it-it/static-analysis.md': static-analysis.md
+ 'it-it/storage.md': storage.md
+ 'it-it/support-collection.md': support-collection.md
+ 'it-it/support-debug.md': support-debug.md
+ 'it-it/support-helper.md': support-helper.md
+ 'it-it/support-registry.md': support-registry.md
+ 'it-it/support-version.md': support-version.md
+ 'it-it/tag.md': tag.md
+ 'it-it/testing-environment.md': testing-environment.md
+ 'it-it/translate.md': translate.md
+ 'it-it/tutorial-basic.md': tutorial-basic.md
+ 'it-it/tutorial-invo.md': tutorial-invo.md
+ 'it-it/tutorial-rest.md': tutorial-rest.md
+ 'it-it/tutorial-vokuro.md': tutorial-vokuro.md
+ 'it-it/unit-testing.md': unit-testing.md
+ 'it-it/upgrade.md': upgrade.md
+ 'it-it/use-case.md': use-case.md
+ 'it-it/views.md': views.md
+ 'it-it/volt.md': volt.md
+ 'it-it/webserver-setup.md': webserver-setup.md
+ 'ja-jp/acl.md': acl.md
+ 'ja-jp/annotations.md': annotations.md
+ 'ja-jp/api/index.md': api/index.md
+ 'ja-jp/api/phalcon_acl.md': api/phalcon_acl.md
+ 'ja-jp/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'ja-jp/api/phalcon_application.md': api/phalcon_application.md
+ 'ja-jp/api/phalcon_assets.md': api/phalcon_assets.md
+ 'ja-jp/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'ja-jp/api/phalcon_cache.md': api/phalcon_cache.md
+ 'ja-jp/api/phalcon_cli.md': api/phalcon_cli.md
+ 'ja-jp/api/phalcon_config.md': api/phalcon_config.md
+ 'ja-jp/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'ja-jp/api/phalcon_db.md': api/phalcon_db.md
+ 'ja-jp/api/phalcon_di.md': api/phalcon_di.md
+ 'ja-jp/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'ja-jp/api/phalcon_domain.md': api/phalcon_domain.md
+ 'ja-jp/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'ja-jp/api/phalcon_events.md': api/phalcon_events.md
+ 'ja-jp/api/phalcon_factory.md': api/phalcon_factory.md
+ 'ja-jp/api/phalcon_filter.md': api/phalcon_filter.md
+ 'ja-jp/api/phalcon_flash.md': api/phalcon_flash.md
+ 'ja-jp/api/phalcon_forms.md': api/phalcon_forms.md
+ 'ja-jp/api/phalcon_html.md': api/phalcon_html.md
+ 'ja-jp/api/phalcon_http.md': api/phalcon_http.md
+ 'ja-jp/api/phalcon_image.md': api/phalcon_image.md
+ 'ja-jp/api/phalcon_logger.md': api/phalcon_logger.md
+ 'ja-jp/api/phalcon_messages.md': api/phalcon_messages.md
+ 'ja-jp/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'ja-jp/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'ja-jp/api/phalcon_session.md': api/phalcon_session.md
+ 'ja-jp/api/phalcon_storage.md': api/phalcon_storage.md
+ 'ja-jp/api/phalcon_support.md': api/phalcon_support.md
+ 'ja-jp/api/phalcon_tag.md': api/phalcon_tag.md
+ 'ja-jp/api/phalcon_translate.md': api/phalcon_translate.md
+ 'ja-jp/application-cli.md': application-cli.md
+ 'ja-jp/application.md': application.md
+ 'ja-jp/application-micro.md': application-micro.md
+ 'ja-jp/assets.md': assets.md
+ 'ja-jp/autoload.md': autoload.md
+ 'ja-jp/cache.md': cache.md
+ 'ja-jp/coding-standard.md': coding-standard.md
+ 'ja-jp/config.md': config.md
+ 'ja-jp/contributions.md': contributions.md
+ 'ja-jp/controllers.md': controllers.md
+ 'ja-jp/datamapper.md': datamapper.md
+ 'ja-jp/db-layer.md': db-layer.md
+ 'ja-jp/db-migrations.md': db-migrations.md
+ 'ja-jp/db-models-behaviors.md': db-models-behaviors.md
+ 'ja-jp/db-models-cache.md': db-models-cache.md
+ 'ja-jp/db-models-events.md': db-models-events.md
+ 'ja-jp/db-models.md': db-models.md
+ 'ja-jp/db-models-metadata.md': db-models-metadata.md
+ 'ja-jp/db-models-relationships.md': db-models-relationships.md
+ 'ja-jp/db-models-transactions.md': db-models-transactions.md
+ 'ja-jp/db-models-validation.md': db-models-validation.md
+ 'ja-jp/db-odm.md': db-odm.md
+ 'ja-jp/db-pagination.md': db-pagination.md
+ 'ja-jp/db-phql.md': db-phql.md
+ 'ja-jp/devtools.md': devtools.md
+ 'ja-jp/di.md': di.md
+ 'ja-jp/dispatcher.md': dispatcher.md
+ 'ja-jp/domain.md': domain.md
+ 'ja-jp/encryption-crypt.md': encryption-crypt.md
+ 'ja-jp/encryption-security-jwt.md': encryption-security-jwt.md
+ 'ja-jp/encryption-security.md': encryption-security.md
+ 'ja-jp/environments-devilbox.md': environments-devilbox.md
+ 'ja-jp/environments-nanobox.md': environments-nanobox.md
+ 'ja-jp/events.md': events.md
+ 'ja-jp/filter-filter.md': filter-filter.md
+ 'ja-jp/filter-validation.md': filter-validation.md
+ 'ja-jp/flash.md': flash.md
+ 'ja-jp/forms.md': forms.md
+ 'ja-jp/generating-backtrace.md': generating-backtrace.md
+ 'ja-jp/html-attributes.md': html-attributes.md
+ 'ja-jp/html-breadcrumbs.md': html-breadcrumbs.md
+ 'ja-jp/html-escaper.md': html-escaper.md
+ 'ja-jp/html-link.md': html-link.md
+ 'ja-jp/html.md': html.md
+ 'ja-jp/html-tagfactory.md': html-tagfactory.md
+ 'ja-jp/http-factories.md': http-factories.md
+ 'ja-jp/http-request.md': http-request.md
+ 'ja-jp/http-response.md': http-response.md
+ 'ja-jp/http-server-request.md': http-server-request.md
+ 'ja-jp/http-stream.md': http-stream.md
+ 'ja-jp/http-uploaded-file.md': http-uploaded-file.md
+ 'ja-jp/http-uri.md': http-uri.md
+ 'ja-jp/i18n.md': i18n.md
+ 'ja-jp/image.md': image.md
+ 'ja-jp/index.md': introduction.md
+ 'ja-jp/installation.md': installation.md
+ 'ja-jp/introduction.md': introduction.md
+ 'ja-jp/logger.md': logger.md
+ 'ja-jp/meta-home.json': meta-home.json
+ 'ja-jp/meta-topics.json': meta-topics.json
+ 'ja-jp/mvc.md': mvc.md
+ 'ja-jp/mvc-url.md': mvc-url.md
+ 'ja-jp/namespaces.md': namespaces.md
+ 'ja-jp/new-feature-request-list.md': new-feature-request-list.md
+ 'ja-jp/new-feature-request.md': new-feature-request.md
+ 'ja-jp/new-pull-request.md': new-pull-request.md
+ 'ja-jp/performance.md': performance.md
+ 'ja-jp/queue.md': queue.md
+ 'ja-jp/reproducible-tests.md': reproducible-tests.md
+ 'ja-jp/request.md': request.md
+ 'ja-jp/response.md': response.md
+ 'ja-jp/routing.md': routing.md
+ 'ja-jp/session.md': session.md
+ 'ja-jp/sponsors.md': sponsors.md
+ 'ja-jp/static-analysis.md': static-analysis.md
+ 'ja-jp/storage.md': storage.md
+ 'ja-jp/support-collection.md': support-collection.md
+ 'ja-jp/support-debug.md': support-debug.md
+ 'ja-jp/support-helper.md': support-helper.md
+ 'ja-jp/support-registry.md': support-registry.md
+ 'ja-jp/support-version.md': support-version.md
+ 'ja-jp/tag.md': tag.md
+ 'ja-jp/testing-environment.md': testing-environment.md
+ 'ja-jp/translate.md': translate.md
+ 'ja-jp/tutorial-basic.md': tutorial-basic.md
+ 'ja-jp/tutorial-invo.md': tutorial-invo.md
+ 'ja-jp/tutorial-rest.md': tutorial-rest.md
+ 'ja-jp/tutorial-vokuro.md': tutorial-vokuro.md
+ 'ja-jp/unit-testing.md': unit-testing.md
+ 'ja-jp/upgrade.md': upgrade.md
+ 'ja-jp/use-case.md': use-case.md
+ 'ja-jp/views.md': views.md
+ 'ja-jp/volt.md': volt.md
+ 'ja-jp/webserver-setup.md': webserver-setup.md
+ 'ko-kr/acl.md': acl.md
+ 'ko-kr/annotations.md': annotations.md
+ 'ko-kr/api/index.md': api/index.md
+ 'ko-kr/api/phalcon_acl.md': api/phalcon_acl.md
+ 'ko-kr/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'ko-kr/api/phalcon_application.md': api/phalcon_application.md
+ 'ko-kr/api/phalcon_assets.md': api/phalcon_assets.md
+ 'ko-kr/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'ko-kr/api/phalcon_cache.md': api/phalcon_cache.md
+ 'ko-kr/api/phalcon_cli.md': api/phalcon_cli.md
+ 'ko-kr/api/phalcon_config.md': api/phalcon_config.md
+ 'ko-kr/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'ko-kr/api/phalcon_db.md': api/phalcon_db.md
+ 'ko-kr/api/phalcon_di.md': api/phalcon_di.md
+ 'ko-kr/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'ko-kr/api/phalcon_domain.md': api/phalcon_domain.md
+ 'ko-kr/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'ko-kr/api/phalcon_events.md': api/phalcon_events.md
+ 'ko-kr/api/phalcon_factory.md': api/phalcon_factory.md
+ 'ko-kr/api/phalcon_filter.md': api/phalcon_filter.md
+ 'ko-kr/api/phalcon_flash.md': api/phalcon_flash.md
+ 'ko-kr/api/phalcon_forms.md': api/phalcon_forms.md
+ 'ko-kr/api/phalcon_html.md': api/phalcon_html.md
+ 'ko-kr/api/phalcon_http.md': api/phalcon_http.md
+ 'ko-kr/api/phalcon_image.md': api/phalcon_image.md
+ 'ko-kr/api/phalcon_logger.md': api/phalcon_logger.md
+ 'ko-kr/api/phalcon_messages.md': api/phalcon_messages.md
+ 'ko-kr/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'ko-kr/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'ko-kr/api/phalcon_session.md': api/phalcon_session.md
+ 'ko-kr/api/phalcon_storage.md': api/phalcon_storage.md
+ 'ko-kr/api/phalcon_support.md': api/phalcon_support.md
+ 'ko-kr/api/phalcon_tag.md': api/phalcon_tag.md
+ 'ko-kr/api/phalcon_translate.md': api/phalcon_translate.md
+ 'ko-kr/application-cli.md': application-cli.md
+ 'ko-kr/application.md': application.md
+ 'ko-kr/application-micro.md': application-micro.md
+ 'ko-kr/assets.md': assets.md
+ 'ko-kr/autoload.md': autoload.md
+ 'ko-kr/cache.md': cache.md
+ 'ko-kr/coding-standard.md': coding-standard.md
+ 'ko-kr/config.md': config.md
+ 'ko-kr/contributions.md': contributions.md
+ 'ko-kr/controllers.md': controllers.md
+ 'ko-kr/datamapper.md': datamapper.md
+ 'ko-kr/db-layer.md': db-layer.md
+ 'ko-kr/db-migrations.md': db-migrations.md
+ 'ko-kr/db-models-behaviors.md': db-models-behaviors.md
+ 'ko-kr/db-models-cache.md': db-models-cache.md
+ 'ko-kr/db-models-events.md': db-models-events.md
+ 'ko-kr/db-models.md': db-models.md
+ 'ko-kr/db-models-metadata.md': db-models-metadata.md
+ 'ko-kr/db-models-relationships.md': db-models-relationships.md
+ 'ko-kr/db-models-transactions.md': db-models-transactions.md
+ 'ko-kr/db-models-validation.md': db-models-validation.md
+ 'ko-kr/db-odm.md': db-odm.md
+ 'ko-kr/db-pagination.md': db-pagination.md
+ 'ko-kr/db-phql.md': db-phql.md
+ 'ko-kr/devtools.md': devtools.md
+ 'ko-kr/di.md': di.md
+ 'ko-kr/dispatcher.md': dispatcher.md
+ 'ko-kr/domain.md': domain.md
+ 'ko-kr/encryption-crypt.md': encryption-crypt.md
+ 'ko-kr/encryption-security-jwt.md': encryption-security-jwt.md
+ 'ko-kr/encryption-security.md': encryption-security.md
+ 'ko-kr/environments-devilbox.md': environments-devilbox.md
+ 'ko-kr/environments-nanobox.md': environments-nanobox.md
+ 'ko-kr/events.md': events.md
+ 'ko-kr/filter-filter.md': filter-filter.md
+ 'ko-kr/filter-validation.md': filter-validation.md
+ 'ko-kr/flash.md': flash.md
+ 'ko-kr/forms.md': forms.md
+ 'ko-kr/generating-backtrace.md': generating-backtrace.md
+ 'ko-kr/html-attributes.md': html-attributes.md
+ 'ko-kr/html-breadcrumbs.md': html-breadcrumbs.md
+ 'ko-kr/html-escaper.md': html-escaper.md
+ 'ko-kr/html-link.md': html-link.md
+ 'ko-kr/html.md': html.md
+ 'ko-kr/html-tagfactory.md': html-tagfactory.md
+ 'ko-kr/http-factories.md': http-factories.md
+ 'ko-kr/http-request.md': http-request.md
+ 'ko-kr/http-response.md': http-response.md
+ 'ko-kr/http-server-request.md': http-server-request.md
+ 'ko-kr/http-stream.md': http-stream.md
+ 'ko-kr/http-uploaded-file.md': http-uploaded-file.md
+ 'ko-kr/http-uri.md': http-uri.md
+ 'ko-kr/i18n.md': i18n.md
+ 'ko-kr/image.md': image.md
+ 'ko-kr/index.md': introduction.md
+ 'ko-kr/installation.md': installation.md
+ 'ko-kr/introduction.md': introduction.md
+ 'ko-kr/logger.md': logger.md
+ 'ko-kr/meta-home.json': meta-home.json
+ 'ko-kr/meta-topics.json': meta-topics.json
+ 'ko-kr/mvc.md': mvc.md
+ 'ko-kr/mvc-url.md': mvc-url.md
+ 'ko-kr/namespaces.md': namespaces.md
+ 'ko-kr/new-feature-request-list.md': new-feature-request-list.md
+ 'ko-kr/new-feature-request.md': new-feature-request.md
+ 'ko-kr/new-pull-request.md': new-pull-request.md
+ 'ko-kr/performance.md': performance.md
+ 'ko-kr/queue.md': queue.md
+ 'ko-kr/reproducible-tests.md': reproducible-tests.md
+ 'ko-kr/request.md': request.md
+ 'ko-kr/response.md': response.md
+ 'ko-kr/routing.md': routing.md
+ 'ko-kr/session.md': session.md
+ 'ko-kr/sponsors.md': sponsors.md
+ 'ko-kr/static-analysis.md': static-analysis.md
+ 'ko-kr/storage.md': storage.md
+ 'ko-kr/support-collection.md': support-collection.md
+ 'ko-kr/support-debug.md': support-debug.md
+ 'ko-kr/support-helper.md': support-helper.md
+ 'ko-kr/support-registry.md': support-registry.md
+ 'ko-kr/support-version.md': support-version.md
+ 'ko-kr/tag.md': tag.md
+ 'ko-kr/testing-environment.md': testing-environment.md
+ 'ko-kr/translate.md': translate.md
+ 'ko-kr/tutorial-basic.md': tutorial-basic.md
+ 'ko-kr/tutorial-invo.md': tutorial-invo.md
+ 'ko-kr/tutorial-rest.md': tutorial-rest.md
+ 'ko-kr/tutorial-vokuro.md': tutorial-vokuro.md
+ 'ko-kr/unit-testing.md': unit-testing.md
+ 'ko-kr/upgrade.md': upgrade.md
+ 'ko-kr/use-case.md': use-case.md
+ 'ko-kr/views.md': views.md
+ 'ko-kr/volt.md': volt.md
+ 'ko-kr/webserver-setup.md': webserver-setup.md
+ 'pl-pl/acl.md': acl.md
+ 'pl-pl/annotations.md': annotations.md
+ 'pl-pl/api/index.md': api/index.md
+ 'pl-pl/api/phalcon_acl.md': api/phalcon_acl.md
+ 'pl-pl/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'pl-pl/api/phalcon_application.md': api/phalcon_application.md
+ 'pl-pl/api/phalcon_assets.md': api/phalcon_assets.md
+ 'pl-pl/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'pl-pl/api/phalcon_cache.md': api/phalcon_cache.md
+ 'pl-pl/api/phalcon_cli.md': api/phalcon_cli.md
+ 'pl-pl/api/phalcon_config.md': api/phalcon_config.md
+ 'pl-pl/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'pl-pl/api/phalcon_db.md': api/phalcon_db.md
+ 'pl-pl/api/phalcon_di.md': api/phalcon_di.md
+ 'pl-pl/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'pl-pl/api/phalcon_domain.md': api/phalcon_domain.md
+ 'pl-pl/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'pl-pl/api/phalcon_events.md': api/phalcon_events.md
+ 'pl-pl/api/phalcon_factory.md': api/phalcon_factory.md
+ 'pl-pl/api/phalcon_filter.md': api/phalcon_filter.md
+ 'pl-pl/api/phalcon_flash.md': api/phalcon_flash.md
+ 'pl-pl/api/phalcon_forms.md': api/phalcon_forms.md
+ 'pl-pl/api/phalcon_html.md': api/phalcon_html.md
+ 'pl-pl/api/phalcon_http.md': api/phalcon_http.md
+ 'pl-pl/api/phalcon_image.md': api/phalcon_image.md
+ 'pl-pl/api/phalcon_logger.md': api/phalcon_logger.md
+ 'pl-pl/api/phalcon_messages.md': api/phalcon_messages.md
+ 'pl-pl/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'pl-pl/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'pl-pl/api/phalcon_session.md': api/phalcon_session.md
+ 'pl-pl/api/phalcon_storage.md': api/phalcon_storage.md
+ 'pl-pl/api/phalcon_support.md': api/phalcon_support.md
+ 'pl-pl/api/phalcon_tag.md': api/phalcon_tag.md
+ 'pl-pl/api/phalcon_translate.md': api/phalcon_translate.md
+ 'pl-pl/application-cli.md': application-cli.md
+ 'pl-pl/application.md': application.md
+ 'pl-pl/application-micro.md': application-micro.md
+ 'pl-pl/assets.md': assets.md
+ 'pl-pl/autoload.md': autoload.md
+ 'pl-pl/cache.md': cache.md
+ 'pl-pl/coding-standard.md': coding-standard.md
+ 'pl-pl/config.md': config.md
+ 'pl-pl/contributions.md': contributions.md
+ 'pl-pl/controllers.md': controllers.md
+ 'pl-pl/datamapper.md': datamapper.md
+ 'pl-pl/db-layer.md': db-layer.md
+ 'pl-pl/db-migrations.md': db-migrations.md
+ 'pl-pl/db-models-behaviors.md': db-models-behaviors.md
+ 'pl-pl/db-models-cache.md': db-models-cache.md
+ 'pl-pl/db-models-events.md': db-models-events.md
+ 'pl-pl/db-models.md': db-models.md
+ 'pl-pl/db-models-metadata.md': db-models-metadata.md
+ 'pl-pl/db-models-relationships.md': db-models-relationships.md
+ 'pl-pl/db-models-transactions.md': db-models-transactions.md
+ 'pl-pl/db-models-validation.md': db-models-validation.md
+ 'pl-pl/db-odm.md': db-odm.md
+ 'pl-pl/db-pagination.md': db-pagination.md
+ 'pl-pl/db-phql.md': db-phql.md
+ 'pl-pl/devtools.md': devtools.md
+ 'pl-pl/di.md': di.md
+ 'pl-pl/dispatcher.md': dispatcher.md
+ 'pl-pl/domain.md': domain.md
+ 'pl-pl/encryption-crypt.md': encryption-crypt.md
+ 'pl-pl/encryption-security-jwt.md': encryption-security-jwt.md
+ 'pl-pl/encryption-security.md': encryption-security.md
+ 'pl-pl/environments-devilbox.md': environments-devilbox.md
+ 'pl-pl/environments-nanobox.md': environments-nanobox.md
+ 'pl-pl/events.md': events.md
+ 'pl-pl/filter-filter.md': filter-filter.md
+ 'pl-pl/filter-validation.md': filter-validation.md
+ 'pl-pl/flash.md': flash.md
+ 'pl-pl/forms.md': forms.md
+ 'pl-pl/generating-backtrace.md': generating-backtrace.md
+ 'pl-pl/html-attributes.md': html-attributes.md
+ 'pl-pl/html-breadcrumbs.md': html-breadcrumbs.md
+ 'pl-pl/html-escaper.md': html-escaper.md
+ 'pl-pl/html-link.md': html-link.md
+ 'pl-pl/html.md': html.md
+ 'pl-pl/html-tagfactory.md': html-tagfactory.md
+ 'pl-pl/http-factories.md': http-factories.md
+ 'pl-pl/http-request.md': http-request.md
+ 'pl-pl/http-response.md': http-response.md
+ 'pl-pl/http-server-request.md': http-server-request.md
+ 'pl-pl/http-stream.md': http-stream.md
+ 'pl-pl/http-uploaded-file.md': http-uploaded-file.md
+ 'pl-pl/http-uri.md': http-uri.md
+ 'pl-pl/i18n.md': i18n.md
+ 'pl-pl/image.md': image.md
+ 'pl-pl/index.md': introduction.md
+ 'pl-pl/installation.md': installation.md
+ 'pl-pl/introduction.md': introduction.md
+ 'pl-pl/logger.md': logger.md
+ 'pl-pl/meta-home.json': meta-home.json
+ 'pl-pl/meta-topics.json': meta-topics.json
+ 'pl-pl/mvc.md': mvc.md
+ 'pl-pl/mvc-url.md': mvc-url.md
+ 'pl-pl/namespaces.md': namespaces.md
+ 'pl-pl/new-feature-request-list.md': new-feature-request-list.md
+ 'pl-pl/new-feature-request.md': new-feature-request.md
+ 'pl-pl/new-pull-request.md': new-pull-request.md
+ 'pl-pl/performance.md': performance.md
+ 'pl-pl/queue.md': queue.md
+ 'pl-pl/reproducible-tests.md': reproducible-tests.md
+ 'pl-pl/request.md': request.md
+ 'pl-pl/response.md': response.md
+ 'pl-pl/routing.md': routing.md
+ 'pl-pl/session.md': session.md
+ 'pl-pl/sponsors.md': sponsors.md
+ 'pl-pl/static-analysis.md': static-analysis.md
+ 'pl-pl/storage.md': storage.md
+ 'pl-pl/support-collection.md': support-collection.md
+ 'pl-pl/support-debug.md': support-debug.md
+ 'pl-pl/support-helper.md': support-helper.md
+ 'pl-pl/support-registry.md': support-registry.md
+ 'pl-pl/support-version.md': support-version.md
+ 'pl-pl/tag.md': tag.md
+ 'pl-pl/testing-environment.md': testing-environment.md
+ 'pl-pl/translate.md': translate.md
+ 'pl-pl/tutorial-basic.md': tutorial-basic.md
+ 'pl-pl/tutorial-invo.md': tutorial-invo.md
+ 'pl-pl/tutorial-rest.md': tutorial-rest.md
+ 'pl-pl/tutorial-vokuro.md': tutorial-vokuro.md
+ 'pl-pl/unit-testing.md': unit-testing.md
+ 'pl-pl/upgrade.md': upgrade.md
+ 'pl-pl/use-case.md': use-case.md
+ 'pl-pl/views.md': views.md
+ 'pl-pl/volt.md': volt.md
+ 'pl-pl/webserver-setup.md': webserver-setup.md
+ 'pt-br/acl.md': acl.md
+ 'pt-br/annotations.md': annotations.md
+ 'pt-br/api/index.md': api/index.md
+ 'pt-br/api/phalcon_acl.md': api/phalcon_acl.md
+ 'pt-br/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'pt-br/api/phalcon_application.md': api/phalcon_application.md
+ 'pt-br/api/phalcon_assets.md': api/phalcon_assets.md
+ 'pt-br/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'pt-br/api/phalcon_cache.md': api/phalcon_cache.md
+ 'pt-br/api/phalcon_cli.md': api/phalcon_cli.md
+ 'pt-br/api/phalcon_config.md': api/phalcon_config.md
+ 'pt-br/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'pt-br/api/phalcon_db.md': api/phalcon_db.md
+ 'pt-br/api/phalcon_di.md': api/phalcon_di.md
+ 'pt-br/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'pt-br/api/phalcon_domain.md': api/phalcon_domain.md
+ 'pt-br/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'pt-br/api/phalcon_events.md': api/phalcon_events.md
+ 'pt-br/api/phalcon_factory.md': api/phalcon_factory.md
+ 'pt-br/api/phalcon_filter.md': api/phalcon_filter.md
+ 'pt-br/api/phalcon_flash.md': api/phalcon_flash.md
+ 'pt-br/api/phalcon_forms.md': api/phalcon_forms.md
+ 'pt-br/api/phalcon_html.md': api/phalcon_html.md
+ 'pt-br/api/phalcon_http.md': api/phalcon_http.md
+ 'pt-br/api/phalcon_image.md': api/phalcon_image.md
+ 'pt-br/api/phalcon_logger.md': api/phalcon_logger.md
+ 'pt-br/api/phalcon_messages.md': api/phalcon_messages.md
+ 'pt-br/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'pt-br/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'pt-br/api/phalcon_session.md': api/phalcon_session.md
+ 'pt-br/api/phalcon_storage.md': api/phalcon_storage.md
+ 'pt-br/api/phalcon_support.md': api/phalcon_support.md
+ 'pt-br/api/phalcon_tag.md': api/phalcon_tag.md
+ 'pt-br/api/phalcon_translate.md': api/phalcon_translate.md
+ 'pt-br/application-cli.md': application-cli.md
+ 'pt-br/application.md': application.md
+ 'pt-br/application-micro.md': application-micro.md
+ 'pt-br/assets.md': assets.md
+ 'pt-br/autoload.md': autoload.md
+ 'pt-br/cache.md': cache.md
+ 'pt-br/coding-standard.md': coding-standard.md
+ 'pt-br/config.md': config.md
+ 'pt-br/contributions.md': contributions.md
+ 'pt-br/controllers.md': controllers.md
+ 'pt-br/datamapper.md': datamapper.md
+ 'pt-br/db-layer.md': db-layer.md
+ 'pt-br/db-migrations.md': db-migrations.md
+ 'pt-br/db-models-behaviors.md': db-models-behaviors.md
+ 'pt-br/db-models-cache.md': db-models-cache.md
+ 'pt-br/db-models-events.md': db-models-events.md
+ 'pt-br/db-models.md': db-models.md
+ 'pt-br/db-models-metadata.md': db-models-metadata.md
+ 'pt-br/db-models-relationships.md': db-models-relationships.md
+ 'pt-br/db-models-transactions.md': db-models-transactions.md
+ 'pt-br/db-models-validation.md': db-models-validation.md
+ 'pt-br/db-odm.md': db-odm.md
+ 'pt-br/db-pagination.md': db-pagination.md
+ 'pt-br/db-phql.md': db-phql.md
+ 'pt-br/devtools.md': devtools.md
+ 'pt-br/di.md': di.md
+ 'pt-br/dispatcher.md': dispatcher.md
+ 'pt-br/domain.md': domain.md
+ 'pt-br/encryption-crypt.md': encryption-crypt.md
+ 'pt-br/encryption-security-jwt.md': encryption-security-jwt.md
+ 'pt-br/encryption-security.md': encryption-security.md
+ 'pt-br/environments-devilbox.md': environments-devilbox.md
+ 'pt-br/environments-nanobox.md': environments-nanobox.md
+ 'pt-br/events.md': events.md
+ 'pt-br/filter-filter.md': filter-filter.md
+ 'pt-br/filter-validation.md': filter-validation.md
+ 'pt-br/flash.md': flash.md
+ 'pt-br/forms.md': forms.md
+ 'pt-br/generating-backtrace.md': generating-backtrace.md
+ 'pt-br/html-attributes.md': html-attributes.md
+ 'pt-br/html-breadcrumbs.md': html-breadcrumbs.md
+ 'pt-br/html-escaper.md': html-escaper.md
+ 'pt-br/html-link.md': html-link.md
+ 'pt-br/html.md': html.md
+ 'pt-br/html-tagfactory.md': html-tagfactory.md
+ 'pt-br/http-factories.md': http-factories.md
+ 'pt-br/http-request.md': http-request.md
+ 'pt-br/http-response.md': http-response.md
+ 'pt-br/http-server-request.md': http-server-request.md
+ 'pt-br/http-stream.md': http-stream.md
+ 'pt-br/http-uploaded-file.md': http-uploaded-file.md
+ 'pt-br/http-uri.md': http-uri.md
+ 'pt-br/i18n.md': i18n.md
+ 'pt-br/image.md': image.md
+ 'pt-br/index.md': introduction.md
+ 'pt-br/installation.md': installation.md
+ 'pt-br/introduction.md': introduction.md
+ 'pt-br/logger.md': logger.md
+ 'pt-br/meta-home.json': meta-home.json
+ 'pt-br/meta-topics.json': meta-topics.json
+ 'pt-br/mvc.md': mvc.md
+ 'pt-br/mvc-url.md': mvc-url.md
+ 'pt-br/namespaces.md': namespaces.md
+ 'pt-br/new-feature-request-list.md': new-feature-request-list.md
+ 'pt-br/new-feature-request.md': new-feature-request.md
+ 'pt-br/new-pull-request.md': new-pull-request.md
+ 'pt-br/performance.md': performance.md
+ 'pt-br/queue.md': queue.md
+ 'pt-br/reproducible-tests.md': reproducible-tests.md
+ 'pt-br/request.md': request.md
+ 'pt-br/response.md': response.md
+ 'pt-br/routing.md': routing.md
+ 'pt-br/session.md': session.md
+ 'pt-br/sponsors.md': sponsors.md
+ 'pt-br/static-analysis.md': static-analysis.md
+ 'pt-br/storage.md': storage.md
+ 'pt-br/support-collection.md': support-collection.md
+ 'pt-br/support-debug.md': support-debug.md
+ 'pt-br/support-helper.md': support-helper.md
+ 'pt-br/support-registry.md': support-registry.md
+ 'pt-br/support-version.md': support-version.md
+ 'pt-br/tag.md': tag.md
+ 'pt-br/testing-environment.md': testing-environment.md
+ 'pt-br/translate.md': translate.md
+ 'pt-br/tutorial-basic.md': tutorial-basic.md
+ 'pt-br/tutorial-invo.md': tutorial-invo.md
+ 'pt-br/tutorial-rest.md': tutorial-rest.md
+ 'pt-br/tutorial-vokuro.md': tutorial-vokuro.md
+ 'pt-br/unit-testing.md': unit-testing.md
+ 'pt-br/upgrade.md': upgrade.md
+ 'pt-br/use-case.md': use-case.md
+ 'pt-br/views.md': views.md
+ 'pt-br/volt.md': volt.md
+ 'pt-br/webserver-setup.md': webserver-setup.md
+ 'ru-ru/acl.md': acl.md
+ 'ru-ru/annotations.md': annotations.md
+ 'ru-ru/api/index.md': api/index.md
+ 'ru-ru/api/phalcon_acl.md': api/phalcon_acl.md
+ 'ru-ru/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'ru-ru/api/phalcon_application.md': api/phalcon_application.md
+ 'ru-ru/api/phalcon_assets.md': api/phalcon_assets.md
+ 'ru-ru/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'ru-ru/api/phalcon_cache.md': api/phalcon_cache.md
+ 'ru-ru/api/phalcon_cli.md': api/phalcon_cli.md
+ 'ru-ru/api/phalcon_config.md': api/phalcon_config.md
+ 'ru-ru/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'ru-ru/api/phalcon_db.md': api/phalcon_db.md
+ 'ru-ru/api/phalcon_di.md': api/phalcon_di.md
+ 'ru-ru/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'ru-ru/api/phalcon_domain.md': api/phalcon_domain.md
+ 'ru-ru/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'ru-ru/api/phalcon_events.md': api/phalcon_events.md
+ 'ru-ru/api/phalcon_factory.md': api/phalcon_factory.md
+ 'ru-ru/api/phalcon_filter.md': api/phalcon_filter.md
+ 'ru-ru/api/phalcon_flash.md': api/phalcon_flash.md
+ 'ru-ru/api/phalcon_forms.md': api/phalcon_forms.md
+ 'ru-ru/api/phalcon_html.md': api/phalcon_html.md
+ 'ru-ru/api/phalcon_http.md': api/phalcon_http.md
+ 'ru-ru/api/phalcon_image.md': api/phalcon_image.md
+ 'ru-ru/api/phalcon_logger.md': api/phalcon_logger.md
+ 'ru-ru/api/phalcon_messages.md': api/phalcon_messages.md
+ 'ru-ru/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'ru-ru/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'ru-ru/api/phalcon_session.md': api/phalcon_session.md
+ 'ru-ru/api/phalcon_storage.md': api/phalcon_storage.md
+ 'ru-ru/api/phalcon_support.md': api/phalcon_support.md
+ 'ru-ru/api/phalcon_tag.md': api/phalcon_tag.md
+ 'ru-ru/api/phalcon_translate.md': api/phalcon_translate.md
+ 'ru-ru/application-cli.md': application-cli.md
+ 'ru-ru/application.md': application.md
+ 'ru-ru/application-micro.md': application-micro.md
+ 'ru-ru/assets.md': assets.md
+ 'ru-ru/autoload.md': autoload.md
+ 'ru-ru/cache.md': cache.md
+ 'ru-ru/coding-standard.md': coding-standard.md
+ 'ru-ru/config.md': config.md
+ 'ru-ru/contributions.md': contributions.md
+ 'ru-ru/controllers.md': controllers.md
+ 'ru-ru/datamapper.md': datamapper.md
+ 'ru-ru/db-layer.md': db-layer.md
+ 'ru-ru/db-migrations.md': db-migrations.md
+ 'ru-ru/db-models-behaviors.md': db-models-behaviors.md
+ 'ru-ru/db-models-cache.md': db-models-cache.md
+ 'ru-ru/db-models-events.md': db-models-events.md
+ 'ru-ru/db-models.md': db-models.md
+ 'ru-ru/db-models-metadata.md': db-models-metadata.md
+ 'ru-ru/db-models-relationships.md': db-models-relationships.md
+ 'ru-ru/db-models-transactions.md': db-models-transactions.md
+ 'ru-ru/db-models-validation.md': db-models-validation.md
+ 'ru-ru/db-odm.md': db-odm.md
+ 'ru-ru/db-pagination.md': db-pagination.md
+ 'ru-ru/db-phql.md': db-phql.md
+ 'ru-ru/devtools.md': devtools.md
+ 'ru-ru/di.md': di.md
+ 'ru-ru/dispatcher.md': dispatcher.md
+ 'ru-ru/domain.md': domain.md
+ 'ru-ru/encryption-crypt.md': encryption-crypt.md
+ 'ru-ru/encryption-security-jwt.md': encryption-security-jwt.md
+ 'ru-ru/encryption-security.md': encryption-security.md
+ 'ru-ru/environments-devilbox.md': environments-devilbox.md
+ 'ru-ru/environments-nanobox.md': environments-nanobox.md
+ 'ru-ru/events.md': events.md
+ 'ru-ru/filter-filter.md': filter-filter.md
+ 'ru-ru/filter-validation.md': filter-validation.md
+ 'ru-ru/flash.md': flash.md
+ 'ru-ru/forms.md': forms.md
+ 'ru-ru/generating-backtrace.md': generating-backtrace.md
+ 'ru-ru/html-attributes.md': html-attributes.md
+ 'ru-ru/html-breadcrumbs.md': html-breadcrumbs.md
+ 'ru-ru/html-escaper.md': html-escaper.md
+ 'ru-ru/html-link.md': html-link.md
+ 'ru-ru/html.md': html.md
+ 'ru-ru/html-tagfactory.md': html-tagfactory.md
+ 'ru-ru/http-factories.md': http-factories.md
+ 'ru-ru/http-request.md': http-request.md
+ 'ru-ru/http-response.md': http-response.md
+ 'ru-ru/http-server-request.md': http-server-request.md
+ 'ru-ru/http-stream.md': http-stream.md
+ 'ru-ru/http-uploaded-file.md': http-uploaded-file.md
+ 'ru-ru/http-uri.md': http-uri.md
+ 'ru-ru/i18n.md': i18n.md
+ 'ru-ru/image.md': image.md
+ 'ru-ru/index.md': introduction.md
+ 'ru-ru/installation.md': installation.md
+ 'ru-ru/introduction.md': introduction.md
+ 'ru-ru/logger.md': logger.md
+ 'ru-ru/meta-home.json': meta-home.json
+ 'ru-ru/meta-topics.json': meta-topics.json
+ 'ru-ru/mvc.md': mvc.md
+ 'ru-ru/mvc-url.md': mvc-url.md
+ 'ru-ru/namespaces.md': namespaces.md
+ 'ru-ru/new-feature-request-list.md': new-feature-request-list.md
+ 'ru-ru/new-feature-request.md': new-feature-request.md
+ 'ru-ru/new-pull-request.md': new-pull-request.md
+ 'ru-ru/performance.md': performance.md
+ 'ru-ru/queue.md': queue.md
+ 'ru-ru/reproducible-tests.md': reproducible-tests.md
+ 'ru-ru/request.md': request.md
+ 'ru-ru/response.md': response.md
+ 'ru-ru/routing.md': routing.md
+ 'ru-ru/session.md': session.md
+ 'ru-ru/sponsors.md': sponsors.md
+ 'ru-ru/static-analysis.md': static-analysis.md
+ 'ru-ru/storage.md': storage.md
+ 'ru-ru/support-collection.md': support-collection.md
+ 'ru-ru/support-debug.md': support-debug.md
+ 'ru-ru/support-helper.md': support-helper.md
+ 'ru-ru/support-registry.md': support-registry.md
+ 'ru-ru/support-version.md': support-version.md
+ 'ru-ru/tag.md': tag.md
+ 'ru-ru/testing-environment.md': testing-environment.md
+ 'ru-ru/translate.md': translate.md
+ 'ru-ru/tutorial-basic.md': tutorial-basic.md
+ 'ru-ru/tutorial-invo.md': tutorial-invo.md
+ 'ru-ru/tutorial-rest.md': tutorial-rest.md
+ 'ru-ru/tutorial-vokuro.md': tutorial-vokuro.md
+ 'ru-ru/unit-testing.md': unit-testing.md
+ 'ru-ru/upgrade.md': upgrade.md
+ 'ru-ru/use-case.md': use-case.md
+ 'ru-ru/views.md': views.md
+ 'ru-ru/volt.md': volt.md
+ 'ru-ru/webserver-setup.md': webserver-setup.md
+ 'tr-tr/acl.md': acl.md
+ 'tr-tr/annotations.md': annotations.md
+ 'tr-tr/api/index.md': api/index.md
+ 'tr-tr/api/phalcon_acl.md': api/phalcon_acl.md
+ 'tr-tr/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'tr-tr/api/phalcon_application.md': api/phalcon_application.md
+ 'tr-tr/api/phalcon_assets.md': api/phalcon_assets.md
+ 'tr-tr/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'tr-tr/api/phalcon_cache.md': api/phalcon_cache.md
+ 'tr-tr/api/phalcon_cli.md': api/phalcon_cli.md
+ 'tr-tr/api/phalcon_config.md': api/phalcon_config.md
+ 'tr-tr/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'tr-tr/api/phalcon_db.md': api/phalcon_db.md
+ 'tr-tr/api/phalcon_di.md': api/phalcon_di.md
+ 'tr-tr/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'tr-tr/api/phalcon_domain.md': api/phalcon_domain.md
+ 'tr-tr/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'tr-tr/api/phalcon_events.md': api/phalcon_events.md
+ 'tr-tr/api/phalcon_factory.md': api/phalcon_factory.md
+ 'tr-tr/api/phalcon_filter.md': api/phalcon_filter.md
+ 'tr-tr/api/phalcon_flash.md': api/phalcon_flash.md
+ 'tr-tr/api/phalcon_forms.md': api/phalcon_forms.md
+ 'tr-tr/api/phalcon_html.md': api/phalcon_html.md
+ 'tr-tr/api/phalcon_http.md': api/phalcon_http.md
+ 'tr-tr/api/phalcon_image.md': api/phalcon_image.md
+ 'tr-tr/api/phalcon_logger.md': api/phalcon_logger.md
+ 'tr-tr/api/phalcon_messages.md': api/phalcon_messages.md
+ 'tr-tr/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'tr-tr/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'tr-tr/api/phalcon_session.md': api/phalcon_session.md
+ 'tr-tr/api/phalcon_storage.md': api/phalcon_storage.md
+ 'tr-tr/api/phalcon_support.md': api/phalcon_support.md
+ 'tr-tr/api/phalcon_tag.md': api/phalcon_tag.md
+ 'tr-tr/api/phalcon_translate.md': api/phalcon_translate.md
+ 'tr-tr/application-cli.md': application-cli.md
+ 'tr-tr/application.md': application.md
+ 'tr-tr/application-micro.md': application-micro.md
+ 'tr-tr/assets.md': assets.md
+ 'tr-tr/autoload.md': autoload.md
+ 'tr-tr/cache.md': cache.md
+ 'tr-tr/coding-standard.md': coding-standard.md
+ 'tr-tr/config.md': config.md
+ 'tr-tr/contributions.md': contributions.md
+ 'tr-tr/controllers.md': controllers.md
+ 'tr-tr/datamapper.md': datamapper.md
+ 'tr-tr/db-layer.md': db-layer.md
+ 'tr-tr/db-migrations.md': db-migrations.md
+ 'tr-tr/db-models-behaviors.md': db-models-behaviors.md
+ 'tr-tr/db-models-cache.md': db-models-cache.md
+ 'tr-tr/db-models-events.md': db-models-events.md
+ 'tr-tr/db-models.md': db-models.md
+ 'tr-tr/db-models-metadata.md': db-models-metadata.md
+ 'tr-tr/db-models-relationships.md': db-models-relationships.md
+ 'tr-tr/db-models-transactions.md': db-models-transactions.md
+ 'tr-tr/db-models-validation.md': db-models-validation.md
+ 'tr-tr/db-odm.md': db-odm.md
+ 'tr-tr/db-pagination.md': db-pagination.md
+ 'tr-tr/db-phql.md': db-phql.md
+ 'tr-tr/devtools.md': devtools.md
+ 'tr-tr/di.md': di.md
+ 'tr-tr/dispatcher.md': dispatcher.md
+ 'tr-tr/domain.md': domain.md
+ 'tr-tr/encryption-crypt.md': encryption-crypt.md
+ 'tr-tr/encryption-security-jwt.md': encryption-security-jwt.md
+ 'tr-tr/encryption-security.md': encryption-security.md
+ 'tr-tr/environments-devilbox.md': environments-devilbox.md
+ 'tr-tr/environments-nanobox.md': environments-nanobox.md
+ 'tr-tr/events.md': events.md
+ 'tr-tr/filter-filter.md': filter-filter.md
+ 'tr-tr/filter-validation.md': filter-validation.md
+ 'tr-tr/flash.md': flash.md
+ 'tr-tr/forms.md': forms.md
+ 'tr-tr/generating-backtrace.md': generating-backtrace.md
+ 'tr-tr/html-attributes.md': html-attributes.md
+ 'tr-tr/html-breadcrumbs.md': html-breadcrumbs.md
+ 'tr-tr/html-escaper.md': html-escaper.md
+ 'tr-tr/html-link.md': html-link.md
+ 'tr-tr/html.md': html.md
+ 'tr-tr/html-tagfactory.md': html-tagfactory.md
+ 'tr-tr/http-factories.md': http-factories.md
+ 'tr-tr/http-request.md': http-request.md
+ 'tr-tr/http-response.md': http-response.md
+ 'tr-tr/http-server-request.md': http-server-request.md
+ 'tr-tr/http-stream.md': http-stream.md
+ 'tr-tr/http-uploaded-file.md': http-uploaded-file.md
+ 'tr-tr/http-uri.md': http-uri.md
+ 'tr-tr/i18n.md': i18n.md
+ 'tr-tr/image.md': image.md
+ 'tr-tr/index.md': introduction.md
+ 'tr-tr/installation.md': installation.md
+ 'tr-tr/introduction.md': introduction.md
+ 'tr-tr/logger.md': logger.md
+ 'tr-tr/meta-home.json': meta-home.json
+ 'tr-tr/meta-topics.json': meta-topics.json
+ 'tr-tr/mvc.md': mvc.md
+ 'tr-tr/mvc-url.md': mvc-url.md
+ 'tr-tr/namespaces.md': namespaces.md
+ 'tr-tr/new-feature-request-list.md': new-feature-request-list.md
+ 'tr-tr/new-feature-request.md': new-feature-request.md
+ 'tr-tr/new-pull-request.md': new-pull-request.md
+ 'tr-tr/performance.md': performance.md
+ 'tr-tr/queue.md': queue.md
+ 'tr-tr/reproducible-tests.md': reproducible-tests.md
+ 'tr-tr/request.md': request.md
+ 'tr-tr/response.md': response.md
+ 'tr-tr/routing.md': routing.md
+ 'tr-tr/session.md': session.md
+ 'tr-tr/sponsors.md': sponsors.md
+ 'tr-tr/static-analysis.md': static-analysis.md
+ 'tr-tr/storage.md': storage.md
+ 'tr-tr/support-collection.md': support-collection.md
+ 'tr-tr/support-debug.md': support-debug.md
+ 'tr-tr/support-helper.md': support-helper.md
+ 'tr-tr/support-registry.md': support-registry.md
+ 'tr-tr/support-version.md': support-version.md
+ 'tr-tr/tag.md': tag.md
+ 'tr-tr/testing-environment.md': testing-environment.md
+ 'tr-tr/translate.md': translate.md
+ 'tr-tr/tutorial-basic.md': tutorial-basic.md
+ 'tr-tr/tutorial-invo.md': tutorial-invo.md
+ 'tr-tr/tutorial-rest.md': tutorial-rest.md
+ 'tr-tr/tutorial-vokuro.md': tutorial-vokuro.md
+ 'tr-tr/unit-testing.md': unit-testing.md
+ 'tr-tr/upgrade.md': upgrade.md
+ 'tr-tr/use-case.md': use-case.md
+ 'tr-tr/views.md': views.md
+ 'tr-tr/volt.md': volt.md
+ 'tr-tr/webserver-setup.md': webserver-setup.md
+ 'uk-ua/acl.md': acl.md
+ 'uk-ua/annotations.md': annotations.md
+ 'uk-ua/api/index.md': api/index.md
+ 'uk-ua/api/phalcon_acl.md': api/phalcon_acl.md
+ 'uk-ua/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'uk-ua/api/phalcon_application.md': api/phalcon_application.md
+ 'uk-ua/api/phalcon_assets.md': api/phalcon_assets.md
+ 'uk-ua/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'uk-ua/api/phalcon_cache.md': api/phalcon_cache.md
+ 'uk-ua/api/phalcon_cli.md': api/phalcon_cli.md
+ 'uk-ua/api/phalcon_config.md': api/phalcon_config.md
+ 'uk-ua/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'uk-ua/api/phalcon_db.md': api/phalcon_db.md
+ 'uk-ua/api/phalcon_di.md': api/phalcon_di.md
+ 'uk-ua/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'uk-ua/api/phalcon_domain.md': api/phalcon_domain.md
+ 'uk-ua/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'uk-ua/api/phalcon_events.md': api/phalcon_events.md
+ 'uk-ua/api/phalcon_factory.md': api/phalcon_factory.md
+ 'uk-ua/api/phalcon_filter.md': api/phalcon_filter.md
+ 'uk-ua/api/phalcon_flash.md': api/phalcon_flash.md
+ 'uk-ua/api/phalcon_forms.md': api/phalcon_forms.md
+ 'uk-ua/api/phalcon_html.md': api/phalcon_html.md
+ 'uk-ua/api/phalcon_http.md': api/phalcon_http.md
+ 'uk-ua/api/phalcon_image.md': api/phalcon_image.md
+ 'uk-ua/api/phalcon_logger.md': api/phalcon_logger.md
+ 'uk-ua/api/phalcon_messages.md': api/phalcon_messages.md
+ 'uk-ua/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'uk-ua/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'uk-ua/api/phalcon_session.md': api/phalcon_session.md
+ 'uk-ua/api/phalcon_storage.md': api/phalcon_storage.md
+ 'uk-ua/api/phalcon_support.md': api/phalcon_support.md
+ 'uk-ua/api/phalcon_tag.md': api/phalcon_tag.md
+ 'uk-ua/api/phalcon_translate.md': api/phalcon_translate.md
+ 'uk-ua/application-cli.md': application-cli.md
+ 'uk-ua/application.md': application.md
+ 'uk-ua/application-micro.md': application-micro.md
+ 'uk-ua/assets.md': assets.md
+ 'uk-ua/autoload.md': autoload.md
+ 'uk-ua/cache.md': cache.md
+ 'uk-ua/coding-standard.md': coding-standard.md
+ 'uk-ua/config.md': config.md
+ 'uk-ua/contributions.md': contributions.md
+ 'uk-ua/controllers.md': controllers.md
+ 'uk-ua/datamapper.md': datamapper.md
+ 'uk-ua/db-layer.md': db-layer.md
+ 'uk-ua/db-migrations.md': db-migrations.md
+ 'uk-ua/db-models-behaviors.md': db-models-behaviors.md
+ 'uk-ua/db-models-cache.md': db-models-cache.md
+ 'uk-ua/db-models-events.md': db-models-events.md
+ 'uk-ua/db-models.md': db-models.md
+ 'uk-ua/db-models-metadata.md': db-models-metadata.md
+ 'uk-ua/db-models-relationships.md': db-models-relationships.md
+ 'uk-ua/db-models-transactions.md': db-models-transactions.md
+ 'uk-ua/db-models-validation.md': db-models-validation.md
+ 'uk-ua/db-odm.md': db-odm.md
+ 'uk-ua/db-pagination.md': db-pagination.md
+ 'uk-ua/db-phql.md': db-phql.md
+ 'uk-ua/devtools.md': devtools.md
+ 'uk-ua/di.md': di.md
+ 'uk-ua/dispatcher.md': dispatcher.md
+ 'uk-ua/domain.md': domain.md
+ 'uk-ua/encryption-crypt.md': encryption-crypt.md
+ 'uk-ua/encryption-security-jwt.md': encryption-security-jwt.md
+ 'uk-ua/encryption-security.md': encryption-security.md
+ 'uk-ua/environments-devilbox.md': environments-devilbox.md
+ 'uk-ua/environments-nanobox.md': environments-nanobox.md
+ 'uk-ua/events.md': events.md
+ 'uk-ua/filter-filter.md': filter-filter.md
+ 'uk-ua/filter-validation.md': filter-validation.md
+ 'uk-ua/flash.md': flash.md
+ 'uk-ua/forms.md': forms.md
+ 'uk-ua/generating-backtrace.md': generating-backtrace.md
+ 'uk-ua/html-attributes.md': html-attributes.md
+ 'uk-ua/html-breadcrumbs.md': html-breadcrumbs.md
+ 'uk-ua/html-escaper.md': html-escaper.md
+ 'uk-ua/html-link.md': html-link.md
+ 'uk-ua/html.md': html.md
+ 'uk-ua/html-tagfactory.md': html-tagfactory.md
+ 'uk-ua/http-factories.md': http-factories.md
+ 'uk-ua/http-request.md': http-request.md
+ 'uk-ua/http-response.md': http-response.md
+ 'uk-ua/http-server-request.md': http-server-request.md
+ 'uk-ua/http-stream.md': http-stream.md
+ 'uk-ua/http-uploaded-file.md': http-uploaded-file.md
+ 'uk-ua/http-uri.md': http-uri.md
+ 'uk-ua/i18n.md': i18n.md
+ 'uk-ua/image.md': image.md
+ 'uk-ua/index.md': introduction.md
+ 'uk-ua/installation.md': installation.md
+ 'uk-ua/introduction.md': introduction.md
+ 'uk-ua/logger.md': logger.md
+ 'uk-ua/meta-home.json': meta-home.json
+ 'uk-ua/meta-topics.json': meta-topics.json
+ 'uk-ua/mvc.md': mvc.md
+ 'uk-ua/mvc-url.md': mvc-url.md
+ 'uk-ua/namespaces.md': namespaces.md
+ 'uk-ua/new-feature-request-list.md': new-feature-request-list.md
+ 'uk-ua/new-feature-request.md': new-feature-request.md
+ 'uk-ua/new-pull-request.md': new-pull-request.md
+ 'uk-ua/performance.md': performance.md
+ 'uk-ua/queue.md': queue.md
+ 'uk-ua/reproducible-tests.md': reproducible-tests.md
+ 'uk-ua/request.md': request.md
+ 'uk-ua/response.md': response.md
+ 'uk-ua/routing.md': routing.md
+ 'uk-ua/session.md': session.md
+ 'uk-ua/sponsors.md': sponsors.md
+ 'uk-ua/static-analysis.md': static-analysis.md
+ 'uk-ua/storage.md': storage.md
+ 'uk-ua/support-collection.md': support-collection.md
+ 'uk-ua/support-debug.md': support-debug.md
+ 'uk-ua/support-helper.md': support-helper.md
+ 'uk-ua/support-registry.md': support-registry.md
+ 'uk-ua/support-version.md': support-version.md
+ 'uk-ua/tag.md': tag.md
+ 'uk-ua/testing-environment.md': testing-environment.md
+ 'uk-ua/translate.md': translate.md
+ 'uk-ua/tutorial-basic.md': tutorial-basic.md
+ 'uk-ua/tutorial-invo.md': tutorial-invo.md
+ 'uk-ua/tutorial-rest.md': tutorial-rest.md
+ 'uk-ua/tutorial-vokuro.md': tutorial-vokuro.md
+ 'uk-ua/unit-testing.md': unit-testing.md
+ 'uk-ua/upgrade.md': upgrade.md
+ 'uk-ua/use-case.md': use-case.md
+ 'uk-ua/views.md': views.md
+ 'uk-ua/volt.md': volt.md
+ 'uk-ua/webserver-setup.md': webserver-setup.md
+ 'zh-cn/acl.md': acl.md
+ 'zh-cn/annotations.md': annotations.md
+ 'zh-cn/api/index.md': api/index.md
+ 'zh-cn/api/phalcon_acl.md': api/phalcon_acl.md
+ 'zh-cn/api/phalcon_annotations.md': api/phalcon_annotations.md
+ 'zh-cn/api/phalcon_application.md': api/phalcon_application.md
+ 'zh-cn/api/phalcon_assets.md': api/phalcon_assets.md
+ 'zh-cn/api/phalcon_autoload.md': api/phalcon_autoload.md
+ 'zh-cn/api/phalcon_cache.md': api/phalcon_cache.md
+ 'zh-cn/api/phalcon_cli.md': api/phalcon_cli.md
+ 'zh-cn/api/phalcon_config.md': api/phalcon_config.md
+ 'zh-cn/api/phalcon_datamapper.md': api/phalcon_datamapper.md
+ 'zh-cn/api/phalcon_db.md': api/phalcon_db.md
+ 'zh-cn/api/phalcon_di.md': api/phalcon_di.md
+ 'zh-cn/api/phalcon_dispatcher.md': api/phalcon_dispatcher.md
+ 'zh-cn/api/phalcon_domain.md': api/phalcon_domain.md
+ 'zh-cn/api/phalcon_encryption.md': api/phalcon_encryption.md
+ 'zh-cn/api/phalcon_events.md': api/phalcon_events.md
+ 'zh-cn/api/phalcon_factory.md': api/phalcon_factory.md
+ 'zh-cn/api/phalcon_filter.md': api/phalcon_filter.md
+ 'zh-cn/api/phalcon_flash.md': api/phalcon_flash.md
+ 'zh-cn/api/phalcon_forms.md': api/phalcon_forms.md
+ 'zh-cn/api/phalcon_html.md': api/phalcon_html.md
+ 'zh-cn/api/phalcon_http.md': api/phalcon_http.md
+ 'zh-cn/api/phalcon_image.md': api/phalcon_image.md
+ 'zh-cn/api/phalcon_logger.md': api/phalcon_logger.md
+ 'zh-cn/api/phalcon_messages.md': api/phalcon_messages.md
+ 'zh-cn/api/phalcon_mvc.md': api/phalcon_mvc.md
+ 'zh-cn/api/phalcon_paginator.md': api/phalcon_paginator.md
+ 'zh-cn/api/phalcon_session.md': api/phalcon_session.md
+ 'zh-cn/api/phalcon_storage.md': api/phalcon_storage.md
+ 'zh-cn/api/phalcon_support.md': api/phalcon_support.md
+ 'zh-cn/api/phalcon_tag.md': api/phalcon_tag.md
+ 'zh-cn/api/phalcon_translate.md': api/phalcon_translate.md
+ 'zh-cn/application-cli.md': application-cli.md
+ 'zh-cn/application.md': application.md
+ 'zh-cn/application-micro.md': application-micro.md
+ 'zh-cn/assets.md': assets.md
+ 'zh-cn/autoload.md': autoload.md
+ 'zh-cn/cache.md': cache.md
+ 'zh-cn/coding-standard.md': coding-standard.md
+ 'zh-cn/config.md': config.md
+ 'zh-cn/contributions.md': contributions.md
+ 'zh-cn/controllers.md': controllers.md
+ 'zh-cn/datamapper.md': datamapper.md
+ 'zh-cn/db-layer.md': db-layer.md
+ 'zh-cn/db-migrations.md': db-migrations.md
+ 'zh-cn/db-models-behaviors.md': db-models-behaviors.md
+ 'zh-cn/db-models-cache.md': db-models-cache.md
+ 'zh-cn/db-models-events.md': db-models-events.md
+ 'zh-cn/db-models.md': db-models.md
+ 'zh-cn/db-models-metadata.md': db-models-metadata.md
+ 'zh-cn/db-models-relationships.md': db-models-relationships.md
+ 'zh-cn/db-models-transactions.md': db-models-transactions.md
+ 'zh-cn/db-models-validation.md': db-models-validation.md
+ 'zh-cn/db-odm.md': db-odm.md
+ 'zh-cn/db-pagination.md': db-pagination.md
+ 'zh-cn/db-phql.md': db-phql.md
+ 'zh-cn/devtools.md': devtools.md
+ 'zh-cn/di.md': di.md
+ 'zh-cn/dispatcher.md': dispatcher.md
+ 'zh-cn/domain.md': domain.md
+ 'zh-cn/encryption-crypt.md': encryption-crypt.md
+ 'zh-cn/encryption-security-jwt.md': encryption-security-jwt.md
+ 'zh-cn/encryption-security.md': encryption-security.md
+ 'zh-cn/environments-devilbox.md': environments-devilbox.md
+ 'zh-cn/environments-nanobox.md': environments-nanobox.md
+ 'zh-cn/events.md': events.md
+ 'zh-cn/filter-filter.md': filter-filter.md
+ 'zh-cn/filter-validation.md': filter-validation.md
+ 'zh-cn/flash.md': flash.md
+ 'zh-cn/forms.md': forms.md
+ 'zh-cn/generating-backtrace.md': generating-backtrace.md
+ 'zh-cn/html-attributes.md': html-attributes.md
+ 'zh-cn/html-breadcrumbs.md': html-breadcrumbs.md
+ 'zh-cn/html-escaper.md': html-escaper.md
+ 'zh-cn/html-link.md': html-link.md
+ 'zh-cn/html.md': html.md
+ 'zh-cn/html-tagfactory.md': html-tagfactory.md
+ 'zh-cn/http-factories.md': http-factories.md
+ 'zh-cn/http-request.md': http-request.md
+ 'zh-cn/http-response.md': http-response.md
+ 'zh-cn/http-server-request.md': http-server-request.md
+ 'zh-cn/http-stream.md': http-stream.md
+ 'zh-cn/http-uploaded-file.md': http-uploaded-file.md
+ 'zh-cn/http-uri.md': http-uri.md
+ 'zh-cn/i18n.md': i18n.md
+ 'zh-cn/image.md': image.md
+ 'zh-cn/index.md': introduction.md
+ 'zh-cn/installation.md': installation.md
+ 'zh-cn/introduction.md': introduction.md
+ 'zh-cn/logger.md': logger.md
+ 'zh-cn/meta-home.json': meta-home.json
+ 'zh-cn/meta-topics.json': meta-topics.json
+ 'zh-cn/mvc.md': mvc.md
+ 'zh-cn/mvc-url.md': mvc-url.md
+ 'zh-cn/namespaces.md': namespaces.md
+ 'zh-cn/new-feature-request-list.md': new-feature-request-list.md
+ 'zh-cn/new-feature-request.md': new-feature-request.md
+ 'zh-cn/new-pull-request.md': new-pull-request.md
+ 'zh-cn/performance.md': performance.md
+ 'zh-cn/queue.md': queue.md
+ 'zh-cn/reproducible-tests.md': reproducible-tests.md
+ 'zh-cn/request.md': request.md
+ 'zh-cn/response.md': response.md
+ 'zh-cn/routing.md': routing.md
+ 'zh-cn/session.md': session.md
+ 'zh-cn/sponsors.md': sponsors.md
+ 'zh-cn/static-analysis.md': static-analysis.md
+ 'zh-cn/storage.md': storage.md
+ 'zh-cn/support-collection.md': support-collection.md
+ 'zh-cn/support-debug.md': support-debug.md
+ 'zh-cn/support-helper.md': support-helper.md
+ 'zh-cn/support-registry.md': support-registry.md
+ 'zh-cn/support-version.md': support-version.md
+ 'zh-cn/tag.md': tag.md
+ 'zh-cn/testing-environment.md': testing-environment.md
+ 'zh-cn/translate.md': translate.md
+ 'zh-cn/tutorial-basic.md': tutorial-basic.md
+ 'zh-cn/tutorial-invo.md': tutorial-invo.md
+ 'zh-cn/tutorial-rest.md': tutorial-rest.md
+ 'zh-cn/tutorial-vokuro.md': tutorial-vokuro.md
+ 'zh-cn/unit-testing.md': unit-testing.md
+ 'zh-cn/upgrade.md': upgrade.md
+ 'zh-cn/use-case.md': use-case.md
+ 'zh-cn/views.md': views.md
+ 'zh-cn/volt.md': volt.md
+ 'zh-cn/webserver-setup.md': webserver-setup.md
# Hooks
#hooks:
From b22bd1e95ba6011461b2851b6b2991c29b0888a2 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Tue, 26 Dec 2023 08:57:17 -0600
Subject: [PATCH 044/191] reformatting testing-environment
---
docs/testing-environment.md | 279 ++++++++++--------------------------
1 file changed, 79 insertions(+), 200 deletions(-)
diff --git a/docs/testing-environment.md b/docs/testing-environment.md
index 3f00eca1e..2a0e9c38a 100644
--- a/docs/testing-environment.md
+++ b/docs/testing-environment.md
@@ -2,50 +2,58 @@
- - -
# Overview
-Phalcon has always had a small development community and not that many pull requests, offering bug fixes and enhancements, compared to other PHP frameworks. This was primarily due to the fact that most developers do not really know C. To help developers contribute, we have created a new language called [Zephir][zephir], which has a very similar syntax to PHP or Javascript. In [2003][2003], we announced this plan and a few months later we released the language and rewrote all the Phalcon code in Zephir. We have been using Zephir ever since for developing Phalcon.
+Phalcon, historically characterized by a modest development community and limited pull requests, faced challenges due to developers' unfamiliarity with C, the language in which the framework was originally written. To encourage contributions, we introduced [Zephir][zephir], a language closely resembling PHP and Javascript syntax. In [2003][2003], we unveiled this initiative, subsequently releasing the language and transitioning all Phalcon code to Zephir. Since then, Zephir has been integral to Phalcon's development.
-# The Problem
-Having a framework that is rich in features requires a development environment that will offer all those features and related services. For instance one needs to install `MySQL`, `Postgresql` and `Sqlite` to be able to check whether functionality in the ORM will be the same when using any of these adapters for your database needs. Additionally, the relevant extensions for PHP have to be installed in the development system.
+# The Challenge
+Building a feature-rich framework necessitates a comprehensive development environment supporting various features and associated services. For example, validating ORM functionality across different database adapters (e.g., `MySQL`, `Postgresql`, `Sqlite`) requires installations of relevant PHP extensions and databases. Similarly, to execute the testing suite for Phalcon's extensive functionality, developers must install numerous extensions and services such as Redis and Memcached.
-When looking at all the functionality that Phalcon offers, just to run the testing suite, one needs a great number of extensions as well as services installed (Redis, Memcached etc.)
-
-If one considers the PHP version also (PHP 7.4, 8.0 etc.), developing for Phalcon is not an easy task, because of all these prerequisites.
+Considering the diverse PHP versions (e.g., PHP 8.0, 8.1), Phalcon's development becomes intricate due to these prerequisites.
# Solution
-We had a good solution with `nanobox` in the past but since that project has been discontinued, we redoubled our efforts and used docker for our needs. With a few commands, developers can be contributing to phalcon as well as running the tests in no time.
+Formerly relying on `nanobox," a solution now discontinued, we intensified our efforts, adopting Docker to streamline development requirements. With just a few commands, developers can seamlessly contribute to Phalcon and execute tests promptly.
+
+This Docker-based approach simplifies the setup, ensuring a more accessible and efficient development process for Phalcon.
+
# Installation
-You will first need to have `docker` installed on your machine. Instructions on how to do that, can be found [here][docker_installation]. Additionally, we will need `docker compose`. Installation instructions can be found [here][docker_compose]
+Before you begin, ensure that docker is installed on your machine. If you haven't installed it yet, follow the instructions [here][docker_installation]. Additionally, you'll need docker compose—installation details can be found [here][docker_compose].
-# Running the Environment
-## Fork the Repository
-Fork the [cphalcon][cphalcon] to your GitHub account, if you have not done so already. Visit the [cphalcon][cphalcon] page on your browser and click the `Fork` button at the top right of the screen.
+# Running the Development Environment
+1. Fork the Repository
+ Start by forking the [cphalcon][cphalcon] repository to your GitHub account. If you haven't done this already, navigate to the [cphalcon][cphalcon] page in your browser and click the Fork button located at the top right of the screen.
-## Clone the Fork
-Now you will need to clone the forked repository to a folder of your choice. The example below assumes that the GitHub account is `niden` - change it to your own.
+2. Clone the Fork
+ Clone the forked repository to a directory of your choice. The example below assumes the GitHub account is `niden`; replace it with your own account.
```bash
git clone git@github.com:niden/cphalcon
```
-## Build the environment
-Once you are in `cphalcon` folder (or wherever you cloned the repository), you will need to build the containers
+3. Build the Environment
+ Navigate to the cphalcon folder (or your chosen repository location) and build the containers with the following command:
```bash
docker compose build
```
-This will be a lengthy process, depending on the specifications of your machine. This process is not run frequently, only when there are changes in the dockerfiles.
+This process may take some time, depending on your machine's specifications. It is not required frequently, only when changes occur in the dockerfiles or when you choose to rebuild your containers.
-## Start the environment
-Once all the containers have been built, you will need to start it. You can start it with the containers exposing ports to your host or without.
+# Starting the Environment
+Once all the containers have been built, initiate the environment using the following command:
```bash
docker compose up -d
```
-The above command uses the `docker-compose.yml` file from the repository. The `-d` command runs the environment in the background, and you can reuse your terminal. Without this option, you will have to use `Ctrl-C` to stop it.
-With the above command, the services containers will bind their respective ports to your host.
+The above command, utilizing the `docker-compose.yml` file from the repository, runs the environment in the background, allowing you to reuse your terminal. To stop the environment, press `Ctrl-C` if the `-d` flag was not used. If `-d` was used, inform Docker that you wish to halt the environment:
+
+```bash
+docker compose down
+```
+
+# Environment Configuration
+## Exposed Ports
+With the above command, service containers expose ports to your host as detailed in the table below:
| Service | Port |
|------------|------|
@@ -53,101 +61,56 @@ With the above command, the services containers will bind their respective ports
| `postgres` | 5432 |
| `redis` | 6379 |
-You can then connect to your environment from your host directly. For example to connect to the `mysql` database, you will just need `localhost` as your host, since the 3306 port is bound.
-
-This configuration is very handy and works well for most developers. However, there are developers that work on many projects at the same time, and those projects use the same services (i.e. mysql). Using this configuration will not allow a second environment to work, that uses `mysql` in the same manner, because the `mysql` port on the host is already in use.
+This setup is convenient for most developers. However, for those concurrently working on multiple projects using the same services (e.g., `mysql`), this configuration may hinder a second environment's functionality, as the port on the host is already in use.
-You can therefore, use the `docker-compose-local.yml` file, which does not expose ports from the services containers to the host, keeping everything isolated.
+## Isolated Configuration
+Alternatively, use the `docker-compose-local.yml` file, which does not expose ports from service containers to the host, ensuring isolation:
```bash
docker compose -f docker-compose-local.yml up -d
```
-If you use the above command to start your environment, you will need to know the IP address of a service container that you need to connect to. If, for instance, you need to connect to the `mysql` container, using `localhost` as your host will not work. You will need to find the correct IP address:
-```bash
-docker inspect cphalcon-mysql
-```
-
-`cphalcon-mysql` is the name for the `mysql` service. You can check the `docker-compose-local.yml` file if you are interested in finding the names of the containers. The above command will produce:
+In this case, you'll need to determine the IP address of a specific service container to connect to it. For example, to connect to the mysql container:
```bash
-[
- {
- "Id": "121513ec37c31bcb717526b5f792e373534a9d7187db5d919d30e8c89a7cc897",
- "Created": "2022-09-01T16:05:38.440859071Z",
- "Path": "docker-entrypoint.sh",
- "Args": [
- "mysqld"
- ],
-//........
- "NetworkSettings": {
- "Networks": {
- "cphalcon_default": {
- "IPAMConfig": null,
- "Links": null,
- "Aliases": [
- "mysql",
- "121513ec37c3"
- ],
- "NetworkID": "3be8b1ff3f87e11bd60c568d3a5ca04d0cd6b07779bcbe585eaac12f60bf26c9",
- "EndpointID": "d0940c441edf26b573e2f42f7f659666c4c1535394843bc0e115ddbac947420b",
- "Gateway": "172.18.0.1",
- "IPAddress": "172.18.0.4",
- "IPPrefixLen": 16,
- "IPv6Gateway": "",
- "GlobalIPv6Address": "",
- "GlobalIPv6PrefixLen": 0,
- "MacAddress": "02:42:ac:12:00:04",
- "DriverOpts": null
- }
- }
- }
- }
-]
-```
-Then you can connect to the container using the `IPAddress`
-
-```bash
-mysql -uroot -p -h172.18.0.4
+docker inspect \
+ -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
+ cphalcon-mysql
```
-## Stop the environment
-To stop the environment you can press `Ctrl-C` if you have not used the `-d` flag. If you have, you will need to tell docker that you no longer wish the environment to be up:
+Identify the correct IP address and connect accordingly:
```bash
-docker compose down
+mysql -uroot -p -h172.18.0.4
```
-## Enter the Environment
-To enter the environment, we will need to tell docker, which one we need. There are three environments built for us:
-
-- `cphalcon-8.0`
-- `cphalcon-8.1`
-- `cphalcon-8.2`
+## Entering the Environment
+To enter the environment, specify the desired PHP version environment. Three environments are available:
-Each of those represents the PHP version that they have installed.
+`cphalcon-8.0`
+`cphalcon-8.1`
+`cphalcon-8.2`
-To enter the PHP 8.1 environment, we need:
+For example, to enter the PHP 8.1 environment:
```bash
docker exec -it cphalcon-8.1 /bin/bash
```
-The following prompt will appear:
+
+You'll be prompted with:
```bash
-root@cphalcon-81:/srv#
+root@cphalcon-81:/srv#
```
-You are now inside the environment with all the extensions and services you need.
-
-To exit the environment, all you need is to type `exit` and press the enter key.
+You are now inside the environment with all the necessary extensions and services. To exit, type `exit` and press Enter:
```bash
-root@cphalcon-81:/srv# exit
+root@cphalcon-81:/srv# exit
```
## Aliases
-The environments come with predefined aliases for your terminal. You can find them all in the `.bashrc` file under the `docker/` folder and relevant PHP version subfolder. Some of these are:
+The development environments include predefined aliases in the `.bashrc` file located under the `docker/` folder and the corresponding PHP version subfolder. Some notable aliases include:
| Alias | Command |
|--------------------|---------------------------------------------------------------|
@@ -161,19 +124,17 @@ The environments come with predefined aliases for your terminal. You can find th
| `zs` | ./zephir stubs |
| `cpl` | zf && zg && cd ext/ && ./install && .. |
| `codecept` | php -d extension=ext/modules/phalcon.so ./vendor/bin/codecept |
-| `phpcs` | php -d extension=ext/modules/phalcon.so ./vendor/bin/phpcs |
-| `phpcbf` | php -d extension=ext/modules/phalcon.so ./vendor/bin/phpcbf |
-| `psalm` | php ./vendor/bin/psalm |
## Composer
-Just in case update composer:
+Before proceeding, update Composer:
```bash
root@cphalcon-81:/srv# composer install
```
### Composer commands
-Composer has been set so that you can run tests with ease. You can use these commands as follows
+
+Composer is configured to facilitate testing. Execute the commands as follows:
```bash
composer
@@ -186,10 +147,10 @@ Example:
composer cs
```
-
| Command | Description |
|--------------------|--------------------------------|
-| `cs` | Run CodeSniffer (`phpcs` |
+| `analyze` | Run Psalm (`psalm`) |
+| `cs` | Run CodeSniffer (`phpcs`) |
| `cs-fix` | Run CodeSniffer fix (`phpcbf`) |
| `test-unit` | Run unit tests |
| `test-cli` | Run cli tests |
@@ -202,93 +163,31 @@ composer cs
| `test-all` | Run all tests |
## Check Zephir
-Zephir is already installed in the environment. Just check it:
-
-```bash
-root@cphalcon-81:/srv# zephir
-```
-A screen like the one below should appear (output formatted for reading):
+`Zephir` is installed by `composer`. Ensure that the latest version is installed by executing:
```bash
- _____ __ _
-/__ / ___ ____ / /_ (_)____
- / / / _ \/ __ \/ __ \/ / ___/
- / /__/ __/ /_/ / / / / / /
-/____/\___/ .___/_/ /_/_/_/
- /_/
-
-Zephir 0.17.0 by the Phalcon Team
-Thanks to the work by: Andres Gutierrez and Serghei Iakovlev
-
-Usage:
- command [options] [arguments]
-
-Options:
- --dumpversion Print the version of the compiler and don't
- do anything else (also works with a single hyphen)
- -h, --help Print this help message
- --no-ansi Disable ANSI output
- -v, --verbose Displays more detail in error messages from
- exceptions generated by commands (can also disable with -V)
- --vernum Print the version of the compiler as integer
- --version Print compiler version information and quit
-
-Available commands:
- api Generates a HTML API based on the classes exposed in the extension
- build Generates/Compiles/Installs a Zephir extension
- clean Cleans any object files created by the extension
- compile Compile a Zephir extension
- fullclean Cleans any object files created by the extension
- (including files generated by phpize)
- generate Generates C code from the Zephir code without compiling it
- help Display help for a command
- init Initializes a Zephir extension
- install Installs the extension in the extension directory
- (may require root password)
- stubs Generates stubs that can be used in a PHP IDE
+root@cphalcon-81:/srv# zephir
```
+The output should resemble the formatted screen provided in the documentation.
## Compile Phalcon
-Phalcon is not compiled yet. We need to instruct Zephir to do that:
+Compile Phalcon using Zephir:
```bash
root@cphalcon-81:/srv# cpl
```
## Check Extensions
-Type
+Verify that extensions are correctly installed by typing:
```bash
root@cphalcon-81:/srv# php -m
```
-and you will see:
+Check for phalcon in the list of installed modules.
-```bash
-[PHP Modules]
-apcu
-Core
-ctype
-....
-PDO
-pdo_mysql
-pdo_pgsql
-pdo_sqlite
-phalcon
-Phar
-psr
-redis
-...
-
-[Zend Modules]
-Xdebug
-```
-
-Once you see `phalcon` in the list, you have the extension compiled and ready to use.
-
-## Setup databases
-
-First, we need to have a `.env` file in the project root.
+## Setup Databases
+Create a `.env` file in the project root:
```bash
root@cphalcon-81:/srv# cp tests/_config/.env.docker .env
@@ -296,80 +195,62 @@ root@cphalcon-81:/srv# cp tests/_config/.env.docker .env
# Running Tests
## Unit
-Now that the environment is set up, we need to run the tests. The testing framework Phalcon uses is [Codeception][codeception]. For a basic introduction you can check [this][codeception_introduction] page. Also, for the list of the commands, you can check [here][codeception_commands].
-
-We need to first build the Codeception base classes. This needs to happen every time new functionality is introduced in Codeception's helpers.
+Build the Codeception base classes before running unit tests:
-Now you can run:
```bash
root@cphalcon-81:/srv# codecept build
```
-The output should show:
-```bash
-Building Actor classes for suites: cli, database, integration, unit
- -> CliTesterActions.php generated successfully. 152 methods added
-\CliTester includes modules: Asserts, Cli, \Helper\Cli, \Helper\Unit
- -> DatabaseTesterActions.php generated successfully. 252 methods added
-\DatabaseTester includes modules: Phalcon4, Redis, Asserts, Filesystem, Helper\Database, Helper\Unit
- -> IntegrationTesterActions.php generated successfully. 251 methods added
-\IntegrationTester includes modules: Phalcon4, Redis, Asserts, Filesystem, Helper\Integration, Helper\PhalconLibmemcached, Helper\Unit
- -> UnitTesterActions.php generated successfully. 166 methods added
-\UnitTester includes modules: Apc, Asserts, Filesystem, Helper\Unit
-```
-Now we can run the tests:
+Run unit tests:
```bash
root@cphalcon-81:/srv# test-unit
```
-
-This will start running the unit testing suite. You will see a lot of tests and assertions. At the time of this article, we have `Tests: 2780, Assertions: 8965, Skipped: 34` unit tests. The reason for so many skipped tests is that we created test stubs for every component and every method in each component. This was to create awareness on what needs to be checked and what components/methods we need to write tests for. Of course some test stubs are duplicate or obsolete. Those will be deleted once the relevant component is checked and tests written for it. Our goal is to get as close to 100% code coverage as possible. If we manage to get to 100% that would be great!
-
-Execute all tests from a folder:
+Execute tests from a specific folder:
```bash
root@cphalcon-81:/srv# codecept run tests/unit/some/folder/
```
-
-Execute single test:
+Execute a single test:
```bash
root@cphalcon-81:/srv# codecept run tests/unit/some/folder/some/test/file.php
```
## Database
-To run database related tests you can use the relevant aliases:
+Run database-related tests using aliases:
```bash
root@cphalcon-81:/srv# test-db-common
-root@cphalcon-81:/srv# test-db-mysql
-root@cphalcon-81:/srv# test-db-pgsql
+root@cphalcon-81:/srv# test-db-mysql
+root@cphalcon-81:/srv# test-db-pgsql
root@cphalcon-81:/srv# test-db-sqlite
root@cphalcon-81:/srv# test-db
```
# Development
-You can now open your favorite editor and start developing in Zephir. You can create new functionality, fix issues, write tests etc. Remember though that if you change any of the `zep` files (inside the `phalcon` folder), you will need to recompile the extension:
+Open your preferred editor and start developing in Zephir. For any changes to `.zep` files (inside the `phalcon` folder), recompile the extension:
```bash
root@cphalcon-81:/srv# cpl
```
-and then you can run your tests
+Run tests after making changes:
```bash
root@cphalcon-81:/srv# codecept run tests/unit/somefolder/somecestfile:sometest
```
-
-For Zephir documentation, you can visit the [Zephir Docs][zephir_docs] site.
+For Zephir documentation, refer to the [Zephir Docs][zephir_docs] site.
# Services
The available services are:
+
- Memcached
-- Mysql
-- Postgresql
+- MySQL
+- PostgreSQL
- Redis
-The PHP extensions enabled are:
+Enabled PHP extensions include:
+
- apcu
- ctype
- curl
@@ -405,14 +286,12 @@ The PHP extensions enabled are:
- zip
- zlib
-The database dumps are located under `tests/_data/assets/schemas`
-
-If you have any questions, feel free to join us in our [Discord][discord] server or our [Discussions][discussions].
+Database dumps are located under `tests/_data/assets/schemas`
+For questions, join the [Discord][discord] server or our [Discussions][discussions].
<3 Phalcon Team
-
[2003]: https://blog.phalcon.io/post/phalcon-2-0-the-future
[cphalcon]: https://github.com/phalcon/cphalcon
[codeception]: https://codeception.com
From 0fabc103e8c72594c9c1d9481f87ebbae39c10fe Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Tue, 26 Dec 2023 11:02:37 -0600
Subject: [PATCH 045/191] rewriting acl
---
docs/acl.md | 251 ++++++++++++++++++++--------------------------------
1 file changed, 97 insertions(+), 154 deletions(-)
diff --git a/docs/acl.md b/docs/acl.md
index 1d5991199..26ad19857 100644
--- a/docs/acl.md
+++ b/docs/acl.md
@@ -2,9 +2,9 @@
- - -
## Overview
-[Phalcon\Acl][acl-acl] provides an easy and lightweight management of ACLs as well as the permissions attached to them. [Access Control Lists][acl] (ACL) allow an application to control access to its areas and the underlying objects from requests.
+The [Phalcon\Acl][acl-acl] component offers a lightweight and straightforward method for managing Access Control Lists (ACLs) and associated permissions. ACLs play a crucial role in regulating access to areas and underlying objects within an application.
-In short, ACLs have two objects: The object that needs access, and the object that we need access to. In the programming world, these are usually referred to as Roles and Resources. In the Phalcon world, we use the terminology [Role][acl-role] and [Component][acl-component].
+In the context of programming, ACLs typically involve two key entities: the object seeking access (Role) and the object being accessed (Component or Resource). In Phalcon, these are referred to as [Roles][acl-role] and [Components][acl-component]. In a practical scenario, [Roles][acl-role] define the groups of users, and [Components][acl-component] represent areas of the application.
!!! info "Use Case"
@@ -22,14 +22,14 @@ In short, ACLs have two objects: The object that needs access, and the object th
- Invoices page
- Reports page
-As seen above in the use case, a [Role][acl-role] is defined as who needs to access a particular [Component][acl-component] i.e. an area of the application. A [Component][acl-component] is defined as the area of the application that needs to be accessed.
-Using the [Phalcon\Acl][acl-acl] component, we can tie those two together, and strengthen the security of our application, allowing only specific roles to be bound to specific components.
+In this example, a [Role][acl-role] indicates who needs access to a specific [Component][acl-component]. A [Component][acl-component] represents an area of the application.
+Using the [Phalcon\Acl][acl-acl] component, you can establish associations between these [Roles][acl-role] and [Components][acl-component], enhancing the application's security by allowing only specific roles to access designated components.
## Activation
-[Phalcon\Acl][acl-acl] uses adapters to store and work with roles and components. The only adapter available right now is [Phalcon\Acl\Adapter\Memory][acl-adapter-memory]. Having the adapter use the memory, significantly increases the speed that the ACL is accessed but also comes with drawbacks. The main drawback is that memory is not persistent, so the developer will need to implement a storing strategy for the ACL data, so that the ACL is not generated at every request. This could easily lead to delays and unnecessary processing, especially if the ACL is quite big and/or stored in a database or file system.
+[Phalcon\Acl][acl-acl] relies on adapters to manage roles and components. Presently, the only available adapter is [Phalcon\Acl\Adapter\Memory][acl-adapter-memory]. While using the memory adapter significantly enhances ACL access speed, it comes with the trade-off of non-persistent memory. Therefore, developers need to implement a storage strategy for ACL data to avoid regenerating the ACL at every request. This is particularly crucial for large ACLs stored in a database or file system.
-The [Phalcon\Acl][acl-acl] constructor takes as its first parameter an adapter used to retrieve the information related to the control list.
+The [Phalcon\Acl][acl-acl] constructor takes an adapter as its first parameter for retrieving information related to the control list.
```php
setDefaultAction(Enum::ALLOW);
```
## Constants
-The [Phalcon\Acl\Enum][acl-enum] class offers two constants that can be used when defining access levels.
+The [Phalcon\Acl\Enum][acl-enum] class provides two constants for defining access levels:
- `Phalcon\Acl\Enum::ALLOW` (`1`)
- `Phalcon\Acl\Enum::DENY` (`0` - default)
-You can use these constants to define access levels for your ACL.
+These constants help specify access levels within your ACL.
## Adding Roles
-As mentioned above, a [Phalcon\Acl\Role][acl-role] is an object that can or cannot access a set of [Component][acl-component] in the access list.
+[Phalcon\Acl\Roles][acl-role] represent objects that can or cannot access a set of [Components][acl-component] in the ACL. There are two methods for adding roles:
-There are two ways of adding roles to our list.
-* by using a [Phalcon\Acl\Role][acl-role] object or
-* using a string, representing the name of the role
+* Using a [Phalcon\Acl\Role][acl-role] object
+* Using a string, representing the role name
-To see this in action, using the example outlined above, we will add the relevant [Phalcon\Acl\Role][acl-role] objects in our list.
+In the example below, roles related to the outlined use case are added to the ACL:
-Role objects. The first parameter is the name of the role, the second the description
+Using [Phalcon\Acl\Role][acl-role] objects:
```php
addRole($roleAdmins);
$acl->addRole($roleAccounting);
```
-Strings. Add the role with just the name directly to the ACL:
+Using strings:
```php
addRole('guest');
```
## Adding Components
-A [Component][acl-component] is the area of the application where access is controlled. In an MVC application, this would be a Controller. Although not mandatory, the [Phalcon\Acl\Component][acl-component] class can be used to define components in the application. Also, it is important to add related actions to a component so that the ACL can understand what it should control.
+A [Component][acl-component] in the context of Phalcon\Acl represents an area of the application where access is controlled. In an MVC application, this typically corresponds to a Controller. Although it's not mandatory, you can use the [Phalcon\Acl\Component][acl-component] class to define components in the application. It's also important to add related actions to a component so that the ACL understands what it should control.
+
+There are two ways to add components to our list:
-There are two ways of adding components to our list.
-* by using a [Phalcon\Acl\Component][acl-component] object or
-* using a string, representing the name of the role
+* By using a [Phalcon\Acl\Component][acl-component] object.
+* Using a string, representing the name of the component.
-Similar to the `addRole`, `addComponent` requires a name for the component and an optional description.
+Similar to the `addRole` method, the addComponent method requires a name for the component and an optional description.
-Component objects. The first parameter is the name of the component, the second the description
+### Component objects:
```php
addComponent(
);
```
-Strings. Add the component with just the name directly to the ACL:
+### Strings:
```php
addComponent(
```
## Defining Access Controls
-After both the `Roles` and `Components` have been defined, we need to tie them together so that the access list can be created. This is the most important step in the role since a small mistake here can allow access to roles for components that the developer does not intend to. As mentioned earlier, the default access action for [Phalcon\Acl][acl-acl] is `Phalcon\Acl\Enum::DENY`, following the [white list][whitelist] approach.
+After defining both the `Roles` and `Components`, the next step is to tie them together to create the access list. This is a critical step, as a small mistake here can inadvertently allow access to roles for components that the developer did not intend to. As mentioned earlier, the default access action for [Phalcon\Acl][acl-acl] is `Phalcon\Acl\Enum::DENY`, following the [white list][whitelist] approach.
+
+To associate Roles and Components, you use the allow() and deny() methods provided by the [Phalcon\Acl\Memory][acl-adapter-memory] class.
-To tie `Roles` and `Components` together we use the `allow()` and `deny()` methods exposed by the [Phalcon\Acl\Memory][acl-adapter-memory] class.
+### Example:
```php
addRole('manager');
$acl->addRole('accounting');
$acl->addRole('guest');
-
$acl->addComponent(
'admin',
[
@@ -214,56 +216,29 @@ $acl->allow('accounting', 'reports', '*');
$acl->allow('*', 'session', '*');
```
-What the above lines tell us:
+In the above example:
-```php
-$acl->allow('manager', 'admin', 'users');
-```
-
-For the `manager` role, allow access to the `admin` component and `users` action. To bring this into perspective with an MVC application, the above line says that the group `manager` is allowed to access the `admin` controller and `users` action.
+* `$acl->allow('manager', 'admin', 'dashboard');`: For the `manager` role, allow access to the `admin` component and `dashboard` action. In MVC terms, this allows the `manager` role to access the `admin` controller and `dashboard` action.
+* `$acl->allow('manager', 'reports', ['list', 'add']);`: You can pass an array as the `action` parameter when invoking the `allow()` method. This line means that for the `manager` role, allow access to the `reports` component and `list` and `add` actions. In MVC terms, this allows the `manager` role to access the `reports` controller and `list` and `add` actions.
+* `$acl->allow('*', 'session', '*');`: Wildcards can be used for mass matching roles, components, or actions. This line allows every role to access every action in the `session` component.
+* `$acl->allow('*', '*', 'view');`: This line gives access to the `view` action to every role. In MVC terms, it allows any role to access any controller that exposes a `viewAction`.
+* `$acl->deny('guest', '*', 'view');`: For the `guest` role, deny access to all components with the `view` action. Despite the default access level being `Acl\Enum::DENY`, this line specifically denies the `view` action to all roles and components. It ensures that the `guest` role only has access to the `session` component and the `login` and `logout` actions since guests are not logged into the application.
+* `$acl->allow('*', '*', 'view');`: This line gives access to the `view` action to every role. However, the following line excludes the `guest` role from that access:
```php
-$acl->allow('manager', 'reports', ['list', 'add']);
-```
-
-You can also pass an array as the `action` parameter when invoking the `allow()` command. The above means that for the `manager` role, allow access to the `reports` component and `list` and `add` actions. Again to bring this into perspective with an MVC application, the above line says that the group `manager` is allowed to access the `reports` controller and `list` and `add` actions.
-
-```php
-$acl->allow('*', 'session', '*');
-```
-
-Wildcards can also be used to do mass matching for roles, components or actions. In the above example, we allow every role to access every action in the `session` component. This command will give access to the `manager`, `accounting` and `guest` roles, access to the `session` component and to the `login` and `logout` actions.
-
-```php
-$acl->allow('*', '*', 'view');
+$acl->deny('guest', '*', 'view');
```
-Similarly, the above gives access to any role, any component that has the `view` action. In an MVC application, the above is the equivalent of allowing any group to access any controller that exposes a `viewAction`.
-
!!! danger "NOTE"
Please be **VERY** careful when using the `*` wildcard. It is very easy to make a mistake and the wildcard, although it seems convenient, it may allow users to access areas of your application that they are not supposed to. The best way to be 100% sure is to write tests specifically to test the permissions and the ACL. These can be done in the `unit` test suite by instantiating the component and then checking the `isAllowed()` if it is `true` or `false`.
There are plenty of tests in our GitHub repository (`tests` folder) to offer guidance and ideas.
-```php
-$acl->deny('guest', '*', 'view');
-```
-
-For the `guest` role, we deny access to all components with the `view` action. Despite the fact that the default access level is `Acl\Enum::DENY` in our example above, we specifically allowed the `view` action to all roles and components. This includes the `guest` role. We want to allow the `guest` role access only to the `session` component and the `login` and `logout` actions, since `guests` are not logged into our application.
-
-```php
-$acl->allow('*', '*', 'view');
-```
-
-This gives access to the `view` access to everyone, but we want the `guest` role to be excluded from that so the following line does what we need.
-
-```php
-$acl->deny('guest', '*', 'view');
-```
-
## Querying
-Once the list has been defined, we can query it to check if a particular role has access to a particular component and action. To do so, we need to use the `isAllowed()` method.
+Once the list is defined, you can query it to check if a particular role has access to a specific component and action using the isAllowed() method.
+
+### Example:
```php
addRole('manager');
-$acl->addRole('accounting');
-$acl->addRole('guest');
-
-// Add components
-$acl->addComponent(
- 'admin',
- [
- 'dashboard',
- 'users',
- 'view',
- ]
-);
-
-$acl->addComponent(
- 'reports',
- [
- 'list',
- 'add',
- 'view',
- ]
-);
-
-$acl->addComponent(
- 'session',
- [
- 'login',
- 'logout',
- ]
-);
-
-// Set up the `allow` list
-$acl->allow('manager', 'admin', 'users');
-$acl->allow('manager', 'reports', ['list', 'add']);
-$acl->allow('*', 'session', '*');
-$acl->allow('*', '*', 'view');
-
-// Set up the `deny` list
-$acl->deny('guest', '*', 'view');
+// (Roles and Components setup...)
-// ....
-
-// `true` - defined explicitly
-$acl->isAllowed('manager', 'admin', 'dashboard');
-
-// `true` - defined with wildcard
-$acl->isAllowed('manager', 'session', 'login');
+// Check permissions
+$acl->isAllowed('manager', 'admin', 'dashboard'); // true - explicitly defined
+$acl->isAllowed('manager', 'session', 'login'); // true - defined with wildcard
+$acl->isAllowed('accounting', 'reports', 'view'); // true - defined with wildcard
+$acl->isAllowed('guest', 'reports', 'view'); // false - explicitly defined
+$acl->isAllowed('guest', 'reports', 'add'); // false - default access level
+```
-// `true` - defined with wildcard
-$acl->isAllowed('accounting', 'reports', 'view');
+In the above example, the `isAllowed()` method checks whether a role has permission to access a specific component and action. It returns `true` if access is allowed, and `false` otherwise. This method is valuable for implementing role-based access control in your application.
-// `false` - defined explicitly
-$acl->isAllowed('guest', 'reports', 'view');
+## Function-Based Access
+Depending on the needs of your application, you might require an additional layer of calculations to allow or deny access to users through the ACL. The `isAllowed()` method in Phalcon's ACL accepts a fourth parameter, which is a callable such as an anonymous function.
-// `false` - default access level
-$acl->isAllowed('guest', 'reports', 'add');
-```
+To take advantage of this functionality, you need to define your function when calling the `allow()` method for the role and component you need. For example, assume you need to allow access to all `manager` roles to the `admin` component except if their name is 'Bob'. To achieve this, you register an anonymous function that checks this condition.
-## Function Based Access
-Depending on the needs of your application, you might need another layer of calculations to allow or deny access to users through the ACL. The method `isAllowed()` accepts a 4th parameter which is a callable such as an anonymous function.
-
-To take advantage of this functionality, you will need to define your function when calling the `allow()` method for the role and component you need. Assume that we need to allow access to all `manager` roles to the `admin` component except if their name is 'Bob' (Poor Bob!). To achieve this we will register an anonymous function that will check this condition.
+### Example:
```php
addComponent(
]
);
-// Set access level for role into components with custom function
+// Set access level for role into components with a custom function
$acl->allow(
'manager',
'admin',
@@ -371,7 +301,9 @@ $acl->allow(
);
```
-Now that the callable is defined in the ACL, we will need to call the `isAllowed()` method with an array as the fourth parameter:
+Now that the callable is defined in the ACL, you need to call the `isAllowed()` method with an array as the fourth parameter:
+
+### Example:
```php
addComponent(
]
);
-// Set access level for role into components with custom function
+// Set access level for role into components with a custom function
$acl->allow(
'manager',
'admin',
@@ -426,11 +358,13 @@ $acl->isAllowed(
);
```
-!!! info "NOTE"
+!!! info "NOTE":
- The fourth parameter must be an array. Each array element represents a parameter that your anonymous function accepts. The key of the element is the name of the parameter, while the value is what will be passed as the value of that the parameter of to the function.
+ The fourth parameter must be an array. Each array element represents a parameter that your anonymous function accepts. The key of the element is the name of the parameter, while the value is what will be passed as the value of that parameter to the function.
+
+You can also omit passing the fourth parameter to `isAllowed()` if you wish. The default action for a call to `isAllowed()` without the last parameter is `Acl\Enum::DENY`. To change this behavior, you can make a call to `setNoArgumentsDefaultAction()`:
-You can also omit to pass the fourth parameter to `isAllowed()` if you wish. The default action for a call to `isAllowed()` without the last parameter is `Acl\Enum::DENY`. To change this behavior, you can make a call to `setNoArgumentsDefaultAction()`:
+### Example:
```php
addComponent(
]
);
-// Set access level for role into components with custom function
+// Set access level for role into components with a custom function
$acl->allow(
'manager',
'admin',
@@ -483,7 +417,7 @@ Phalcon allows developers to define their own role and component objects. These
* [Phalcon\Acl\ComponentAwareInterface][acl-componentawareinterface] for Component
### Role
-We can implement the [Phalcon\Acl\RoleAwareInterface][acl-roleawareinterface] in our custom class with its own logic. The example below shows a new role object called `ManagerRole`:
+You can implement the [Phalcon\Acl\RoleAwareInterface][acl-roleawareinterface] in your custom class with its own logic. The example below shows a new role object called `ManagerRole`:
```php
id = $id;
+ $this->id = $id;
$this->roleName = $roleName;
}
@@ -517,15 +451,15 @@ class ManagerRole implements RoleAware
```
### Component
-We can implement the [Phalcon\Acl\ComponentAware][acl-componentaware] in our custom class with its own logic. The example below shows a new role object called `ReportsComponent`:
+You can implement the [Phalcon\Acl\ComponentAwareInterface][acl-componentawareinterface] in your custom class with its own logic. The example below shows a new role object called `ReportsComponent`:
```php
id = $id;
+ $this->id = $id;
$this->componentName = $componentName;
- $this->userId = $userId;
+ $this->userId = $userId;
}
public function getId()
@@ -559,7 +493,7 @@ class ReportsComponent implements ComponentAware
```
### ACL
-These objects can now be used in our ACL.
+These objects can now be used in your ACL.
```php
allow(
'manager',
'reports',
'list',
- function (ManagerRole $manager, ModelComponent $model) {
+ function (ManagerRole $manager, ReportsComponent $model) {
return boolval($manager->getId() === $model->getUserId());
}
);
@@ -603,7 +537,7 @@ $levelTwo = new ManagerRole(2, 'manager');
$admin = new ManagerRole(3, 'manager');
// id - name - userId
-$reports = new ModelComponent(2, 'reports', 2);
+$reports = new ReportsComponent(2, 'reports', 2);
// Check whether our user objects have access. Returns `false`
$acl->isAllowed($levelOne, $reports, 'list');
@@ -615,10 +549,12 @@ $acl->isAllowed($levelTwo, $reports, 'list');
$acl->isAllowed($admin, $reports, 'list');
```
-The second call for `$levelTwo` evaluates `true` since the `getUserId()` returns `2` which in turn is evaluated in our custom function. Also note that in the custom function for `allow()` the objects are automatically bound, providing all the data necessary for the custom function to work. The custom function can accept any number of additional parameters. The order of the parameters defined in the `function()` constructor does not matter, because the objects will be automatically discovered and bound.
+The second call for `$levelTwo` evaluates `true` since the `getUserId()` returns `2` which in turn is evaluated in our custom function. Also, note that in the custom function for `allow()`, the objects are automatically bound, providing all the data necessary for the custom function to work. The custom function can accept any number of additional parameters. The order of the parameters defined in the `function()` constructor does not matter because the objects will be automatically discovered and bound.
## Roles Inheritance
-To remove duplication and increase efficiency in your application, the ACL offers inheritance in roles. This means that you can define one [Phalcon\Acl\Role][acl-role] as a base and after that inherit from it offering access to supersets or subsets of components. To use role inheritance, you need, you need to pass the inherited role as the second parameter of the method call, when adding that role in the list.
+To remove duplication and increase efficiency in your application, the ACL offers inheritance in roles. This means that you can define one [Phalcon\Acl\Role][acl-role] as a base and then inherit from it, offering access to supersets or subsets of components. To use role inheritance, you need to pass the inherited role as the second parameter of the method call when adding that role to the list.
+
+### Example:
```php
addRole($guest);
-// Add the `accounting` inheriting from `guest`
+// Add the `accounting` role inheriting from `guest`
$acl->addRole($accounting, $guest);
-// Add the `manager` inheriting from `accounting`
+// Add the `manager` role inheriting from `accounting`
$acl->addRole($manager, $accounting);
```
-Whatever access `guests` have will be propagated to `accounting` and in turn `accounting` will be propagated to `manager`. You can also pass an array of roles as the second parameter of `addRole` offering more flexibility.
+Whatever access `guests` have will be propagated to `accounting`, and in turn, `accounting` will be propagated to `manager`. You can also pass an array of roles as the second parameter of `addRole`, offering more flexibility.
## Roles Relationships
-Based on the application design, you might prefer to add first all the roles and then define the relationship between them.
+Based on the application design, you might prefer to add all the roles first and then define the relationships between them.
+
+### Example:
```php
addInherit($accounting, $guest);
```
## Serialization
-[Phalcon\Acl][acl-acl] can be serialized and stored in a cache system to improve efficiency. You can store the serialized object in APC, session, file system, database, Redis etc. This way you can retrieve the ACL quickly without having to read the underlying data that create the ACL nor will you have to compute the ACL in every request.
+[Phalcon\Acl][acl-acl] can be serialized and stored in a cache system to improve efficiency. You can store the serialized object in APC, session, the file system, database, Redis, etc. This way, you can retrieve the ACL quickly without having to read the underlying data that creates the ACL, nor will you have to compute the ACL in every request.
+
+### Example:
```php
addInherit($accounting, $guest);
use Phalcon\Acl\Adapter\Memory;
$aclFile = 'app/security/acl.cache';
+
// Check whether ACL data already exist
-if (true !== is_file($aclFile)) {
-
+if (!is_file($aclFile)) {
// The ACL does not exist - build it
$acl = new Memory();
@@ -702,14 +642,14 @@ if (true !== is_file($aclFile)) {
}
// Use the ACL list as needed
-if (true === $acl->isAllowed('manager', 'admin', 'dashboard')) {
+if ($acl->isAllowed('manager', 'admin', 'dashboard')) {
echo 'Access granted!';
} else {
echo 'Access denied :(';
}
```
-It is a good practice to not use serialization of the ACL during development, to ensure that your ACL is rebuilt with every request, while other adapters or means of serializing and storing the ACL in production.
+It is a good practice to not use serialization of the ACL during development to ensure that your ACL is rebuilt with every request, while other adapters or means of serializing and storing the ACL in production.
## Events
[Phalcon\Acl][acl-acl] can work in conjunction with the [Events Manager][events] if present, to fire events to your application. Events are triggered using the type `acl`. Events that return `false` can stop the active role. The following events are available:
@@ -719,7 +659,7 @@ It is a good practice to not use serialization of the ACL during development, to
| `afterCheckAccess` | Triggered after checking if a role/component has access | No |
| `beforeCheckAccess` | Triggered before checking if a role/component has access | Yes |
-The following example demonstrates how to attach listeners to the ACL:
+### Example:
```php
setEventsManager($eventsManager);
```
## Exceptions
-Any exceptions thrown in the `Phalcon\Acl` namespace will be of type [Phalcon\Acl\Exception][acl-exception]. You can use this exception to selectively catch exceptions thrown only from this component.
+Any exceptions thrown in the [Phalcon\Acl][acl-acl] namespace will be of type [Phalcon\Acl\Exception][acl-exception]. You can use this exception to selectively catch exceptions thrown only from this component.
+
+### Example:
```php
Date: Tue, 26 Dec 2023 11:04:00 -0600
Subject: [PATCH 046/191] reformatting
---
docs/acl.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/docs/acl.md b/docs/acl.md
index 26ad19857..64118130a 100644
--- a/docs/acl.md
+++ b/docs/acl.md
@@ -11,12 +11,14 @@ In the context of programming, ACLs typically involve two key entities: the obje
An accounting application needs to have different groups of users have access to various areas of the application.
**Role**
+
- Administrator Access
- Accounting Department Access
- Manager Access
- Guest Access
**Component**
+
- Login page
- Admin page
- Invoices page
From fb6b26b9ebc294d7022f449500e86f6a0f9a8598 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Tue, 26 Dec 2023 11:07:31 -0600
Subject: [PATCH 047/191] trying a different format for a list in a callout
---
docs/acl.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/docs/acl.md b/docs/acl.md
index 64118130a..fac3b82b7 100644
--- a/docs/acl.md
+++ b/docs/acl.md
@@ -13,15 +13,21 @@ In the context of programming, ACLs typically involve two key entities: the obje
**Role**
- Administrator Access
+
- Accounting Department Access
+
- Manager Access
+
- Guest Access
**Component**
- Login page
+
- Admin page
+
- Invoices page
+
- Reports page
From f8b46760bc912dd3202329644274114336dfb72b Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Tue, 26 Dec 2023 11:14:08 -0600
Subject: [PATCH 048/191] more corrections for headings/menu of the acl
---
docs/acl.md | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/docs/acl.md b/docs/acl.md
index fac3b82b7..9757a9eb7 100644
--- a/docs/acl.md
+++ b/docs/acl.md
@@ -175,9 +175,9 @@ $acl->addComponent(
## Defining Access Controls
After defining both the `Roles` and `Components`, the next step is to tie them together to create the access list. This is a critical step, as a small mistake here can inadvertently allow access to roles for components that the developer did not intend to. As mentioned earlier, the default access action for [Phalcon\Acl][acl-acl] is `Phalcon\Acl\Enum::DENY`, following the [white list][whitelist] approach.
-To associate Roles and Components, you use the allow() and deny() methods provided by the [Phalcon\Acl\Memory][acl-adapter-memory] class.
+To associate Roles and Components, you use the `allow()` and `deny()` methods provided by the [Phalcon\Acl\Memory][acl-adapter-memory] class.
-### Example:
+**Example:**
```php
deny('guest', '*', 'view');
## Querying
Once the list is defined, you can query it to check if a particular role has access to a specific component and action using the isAllowed() method.
-### Example:
+**Example:**
```php
allow(
Now that the callable is defined in the ACL, you need to call the `isAllowed()` method with an array as the fourth parameter:
-### Example:
+**Example:**
```php
isAllowed(
You can also omit passing the fourth parameter to `isAllowed()` if you wish. The default action for a call to `isAllowed()` without the last parameter is `Acl\Enum::DENY`. To change this behavior, you can make a call to `setNoArgumentsDefaultAction()`:
-### Example:
+**Example:**
```php
addInherit($accounting, $guest);
## Serialization
[Phalcon\Acl][acl-acl] can be serialized and stored in a cache system to improve efficiency. You can store the serialized object in APC, session, the file system, database, Redis, etc. This way, you can retrieve the ACL quickly without having to read the underlying data that creates the ACL, nor will you have to compute the ACL in every request.
-### Example:
+**Example:**
```php
setEventsManager($eventsManager);
## Exceptions
Any exceptions thrown in the [Phalcon\Acl][acl-acl] namespace will be of type [Phalcon\Acl\Exception][acl-exception]. You can use this exception to selectively catch exceptions thrown only from this component.
-### Example:
+**Example:**
```php
Date: Tue, 26 Dec 2023 11:16:11 -0600
Subject: [PATCH 049/191] correcting callout
---
docs/acl.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/acl.md b/docs/acl.md
index 9757a9eb7..7d6e055e2 100644
--- a/docs/acl.md
+++ b/docs/acl.md
@@ -366,7 +366,7 @@ $acl->isAllowed(
);
```
-!!! info "NOTE":
+!!! info "NOTE"
The fourth parameter must be an array. Each array element represents a parameter that your anonymous function accepts. The key of the element is the name of the parameter, while the value is what will be passed as the value of that parameter to the function.
From 4c1f19b59ba49ce2f092173fc5b806b59b501193 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Tue, 26 Dec 2023 11:22:30 -0600
Subject: [PATCH 050/191] link correction
---
docs/acl.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/docs/acl.md b/docs/acl.md
index 7d6e055e2..1e2609e2e 100644
--- a/docs/acl.md
+++ b/docs/acl.md
@@ -421,11 +421,11 @@ $acl->isAllowed('manager', 'admin', 'dashboard');
## Custom Objects
Phalcon allows developers to define their own role and component objects. These objects must implement the supplied interfaces:
-* [Phalcon\Acl\RoleAwareInterface][acl-roleawareinterface] for Role
-* [Phalcon\Acl\ComponentAwareInterface][acl-componentawareinterface] for Component
+* [Phalcon\Acl\RoleAwareInterface][acl-roleaware] for Role
+* [Phalcon\Acl\ComponentAwareInterface][acl-componentaware] for Component
### Role
-You can implement the [Phalcon\Acl\RoleAwareInterface][acl-roleawareinterface] in your custom class with its own logic. The example below shows a new role object called `ManagerRole`:
+You can implement the [Phalcon\Acl\RoleAwareInterface][acl-roleaware] in your custom class with its own logic. The example below shows a new role object called `ManagerRole`:
```php
Date: Wed, 27 Dec 2023 07:59:29 -0600
Subject: [PATCH 051/191] rewrote annotations, application/-cli
---
docs/annotations.md | 164 +++++++----------------------------
docs/application-cli.md | 131 ++++++++++++++--------------
docs/application.md | 186 ++++++++++++++++++++--------------------
3 files changed, 187 insertions(+), 294 deletions(-)
diff --git a/docs/annotations.md b/docs/annotations.md
index 71a7c7af6..3f04b542a 100644
--- a/docs/annotations.md
+++ b/docs/annotations.md
@@ -2,10 +2,10 @@
- - -
## Overview
-Phalcon introduced the first annotations parser component written in C for PHP. The `Phalcon\Annotations` namespace contains general purpose components that offers an easy way to parse and cache annotations in PHP applications.
+Phalcon has introduced the first annotations parser component written in C for PHP. The `Phalcon\Annotations` namespace encompasses general-purpose components that provide an easy way to parse and cache annotations in PHP applications.
## Usage
-Annotations are read from docblocks in classes, methods and properties. An annotation can be placed at any position in the docblock:
+Annotations are extracted from docblocks in classes, methods, and properties. An annotation can be placed at any position in the docblock:
```php
'my-prefix',
- 'lifetime' => 3600,
-];
-
-$factory = new AdapterFactory();
-$apcu = $factory->newInstance('apcu', $options);
-```
-
-### `load`
-The [Phalcon\Annotations\AnnotationsFactory][annotations-annotationsfactory] also offers the `load` method, which accepts a configuration object. This object can be an array or a [Phalcon\Config\Config][config] object, with directives that are used to set up the adapter. The object requires the `adapter` element, as well as the `options` element with the necessary directives.
-
-```php
- 'apcu',
- 'options' => [
- 'prefix' => 'my-prefix',
- 'lifetime' => 3600,
- ]
-];
-
-$factory = new AdapterFactory();
-$apcu = $factory->load($options);
-```
-
-## Reading Annotations
-A reflector is implemented to easily get the annotations defined on a class using an object-oriented interface. [Phalcon\Annotations\Reader][annotations-reader] is used along with [Phalcon\Annotations\Reflection][annotations-reflection]. They also utilize the collection [Phalcon\Annotations\Collection][annotations-collection] that contains [Phalcon\Annotations\Annotation][annotations-annotation] objects once the annotations are parsed.
-
-```php
-get('Invoices');
-$annotations = $reflector->getClassAnnotations();
-
-foreach ($annotations as $annotation) {
- echo $annotation->getName(), PHP_EOL;
- echo $annotation->numberArguments(), PHP_EOL;
-
- print_r($annotation->getArguments());
-}
-```
-In the above example we first create the memory annotations adapter. We then call `get` on it to load the annotations from the `Invoices` class. The `getClassAnnotations` will return a [Phalcon\Annotations\Collection][annotations-collection] class. We iterate through the collection and print out the name (`getName`), the number arguments (`numberArguments`) and then we print all the arguments (`getArguments`) on screen.
-
-The annotation reading process is very fast, however, for performance reasons it is recommended to store the parsed annotations using an adapter to reduce unnecessary CPU cycles for parsing.
+[Phalcon\Annotations\Adapter\AdapterInterface][annotations-adapter-adapterinterface] is available
## Exceptions
Any exceptions thrown in the `Phalcon\Annotations` namespace will be of type [Phalcon\Annotations\Exception][annotations-exception]. You can use these exceptions to selectively catch exceptions thrown only from this component.
@@ -367,12 +276,10 @@ class IndexController extends Controller
```
## Examples
+### Controller-based Access
+You can use annotations to define which areas are controlled by the ACL. This can be achieved by registering a plugin in the events manager listening to the `beforeExecuteRoute` event, or simply by implementing the method in your base controller.
-**Controller based access**
-
-You can use annotations to define which areas are controlled by the ACL. We can do this by registering a plugin in the events manager listening to the `beforeExceuteRoute` event, or simply implement the method in our base controller.
-
-First we need to set the annotations manager in our DI container:
+First, set the annotations manager in your DI container:
```php
set(
}
);
```
-
-and now in the base controller we implement the `beforeExceuteRoute` method:
+Now, in the base controller, implement the `beforeExecuteRoute` method:
```php
getControllerClass();
@@ -434,11 +340,11 @@ class BaseController extends Controller
->has('Private')
;
- if (true !== $exists) {
+ if (!$exists) {
return true;
}
- if (true === $this->auth->isLoggedIn()) {
+ if ($this->auth->isLoggedIn()) {
return true;
}
@@ -453,12 +359,7 @@ class BaseController extends Controller
}
}
```
-
-!!! info "NOTE"
-
- You can also implement the above to a listener and use the `beforeDispatch` event if you wish.
-
-and in our controllers we can specify:
+In your controllers, specify:
```php
set(
'annotations',
@@ -504,7 +404,7 @@ $container->set(
);
```
-and now in the base controller we implement the `beforeExceuteRoute` method:
+Now, in the base controller, implement the `beforeExecuteRoute` method:
```php
getControllerClass();
- $actionName = $dispatcher->getActionName()
- . 'Action';
+ $actionName = $dispatcher->getActionName() . 'Action';
$data = $this
->annotations
@@ -554,7 +453,7 @@ class BaseController extends Controller
$allowed = array_intersect($userGroups, $aclGroups);
$allowed = (count($allowed) > 0);
- if (true === $allowed) {
+ if ($allowed) {
return true;
}
@@ -569,8 +468,7 @@ class BaseController extends Controller
}
}
```
-
-and in our controllers:
+In your controllers:
```php
setNamespaces(
[
- 'MyApp' => 'src/',
+ 'MyApp' => 'src/',
]
);
$loader->register();
@@ -80,69 +79,73 @@ try {
exit(1);
}
```
-
Let's look at the code above in more detail.
-First we need to create all the necessary services for our CLI application. We are going to create a loader to autoload our tasks, the CLI application, a dispatcher and a CLI Console application. These are the minimum amount of services that we need to instantiate to create a CLI application.
+First, we need to create all the necessary services for our CLI application. We are going to create a loader to autoload our tasks, the CLI application, a dispatcher, and a CLI Console application. These are the minimum amount of services that we need to instantiate to create a CLI application.
**Loader**
+
```php
$loader = new Loader();
$loader->setNamespaces(
[
- 'MyApp' => 'src/',
+ 'MyApp' => 'src/',
]
);
$loader->register();
```
-
-Create the Phalcon autoloader and register the namespace to point to the `src/` directory.
+Create the Phalcon autoloader and register the namespace to point to the src/ directory.
!!! info "NOTE"
If you decided to use the Composer autoloader in your `composer.json`, you do not need to register the loader in this application
**DI**
+
```php
$container = new CliDI();
```
-We need a Dependency Injection container. You can use the [Phalcon\Di\FactoryDefault\Cli][di-factorydefault-cli] container, which already has services registered for you. Alternatively, you can always use the [Phalcon\Di][di] and register the services you need, one after another.
+We need a Dependency Injection container. You can use the `Phalcon\Di\FactoryDefault\Cli` container, which already has services registered for you. Alternatively, you can always use the `Phalcon\Di` and register the services you need, one after another.
**Dispatcher**
+
```php
$dispatcher = new Dispatcher();
$dispatcher->setDefaultNamespace('MyApp\Tasks');
$container->setShared('dispatcher', $dispatcher);
```
-
-CLI applications need a specific dispatcher. [Phalcon\Cli\Dispatcher][cli-dispatcher] offers the same functionality as the main dispatcher for MVC applications, but it is tailored to CLI applications. As expected, we instantiate the dispatcher object, we set our default namespace and then register it in the DI container.
+CLI applications need a specific dispatcher. `Phalcon\Cli\Dispatcher` offers the same functionality as the main dispatcher for MVC applications, but it is tailored to CLI applications. As expected, we instantiate the dispatcher object, we set our default namespace, and then register it in the DI container.
**Config**
+
```php
-$container->setShared('config', function () {
- return include 'app/config/config.php';
-});
+$container->setShared(
+ 'config',
+ function () {
+ return include 'app/config/config.php';
+ }
+);
```
The above snippet is optional but will allow you to access any configuration settings you have set up.
Make sure to update the include path to be relative to where your `cli.php` file is.
**Application**
+
```php
$console = new Console($container);
```
-As mentioned above, a CLI application is handled by the [Phalcon\Cli\Console][cli-console] class. Here we instantiate it and pass in it the DI container.
+As mentioned above, a CLI application is handled by the `Phalcon\Cli\Console` class. Here we instantiate it and pass in it the DI container.
**Arguments**
-Our application needs arguments. These come in the form of :
+Our application needs arguments. These come in the form of:
```bash
php ./cli.php argument1 argument2 argument3 ...
```
-
-The first argument relates to the task to be executed. The second is the action and after that follow the parameters we need to pass.
+The first argument relates to the task to be executed. The second is the action, and after that follow the parameters we need to pass.
```php
$arguments = [];
@@ -156,16 +159,13 @@ foreach ($argv as $k => $arg) {
}
}
```
-
As you can see in the above, we use the `$argv` to receive what has been passed through the command line, and we split those arguments accordingly to understand what task and action need to be invoked and with what parameters.
-
So for the following example:
```bash
php ./cli.php users recalculate 10
-```
-
+```
Our application will invoke the `UsersTask`, call the `recalculate` action and pass the parameter `10`.
**Execution**
@@ -184,11 +184,10 @@ try {
exit(1);
}
```
-
-In the code above, we use our console object and call `handle` with the calculated parameters. The CLI application will do the necessary routing and dispatch the task and action requested. If an exception is thrown, it will be caught by the `catch` statements and errors will be displayed on screen accordingly.
+In the code above, we use our console object and call `handle` with the calculated parameters. The CLI application will do the necessary routing and dispatch the task and action requested. If an exception is thrown, it will be caught by the `catch` statements, and errors will be displayed on the screen accordingly.
## Exceptions
-Any exception thrown in the [Phalcon\Cli\Console][cli-console] component will be of type [Phalcon\Cli\Console\Exception][cli-console-exception], which allows you to trap the exception specifically.
+Any exception thrown in the `Phalcon\Cli\Console` component will be of type `Phalcon\Cli\Console\Exception`, which allows you to trap the exception specifically.
## Tasks
Tasks are the equivalent of controllers in an MVC application. Any CLI application needs at least one task called `MainTask` and a `mainAction`. Any task defined needs to have a `mainAction` which will be called if no action is defined. You are not restricted to the number of actions that each task can contain.
@@ -213,11 +212,10 @@ class MainTask extends Task
}
}
```
-
-You can implement your own tasks by either extending the supplied [Phalcon\Cli\Task][cli-task] or writing your own class implementing the [Phalcon\Cli\TaskInterface][cli-taskinterface].
+You can implement your tasks by either extending the supplied `Phalcon\Cli\Task` or writing your own class implementing the `Phalcon\Cli\TaskInterface`.
## Actions
-As seen above, we have specified the second parameter to be the action. The task can contain more than one actions.
+As seen above, we have specified the second parameter to be the action. The task can contain more than one action.
```php
setShared('console', $console);
$arguments = [];
// ...
```
-
-Now that the console application is inside the DI container, we can access it from any task.
+Now that the console application is inside the DI container, we can access it from any task.
Assume we want to call the `printAction()` from the `Users` task, all we have to do is call it, using the container.
@@ -356,7 +348,7 @@ class UsersTask extends Task
{
# This is the default task and the default action
echo '000000' . PHP_EOL;
-
+
# Also handle the `print` action
$this->console->handle(
[
@@ -373,14 +365,13 @@ class UsersTask extends Task
}
}
```
-
-This technique allows you to run any task and any action from any other task. However, it is not recommended because it could lead to maintenance nightmares. It is better to extend [Phalcon\Cli\Task][cli-task] and implement your logic there.
+This technique allows you to run any task and any action from any other task. However, it is not recommended because it could lead to maintenance nightmares. It is better to extend `Phalcon\Cli\Task` and implement your logic there.
## Modules
-CLI applications can also handle different modules, the same as MVC applications. You can register different modules in your CLI application, to handle different paths of your CLI application. This allows for better organization of your code and grouping of tasks.
+CLI applications can also handle different modules, the same as MVC applications. You can register different modules in your CLI application to handle different paths of your CLI application. This allows for better organization of your code and grouping of tasks.
You can register a `frontend` and `backend` module for your console application as follows:
-
+
```php
setNamespaces(
[
- 'MyApp' => 'src/',
+ 'MyApp' => 'src/',
]
);
$loader->register();
@@ -449,7 +440,6 @@ try {
exit(1);
}
```
-
The above code assumes that you have structured your directories to contain modules in the `frontend` and `backend` directories.
```bash
@@ -488,12 +478,16 @@ public function setDefaultModule(string $defaultModule): AbstractApplication
```
Sets the module name to be used if the router does not return a valid module
+
+
## Routes
The CLI application has its own router. By default, the Phalcon CLI application uses the [Phalcon\Cli\Router][cli-router] object, but you can implement your own by using the [Phalcon\Cli\RouterInterface][cli-routerinterface].
+### Default Routes
Similar to an MVC application, the [Phalcon\Cli\Router][cli-router] uses [Phalcon\Cli\Router\Route][cli-router-route] objects to store the route information. You can always implement your own objects by implementing the [Phalcon\Cli\Router\RouteInterface][cli-router-routeinterface].
-The routes accept the expected regex parameters such as `a-zA-Z0-9` etc. There are also additional placeholders that you can take advantage of:
+These routes support regex parameters, such as `a-zA-Z0-9`, and also provide additional placeholders:
+
| Placeholder | Description |
|--------------|--------------------------------------------|
@@ -504,12 +498,12 @@ The routes accept the expected regex parameters such as `a-zA-Z0-9` etc. There a
| `:params` | Any parameters |
| `:int` | Whether this is an integer route parameter |
-The [Phalcon\Cli\Router][cli-router] comes with two predefined routes, so that it works right out of the box. These are:
+The default routes are:
- `/:task/:action`
- `/:task/:action/:params`
-If you do not wish to use the default routes, all you have to do is pass `false` in the [Phalcon\Cli\Router][cli-router] object upon construction.
+If you prefer not to use the default routes, you can disable them by passing `false` when constructing the [Phalcon\Cli\Router][cli-router] object:
```php
handle(
- $_SERVER["REQUEST_URI"]
- );
-
+ // Handle the request and send the response
+ $response = $application->handle($_SERVER["REQUEST_URI"]);
$response->send();
} catch (\Exception $e) {
- echo $e->getMessage();
+ echo 'Exception: ', $e->getMessage();
}
```
@@ -130,7 +132,7 @@ This is enabled by default. The view is implicitly buffering all the output. You
```php
handle(
$_SERVER["REQUEST_URI"]
);
-
$response->send();
} catch (\Exception $e) {
echo 'Exception: ', $e->getMessage();
@@ -162,26 +165,32 @@ $response = $application->handle(
```
## Manual Bootstrapping
-If you do not wish to use [Phalcon\Mvc\Application][mvc-application], the code above can be changed as follows:
+If you prefer not to use [Phalcon\Mvc\Application][mvc-application], you can manually handle the bootstrapping process based on your application's requirements. Below are alternative approaches for manual bootstrapping:
+### Standard Web Application
```php
handle(
$_SERVER["REQUEST_URI"]
);
+// Get the 'view' service
$view = $container['view'];
+// Get the 'dispatcher' service
$dispatcher = $container['dispatcher'];
+// Set controller, action, and params based on router
$dispatcher->setControllerName(
$router->getControllerName()
);
@@ -194,50 +203,56 @@ $dispatcher->setParams(
$router->getParams()
);
-// View
+// Start buffering the view output
$view->start();
-// Dispatcher
+// Dispatch the request
$dispatcher->dispatch();
-// View
+// Render the view with controller, action, and params
$view->render(
$dispatcher->getControllerName(),
$dispatcher->getActionName(),
$dispatcher->getParams()
);
-// View
+// Finish buffering the view output
$view->finish();
+// Get the 'response' service
$response = $container['response'];
+// Set the response content from the view output
$response->setContent(
$view->getContent()
);
+// Send the response
$response->send();
```
-The following replacement of [Phalcon\Mvc\Application][mvc-application] does not have the `view`, making it suitable for REST API applications:
-
+### REST API
```php
handle(
$_SERVER["REQUEST_URI"]
);
+// Get the 'dispatcher' service
$dispatcher = $container['dispatcher'];
+// Set controller, action, and params based on router
$dispatcher->setControllerName(
$router->getControllerName()
);
@@ -250,35 +265,41 @@ $dispatcher->setParams(
$router->getParams()
);
+// Dispatch the request
$dispatcher->dispatch();
+// Get the returned value from the dispatcher
$response = $dispatcher->getReturnedValue();
+// If the response is an instance of ResponseInterface, send it
if ($response instanceof ResponseInterface) {
$response->send();
}
```
-Another way that catches exceptions generated in the dispatcher forwarding to other actions consequently is as follows:
-
+### Catching Exceptions
```php
handle(
$_SERVER["REQUEST_URI"]
);
+// Get the 'dispatcher' service
$dispatcher = $container['dispatcher'];
+// Set controller, action, and params based on router
$dispatcher->setControllerName(
$router->getControllerName()
);
@@ -292,31 +313,35 @@ $dispatcher->setParams(
);
try {
+ // Dispatch the request
$dispatcher->dispatch();
-} catch (Exception $e) {
- // 503
+} catch (DispatcherException $e) {
+ // Handle exceptions, for example,
+ // forward to a 503 error page
$dispatcher->setControllerName('errors');
$dispatcher->setActionName('action503');
-
$dispatcher->dispatch();
}
+// Get the returned value from the dispatcher
$response = $dispatcher->getReturnedValue();
+// If the response is an instance of
+// `ResponseInterface`, send it
if ($response instanceof ResponseInterface) {
$response->send();
}
```
-Depending on your application needs, you might want to have full control of what should be instantiated or not, or replace certain components with those of your own to extend the default functionality. The bootstrapping method you choose depends on the needs of your application.
+Choose the option that best fits your application's needs. Depending on your requirements, you may have full control over instantiation and component replacement to extend default functionality. The manual bootstrapping method should align with your application's specific use case.
## Single - Multi Module
-[Phalcon\Mvc\Application][mvc-application] offers two ways of MVC structures: Single and Multi module.
+`Phalcon\Mvc\Application` supports both Single and Multi module MVC structures.
### Single Module
-Single module MVC applications consist of one module only. Namespaces can be used but are not necessary. The structure of such application is usually as follows:
+In Single module MVC applications, there is only one module. Namespaces are optional. The structure typically looks like this:
-```
+```plaintext
single/
app/
controllers/
@@ -327,8 +352,7 @@ single/
img/
js/
```
-
-If namespaces are not used, the following bootstrap file could be used:
+If namespaces are not used, the bootstrap file might look like this:
```php
registerDirs(
'../apps/models/',
]
);
-
$loader->register();
$container = new FactoryDefault();
-$container->set(
- 'view',
- function () {
- $view = new View();
- $view->setViewsDir(
- '../apps/views/'
- );
-
- return $view;
- }
-);
+$container->set('view', function () {
+ $view = new View();
+ $view->setViewsDir('../apps/views/');
+
+ return $view;
+});
$application = new Application($container);
try {
+ // Handle the request and send the response
$response = $application->handle(
$_SERVER["REQUEST_URI"]
);
-
$response->send();
} catch (\Exception $e) {
- echo $e->getMessage();
+ echo 'Exception: ', $e->getMessage();
}
```
-
If namespaces are used, the bootstrap changes slightly:
```php
@@ -393,52 +410,42 @@ $loader->setNamespaces(
'Single\Models' => '../apps/models/',
]
);
-
$loader->register();
$container = new FactoryDefault();
-$container->set(
- 'dispatcher',
- function () {
- $dispatcher = new Dispatcher();
- $dispatcher->setDefaultNamespace(
- 'Single\Controllers'
- );
-
- return $dispatcher;
- }
-);
-
-$container->set(
- 'view',
- function () {
- $view = new View();
- $view->setViewsDir(
- '../apps/views/'
- );
+$container->set('dispatcher', function () {
+ $dispatcher = new Dispatcher();
+ $dispatcher->setDefaultNamespace('Single\Controllers');
+
+ return $dispatcher;
+});
- return $view;
- }
-);
+$container->set('view', function () {
+ $view = new View();
+ $view->setViewsDir('../apps/views/');
+
+ return $view;
+});
$application = new Application($container);
try {
+ // Handle the request and send the response
$response = $application->handle(
$_SERVER["REQUEST_URI"]
);
-
$response->send();
} catch (\Exception $e) {
- echo $e->getMessage();
+ echo 'Exception: ', $e->getMessage();
}
```
-### Multi Module
-A multimodule application uses the same document root for more than one module. Modules are groups of components/files that offer functionality but increase maintainability and isolate functionality if necessary. Each module must implement the [Phalcon\Mvc\ModuleDefinitionInterface][mvc-moduledefinitioninterface], to ensure proper functionality. A sample directory structure can be seen below:
+### Multi-Module
+A multi-module application utilizes a shared document root for more than one module. Modules help organize components, enhance maintainability, and isolate functionality. Each module must implement the [Phalcon\Mvc\ModuleDefinitionInterface][mvc-moduledefinitioninterface] to ensure proper functionality. The directory structure typically includes subdirectories within the `apps/` directory, where each subdirectory has its MVC structure. Additionally, each module directory contains a `Module.php` file to configure module-specific settings, such as autoloaders and custom services.
-```
+**Directory Structure**
+```plaintext
multiple/
apps/
front/
@@ -456,7 +463,7 @@ multiple/
img/
js/
```
-Each subdirectory in `apps/` directory have its own MVC structure. A `Module.php` file is present in each module directory, to configure specific settings of each module, such as autoloaders, custom services etc.
+In each module directory, the `Module.php` file is responsible for registering autoloaders and services for the specific module. Here is an example `Module.php` file for the `Multi\Back` module:
```php
setNamespaces(
@@ -517,7 +522,8 @@ class Module implements ModuleDefinitionInterface
}
```
-A slightly modified bootstrap file is required for a multimodule MVC architecture
+**Bootstrap File for Multi-Module Architecture**
+The bootstrap file for a multi-module MVC architecture requires a slightly modified setup. The router is explicitly configured, and modules are registered with the application. Here is an example bootstrap file:
```php
getMessage();
}
```
-
-If you want to keep the module configuration in your bootstrap file, you can use an anonymous function to register the module.
+Alternatively, you can keep the module configuration in your bootstrap file using anonymous functions to register modules. Here's an example:
```php
registerModules(
]
);
```
+When a [Phalcon\Mvc\Application][mvc-application] has modules registered, it's crucial that every matched route returns a valid module. Each registered module has an associated class exposing methods for the module setup.
-When a [Phalcon\Mvc\Application][mvc-application] has modules registered, it is essential that every matched route returns a valid module. Each registered module has an associated class exposing methods for the module setup.
-
-Module definition classes must implement two methods:
-- `registerAutoloaders()` and
-- `registerServices()`
-
-These will be called by the [Phalcon\Mvc\Application][mvc-application] accordingly.
+Module definition classes must implement two methods: `registerAutoloaders()` and `registerServices()`. These methods will be called by the [Phalcon\Mvc\Application][mvc-application] accordingly.
## Exceptions
Any exceptions thrown in the [Phalcon\Mvc\Application][mvc-application] component will be of type [Phalcon\Mvc\Application\Exception][mvc-application-exception] or [Phalcon\Application\Exception][application-exception]. You can use this exception to selectively catch exceptions thrown only from this component.
@@ -652,7 +652,7 @@ use Phalcon\Mvc\Application\Exception;
try {
$container = new FactoryDefault();
-
+
// ...
$application = new Application($container);
@@ -661,7 +661,7 @@ try {
'front' => false,
]
);
-
+
$response = $application->handle(
$_SERVER["REQUEST_URI"]
);
@@ -672,9 +672,9 @@ try {
}
```
-
## Events
-[Phalcon\Mvc\Application][mvc-application] is able to send events to the [EventsManager][events] (if it is present). Events are triggered using the type `application`. The following events are supported:
+[Phalcon\Mvc\Application][mvc-application] can send events to the [EventsManager][events] if present. Events are triggered using the type application. The supported events are:
+
| Event Name | Triggered |
|-----------------------|--------------------------------------------------------------|
@@ -684,7 +684,7 @@ try {
| `beforeHandleRequest` | Before execute the dispatch loop |
| `afterHandleRequest` | After execute the dispatch loop |
-The following example demonstrates how to attach listeners to this component:
+Here's an example of how to attach listeners to this component:
```php
Date: Fri, 29 Dec 2023 02:04:28 +0200
Subject: [PATCH 052/191] fix supporters block on dark mode (#7)
---
docs/assets/css/extra.css | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 098e7b536..89237300d 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -38,3 +38,9 @@
.phalcon-blog__sponsors-items a:hover {
border-bottom-color: #273646;
}
+
+[data-md-color-scheme="state"] {
+ .phalcon-blog__sponsors-items a {
+ background-color: #ffffffb3;
+ }
+}
From c9fc8051db9055079b34cf178b3a181465f71cb8 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Thu, 28 Dec 2023 21:32:32 -0600
Subject: [PATCH 053/191] added datamapper docs
---
docs/datamapper.md | 1115 +++++++++++++++++++++++++++++++++++++++++++-
mkdocs.yml | 34 --
2 files changed, 1114 insertions(+), 35 deletions(-)
diff --git a/docs/datamapper.md b/docs/datamapper.md
index 789310c1e..54a9973db 100644
--- a/docs/datamapper.md
+++ b/docs/datamapper.md
@@ -13,7 +13,7 @@ The Data Mapper pattern as described by [Martin Fowler][datamapper] in [Patterns
A layer of Mappers that moves data between objects and a database while keeping them independent of each other and the mapper itself.
-The `Phalcon\DataMapper` namespace contains components to help with accessing your data source, with the [Data Mapper][pattern].
+The `Phalcon\DataMapper` namespace contains components to help with accessing your data source, with the [Data Mapper][datamapper].
## PDO
@@ -23,15 +23,1127 @@ One of the components required by this implementation is a PDO connector. The [P
**Connecting to a source**
+Connecting to a database requires the DSN string as well as the username and the password of the account with permission to access the database we need to connect to.
+
+The DSN is as follows:
+
+| Engine | DSN |
+|:-----------:|--------------------------------------------------------------------------|
+| Mysql | `mysql:host=;dbname=;charset=;port=` |
+| Postgresql | `pgsql:host=;dbname=` |
+| Sqlite | `sqlite:` |
+
+You will only need to substitute the values in `<>` with the respective values for your environment. The `charset` and `port` are optional for `Mysql`. For `Sqlite` you can use `memory` as the `` but the database will not persist. A file name in an appropriate location will create the necessary storage file for `Sqlite`.
+
+```php
+ 1
+];
+
+$result = $connection->fetchAll($statement, $bind);
+```
+
+#### Methods
+
+```php
+public function __construct(
+ string $dsn,
+ string $username = null,
+ string $password = null,
+ array $options = [],
+ array $queries = [],
+ ProfilerInterface $profiler = null
+)
+```
+Constructs the object. The `$dsn`, `$username` and `$password` are used to connect to the source. The `$options` allows for additional `PDO` options to be specified. The `$queries` array contains a list of queries that will be executed when the connection is established. The `$profiler` is an optional object implementing the `ProfilerInterface` interface, used to profile the connection.
+
+```php
+public function __debugInfo(): array
+```
+The purpose of this method is to hide sensitive data from stack traces (such as usernames, passwords).
+
+```php
+public function beginTransaction(): bool
+```
+Begins a transaction. If the profiler is enabled, the operation will be recorded.
+
+```php
+public function commit(): bool
+```
+Commits the existing transaction. If the profiler is enabled, the operation will be recorded.
+
+```php
+abstract public function connect(): void;
+```
+Connects to the database.
+
+```php
+abstract public function disconnect(): void;
+```
+Disconnects from the database.
+
+```php
+public function errorCode(): string | null
+```
+Gets the most recent error code.
+
+```php
+public function errorInfo(): array
+```
+Gets the most recent error info.
+
+```php
+public function exec(string $statement): int
+```
+Executes an SQL statement and returns the number of affected rows. If the profiler is enabled, the operation will be recorded.
+
+```php
+public function fetchAffected(string $statement, array $values = []): int
+```
+Performs a statement and returns the number of affected rows.
+
+```php
+public function fetchAll(string $statement, array $values = []): array
+```
+Fetches a sequential array of rows from the database; the rows are returned as associative arrays.
+
+```php
+public function fetchAssoc(string $statement, array $values = []): array
+```
+Fetches an associative array of rows from the database; the rows are returned as associative arrays, and the array of rows is keyed on the first column of each row.
+
+If multiple rows have the same first column value, the last row with that value will overwrite earlier rows. This method is more resource intensive and should be avoided if possible.
+
+```php
+public function fetchColumn(
+ string $statement,
+ array $values = [],
+ int $column = 0
+): array
+```
+Fetches a column of rows as a sequential array (default first one).
+
+```php
+public function fetchGroup(
+ string $statement,
+ array $values = [],
+ int $flags = \PDO::FETCH_ASSOC
+): array
+```
+Fetches multiple from the database as an associative array. The first column will be the index key. The default flags are `PDO::FETCH_ASSOC` | `PDO::FETCH_GROUP`
+
+```php
+public function fetchObject(
+ string $statement,
+ array $values = [],
+ string $className = "stdClass",
+ array $arguments = []
+): object
+```
+Fetches one row from the database as an object where the column values are mapped to object properties.
+
+Since PDO injects property values before invoking the constructor, any initializations for defaults that you potentially have in your object's constructor, will override the values that have been injected by `fetchObject`. The default object returned is `\stdClass`
+
+```php
+public function fetchObjects(
+ string $statement,
+ array $values = [],
+ string $className = "stdClass",
+ array $arguments = []
+): array {
+```
+Fetches a sequential array of rows from the database; the rows are returned as objects where the column values are mapped to object properties.
+
+Since PDO injects property values before invoking the constructor, any initializations for defaults that you potentially have in your object's constructor, will override the values that have been injected by `fetchObject`. The default object returned is `\stdClass`
+
+```php
+public function fetchOne(string $statement, array $values = []): array
+```
+Fetches one row from the database as an associative array.
+
+```php
+public function fetchPairs(string $statement, array $values = []): array
+```
+Fetches an associative array of rows as key-value pairs (first column is the key, second column is the value).
+
+```php
+public function fetchValue(string $statement, array $values = [])
+```
+Fetches the very first value (i.e., first column of the first row).
+
+```php
+public function getAdapter(): \PDO
+```
+Return the inner PDO (if any)
+
+```php
+public function getAttribute(int $attribute): var
+```
+Retrieve a database connection attribute
+
+```php
+public static function getAvailableDrivers(): array
+```
+Return an array of available PDO drivers (empty array if none available)
+
+```php
+public function getDriverName(): string
+```
+Return the driver name
+
+```php
+public function getProfiler():
+```
+Returns the Profiler instance.
+
+```php
+public function getQuoteNames(string $driver = ""): array
+```
+Gets the quote parameters based on the driver
+
+```php
+public function inTransaction(): bool
+```
+Is a transaction currently active? If the profiler is enabled, the operation will be recorded. If the profiler is enabled, the operation will be recorded.
+
+```php
+public function isConnected(): bool
+```
+Is the PDO connection active?
+
+```php
+public function lastInsertId(string $name = null): string
+```
+Returns the last inserted autoincrement sequence value. If the profiler is enabled, the operation will be recorded.
+
+```php
+public function perform(
+ string $statement,
+ array $values = []
+): \PDOStatement
+```
+Performs a query with bound values and returns the resulting PDOStatement; array $values will be passed through `quote()` and their respective placeholders will be replaced in the query string. If the profiler is enabled, the operation will be recorded.
+
+```php
+public function prepare(
+ string $statement,
+ array $options = []
+): \PDOStatement
+```
+Prepares an SQL statement for execution.
+
+```php
+public function query(string $statement, ...$fetch): <\PDOStatement> | bool
+```
+Queries the database and returns a PDOStatement. If the profiler is enabled, the operation will be recorded.
+
+```php
+public function quote(mixed $value, int $type = \PDO::PARAM_STR): string
+```
+Quotes a value for use in an SQL statement. This differs from `PDO::quote()` in that it will convert an array into a string of comma-separated quoted values. The default type is `PDO::PARAM_STR`
+
+```php
+public function rollBack(): bool
+```
+Rolls back the current transaction, and restores autocommit mode. If the profiler is enabled, the operation will be recorded.
+
+```php
+public function setAttribute(int $attribute, mixed $value): bool
+```
+Set a database connection attribute
+
+```php
+public function setProfiler(ProfilerInterface $profiler)
+```
+Sets the Profiler instance.
+
+```php
+protected function fetchData(
+ string $method,
+ array $arguments,
+ string $statement,
+ array $values = []
+): array
+```
+Helper method to get data from PDO based on the method passed
+
+```php
+protected function performBind(
+ \PDOStatement $statement,
+ mixed $name,
+ mixed $arguments
+): void
+```
+Bind a value using the proper `PDO::PARAM_*` type.
+
### Connection - Decorated
+
### ConnectionLocator
+Applications with high traffic may utilize multiple database servers. For instance, one could employ a high-powered database server for writes, while smaller ones with memory based tables for reads.
+
+The [Phalcon\DataMapper\ConnectionLocator][datamapper-pdo-connectionlocator] allows you to define multiple [Phalcon\DataMapper\Pdo\Connection][datamapper-pdo-connection] objects for reading and writing. All these objects are lazy-loaded, instantiated only when necessary.
+
+#### Instantiation
+The easiest way to create a [Phalcon\DataMapper\ConnectionLocator][datamapper-pdo-connectionlocator] to instantiate it and pass a [Phalcon\DataMapper\Pdo\Connection][datamapper-pdo-connection] object to it. Additionally, the constructor can optionally receive two arrays, one for the write connections and one for the read connections. The first connection is always the `master` one.
+
+```php
+
+$host = '127.0.0.1';
+$database = 'phalon_test';
+$charset = 'utf8mb4';
+$port = 3306;
+$username = 'phalcon';
+$password = 'secret';
+
+$dsn = sprintf(
+ "mysql:host=%s;dbname=%s;charset=%s;port=%s",
+ $host,
+ $database,
+ $charset,
+ $port
+);
+
+$connection = new Connection($dsn, $username, $password);
+
+$locator = new ConnectionLocator($connection);
+
+```
+
+#### Methods
+
+```php
+public function __construct(
+ ConnectionInterface $master,
+ array $read = [],
+ array $write = []
+)
+```
+Constructor.
+
+```php
+public function getMaster(): ConnectionInterface
+```
+Returns the default connection object.
+
+```php
+public function getRead(string $name = ""): ConnectionInterface
+```
+Returns a read connection by name; if no name is given, picks a random connection; if no read connections are present, returns the default connection.
+
+```php
+public function getWrite(string $name = ""): ConnectionInterface
+```
+Returns a write connection by name; if no name is given, picks a random connection; if no write connections are present, returns the default connection.
+
+```php
+public function setMaster(ConnectionInterface $callableObject): ConnectionLocatorInterface
+```
+Sets the default connection factory.
+
+```php
+public function setRead(
+ string $name,
+ callable $callableObject
+): ConnectionLocatorInterface
+```
+Sets a read connection factory by name.
+
+```php
+public function setWrite(
+ string $name,
+ callable $callableObject
+): ConnectionLocatorInterface
+```
+Sets a write connection factory by name.
+
+```php
+protected function getConnection(
+ string $type,
+ string $name = ""
+): ConnectionInterface
+```
+Returns a connection by name.
+
+#### Configuration
+Once the [Phalcon\DataMapper\ConnectionLocator][datamapper-pdo-connectionlocator] is created, you can add as many additional read or write connections as required. You can do so either during the construction of the locator or at runtime.
+
+##### Runtime
+First, you create the [Phalcon\DataMapper\ConnectionLocator][datamapper-pdo-connectionlocator] object with the master connection. The master connection is the connection that will be used when read or write connections are not defined.
+
+```php
+addRead(
+ 'master',
+ function () {
+ return new Connection(
+ 'mysql:host=10.4.4.1;dbname=phalcon_db;charset=utf8mb4;port=3306',
+ 'username',
+ 'password'
+ );
+ }
+);
+
+// Read: slave01
+$locator->addRead(
+ 'slave01',
+ function () {
+ return new Connection(
+ 'mysql:host=10.4.8.1;dbname=phalcon_db;charset=utf8mb4;port=3306',
+ 'username',
+ 'password'
+ );
+ }
+);
+
+// Read: slave02
+$locator->addRead(
+ 'slave02',
+ function () {
+ return new Connection(
+ 'mysql:host=10.4.8.2;dbname=phalcon_db;charset=utf8mb4;port=3306',
+ 'username',
+ 'password'
+ );
+ }
+);
+
+// Read: slave03
+$locator->addRead(
+ 'slave03',
+ function () {
+ return new Connection(
+ 'mysql:host=10.4.8.3;dbname=phalcon_db;charset=utf8mb4;port=3306',
+ 'username',
+ 'password'
+ );
+ }
+);
+```
+
+##### On construction
+You can also set everything up when the locator is being constructed. This is particularly useful when setting up the locator as a service in a DI container.
+
+```php
+ function () {
+ return new Connection(
+ 'mysql:host=10.4.4.1;dbname=phalcon_db;charset=utf8mb4;port=3306',
+ 'username',
+ 'password'
+ );
+ }
+];
+
+// Set up read connections
+$read = [
+ 'slave01' => function () {
+ return new Connection(
+ 'mysql:host=10.4.8.1;dbname=phalcon_db;charset=utf8mb4;port=3306',
+ 'username',
+ 'password'
+ );
+ },
+ 'slave02' => function () {
+ return new Connection(
+ 'mysql:host=10.4.8.2;dbname=phalcon_db;charset=utf8mb4;port=3306',
+ 'username',
+ 'password'
+ );
+ },
+ 'slave03' => function () {
+ return new Connection(
+ 'mysql:host=10.4.8.3;dbname=phalcon_db;charset=utf8mb4;port=3306',
+ 'username',
+ 'password'
+ );
+ }
+];
+
+$locator = new ConnectionLocator(
+ function () use ($options) {
+ return new Connection(
+ 'mysql:host=10.4.6.1;dbname=phalcon_db;charset=utf8mb4;port=3306',
+ 'username',
+ 'password'
+ );
+ },
+ $read,
+ $write
+);
+```
+
+
+#### Getting Connections
+Getting a connection from the locator will instantiate the object if it is not instantiated yet and then return it.
+
+- `getMaster()` will return the master/default [Phalcon\DataMapper\Pdo\Connection][datamapper-pdo-connection].
+- `getRead()` will return a random read [Phalcon\DataMapper\Pdo\Connection][datamapper-pdo-connection]; after the first call, `getRead()` will always return the same [Phalcon\DataMapper\Pdo\Connection][datamapper-pdo-connection]. (If no read Connections are defined, it will return the default connection.)
+- `getWrite()` will return a random write [Phalcon\DataMapper\Pdo\Connection][datamapper-pdo-connection]; after the first call, `getWrite()` will always return the same [Phalcon\DataMapper\Pdo\Connection][datamapper-pdo-connection]. (If no write Connections are defined, it will return the default connection.)
+
+You can retrieve a specific read or write connection by passing its name (as it was registered), to the `getRead()` or `getWrite()` methods.
### Profiler
+
+The [Phalcon\DataMapper\Profiler\Profiler][datamapper-pdo-profiler-profiler] is a component that allows you to profile database connections. That entails logging which queries have been executed and where they came from in the codebase, as well as what their execution time is. The [Phalcon\DataMapper\Profiler\Profiler][datamapper-pdo-profiler-profiler] accepts a [Phalcon\Logger\Logger][logger] object to log all the information collected to a file. By default, the [Phalcon\DataMapper\Profiler\MemoryLogger][datamapper-pdo-profiler-memorylogger] is used.
+
+The [Phalcon\DataMapper\Profiler\Profiler][datamapper-pdo-profiler-profiler] can be activated by calling the `setActive()` method. The method accepts a boolean flag, which serves also as the deactivation method. Data is only logged when the profiler is active.
+
+```php
+ true, // PDO options
+ ],
+ [
+ 'SET NAMES utf8mb4', // startup queries
+ ],
+ $profiler
+);
+
+// Same profiler as the one we created above
+$profiler = $connection->getProfiler();
+$profiler->setActive(true)
+```
+and to retrieve the data stored:
+
+```php
+getProfiler()->getLogger()->getMessages();
+
+var_dump($messages);
+```
+
+The messages are logged by default according to this pattern:
+
+```text
+"{method} ({duration}s): {statement} {backtrace}"
+```
+
+You can customize the message format using the `setLogFormat()` on the profiler
+
+```php
+getProfiler()
+ ->setLogFormat("{duration}: {method} {statement}{values}")
+```
+
+The parameters available are:
+
+| Parameter | Description |
+|:-------------:|-----------------------------------------------|
+| `{backtrace}` | The backtrace of where the query was executed |
+| `{duration}` | The execution duration for the query |
+| `{finish}` | The microtime when the profile finished |
+| `{method}` | The method that was called the connection |
+| `{start}` | The microtime when the profile began |
+| `{statement}` | The query executed |
+| `{values}` | Any values passed to the query |
+
+!!! info "NOTE"
+
+ The parameters must be enclosed in curly brackets `{}`
+
## Query
### Factory
### Delete
### Insert
### Select
+
+#### Activation
+To instantiate a `Phalcon\DataMapper\Query\Select` builder, you can use the `Phalcon\DataMapper\Query\QueryFactory` with a `Phalcon\DataMapper\Connection`.
+
+```php
+newSelect($connection);
+```
+
+#### Build
+
+##### Columns
+
+To add columns to the Select, use the `columns()` method and pass the columns as an array. If a key is defined as a string, it will be used as an alias for the column.
+
+**Column Names**
+
+```php
+columns($columns);
+
+// SELECT
+// inv_id,
+// inv_cst_id,
+// inv_status_flag,
+// inv_title,
+// inv_total,
+// inv_created_at
+```
+
+**Aliases**
+
+```php
+ 'inv_id',
+ 'customerId' => 'inv_cst_id',
+ 'status' => 'inv_status_flag',
+ 'title' => 'inv_title',
+ 'total' => 'inv_total',
+ 'createdAt' => 'inv_created_at',
+];
+
+$select->columns($columns);
+
+// SELECT
+// id,
+// customerId,
+// status,
+// title,
+// total,
+// createdAt
+```
+
+**Count**
+
+```php
+ 'inv_cst_id',
+ 'totalCount' => 'COUNT(inv_total)'
+];
+
+$select->columns($columns);
+
+// SELECT
+// customerId,
+// COUNT(inv_total) AS totalCount
+```
+
+##### `FROM`
+
+To add a FROM clause, use the `from()` method:
+
+**Direct**
+
+```php
+from('co_invoices')
+;
+
+// SELECT * FROM co_invoices
+```
+
+**Alias**
+
+```php
+from('co_invoices AS i')
+;
+
+// SELECT * FROM co_invoices i
+```
+
+##### `JOIN`
+To add a JOIN clause, use the join() method:
+
+**LEFT**
+
+```php
+from('co_invoices')
+ ->join($select::JOIN_LEFT, 'co_customers', 'inv_cst_id = cst_id')
+;
+
+// SELECT * FROM co_invoices
+// LEFT JOIN co_customers ON inv_cst_id = cst_id
+```
+
+**RIGHT**
+
+```php
+from('co_invoices')
+ ->join($select::JOIN_RIGHT, 'co_customers', 'inv_cst_id = cst_id')
+;
+
+// SELECT * FROM co_invoices
+// RIGHT JOIN co_customers ON inv_cst_id = cst_id
+```
+
+**INNER**
+
+```php
+from('co_invoices')
+ ->join($select::JOIN_INNER, 'co_customers', 'inv_cst_id = cst_id')
+;
+
+// SELECT * FROM co_invoices
+// INNER JOIN co_customers ON inv_cst_id = cst_id
+```
+
+**NATURAL**
+
+```php
+from('co_invoices AS i')
+ ->join($select::JOIN_NATURAL, 'co_customers', 'inv_cst_id = cst_id')
+;
+
+// SELECT * FROM co_invoices
+// NATURAL JOIN co_customers ON inv_cst_id = cst_id
+```
+
+**With Bind**
+
+```php
+from('co_invoices')
+ ->join(
+ $select::JOIN_LEFT,
+ 'co_customers',
+ 'inv_cst_id = cst_id AND cst_status_flag = ',
+ $status
+ )
+ ->appendJoin(' AND cst_name LIKE ', '%john%')
+;
+
+// SELECT * FROM co_invoices
+// LEFT JOIN co_customers ON inv_cst_id = cst_id
+// AND cst_status_flag = :__1__
+// AND cst_name LIKE :__2__
+```
+
+##### WHERE
+
+To add WHERE conditions, use the where() method. Additional calls to `where()` will implicitly `AND` the subsequent condition.
+
+**Single**
+
+```php
+from('co_invoices')
+ ->where('inv_id > ', $invoiceId)
+;
+
+// SELECT * FROM co_invoices
+// WHERE inv_id > :__1__
+```
+
+**`andWhere`**
+
+```php
+from('co_invoices')
+ ->where('inv_id > 1')
+ ->andWhere('inv_total > :total')
+ ->andWhere('inv_cst_id IN ', $customerIds)
+ ->appendWhere(' AND inv_status_flag = ' . $select->bindInline($status))
+ ->bindValue('total', $totalValue)
+;
+
+// SELECT * FROM co_invoices
+// WHERE inv_id > 1
+// AND inv_total > :total
+// AND inv_cst_id IN (:__1__, :__2__, :__3__)
+// AND inv_status_flag = :__4__
+```
+
+**`orWhere`**
+
+```php
+from('co_invoices')
+ ->appendWhere('inv_total > ', $totalValue)
+ ->orWhere("inv_status_flag = :status")
+ ->bindValue('status', $status)
+;
+
+// SELECT * FROM co_invoices
+// WHERE inv_total > :__1__ "
+// OR inv_status_flag = :status
+```
+
+**`whereEquals`**
+
+There is an additional `whereEquals()` convenience method that adds a series of `AND` equality conditions for you based on an array of key-value pairs:
+
+- Given an array value, the condition will be `IN ()`.
+- Given an empty array, the condition will be `FALSE` (which means the query will return no results).
+- Given a `null` value, the condition will be `IS NULL`.
+- For all other values, the condition will be `=`.
+- If you pass a key without a value, that key will be used as a raw unescaped condition.
+
+```php
+from('co_invoices')
+ ->whereEquals(
+ [
+ 'inv_id' => $invoiceIds,
+ 'inv_cst_id' => null,
+ 'inv_title' => 'ACME',
+ 'inv_created_at = NOW()',
+ ]
+ )
+;
+
+// SELECT * FROM co_invoices
+// WHERE inv_id IN (:__1__, :__2__, :__3__)
+// AND inv_cst_id IS NULL
+// AND inv_title = :__4__
+// AND inv_created_at = NOW()
+```
+
+##### `GROUP BY`
+To add `GROUP BY` expressions, use the `groupBy()` method and pass each expression as a variadic argument.
+
+```php
+from('co_invoices')
+ ->groupBy('inv_cst_id')
+ ->groupBy('inv_status_flag')
+;
+
+// SELECT * FROM co_invoices
+// GROUP BY inv_cst_id, inv_status_flag
+```
+
+##### `HAVING`
+
+The `HAVING` methods work just like their equivalent `WHERE` methods:
+
+- `having()` and `andHaving()` `AND` a `HAVING` condition
+- `orHaving()` `OR`s a `HAVING` condition
+- `appendHaving()` concatenates onto the end of the most recent `HAVING` condition
+
+##### `ORDER BY`
+
+To add `ORDER BY` expressions, use the `orderBy()` method and pass each expression an element of an array.
+
+```php
+from('co_invoices')
+ ->orderBy(
+ [
+ 'inv_cst_id',
+ 'UPPER(inv_title) DESC',
+ ]
+ )
+;
+
+// SELECT * FROM co_invoices
+// ORDER BY inv_cst_id, UPPER(inv_title) DESC
+```
+
+##### `LIMIT`, `OFFSET`, Pagination
+
+To set a `LIMIT` and `OFFSET`, use the `limit()` and `offset()` methods.
+
+```php
+from('co_invoices')
+ ->limit(10)
+;
+
+// SELECT * FROM co_invoices
+// LIMIT 10
+
+$select
+ ->from('co_invoices')
+ ->limit(10)
+ ->offset(50)
+;
+
+// SELECT * FROM co_invoices
+// LIMIT 10 OFFSET 50
+```
+
+**Pagination**
+
+Alternatively, you can limit by "pages" using the `page()` and `perPage()` methods:
+
+```php
+from('co_invoices')
+ ->page(5)
+ ->perPage(10)
+;
+
+// SELECT * FROM co_invoices
+// LIMIT 10 OFFSET 5
+```
+
+##### `DISTINCT`
+You can set the `DISTINCT` clause as follows:
+
+```php
+distinct()
+ ->from('co_invoices')
+ ->columns(
+ [
+ 'inv_id',
+ 'inc_cst_id'
+ ]
+ )
+;
+
+// SELECT DISTINCT inv_id, inc_cst_id
+// FROM co_invoices
+```
+!!! info "NOTE"
+
+ The method accepts an optional boolean parameter to enable (`true`) or disable (`false`) the flag.
+
+##### `FOR UPDATE`
+You can set the `FOR UPDATE` clause as follows:
+
+```php
+from('co_invoices')
+ ->forUpdate()
+;
+
+// SELECT * FROM co_invoices FOR UPDATE
+
+$select
+ ->from('co_invoices')
+ ->forUpdate()
+ ->forUpdate(false)
+;
+
+// SELECT * FROM co_invoices
+```
+
+!!! info "NOTE"
+
+ The method accepts an optional boolean parameter to enable (`true`) or disable (`false`) the flag.
+
+##### Additional Flags
+
+You can set flags recognized by your database server using the `setFlag()` method. For example, you can set a MySQL `HIGH_PRIORITY` flag like so:
+
+```php
+from('co_invoices')
+ ->setFlag('HIGH_PRIORITY')
+;
+
+// SELECT HIGH_PRIORITY * FROM co_invoices
+```
+
+##### `UNION`
+To `UNION` or `UNION ALL` the current `Select` with a followup statement, call one the `union*()` methods:
+
+```php
+from('co_invoices')
+ ->where('inv_id = 1')
+ ->union()
+ ->from('co_invoices')
+ ->where('inv_id = 2')
+ ->union()
+ ->from('co_invoices')
+ ->where('inv_id = 3')
+;
+
+// SELECT * FROM co_invoices WHERE inv_id = 1 UNION
+// SELECT * FROM co_invoices WHERE inv_id = 2 UNION
+// SELECT * FROM co_invoices WHERE inv_id = 3
+
+$select
+ ->from('co_invoices')
+ ->where('inv_id = 1')
+ ->unionAll()
+ ->from('co_invoices')
+ ->where('inv_id = 2')
+;
+
+// SELECT * FROM co_invoices WHERE inv_id = 1 UNION ALL
+// SELECT * FROM co_invoices WHERE inv_id = 2
+```
+
+#### Reset
+The `Select` class exposes the `reset()` method, that allows you to reset the object to its original state and reuse it (e.g., to re-issue a statement to get a `COUNT(*)` without a `LIMIT`, to find the total number of rows to be paginated over).
+
+
+#### Subselect Objects
+If you want to create a subselect, call the `subSelect()` method. When you are done building the subselect, give it an alias using the `asAlias()` method; the object itself can be used in the desired condition or expression.
+
+```php
+from(
+ $select
+ ->subSelect()
+ ->columns("inv_id")
+ ->from('co_invoices')
+ ->asAlias('inv')
+ ->getStatement()
+ )
+;
+
+// SELECT *
+// FROM (SELECT inv_id FROM co_invoices) AS inv
+```
+
### Update
[auraphp]: https://github.com/auraphp
@@ -59,3 +1171,4 @@ One of the components required by this implementation is a PDO connector. The [P
[datamapper-query-select]: api/phalcon_datamapper.md#datamapper-query-select
[datamapper-query-update]: api/phalcon_datamapper.md#datamapper-query-update
[eaa]: https://martinfowler.com/books/eaa.html
+[logger]: logger.md
diff --git a/mkdocs.yml b/mkdocs.yml
index e3f8a0801..8770e915a 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -177,8 +177,6 @@ plugins:
'en/installation.md': installation.md
'en/introduction.md': introduction.md
'en/logger.md': logger.md
- 'en/meta-home.json': meta-home.json
- 'en/meta-topics.json': meta-topics.json
'en/mvc.md': mvc.md
'en/mvc-url.md': mvc-url.md
'en/namespaces.md': namespaces.md
@@ -305,8 +303,6 @@ plugins:
'cs-cz/installation.md': installation.md
'cs-cz/introduction.md': introduction.md
'cs-cz/logger.md': logger.md
- 'cs-cz/meta-home.json': meta-home.json
- 'cs-cz/meta-topics.json': meta-topics.json
'cs-cz/mvc.md': mvc.md
'cs-cz/mvc-url.md': mvc-url.md
'cs-cz/namespaces.md': namespaces.md
@@ -433,8 +429,6 @@ plugins:
'de-de/installation.md': installation.md
'de-de/introduction.md': introduction.md
'de-de/logger.md': logger.md
- 'de-de/meta-home.json': meta-home.json
- 'de-de/meta-topics.json': meta-topics.json
'de-de/mvc.md': mvc.md
'de-de/mvc-url.md': mvc-url.md
'de-de/namespaces.md': namespaces.md
@@ -561,8 +555,6 @@ plugins:
'el-gr/installation.md': installation.md
'el-gr/introduction.md': introduction.md
'el-gr/logger.md': logger.md
- 'el-gr/meta-home.json': meta-home.json
- 'el-gr/meta-topics.json': meta-topics.json
'el-gr/mvc.md': mvc.md
'el-gr/mvc-url.md': mvc-url.md
'el-gr/namespaces.md': namespaces.md
@@ -689,8 +681,6 @@ plugins:
'es-es/installation.md': installation.md
'es-es/introduction.md': introduction.md
'es-es/logger.md': logger.md
- 'es-es/meta-home.json': meta-home.json
- 'es-es/meta-topics.json': meta-topics.json
'es-es/mvc.md': mvc.md
'es-es/mvc-url.md': mvc-url.md
'es-es/namespaces.md': namespaces.md
@@ -817,8 +807,6 @@ plugins:
'fa-ir/installation.md': installation.md
'fa-ir/introduction.md': introduction.md
'fa-ir/logger.md': logger.md
- 'fa-ir/meta-home.json': meta-home.json
- 'fa-ir/meta-topics.json': meta-topics.json
'fa-ir/mvc.md': mvc.md
'fa-ir/mvc-url.md': mvc-url.md
'fa-ir/namespaces.md': namespaces.md
@@ -945,8 +933,6 @@ plugins:
'fr-fr/installation.md': installation.md
'fr-fr/introduction.md': introduction.md
'fr-fr/logger.md': logger.md
- 'fr-fr/meta-home.json': meta-home.json
- 'fr-fr/meta-topics.json': meta-topics.json
'fr-fr/mvc.md': mvc.md
'fr-fr/mvc-url.md': mvc-url.md
'fr-fr/namespaces.md': namespaces.md
@@ -1073,8 +1059,6 @@ plugins:
'id-id/installation.md': installation.md
'id-id/introduction.md': introduction.md
'id-id/logger.md': logger.md
- 'id-id/meta-home.json': meta-home.json
- 'id-id/meta-topics.json': meta-topics.json
'id-id/mvc.md': mvc.md
'id-id/mvc-url.md': mvc-url.md
'id-id/namespaces.md': namespaces.md
@@ -1201,8 +1185,6 @@ plugins:
'it-it/installation.md': installation.md
'it-it/introduction.md': introduction.md
'it-it/logger.md': logger.md
- 'it-it/meta-home.json': meta-home.json
- 'it-it/meta-topics.json': meta-topics.json
'it-it/mvc.md': mvc.md
'it-it/mvc-url.md': mvc-url.md
'it-it/namespaces.md': namespaces.md
@@ -1329,8 +1311,6 @@ plugins:
'ja-jp/installation.md': installation.md
'ja-jp/introduction.md': introduction.md
'ja-jp/logger.md': logger.md
- 'ja-jp/meta-home.json': meta-home.json
- 'ja-jp/meta-topics.json': meta-topics.json
'ja-jp/mvc.md': mvc.md
'ja-jp/mvc-url.md': mvc-url.md
'ja-jp/namespaces.md': namespaces.md
@@ -1457,8 +1437,6 @@ plugins:
'ko-kr/installation.md': installation.md
'ko-kr/introduction.md': introduction.md
'ko-kr/logger.md': logger.md
- 'ko-kr/meta-home.json': meta-home.json
- 'ko-kr/meta-topics.json': meta-topics.json
'ko-kr/mvc.md': mvc.md
'ko-kr/mvc-url.md': mvc-url.md
'ko-kr/namespaces.md': namespaces.md
@@ -1585,8 +1563,6 @@ plugins:
'pl-pl/installation.md': installation.md
'pl-pl/introduction.md': introduction.md
'pl-pl/logger.md': logger.md
- 'pl-pl/meta-home.json': meta-home.json
- 'pl-pl/meta-topics.json': meta-topics.json
'pl-pl/mvc.md': mvc.md
'pl-pl/mvc-url.md': mvc-url.md
'pl-pl/namespaces.md': namespaces.md
@@ -1713,8 +1689,6 @@ plugins:
'pt-br/installation.md': installation.md
'pt-br/introduction.md': introduction.md
'pt-br/logger.md': logger.md
- 'pt-br/meta-home.json': meta-home.json
- 'pt-br/meta-topics.json': meta-topics.json
'pt-br/mvc.md': mvc.md
'pt-br/mvc-url.md': mvc-url.md
'pt-br/namespaces.md': namespaces.md
@@ -1841,8 +1815,6 @@ plugins:
'ru-ru/installation.md': installation.md
'ru-ru/introduction.md': introduction.md
'ru-ru/logger.md': logger.md
- 'ru-ru/meta-home.json': meta-home.json
- 'ru-ru/meta-topics.json': meta-topics.json
'ru-ru/mvc.md': mvc.md
'ru-ru/mvc-url.md': mvc-url.md
'ru-ru/namespaces.md': namespaces.md
@@ -1969,8 +1941,6 @@ plugins:
'tr-tr/installation.md': installation.md
'tr-tr/introduction.md': introduction.md
'tr-tr/logger.md': logger.md
- 'tr-tr/meta-home.json': meta-home.json
- 'tr-tr/meta-topics.json': meta-topics.json
'tr-tr/mvc.md': mvc.md
'tr-tr/mvc-url.md': mvc-url.md
'tr-tr/namespaces.md': namespaces.md
@@ -2097,8 +2067,6 @@ plugins:
'uk-ua/installation.md': installation.md
'uk-ua/introduction.md': introduction.md
'uk-ua/logger.md': logger.md
- 'uk-ua/meta-home.json': meta-home.json
- 'uk-ua/meta-topics.json': meta-topics.json
'uk-ua/mvc.md': mvc.md
'uk-ua/mvc-url.md': mvc-url.md
'uk-ua/namespaces.md': namespaces.md
@@ -2225,8 +2193,6 @@ plugins:
'zh-cn/installation.md': installation.md
'zh-cn/introduction.md': introduction.md
'zh-cn/logger.md': logger.md
- 'zh-cn/meta-home.json': meta-home.json
- 'zh-cn/meta-topics.json': meta-topics.json
'zh-cn/mvc.md': mvc.md
'zh-cn/mvc-url.md': mvc-url.md
'zh-cn/namespaces.md': namespaces.md
From 9f9b236213e90ae2a7ce70499268c175d3bb74c2 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Thu, 28 Dec 2023 21:34:44 -0600
Subject: [PATCH 054/191] added datamapper to the menu
---
docs/datamapper.md | 4 ++++
mkdocs.yml | 1 +
2 files changed, 5 insertions(+)
diff --git a/docs/datamapper.md b/docs/datamapper.md
index 54a9973db..6ce9dd1ac 100644
--- a/docs/datamapper.md
+++ b/docs/datamapper.md
@@ -5,6 +5,10 @@
These components have been heavily influenced by [Aura PHP][auraphp] and [Atlas PHP][atlasphp]
+!!! warning "NOTE"
+
+ The full implementation of a DataMapper is not yet complete. There are however a few components that can be used in any project, such as the `Connection` and `Query/Select`
+
## Overview
The Data Mapper pattern as described by [Martin Fowler][datamapper] in [Patterns of Enterprise Application Architecture][eaa] is:
diff --git a/mkdocs.yml b/mkdocs.yml
index 8770e915a..e4d39e8d3 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -2361,6 +2361,7 @@ nav:
- Validators: db-models-validation.md
- Pagination: db-pagination.md
- Migrations: db-migrations.md
+ - DataMapper: datamapper.md
- Front End:
- Assets: assets.md
- Flash Messenger: flash.md
From 6ab38bc72605e66a5c9425c11d2f30a4432be9b8 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Thu, 28 Dec 2023 21:58:03 -0600
Subject: [PATCH 055/191] added setRelated in relationships and corrections
from the community
---
docs/db-models-relationships.md | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/docs/db-models-relationships.md b/docs/db-models-relationships.md
index dab2c3b07..7872a8340 100644
--- a/docs/db-models-relationships.md
+++ b/docs/db-models-relationships.md
@@ -731,6 +731,24 @@ foreach ($products as $product) {
}
```
+### `setRelated()`
+You can set the same relationship by using `setRelated()` and defining which relationship you want to set.
+
+```php
+ 'cst_id = :customerId:',
+ 'bind' => [
+ 'customerId' => 1,
+ ],
+ ]
+);
+$invoice = new Invoice();
+$customer->setRelated('invoices', [$invoice]);
+```
+
## Aliases
Accessing a relationship cam be achieved by using the name of the remote table. Due to naming conventions, this might not be that easy and could lead to confusion. As seen above, you can define an `alias` to the relationship.
@@ -821,7 +839,7 @@ class Parts extends Model
{
$this->hasMany(
'par_id',
- Invoices::class,
+ Parts::class,
'par_par_id',
[
'reusable' => true,
@@ -831,7 +849,7 @@ class Parts extends Model
$this->belongsTo(
'par_par_id',
- Invoices::class,
+ Parts::class,
'par_id',
[
'reusable' => true,
From 8be8c171dcb83a58b5233190c5e845212be7deac Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Thu, 28 Dec 2023 22:07:42 -0600
Subject: [PATCH 056/191] correction to the api/mvc/serialize
---
docs/api/phalcon_mvc.md | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/docs/api/phalcon_mvc.md b/docs/api/phalcon_mvc.md
index 3f15f1ba2..50c5d64ca 100644
--- a/docs/api/phalcon_mvc.md
+++ b/docs/api/phalcon_mvc.md
@@ -8583,10 +8583,10 @@ Sets the object's state
Phalcon\Mvc\Model\Resultset
-This component allows to Phalcon\Mvc\Model returns large resultsets with the minimum memory consumption
+This component allows to `Phalcon\Mvc\Model` returns large resultsets with the minimum memory consumption
Resultsets can be traversed using a standard foreach or a while statement. If a resultset is serialized
-it will dump all the rows into a big array. Then unserialize will retrieve the rows as they were before
-serializing.
+it will dump all the rows into a big array, serialize it and return the resulting string. Then
+`unserialize` will retrieve the rows as they were before serializing.
```php
@@ -8956,7 +8956,8 @@ Returns current row in the resultset
```php
public function serialize(): string;
```
-Serializing a resultset will dump all related rows into a big array
+Serializing a resultset will dump all related rows into a big array,
+serialize it and return the resulting string
```php
@@ -14441,5 +14442,3 @@ Appends template before controller layout
public function start();
```
Starts rendering process enabling the output buffering
-
-
From 7351a6373d068788207ff0e3cef1631a287bb048 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 05:59:09 -0600
Subject: [PATCH 057/191] T16-removed obsolete section
---
docs/db-phql.md | 39 ---------------------------------------
1 file changed, 39 deletions(-)
diff --git a/docs/db-phql.md b/docs/db-phql.md
index 73286c201..7df587dcf 100644
--- a/docs/db-phql.md
+++ b/docs/db-phql.md
@@ -351,45 +351,6 @@ ORDER BY
LIMIT 100
```
-**Aliases in Namespaces**
-
-You can define aliases in namespaces to make your code a bit more readable. This is set up when you register the `modelsManager` in your DI container:
-
-```php
-set(
- 'modelsManager',
- function () {
- $modelsManager = new Manager();
- $modelsManager->registerNamespaceAlias(
- 'inv',
- Invoices::class
- );
-
- return $modelsManager;
- }
-);
-```
-
-and now our query can be written as:
-
-```sql
-SELECT
- i.inv_id
-FROM
- inv:Invoices i
-WHERE
- i.inv_status_flag = 1
-```
-
-The above _shortens_ the whole namespace for the model, replacing it with an alias.
-
**Subqueries**
PHQL also supports subqueries. The syntax is similar to the one offered by PDO.
From a23527e3bd6729d7034a8beb777a6323774d9557 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 09:45:00 -0600
Subject: [PATCH 058/191] update on the docs
---
docs/db-models.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/docs/db-models.md b/docs/db-models.md
index e61c5ed70..d68ed9f29 100644
--- a/docs/db-models.md
+++ b/docs/db-models.md
@@ -30,6 +30,9 @@ class Invoices extends Model
use MyApp\Models\Invoices;
+/**
+ * Create an invoice
+ */
$invoice = new Invoices();
$invoice->inv_cst_id = 1;
From f2c959eb25a365f6824e577d5474c21c27efb924 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 09:50:48 -0600
Subject: [PATCH 059/191] updating docs for mongo
---
docs/db-odm.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/docs/db-odm.md b/docs/db-odm.md
index 4fbc732cb..d2234ec32 100644
--- a/docs/db-odm.md
+++ b/docs/db-odm.md
@@ -7,4 +7,6 @@
The existing implementation was using a PHP MongoDB driver that has been deprecated for years. As such, work is underway to re-introduce the Object Document Mapper in Phalcon, using the latest MongoDB PHP driver.
- We expect this functionality to be reintroduced a future Phalcon release.
+ Support for MonboDb can be found in our [incubator repository][incubator-mongo]
+
+[incubator-mongo]: https://github.com/phalcon/incubator-mongodb
From 1bd864fc5692d1476e0a6fc07c8878594b6ccc80 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 10:44:33 -0600
Subject: [PATCH 060/191] added caddy example
---
docs/webserver-setup.md | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/docs/webserver-setup.md b/docs/webserver-setup.md
index 8c5c71514..90351d2f4 100644
--- a/docs/webserver-setup.md
+++ b/docs/webserver-setup.md
@@ -470,7 +470,32 @@ Execute the application in a browser:

+## Caddy
+
+[Caddy][caddy] is the ultimate server that makes your sites more secure, more reliable and more scalable than any other solution.
+
+### Phalcon Configuration
+Cherokee provides a friendly graphical interface to configure almost every setting available in the web server.
+
+You will need to make sure that PHP is available for your server using the `php_fastcgi` directive from Caddy.
+
+For your site setup you can use the following:
+
+```json
+https://example.cc {
+ gzip
+ tls /ssl/example.cc/cert.pem /ssl/example.cc/key.pem
+ root /path/to/phalcon/public
+ fastcgi / unix:/run/php/php8.0-fpm.sock php
+ rewrite {
+ r (.*)
+ to {path} {path}/ /index.php?_url={1}
+ }
+}
+```
+
[apache]: https://httpd.apache.org/
+[caddy]: https://caddyserver.com
[cherokee]: https://www.cherokee-project.com/
[htrouter]: https://github.com/phalcon/phalcon-devtools/blob/master/templates/.htrouter.php
[nginx]: https://wiki.nginx.org/Main
From cdfd34a11bb3ed028aaeda3c33e7cf920da2187e Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 10:49:49 -0600
Subject: [PATCH 061/191] correcting base path
---
docs/tutorial-basic.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/tutorial-basic.md b/docs/tutorial-basic.md
index bd408197b..38f16b3dc 100644
--- a/docs/tutorial-basic.md
+++ b/docs/tutorial-basic.md
@@ -77,7 +77,7 @@ To start, lets register our app's `controllers` and `models` directories using [
use Phalcon\Autoload\Loader;
-define('BASE_PATH', dirname(__DIR__));
+define('BASE_PATH', dirname(__DIR__ . '/..'));
define('APP_PATH', BASE_PATH . '/app');
// ...
From 28854f794064884e7ee8cf24c0cc69390b380a35 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 11:38:48 -0600
Subject: [PATCH 062/191] correcting config array
---
docs/devtools.md | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/docs/devtools.md b/docs/devtools.md
index aba14b66b..3d3a9914d 100644
--- a/docs/devtools.md
+++ b/docs/devtools.md
@@ -155,11 +155,13 @@ defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');
return new \Phalcon\Config([
'database' => [
'adapter' => 'Mysql',
- 'host' => 'localhost',
- 'username' => 'root',
- 'password' => '',
- 'dbname' => 'test',
- 'charset' => 'utf8',
+ 'options' => [
+ 'host' => 'localhost',
+ 'username' => 'root',
+ 'password' => '',
+ 'dbname' => 'test',
+ 'charset' => 'utf8',
+ ],
],
'application' => [
'appDir' => APP_PATH . '/',
From ba248661b132776574081cbc9902726fc5be3fc4 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 14:04:23 -0600
Subject: [PATCH 063/191] added release doc
---
docs/assets/css/extra.css | 38 +++++++++++
docs/releases.md | 130 ++++++++++++++++++++++++++++++++++++++
mkdocs.yml | 1 +
3 files changed, 169 insertions(+)
create mode 100644 docs/releases.md
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 89237300d..57f70b6a8 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -44,3 +44,41 @@
background-color: #ffffffb3;
}
}
+
+.version-th-center, .version-td-center {
+ text-align: center;
+}
+.version-th-right, .version-td-right {
+ text-align: right;
+}
+.current-version {
+ background-color: #D4F4B4;
+}
+.previous-version {
+ background-color: #FEF8C6;
+}
+
+.legend {
+ padding-left: 0.3em;
+ white-space: nowrap;
+}
+
+.legend-old-version {
+ border-left: 1.2em solid #FDB3AB;
+}
+
+.legend-old-version-supported {
+ border-left: 1.2em solid #FEF8C6;
+}
+
+.legend-latest {
+ border-left: 1.2em solid #D4F4B4;
+}
+
+.legend-preview {
+ border-left: 1.2em solid #FED1A0;
+}
+
+.legend-future {
+ border-left: 1.2em solid #C1E6F5;
+}
diff --git a/docs/releases.md b/docs/releases.md
new file mode 100644
index 000000000..bdc20eb7a
--- /dev/null
+++ b/docs/releases.md
@@ -0,0 +1,130 @@
+---
+hide:
+ - toc
+---
+# Release History
+
+
+
+
+ Version
+ Release date
+ PHP version
+
+
+
+
+ 0.3
+ November 14, 2012
+
+
+
+ 0.4
+ June 02, 2012
+
+
+
+ 0.5
+ September 17, 2012
+
+
+
+ 0.6
+ November 11, 2012
+
+
+
+ 0.7
+ December 12, 2012
+
+
+
+ 0.8
+ January 09, 2013
+
+
+
+ 0.9
+ February 05, 2013
+
+
+
+ 1.0
+ March 21, 2013
+
+
+
+ 1.3
+ March 17, 2014
+
+
+
+ 2.0
+ April 17, 2015
+
+
+
+ 3.0
+ July 29, 2016
+ 5.6-7.0
+
+
+ 4.0
+ December 21, 2019
+ 7.2-7.4
+
+
+ 5.0
+ September 23, 2022
+ 7.4-8.2
+
+
+ 5.4
+ Ocrober 25, 2023
+ 7.4-8.2
+
+
+ 5.5
+ December 25, 2023
+ 8.0-8.3
+
+
+
+
+
+
+ Legend:
+
+
+
+ Old version
+
+
+
+
+ Older version, still maintained
+
+
+
+
+ Latest version
+
+
+
+
+ Latest preview version
+
+
+
+
+ Future release
+
+
+
+
+
diff --git a/mkdocs.yml b/mkdocs.yml
index e4d39e8d3..bb7e7c0a3 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -2309,6 +2309,7 @@ nav:
- Introduction: introduction.md
- Changelog:
- Current Version: https://github.com/phalcon/cphalcon/blob/5.0.x/CHANGELOG-5.0.md
+ - Releases: releases.md
- How to upgrade: upgrade.md
- Contributing:
- Contributions: contributions.md
From 0b7d6b297e38ed2decd232c7534729fba2a5e23a Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 14:12:25 -0600
Subject: [PATCH 064/191] updating css
---
docs/assets/css/extra.css | 2 ++
1 file changed, 2 insertions(+)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 57f70b6a8..6c0a8f234 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -45,6 +45,7 @@
}
}
+/* Releases page table */
.version-th-center, .version-td-center {
text-align: center;
}
@@ -58,6 +59,7 @@
background-color: #FEF8C6;
}
+/* Releases page legend */
.legend {
padding-left: 0.3em;
white-space: nowrap;
From 2a33d2586468067fefff29229006e73392d0db2f Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 14:42:00 -0600
Subject: [PATCH 065/191] Update extra.css
---
docs/assets/css/extra.css | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 6c0a8f234..1d3c8595e 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -53,10 +53,10 @@
text-align: right;
}
.current-version {
- background-color: #D4F4B4;
+ background-color: #d4f4b4;
}
.previous-version {
- background-color: #FEF8C6;
+ background-color: #fef8c6;
}
/* Releases page legend */
@@ -66,21 +66,21 @@
}
.legend-old-version {
- border-left: 1.2em solid #FDB3AB;
+ border-left: 1.2em solid #fdb3ab;
}
.legend-old-version-supported {
- border-left: 1.2em solid #FEF8C6;
+ border-left: 1.2em solid #fef8c6;
}
.legend-latest {
- border-left: 1.2em solid #D4F4B4;
+ border-left: 1.2em solid #d4f4b4;
}
.legend-preview {
- border-left: 1.2em solid #FED1A0;
+ border-left: 1.2em solid #fed1a0;
}
.legend-future {
- border-left: 1.2em solid #C1E6F5;
+ border-left: 1.2em solid #c1e6f5;
}
From 2365f70d0eb4c2a4d3edde94c030555e467dda84 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 14:52:52 -0600
Subject: [PATCH 066/191] Update extra.css
---
docs/assets/css/extra.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 1d3c8595e..8321158a3 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -1,5 +1,5 @@
:root {
- --md-primary-fg-color: #273646;
+ --md-primary-fg-color: #273646;
--md-primary-fg-color--light: #374c62;
--md-primary-fg-color--dark: #1c2631;
}
From c2b1ff5030a9d91057d27a4778ddd1953ce522e4 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 17:24:50 -0600
Subject: [PATCH 067/191] correcting validation example
---
docs/filter-validation.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/filter-validation.md b/docs/filter-validation.md
index a0ca148ed..1133f2bdd 100644
--- a/docs/filter-validation.md
+++ b/docs/filter-validation.md
@@ -1789,7 +1789,7 @@ class IpValidator extends AbstractValidator
}
$validator->appendMessage(
- new Message($message, $attribute, 'Ip')
+ $this->messageFactory($message, $attribute, 'Ip')
);
return false;
From f893f2acaab0926b209fb58bbb44ad6c4ee62e6e Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 18:01:29 -0600
Subject: [PATCH 068/191] correcting characters in tables; added more verbosity
to columns() for the builder
---
docs/api/phalcon_mvc.md | 104 ++++++++++++++++++++++++++++++++++++++--
docs/db-phql.md | 46 +++++++++---------
docs/image.md | 4 +-
docs/response.md | 6 +--
docs/volt.md | 2 +-
5 files changed, 128 insertions(+), 34 deletions(-)
diff --git a/docs/api/phalcon_mvc.md b/docs/api/phalcon_mvc.md
index 50c5d64ca..2e96a771c 100644
--- a/docs/api/phalcon_mvc.md
+++ b/docs/api/phalcon_mvc.md
@@ -3589,15 +3589,47 @@ This method replaces all previously set cache options
```php
public function columns( mixed $columns ): CriteriaInterface;
```
-Sets the columns to be queried
+
+Sets the columns to be queried. The columns can be either a `string` or
+an `array`. The string can specify one or more columns, separated by
+commas, the same way that one uses the SQL select statement. You can
+use aliases, aggregate functions etc. If you need to reference other
+models you will need to reference them with their namespaces.
+
+When using an array as a parameter, you will need to specify one field
+per element. If a key is defined in our array, it will be used as the
+alias in the query
```php
+columns("id, name");
+
+// Array, one column per element
$criteria->columns(
[
"id",
"name",
]
);
+
+// Array, named keys. The name of the key acts as an alias (`AS` clause)
+$criteria->columns(
+ [
+ "name",
+ "number" => "COUNT(*)",
+ ]
+);
+
+// Different models
+$criteria->columns(
+ [
+ "\Phalcon\Models\Invoices.*",
+ "\Phalcon\Models\Customers.cst_name_first",
+ "\Phalcon\Models\Customers.cst_name_last",
+ ]
+);
```
@@ -6956,8 +6988,6 @@ inside the query object
- `BuilderInterface`
- `InjectionAwareInterface`
-Phalcon\Mvc\Model\Query\Builder
-
Helps to create PHQL queries using an OO interface
```php
@@ -7167,11 +7197,24 @@ $builder->betweenWhere("price", 100.25, 200.50);
```php
public function columns( mixed $columns ): BuilderInterface;
```
-Sets the columns to be queried
+
+Sets the columns to be queried. The columns can be either a `string` or
+an `array`. The string can specify one or more columns, separated by
+commas, the same way that one uses the SQL select statement. You can
+use aliases, aggregate functions etc. If you need to reference other
+models you will need to reference them with their namespaces.
+
+When using an array as a parameter, you will need to specify one field
+per element. If a key is defined in our array, it will be used as the
+alias in the query
```php
+columns("id, name");
+// Array, one column per element
$builder->columns(
[
"id",
@@ -7179,12 +7222,22 @@ $builder->columns(
]
);
+// Array, named keys. The name of the key acts as an alias (`AS` clause)
$builder->columns(
[
"name",
"number" => "COUNT(*)",
]
);
+
+// Different models
+$builder->columns(
+ [
+ "\Phalcon\Models\Invoices.*",
+ "\Phalcon\Models\Customers.cst_name_first",
+ "\Phalcon\Models\Customers.cst_name_last",
+ ]
+);
```
@@ -7699,7 +7752,48 @@ Appends a BETWEEN condition to the current conditions
```php
public function columns( mixed $columns ): BuilderInterface;
```
-Sets the columns to be queried
+Sets the columns to be queried. The columns can be either a `string` or
+an `array`. The string can specify one or more columns, separated by
+commas, the same way that one uses the SQL select statement. You can
+use aliases, aggregate functions etc. If you need to reference other
+models you will need to reference them with their namespaces.
+
+When using an array as a parameter, you will need to specify one field
+per element. If a key is defined in our array, it will be used as the
+alias in the query
+
+```php
+columns("id, name");
+
+// Array, one column per element
+$builder->columns(
+ [
+ "id",
+ "name",
+ ]
+);
+
+// Array, named keys. The name of the key acts as an alias (`AS` clause)
+$builder->columns(
+ [
+ "name",
+ "number" => "COUNT(*)",
+ ]
+);
+
+// Different models
+$builder->columns(
+ [
+ "\Phalcon\Models\Invoices.*",
+ "\Phalcon\Models\Customers.cst_name_first",
+ "\Phalcon\Models\Customers.cst_name_last",
+ ]
+);
+```
+
```php
diff --git a/docs/db-phql.md b/docs/db-phql.md
index 7df587dcf..178dca5df 100644
--- a/docs/db-phql.md
+++ b/docs/db-phql.md
@@ -1695,23 +1695,23 @@ $invoices = $this
### Parameters
Whether you create a [Phalcon\Mvc\Model\Query\Builder][mvc-model-query-builder] object directly or you are using the Models Manager's `createBuilder` method, you can always use the fluent interface to build your query or pass an array with parameters in the constructor. The keys of the array are:
-| Parameter | Type | Description |
-|---------------|---------------------|-------------------------------------------------|
-| `bind` | `array` | array of the data to be bound |
-| `bindTypes` | `array` | PDO parameter types |
-| `container` | DI | DI Container |
-| `columns` | `array|string` | columns to select |
-| `conditions` | `array|string` | conditions (where) |
-| `distinct` | `string` | distinct column |
-| `for_update` | `bool` | for update or not |
-| `group` | `array` | group by columns |
-| `having` | `string` | having columns |
-| `joins` | `array` | model classes used for joins |
-| `limit` | `array|int` | limit for the records (i.e. `20` or `[20, 20]`) |
-| `models` | `array` | model classes used |
-| `offset` | `int` | the offset |
-| `order` | `array|string` | order columns |
-| `shared_lock` | `bool` | issue shared lock or not |
+| Parameter | Type | Description |
+|---------------|---------------------|-------------------------------|
+| `bind` | `array` | array of the data to be bound |
+| `bindTypes` | `array` | PDO parameter types |
+| `container` | DI | DI Container |
+| `columns` | `array|string` | columns to select |
+| `conditions` | `array|string` | conditions (where) |
+| `distinct` | `string` | distinct column |
+| `for_update` | `bool` | for update or not |
+| `group` | `array` | group by columns |
+| `having` | `string` | having columns |
+| `joins` | `array` | model classes used for joins |
+| `limit` | `array|int` | limit for the records (i.e. `20` or `[20, 20]`) |
+| `models` | `array` | model classes used |
+| `offset` | `int` | the offset |
+| `order` | `array|string` | order columns |
+| `shared_lock` | `bool` | issue shared lock or not |
```php
Date: Fri, 29 Dec 2023 19:03:37 -0600
Subject: [PATCH 069/191] minor reference to GhostBSD
---
docs/installation.md | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/docs/installation.md b/docs/installation.md
index fe54a8c2e..9bc1275e3 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -74,13 +74,13 @@ brew install pcre
Without `brew`, you need to go to the [PCRE][pcre] website and download the latest pcre:
```bash
-tar -xzvf pcre-8.42.tar.gz
-cd pcre-8.42
-./configure --prefix=/usr/local/pcre-8.42
+tar -xzvf pcre2-10.42.tar.gz
+cd pcre2-10.42
+./configure --prefix=/usr/local/pcre-10.42
make
make install
-ln -s /usr/local/pcre-8.42 /usr/sbin/pcre
-ln -s /usr/local/pcre-8.42/include/pcre.h /usr/include/pcre.h
+ln -s /usr/local/pcre2-10.42 /usr/sbin/pcre
+ln -s /usr/local/pcre2-10.42/include/pcre.h /usr/include/pcre.h
```
For Maverick
@@ -138,7 +138,7 @@ yum install php80-php-phalcon5
Additional versions are available both architecture specific (x86/x64) and PHP version specific
-### FreeBSD
+### FreeBSD/GhostBSD
Binary package (pkg) and compile from source (ports) are available for FreeBSD. To install it you will need to issue the following commands:
##### pkg
@@ -287,6 +287,10 @@ chmod a+x zephir
```
You might also need to change the ownership of the file, depending on your environment.
+!!! note "NOTE"
+
+ Zephir can also be installed using `composer require phalcon/zephir:dev-development`
+
Clone the repository to a location on your file system.
```bash
@@ -333,10 +337,6 @@ make && make install
If you use the above method you will need to add the `extension=phalcon.so` in your `php.ini` both for CLI and web server.
-!!! warning "NOTE"
-
- If you are installing Phalcon with PHP 8.+, the paths will vary slightly.
-
#### Tuning Build
By default, we compile to be as compatible as possible with all processors (`gcc -mtune=native -O2 -fomit-frame-pointer`). If you would like instruct the compiler to generate optimized machine code that matches the processor where it is currently running on you can set your own compile flags by exporting CFLAGS before the build.
From 5d275bb62c85d9e101b096c028cd8c9098a45db9 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 19:12:42 -0600
Subject: [PATCH 070/191] minor clarifications for webserver setup in samples
---
docs/tutorial-invo.md | 2 +-
docs/tutorial-rest.md | 2 +-
docs/tutorial-vokuro.md | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/tutorial-invo.md b/docs/tutorial-invo.md
index adb4ede0d..5c6bc3379 100644
--- a/docs/tutorial-invo.md
+++ b/docs/tutorial-invo.md
@@ -49,7 +49,7 @@ You can clone the repository to your machine (or download it) from [GitHub][gith
├── cache
└── logs
```
-Since Phalcon does not impose a particular directory structure, the particular structure is just our implementation. You will need to set up your webserver with instructions from the [webserver setup][webserver-setup] page.
+Since Phalcon does not impose a particular directory structure, the particular structure is just our implementation. You will need to set up your webserver with instructions from the [webserver setup][webserver-setup] page. The entry point will be `public/index.php`
Once the application is set up, you can open it in your browser by navigating to the following URL `https://localhost/invo`. You will see a screen similar to the one below:
diff --git a/docs/tutorial-rest.md b/docs/tutorial-rest.md
index 652a74e8f..10b57eab3 100644
--- a/docs/tutorial-rest.md
+++ b/docs/tutorial-rest.md
@@ -553,7 +553,7 @@ create table `robotics`.`robots` (
```
## Run
-You can of course set up your web server to run your application. For setup instructions you can check the [webserver setup][webserver-setup] document. If you want to use the built-in PHP server, you will need to create a file called `.htrouter` as follows:
+You can of course set up your web server to run your application. For setup instructions you can check the [webserver setup][webserver-setup] document and make sure your host is pointing to the `index.php` file. If you want to use the built-in PHP server, you will need to create a file called `.htrouter` as follows:
```php
Date: Fri, 29 Dec 2023 19:29:50 -0600
Subject: [PATCH 071/191] clarification about render in simple/view
---
docs/views.md | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/docs/views.md b/docs/views.md
index 7852392a0..b36b70349 100644
--- a/docs/views.md
+++ b/docs/views.md
@@ -940,6 +940,11 @@ class InvoicesController extends Controller
```
## Simple Rendering
+
+!!! warning "NOTE"
+
+ You can use `echo` when calling `$view->render()`, which will output the contents of the rendering process on screen. This **only works** with [Phalcon\Mvc\View\Simple][mvc-view-simple] and **not** with [Phalcon\Mvc\View][mvc-view]. Using `echo` with the latter will produce a warning.
+
[Phalcon\Mvc\View\Simple][mvc-view-simple] is an alternative component to [Phalcon\Mvc\View][mvc-view]. It keeps most of the philosophy of [Phalcon\Mvc\View][mvc-view] but lacks of a hierarchy of files which is, in fact, the main feature of its counterpart.
This component allows you to have control of when a view is rendered and its location. In addition, this component can leverage of view inheritance available in template engines such as [Volt][volt] and others.
@@ -1045,7 +1050,7 @@ $params = [
// Phalcon\Mvc\View
$view = new View();
-echo $view->render('invoices', 'view', $params);
+$view->render('invoices', 'view', $params);
// Phalcon\Mvc\View\Simple
$simpleView = new Simple();
@@ -1356,7 +1361,7 @@ $.ajax({
```
-In the example above, we are utilizing the [Phalcon\Url][mvc-url] component in our javascript code, to correctly set up the URL in our application. The service is available in the view by accessing `$this->url`.
+In the example above, we are utilizing the [Phalcon\Mvc\Url][mvc-url] component in our javascript code, to correctly set up the URL in our application. The service is available in the view by accessing `$this->url`.
## Stand Alone
You can also use the view as a _glue_ component in your application. You will only need to have the proper setup and then use the view to return processed results back.
@@ -1412,6 +1417,11 @@ echo $view->getRender(
```
### Simple Rendering
+
+!!! warning "NOTE"
+
+ You can use `echo` when calling `$view->render()`, which will output the contents of the rendering process on screen. This **only works** with [Phalcon\Mvc\View\Simple][mvc-view-simple] and **not** with [Phalcon\Mvc\View][mvc-view]. Using `echo` with the latter will produce a warning.
+
You can also use the much smaller [Phalcon\Mvc\View\Simple][mvc-view-simple] as a stand-alone component. This component is extremely useful when you want to render a template that is not always tied to your application structure. An example is rendering HTML code required by emails.
```php
From 97cfdd9b454ce15294a9cc75b7a4b2f286b8b4df Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 19:36:42 -0600
Subject: [PATCH 072/191] minor clarification
---
docs/filter-validation.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/filter-validation.md b/docs/filter-validation.md
index 1133f2bdd..07026f873 100644
--- a/docs/filter-validation.md
+++ b/docs/filter-validation.md
@@ -1600,7 +1600,7 @@ $validator->add(
);
```
-#### Using except for fields (SQL operation "value NOT IN (except)")
+#### Using except for fields (SQL operation "`value NOT IN (except)`")
Single field
```php
Date: Fri, 29 Dec 2023 20:40:46 -0600
Subject: [PATCH 073/191] updated compileSet()
---
docs/api/phalcon_mvc.md | 53 ++++++++++++++++++++++++++++++++++++++++-
docs/volt.md | 52 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 103 insertions(+), 2 deletions(-)
diff --git a/docs/api/phalcon_mvc.md b/docs/api/phalcon_mvc.md
index 2e96a771c..0f3d4f391 100644
--- a/docs/api/phalcon_mvc.md
+++ b/docs/api/phalcon_mvc.md
@@ -13743,7 +13743,58 @@ Compiles a "return" statement returning PHP code
```php
public function compileSet( array $statement ): string;
```
-Compiles a "set" statement returning PHP code
+Compiles a "set" statement returning PHP code. The method accepts an
+array produced by the Volt parser and creates the `set` statement in PHP.
+This method is not particularly useful in development, since it requires
+advanced knowledge of the Volt parser.
+
+```php
+ 306,
+ "assignments" => [
+ [
+ "variable" => [
+ "type" => 265,
+ "value" => "a",
+ "file" => "eval code",
+ "line" => 1
+ ],
+ "op" => 61,
+ "expr" => [
+ "type" => 360,
+ "left" => [
+ [
+ "expr" => [
+ "type" => 258,
+ "value" => "1",
+ "file" => "eval code",
+ "line" => 1
+ ],
+ "name" => "first",
+ "file" => "eval code",
+ "line" => 1
+ ]
+ ],
+ "file" => "eval code",
+ "line" => 1
+ ],
+ "file" => "eval code",
+ "line" => 1
+ ]
+ ]
+];
+
+echo $compiler->compileSet($source);
+// 1]; ?>
+```
+
```php
diff --git a/docs/volt.md b/docs/volt.md
index a5c1ad5ea..6b8d635e7 100644
--- a/docs/volt.md
+++ b/docs/volt.md
@@ -1829,7 +1829,57 @@ Compiles a `return` statement returning PHP code
```php
public function compileSet(array $statement): string
```
-Compiles a setter statement (assignment of value to variable) returning PHP code
+Compiles a "set" statement returning PHP code. The method accepts an
+array produced by the Volt parser and creates the `set` statement in PHP.
+This method is not particularly useful in development, since it requires
+advanced knowledge of the Volt parser.
+
+```php
+ 306,
+ "assignments" => [
+ [
+ "variable" => [
+ "type" => 265,
+ "value" => "a",
+ "file" => "eval code",
+ "line" => 1
+ ],
+ "op" => 61,
+ "expr" => [
+ "type" => 360,
+ "left" => [
+ [
+ "expr" => [
+ "type" => 258,
+ "value" => "1",
+ "file" => "eval code",
+ "line" => 1
+ ],
+ "name" => "first",
+ "file" => "eval code",
+ "line" => 1
+ ]
+ ],
+ "file" => "eval code",
+ "line" => 1
+ ],
+ "file" => "eval code",
+ "line" => 1
+ ]
+ ]
+];
+
+echo $compiler->compileSet($source);
+// 1]; ?>
+```
```php
public function compileString(
From 58354c87cab238494ce406ba43d6e0b9e05c2cb1 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Fri, 29 Dec 2023 21:07:50 -0600
Subject: [PATCH 074/191] added clarifications about 'allowEmpty' in forms and
validators
---
docs/filter-validation.md | 2 ++
docs/forms.md | 51 ++++++++++++++++++++++++++++++++-------
2 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/docs/filter-validation.md b/docs/filter-validation.md
index 07026f873..03093bb26 100644
--- a/docs/filter-validation.md
+++ b/docs/filter-validation.md
@@ -2021,6 +2021,8 @@ $validation->add(
);
```
+The `allowEmpty` option can also be an array of field names. The fields matching the elements of the array will validate `true` if they have empty values.
+
## Recursive Validation
You can also run Validation instances within another via the `afterValidation()` method. In this example, validating the `CompanyValidation` instance will also check the `PhoneValidation` instance:
diff --git a/docs/forms.md b/docs/forms.md
index 277e8b417..e7c7438b1 100644
--- a/docs/forms.md
+++ b/docs/forms.md
@@ -774,28 +774,38 @@ use Phalcon\Forms\Element\Text;
use Phalcon\Validation\Validator\PresenceOf;
use Phalcon\Validation\Validator\StringLength;
-$name = new Text(
- 'nameLast'
-);
-
-$name->addValidator(
+$nameLast = new Text('nameLast');
+$nameLast->addValidator(
new PresenceOf(
[
- 'message' => 'The name is required',
+ 'message' => 'The last name is required',
]
)
);
-$name->addValidator(
+$nameLast->addValidator(
new StringLength(
[
'min' => 10,
- 'messageMinimum' => 'The name is too short',
+ 'messageMinimum' => 'The last name is too short',
]
)
);
-$form->add($name);
+$form->add($nameLast);
+
+$nameFirst = new Text('nameFirst');
+$nameFirst->addValidator(
+ new StringLength(
+ [
+ 'max' => 20,
+ 'messageMaximum' => 'The first name is too long',
+ 'allowEmpty' => true,
+ ]
+ )
+);
+
+$form->add($nameFirst);
```
Then you can validate the form according to the input entered by the user:
@@ -826,6 +836,29 @@ foreach ($messages as $message) {
}
```
+### Empty Values
+You can pass the option `allowEmpty` to any of the built-in validators to ignore empty values. The `allowEmpty` option can also be an array of field names. The fields matching the elements of the array will validate `true` if they have empty values.
+
+```php
+addValidator(
+ new Regex(
+ [
+ 'message' => 'The telephone is required',
+ 'pattern' => '/\+1 [0-9]+/',
+ 'allowEmpty' => true,
+ ]
+ )
+);
+
+$form->add($telephone);
+```
+
## Rendering
You can render the form with total flexibility, the following example shows how to render each element using a standard procedure:
From 1cbf9f73b667735c9b7c6c28f2a85453b1f19a11 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 30 Dec 2023 06:52:57 -0600
Subject: [PATCH 075/191] added cancelOnFail in forms
---
docs/forms.md | 43 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/docs/forms.md b/docs/forms.md
index e7c7438b1..967e2bbb2 100644
--- a/docs/forms.md
+++ b/docs/forms.md
@@ -858,6 +858,49 @@ $telephone->addValidator(
$form->add($telephone);
```
+### Cancel on Failure
+If you wish to stop the validation chain as soon as one validation fails, you will need to pass the `cancelOnFail` option. This is particularly useful if many validators have been attached to an element and you need to inform the user if the first validator has failed and not move further, adding more errors to the messages.
+
+```php
+addValidators(
+ [
+ new PresenceOf(
+ [
+ 'message' => 'Last Name is required',
+ 'cancelOnFail' => true,
+ ]
+ ),
+ new StringLength(
+ [
+ 'min' => 3,
+ 'max' => 255,
+ 'messageMaximum' => 'Last Name cannot be more than 255 characters',
+ 'messageMinimum' => 'Last Name cannot be less than 3 characters',
+ ]
+ ),
+ ]
+);
+
+// Empty data
+$form->isValid($_POST);
+
+// Get the messages from the form
+$messages = $form->getMessages();
+
+echo count($messages);
+// 1 message
+
+echo $messages[0]->getMessage();
+// 'Last Name is required'
+```
## Rendering
You can render the form with total flexibility, the following example shows how to render each element using a standard procedure:
From a773bfd44a8b31faba9bd0a0364f5afac3185f82 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 30 Dec 2023 07:11:27 -0600
Subject: [PATCH 076/191] clarifications for model update with primary key
---
docs/api/phalcon_mvc.md | 21 +++++++++++++++------
docs/db-models.md | 10 +++++++++-
2 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/docs/api/phalcon_mvc.md b/docs/api/phalcon_mvc.md
index 0f3d4f391..8325842a9 100644
--- a/docs/api/phalcon_mvc.md
+++ b/docs/api/phalcon_mvc.md
@@ -2654,18 +2654,27 @@ Unserializes the object from a serialized string
public function update(): bool;
```
Updates a model instance. If the instance doesn't exist in the
-persistence it will throw an exception. Returning true on success or
-false otherwise.
+persistence it will throw an exception. Returning `true` on success or
+`false` otherwise.
```php
-// Updating a robot name
-$robot = Robots::findFirst("id = 100");
+name = "Biomass";
+use MyApp\Models\Invoices;
+
+$invoice = Invoices::findFirst('inv_id = 4');
+
+$invoice->inv_total = 120;
-$robot->update();
+$invoice->update();
```
+!!! warning "NOTE"
+
+ When retrieving the record with `findFirst()`, you need to get the full
+ object back (no `columns` definition) but also retrieve it using the
+ primary key. If not, the ORM will issue an `INSERT` instead of `UPDATE`.
+
```php
public function validationHasFailed(): bool;
diff --git a/docs/db-models.md b/docs/db-models.md
index d68ed9f29..e58426936 100644
--- a/docs/db-models.md
+++ b/docs/db-models.md
@@ -1068,7 +1068,9 @@ print_r(
```php
public function update(): bool
```
-Updates a model instance. If the instance doesn't exist in the persistence it will throw an exception. Returning true on success or `false` otherwise.
+Updates a model instance. If the instance doesn't exist in the
+persistence it will throw an exception. Returning `true` on success or
+`false` otherwise.
```php
inv_total = 120;
$invoice->update();
```
+!!! warning "NOTE"
+
+ When retrieving the record with `findFirst()`, you need to get the full
+ object back (no `columns` definition) but also retrieve it using the
+ primary key. If not, the ORM will issue an `INSERT` instead of `UPDATE`.
+
```php
public function writeAttribute(
string $attribute,
From 29299d9de7f8e4c8dbf67fc3923f62498b88981c Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 30 Dec 2023 07:49:59 -0600
Subject: [PATCH 077/191] added google analytics
---
mkdocs.yml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/mkdocs.yml b/mkdocs.yml
index bb7e7c0a3..dabe9436d 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -2238,6 +2238,9 @@ extra:
version:
default: 5.4.0
provider: mike
+ analytics:
+ provider: google
+ property: G-JR4REKBKH3
annotate:
json: [ .s2 ]
social:
From 72c1f6917563e140e46b12c95c00ec765b8525d4 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 30 Dec 2023 16:21:18 -0600
Subject: [PATCH 078/191] application-micro partial rewrite, config rewrite
---
docs/application-micro.md | 114 ++++++++++++++++++++++----------------
docs/config.md | 107 +++++++++++++++++++++--------------
2 files changed, 131 insertions(+), 90 deletions(-)
diff --git a/docs/application-micro.md b/docs/application-micro.md
index 6c55a4b83..f874b5737 100644
--- a/docs/application-micro.md
+++ b/docs/application-micro.md
@@ -2,7 +2,7 @@
- - -
## Overview
-Phalcon offers a very 'thin' application, so that you can create `Micro` applications with minimal PHP code and overhead. Micro applications are suitable for small applications that will have very low overhead. Such applications are usually APIs, prototypes etc.
+Phalcon provides a lightweight application structure known as `Micro` to facilitate the creation of applications with minimal PHP code and reduced overhead. `Micro` applications are well-suited for small-scale projects, such as APIs and prototypes, where efficiency and low overhead are crucial.
```php
handle(
```
## Activation
-The [Phalcon\Mvc\Micro][mvc-micro] class is the one responsible for creating a Micro application.
+To initialize a Micro application, use the [Phalcon\Mvc\Micro][mvc-micro] class.
```php
get(
!!! info "NOTE"
- Check our [routing][routing] document for more information for the [Phalcon\Mvc\Router][mvc-router]
+ Refer to our [routing][routing] document for more information about the [Phalcon\Mvc\Router][mvc-router].
**Application object**
@@ -350,7 +350,7 @@ $app->get(
**Router object**
-You can also create a [Phalcon\Mvc\Router][mvc-router] object, setting the routes there and then injecting it in the dependency injection container.
+Alternatively, you can create a [Phalcon\Mvc\Router][mvc-router] object, define the routes, and then inject it into the dependency injection container.
```php
setService('router', $router, true);
```
-Setting up your routes using the [Phalcon\Mvc\Micro][mvc-micro] applications http methods (`get`, `post`, etc.) is much easier than setting up a router object with relevant routes and then injecting it in the application. Each method has its advantages and disadvantages. It all depends on the design and needs of your application.
+Setting up routes using the [Phalcon\Mvc\Micro][mvc-micro] application's HTTP methods (`get`, `post`, etc.) is simpler than configuring a router object with relevant routes and injecting it into the application. The choice between the two approaches depends on the design and requirements of your application.
### Rewrite Rules
-In order for routes to work, your web server needs to be configured with specific instructions. Please refer to the [webserver setup][webserver-setup] document for more information.
+For routes to function correctly, your web server needs specific configurations. Refer to the [webserver setup][webserver-setup] document for detailed information.
### Handlers
-Handlers are callable pieces of code that get attached to a route. When the route is matched, the handler is executed with all the defined parameters. A handler is any valid PHP `callable`.
+Handlers are callable pieces of code attached to a route. When the route is matched, the handler executes with all the defined parameters. A handler is any valid PHP `callable`.
#### Registration
-Phalcon offers several ways to attach a handler to a route. Your application needs and design as well as coding style will be the factors influencing your choice of implementation.
+Phalcon offers several ways to attach a handler to a route. The choice depends on your application needs, design, and coding style.
**Anonymous Function**
@@ -398,7 +398,7 @@ $app->get(
);
```
-Accessing the `$app` object inside the anonymous function can be achieved by injecting it as follows:
+Accessing the `$app` object inside the anonymous function is achieved by injecting it as follows:
```php
get(
**Function**
-You can define a function as the handler and attach it to a specific route.
+Define a function as the handler and attach it to a specific route.
```php
get(
**Static Method**
-You can also use a static method as the handler.
+Use a static method as the handler.
```php
get(
**Method in an Object**
-You can also use a method in an object as the handler.
+Use a method in an object as the handler.
```php
get(
**Controllers**
-With the [Phalcon\Mvc\Micro][mvc-micro] you can create micro or _medium_ applications. Medium applications use the micro architecture but expand on it to utilize more than the Micro but less than the Full application. In medium applications you can organize handlers in controllers.
+For medium applications, which expand on the micro architecture, you can organize handlers in controllers.
```php
mount($invoices);
**Use case**
-We are developing an API for an online store. The endpoints are `/users`, `/invoices` and `/products`. Each of those endpoints are registered using handlers, and each handler is a controller with relevant actions.
+Consider an API development scenario for an online store with endpoints `/users`, `/invoices`, and `/products`. Each endpoint is registered using handlers, where each handler is a controller with relevant actions.
-The controllers that we use as handlers are as follows:
+Register the controllers:
```php
mount($products);
```
-This implementation loads each handler in turn and mounts it in our application object. The issue with this approach is that each request will result to only one endpoint and therefore one class method executed. The remaining methods/handlers will just remain in memory without being used.
+In the above approach, each handler is loaded sequentially and mounted in our application object. The drawback is that each request results in only one endpoint and, consequently, one class method executed. The remaining methods/handlers stay in memory without being utilized.
+
+By incorporating lazy loading, we reduce the number of objects loaded in memory, resulting in more efficient resource usage. The implementation changes as follows:
-Using lazy loading we reduce the number of objects loaded in memory and as a result our application uses less memory. The above implementation changes if we want to use lazy loading as follows:
```php
mount($products);
```
-Using this simple change in implementation, all handlers remain non instantiated until requested by a caller. Therefore, whenever a caller requests `/invoices/get/2`, our application will instantiate the `InvoicesController` and call the `get` method in it. Our application now uses less resources than before.
+With this simple change, all handlers remain uninstantiated until requested by a caller. Consequently, when a caller requests `/invoices/get/2`, our application instantiates the `InvoicesController` and calls the `get` method. The application now utilizes fewer resources.
#### Extra performance tip
-If you are working on a large application, there is no need to mount all the collections, even if they are lazy loaded: Phalcon will use regex to match the routes. To speed up the routing process it is possible to run a _pre-filter_ like this, using the previous example:
+For large applications, there's no need to mount all collections, even if they are lazy-loaded. Phalcon uses `regex` to match routes, and to speed up the routing process, a _pre-filter_ can be run. For instance:
```php
$uri = new \Phalcon\Http\Message\Uri($_SERVER['REQUEST_URI']);
@@ -824,10 +824,13 @@ switch ($collection) {
// ...
}
```
-In this way, Phalcon can handle tens (or hundreds) of routes without regex performance penalty: using `explode()` is faster than regex.
+
+This approach allows Phalcon to handle numerous routes without a regex performance penalty. Using `explode()` proves faster than regex.
#### Not found (404)
-Any route that has not been matched in our [Phalcon\Mvc\Micro][mvc-micro] application will cause it to try and execute the handler defined with the `notFound` method. Similar to other http methods (`get`, `post` etc.), you can register a handler in the `notFound` method which can be any callable PHP function.
+
+Any route not matched in our [Phalcon\Mvc\Micro][mvc-micro] application triggers the execution of the handler defined with the `notFound` method. Similar to other HTTP methods (`get`, `post`, etc.), you can register a handler in the `notFound` method, which can be any callable PHP function.
+
```php
notFound(
);
```
-You can also handle routes that have not been matched (404) with Middleware discussed below.
+Routes that have not been matched (404) can also be handled with Middleware, discussed below.
### HTTP methods
-The [Phalcon\Mvc\Micro][mvc-micro] application provides a set of methods to bind the HTTP method with the route it is intended to.
+The [Phalcon\Mvc\Micro][mvc-micro] application provides a set of methods to bind the HTTP method with the intended route:
**delete**
@@ -962,7 +965,7 @@ $app->put(
```
### Collections
-Collections are a handy way to group collections attached to a handler and a common prefix (if needed). For a hypothetical `/invoices` endpoint we could have the following routes:
+Collections are a convenient way to group routes attached to a handler and a common prefix (if needed). For a hypothetical /invoices endpoint, you could have the following routes:
```text
/invoices/get/{id}
@@ -971,7 +974,7 @@ Collections are a handy way to group collections attached to a handler and a com
/invoices/delete/{id}
```
-All of those routes are handled by our `InvoicesController`. We set up our routes with a collection as follows:
+All of those routes are handled by our `InvoicesController`. Set up your routes with a collection as follows:
```php
get(
);
```
-We can also enforce certain rules for each parameter by using regular expressions. The regular expression is set after the name of the parameter, separating it with `:`.
+You can enforce rules for parameters using regular expressions. The regular expression is set after the name of the parameter, separating it with `:`.
```php
get(
!!! info "NOTE"
- Check our [routing][routing] document for more information for the [Phalcon\Mvc\Router][mvc-router]
+ For more information, refer to the [routing][routing] documentation
### Redirections
+
You can redirect one matched route to another using the [Phalcon\Http\Response][http-response] object, just like in a full application.
```php
@@ -1203,9 +1208,9 @@ $app->get('/invoices/view/{id}',
!!! info "NOTE"
- We have to pass the `$app` object in our anonymous function to have access to the `request` object.
+ Make sure to pass the $app object in your anonymous function to have access to the response object.
-When using controllers as handlers, you can perform the redirect just as easy:
+When using controllers as handlers, you can perform the redirect just as easily:
```php
mount($invoices);
```
-Lastly you need the [Phalcon\Url][mvc-url] component to generate URLs for the named routes.
+Lastly, you need the [Phalcon\Url][mvc-url] component to generate URLs for the named routes.
```php
get(
```
## Dependency Injector
+
When a micro application is created, a [Phalcon\Di\FactoryDefault][di-factorydefault] services container is created automatically.
```php
@@ -1330,7 +1337,7 @@ $app->get(
);
```
-You can also create a DI container yourself, and assign it to the micro application, therefore manipulating the services depending on the needs of your application.
+You can also create a DI container yourself and assign it to the micro application, therefore manipulating the services depending on the needs of your application.
```php
get(
```
## Responses
-A micro application can return many types of responses. Direct output, use a template engine, calculated data, view based data, JSON etc.
-Handlers may return raw responses using plain text, [Phalcon\Http\Response][http-response] object or a custom-built component that implements the [Phalcon\Http\ResponseInterface][http-responseinterface].
+A micro application can return many types of responses: direct output, use a template engine, calculated data, view-based data, JSON, etc.
+
+Handlers may return raw responses using plain text, [Phalcon\Http\Response][http-response] object, or a custom-built component that implements the [Phalcon\Http\ResponseInterface][http-responseinterface].
### Direct
```php
@@ -1454,6 +1462,7 @@ $app->get(
```
### New Response
+
You can use the `setContent` method of a new [Phalcon\Http\Response][http-response] object to return the response back.
```php
@@ -1475,6 +1484,7 @@ $app->get(
```
### Application Response
+
You can also use the [Phalcon\Http\Response][http-response] from the application to return responses to the caller.
```php
@@ -1495,7 +1505,8 @@ $app->get(
```
### Return Response
-A different approach returning data back to the caller is to return the [Phalcon\Http\Response][http-response] object directly from the application. When responses are returned by handlers they are automatically sent by the application.
+
+A different approach returning data back to the caller is to return the [Phalcon\Http\Response][http-response] object directly from the application. When responses are returned by handlers, they are automatically sent by the application.
```php
get(
```
### JSON
-JSON can be sent back just as easy using the [Phalcon\Http\Response][http-response] object.
+
+JSON can be sent back just as easily using the [Phalcon\Http\Response][http-response] object.
```php
get(
```
## Events
-A [Phalcon\Mvc\Micro][mvc-micro] application works closely with an [Events Manager][events] if it is present, to trigger events that can be used throughout our application. The type of those events is `micro`. These events trigger in our application and can be attached to relevant handlers that will perform actions needed by our application.
+
+A [Phalcon\Mvc\Micro][mvc-micro] application works closely with an [Events Manager][events] if it is present, to trigger events that can be used throughout your application. The type of those events is `micro`. These events trigger in your application and can be attached to relevant handlers that will perform actions needed by your application.
### Available events
The following events are supported:
@@ -1562,6 +1575,7 @@ The following events are supported:
| `beforeNotFound` | Route has not been found | Yes |
### Authentication example
+
You can easily check whether a user has been authenticated or not using the `beforeExecuteRoute` event. The following example demonstrates such a scenario:
```php
@@ -1595,6 +1609,7 @@ $app->setEventsManager($manager);
```
### Not found example
+
You can also create a redirect for a route that does not exist (404). To do so you can use the `beforeNotFound` event. The following example demonstrates such a scenario:
```php
@@ -1622,7 +1637,8 @@ $app->setEventsManager($manager);
```
## Middleware
-Middleware are classes that can be attached to your application and introduce another layer where business logic can exist. They run sequentially, according to the order they are registered and not only improve maintainability, by encapsulating specific functionality, but also performance. A middleware class can stop execution when a particular business rule has not been satisfied, thus allowing the application to exit early without executing the full cycle of a request.
+
+Middleware refers to classes that can be attached to your application, introducing another layer where business logic can exist. They run sequentially, following the order in which they are registered. This not only enhances maintainability by encapsulating specific functionality but also improves performance. A middleware class can halt execution when a particular business rule has not been satisfied, allowing the application to exit early without executing the full cycle of a request.
!!! info "NOTE"
@@ -1645,7 +1661,7 @@ Middleware can be attached to a micro application in 3 different events. Those a
**before**
-This event is perfect for stopping execution of the application if certain criteria is not met. In the below example we are checking if the user has been authenticated and stop execution with the necessary redirect.
+This event is perfect for stopping the execution of the application if certain criteria are not met. In the example below, we check if the user has been authenticated and stop execution with the necessary redirect.
```php
path('app.name'); // PHALCON
## Factory
### `newInstance`
-We can easily create a `Phalcon\Config\Config` or any of the supporting adapter classes `Phalcon\Config\Adapter\*` by using the `new` keyword. However, Phalcon offers the `Phalcon\Config\ConfigFactory` class, so that developers can easily instantiate config objects. Calling `newInstance` with the `name`, `fileName` and a `parameters` array will return the new config object.
The allowed values for `name`, which correspond to a different adapter class are:
-
+Creating a `Phalcon\Config\Config` or any supporting adapter class (`Phalcon\Config\Adapter\*`) is straightforward using the `new` keyword. However, Phalcon offers the `Phalcon\Config\ConfigFactory` class for easy instantiation of config objects. Calling `newInstance` with the `name`, `fileName`, and a `parameters` array will return the new config object.
+
+The allowed values for `name`, corresponding to different adapter classes, are:
+
| Name | Adapter |
|-----------|-------------------------------------------|
| `grouped` | [Phalcon\Config\Adapter\Grouped][grouped] |
@@ -42,7 +45,7 @@ The allowed values for `name`, which correspond to a different adapter class are
| `php` | [Phalcon\Config\Adapter\Php][php] |
| `yaml` | [Phalcon\Config\Adapter\Yaml][yaml] |
-The example below how to create a new [PHP array][php] based adapter:
+For example, creating a new [PHP array][php] based adapter:
Given a PHP configuration file `/app/storage/config.php`
@@ -75,10 +78,11 @@ $factory = new ConfigFactory();
$config = $factory->newInstance('php', $fileName);
```
-As seen above, the third parameter for `newInstance` which is an array is not passed because it is not required. However, other adapter types use it, so you can supply it depending on the type of adapter you use. More information on what can be contained in the `parameters` array can be found in the adapters section.
+The third parameter for `newInstance`, an array, is not required in this case. However, other adapter types may use it, so you can supply it depending on the adapter type. More information on what can be contained in the `parameters` array can be found in the adapters section.
### `load`
-The Config Factory also offers the `load` method, which accepts a string or an array as a parameter. If a string is passed, it is treated as the `fileName` of the file that we need to load. The extension of the file is what determines the adapter that will be used.
+
+The `Phalcon\Config\ConfigFactory` also offers the `load` method, which accepts a string or an array as a parameter. If a string is passed, it is treated as the `fileName` of the file to load, and the file extension determines the adapter used.
```php
load($fileName);
```
-In the above example, the [PHP][php] adapter will be used (extension of the file) and the file will be loaded for you.
-
-If an array is passed, then the `adapter` element is required to specify what adapter will be created. Additionally `filePath` is required to specify where the file to load is located. More information on what can be contained in the array cam be found in the adapters section.
+If an array is passed, the `adapter` element is required to specify the adapter to create. Additionally, `filePath` is required to specify where the file to load is located. More information on what can be contained in the array can be found in the adapters section.
Given an INI configuration file `/app/storage/config.ini`
@@ -118,8 +120,12 @@ $config = $factory->load($fileName);
```
## Exceptions
+
Any exceptions thrown in the [Phalcon\Config\Config][config] component will be of type [Phalcon\Config\Exception][config-exception]. You can use this exception to selectively catch exceptions thrown only from this component.
+php
+
+
```php
app->name; // PHALCON
```
#### Path
-You can also use the `path()` method with a delimiter, to pass a string that will contain the keys separated by the delimiter:
+
+Use the `path()` method with a delimiter to pass a string with keys separated by the delimiter:
```php
path('app-name', 'default', '-'); // PHALCON
echo $config->path('app-unknown', 'default', '-'); // default
```
-You can also use the `getPathDelimiter()` and `setPathDelimiter()` methods to get or set the delimiter that the component will use. The `delimiter` parameter in the `path()` method can then be used as an override if you like, for a special case, while the default delimiter is set using the getter and setter. The default delimiter is `.`.
+Use the `getPathDelimiter()` and `setPathDelimiter()` methods to get or set the delimiter that the component will use. The `delimiter` parameter in the `path()` method can then be used as an override for a special case, while the default delimiter is set using the getter and setter. The default delimiter is `.`.
-You can also use functional programming in conjunction with `path()` to obtain configuration data:
+Functional programming in conjunction with `path()` can be used to obtain configuration data:
```php
get('name'); // PHALCON
```
-Since [Phalcon\Config\Config][config] extends [Phalcon\Support\Collection][collection] you can also pass a second parameter in the `get()` that will act as the default value returned, should the particular config element is not defined.
+Since [Phalcon\Config\Config][config] extends [Phalcon\Support\Collection][collection], you can also pass a second parameter in `get()` that will act as the default value returned if the config element is not defined.
### Merge
+
There are times that we might need to merge configuration data coming from two different config objects. For instance, we might have one config object that contains our base/default settings, while a second config object loads options that are specific to the system the application is running on (i.e. test, development, production etc.). The system specific data can come from a `.env` file and loaded with a [DotEnv][dotenv] library.
In the above scenario, we will need to merge the second configuration object with the first one. `merge()` allows us to do this, merging the two config objects recursively.
@@ -335,9 +347,10 @@ If you need to get the object back as an array `toArray()` and `toJson()` are av
For additional information, you can check the [Phalcon\Support\Collection][support-collection] documentation.
## Adapters
-Other than the base component [Phalcon\Config\Config][config], which accepts a string (file name and path) or a native PHP array, there are several available adapters that can read different file types and load the configuration from them.
-The available adapters are:
+In addition to the core component [Phalcon\Config\Config][config], designed to accept either a string (file name and path) or a native PHP array, several adapters are available. These adapters facilitate the reading of various file types to load configuration data.
+
+### Available Adapters
| Class | Description |
|-------------------------------------------|-----------------------------------------------------------------------------------------------------|
@@ -348,9 +361,10 @@ The available adapters are:
| [Phalcon\Config\Adapter\Yaml][yaml] | Loads configuration from YAML files. Requires the PHP `yaml` extension to be present in the system. |
## Grouped
-The [Phalcon\Config\Adapter\Grouped][grouped] adapter allows you to create a [Phalcon\Config\Config][config] object from multiple sources without having to create each object separately from its source and then merge them together. It accepts an array configuration with the necessary data as well as the `defaultAdapter` which is set to `php` by default.
-The first parameter of the constructor (`arrayConfig`) is a multidimensional array which requires the following options
+The [Phalcon\Config\Adapter\Grouped][grouped] adapter allows the creation of a [Phalcon\Config\Config][config] object from multiple sources without creating each object separately. It accepts an array configuration with necessary data, defaulting to php as the default adapter.
+
+Constructor parameters for the multidimensional array include:
- `adapter` - the adapter to be used
- `filePath` - the path of the configuration file
@@ -411,7 +425,7 @@ $options = [
$config = new Grouped($options);
```
-Finally, you can also use a [Phalcon\Config\Config][config] object, as an option to your grouped object.
+Lastly, a [Phalcon\Config\Config][config] object can be used as an option to the grouped object.
```php
get('adapter'); // Memory
```
-Whenever you want to use the [Phalcon\Config\ConfigFactory][config-configfactory] component, you can set the `mode` as a parameter.
+When using [Phalcon\Config\ConfigFactory][config-configfactory], set the mode as a parameter:
```php
load($options);
```
-or when using the `newInstance()` instead:
+Or when using the `newInstance()`:
```php
newinstance('ini', $fileName, $params);
Requires PHP's `json` extension to be present in the system
-JSON is a very popular format, especially when transporting data from your application to the front end or when sending back responses from an API. It can also be used as a storage for configuration data. [Phalcon\Config\Adapter\Json][json] uses `json_decode()` internally to convert a JSON file to a PHP native array and parse it accordingly.
+JSON is a widely used format, suitable for transporting data between applications and storing configuration data. [Phalcon\Config\Adapter\Json][json] internally uses `json_decode()` to convert a JSON file to a PHP native array and parse it accordingly.
+
+Example JSON file:
```json
{
@@ -547,7 +566,7 @@ JSON is a very popular format, especially when transporting data from your appli
}
```
-You can read the file as follows:
+Usage:
```php
get('adapter'); // Memory
```
-Whenever you want to use the [Phalcon\Config\ConfigFactory][config-configfactory] component, you will just need to pass the name of the file.
+For [Phalcon\Config\ConfigFactory][config-configfactory], pass the file name:
```php
load($options);
```
-or when using the `newInstance()` instead:
+or when using the `newInstance()`:
```php
newinstance('json', $fileName);
```
## Php
-The [Phalcon\Config\Adapter\Php][php] adapter reads a PHP file that returns an array and loads it in the [Phalcon\Config\Config][config] object. You can store your configuration as a PHP array in a file and return the array back. The adapter will read it and parse it accordingly.
+
+The [Phalcon\Config\Adapter\Php][php] adapter reads a PHP file that returns an array, loading it into the [Phalcon\Config\Config][config] object. Configuration can be stored as a PHP array in a file, and the adapter will read and parse it accordingly.
+
+Example PHP file:
```php
get('adapter'); // Memory
```
-Whenever you want to use the [Phalcon\Config\ConfigFactory][config-configfactory] component, you will just need to pass the name of the file.
+For [Phalcon\Config\ConfigFactory][config-configfactory], pass the file name:
```php
load($options);
```
-or when using the `newInstance()` instead:
+or when using the `newInstance()`:
```php
newinstance('php', $fileName);
Requires PHP's yaml extension to be present in the system
-Another common file format is YAML. [Phalcon\Config\Adapter\Yaml][yaml] requires the `yaml` PHP extension to be present in your system. It uses the PHP function [yaml_parse_file][yaml-parse-file] to read these files. The adapter reads a `yaml` file supplied as the first parameter of the constructor, but also accepts a second parameter `callbacks` as an array. The `callbacks` supplies content handlers for YAML nodes. It is an associative array of `tag => callable` mappings.
+YAML is another common file format, and [Phalcon\Config\Adapter\Yaml][yaml] requires the `yaml` PHP extension. It uses the PHP function [yaml_parse_file][yaml-parse-file] to read YAML files. The adapter accepts a second parameter, callbacks, as an array supplying content handlers for YAML nodes.
+
+Example YAML file:
```yaml
app:
@@ -697,7 +721,7 @@ loggers:
name: redis
```
-You can read the file as follows:
+Usage:
```php
get('adapter'); // Memory
```
-Whenever you want to use the [Phalcon\Config\ConfigFactory][config-configfactory] component, you can set the `mode` as a parameter.
+For [Phalcon\Config\ConfigFactory][config-configfactory], set the mode as a parameter:
```php
load($options);
```
-or when using the `newInstance()` instead:
+or when using the `newInstance()`:
```php
newinstance('yaml', $fileName, $callbacks);
```
## Custom Adapters
-There are more adapters available for Config in the [Phalcon Incubator][phalcon-incubator]
+For additional adapters, explore the [Phalcon Incubator][phalcon-incubator].
## Dependency Injection
-As with most Phalcon components, you can store the [Phalcon\Config\Config][config] object in your [Phalcon\Di\Di][di] container. By doing so, you will be able to access your configuration object from controllers, models, views and any component that implements `Injectable`.
-An example of the registration of the service as well as accessing it is below:
+As with most Phalcon components, you can store the [Phalcon\Config\Config][config] object in your [Phalcon\Di\Di][di] container. By doing so, you can access your configuration object from controllers, models, views, and any component that implements `Injectable`.
+
+Example of service registration and access in the container:
```php
set(
);
```
-The component is now available in your controllers using the `config` key
+The component is now accessible in controllers using the `config` key:
```php
Date: Sat, 30 Dec 2023 16:39:14 -0600
Subject: [PATCH 079/191] alterations based on feedback
---
docs/config.md | 70 +++++++++++++++++++++++++++-----------------------
1 file changed, 38 insertions(+), 32 deletions(-)
diff --git a/docs/config.md b/docs/config.md
index 488a7ff39..4c8b8a8af 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -3,8 +3,12 @@
## Overview
-Almost all applications require configuration data for proper operation. This configuration includes parameters and initial settings such as the location of log files, database connection values, registered services, etc. The [Phalcon\Config\Config][config] is designed to store this configuration data in an easy, object-oriented way. This component can be instantiated using a PHP array directly or by reading configuration files from various formats, as described further down in the adapters section. [Phalcon\Config\Config][config] extends the [Phalcon\Support\Collection][collection] object, inheriting its functionality.
-
+Almost all applications require configuration data for proper operation. This configuration includes parameters and initial settings such as the location of log files, database connection values, registered services, etc. The [Phalcon\Config\Config][config] is designed to store this configuration data in an easy, object-oriented way.
+
+It represents a tree whose leaves are configuration values. Each child node of a [Phalcon\Config\Config][config] is named, and is either an external node which contains a configuration value or a sub-collection which is itself a [Phalcon\Config\Config][config] instance holding nested values. It provides methods to access such configuration collections. Each [Phalcon\Config\Config][config] instance represents a virtual object which can be traversed in the fashion of true object properties.
+
+This component can be instantiated using a PHP array directly or by reading configuration files from various formats, as described further down in the adapters section. [Phalcon\Config\Config][config] extends the [Phalcon\Support\Collection][collection] object, inheriting its functionality.
+
```php
app->name; // PHALCON
```
-#### Path
+### Get
-Use the `path()` method with a delimiter to pass a string with keys separated by the delimiter:
+Use the `get()` method and chain it to traverse nested objects:
```php
path('app.name'); // PHALCON
+echo $config
+ ->get('app')
+ ->get('name'); // PHALCON
+```
+
+Since [Phalcon\Config\Config][config] extends [Phalcon\Support\Collection][collection], you can also pass a second parameter in `get()` that will act as the default value returned if the config element is not defined.
+
+## Path
+
+Using `path()` allows for easy retrieval of the value of a nested key, however deep that might be. A delimited string is passed, representing each level of the object, separating nesting with the use of a delimiter (by default `.`). As such, with one call, we can retrieve a value that is nested deep within the Config object.
+
+```php
+get('app')->get('name'); // PHALCON
+
+echo $config->path('app.name'); // PHALCON
```
`path()` also accepts a `defaultValue` which, if set, will be returned if the element is not found or is not set in the config object. The last parameter of `path()` is the delimiter to be used for splitting the passed string (`path`) which also denotes the nesting level.
@@ -236,21 +256,7 @@ echo config('app-name', 'default', '-'); // PHALCON
echo config('app-unknown', 'default', '-'); // default
```
-#### Get
-
-Use the `get()` method and chain it to traverse nested objects:
-
-```php
-get('app')
- ->get('name'); // PHALCON
-```
-
-Since [Phalcon\Config\Config][config] extends [Phalcon\Support\Collection][collection], you can also pass a second parameter in `get()` that will act as the default value returned if the config element is not defined.
-
-### Merge
+## Merge
There are times that we might need to merge configuration data coming from two different config objects. For instance, we might have one config object that contains our base/default settings, while a second config object loads options that are specific to the system the application is running on (i.e. test, development, production etc.). The system specific data can come from a `.env` file and loaded with a [DotEnv][dotenv] library.
@@ -332,16 +338,16 @@ Phalcon\Config Object
)
```
-### Has
+## Has
Using `has()` you can determine if a particular key exists in the collection.
-### Set
+## Set
The component also supports `set()` which allows you to programmatically add or change loaded data.
-### Serialization
+## Serialization
The object can be serialized and saved in a file or a cache service using the `serialize()` method. The reverse can be achieved using the `unserialize` method
-### `toArray` / `toJson`
+## `toArray` / `toJson`
If you need to get the object back as an array `toArray()` and `toJson()` are available.
For additional information, you can check the [Phalcon\Support\Collection][support-collection] documentation.
@@ -360,7 +366,7 @@ In addition to the core component [Phalcon\Config\Config][config], designed to a
| [Phalcon\Config\Adapter\Php][php] | Loads configuration from PHP multidimensional arrays. This adapter offers the best performance. |
| [Phalcon\Config\Adapter\Yaml][yaml] | Loads configuration from YAML files. Requires the PHP `yaml` extension to be present in the system. |
-## Grouped
+### Grouped
The [Phalcon\Config\Adapter\Grouped][grouped] adapter allows the creation of a [Phalcon\Config\Config][config] object from multiple sources without creating each object separately. It accepts an array configuration with necessary data, defaulting to php as the default adapter.
@@ -460,7 +466,7 @@ $options = [
$config = new Grouped($options);
```
-## Ini
+### Ini
The [Phalcon\Config\Adapter\Ini][ini] adapter uses the optimized PHP function [parse_ini_file][parse-ini-file] to read configuration from INI files. Each section represents a top-level element, and sub-elements are nested if keys contain the . separator. The default scanning method is `INI_SCANNER_RAW`, but this can be overridden by passing a different mode in the constructor.
@@ -539,7 +545,7 @@ $params = [
$config = $factory->newinstance('ini', $fileName, $params);
```
-## Json
+### Json
!!! info "NOTE"
@@ -616,7 +622,7 @@ $factory = new ConfigFactory();
$config = $factory->newinstance('json', $fileName);
```
-## Php
+### Php
The [Phalcon\Config\Adapter\Php][php] adapter reads a PHP file that returns an array, loading it into the [Phalcon\Config\Config][config] object. Configuration can be stored as a PHP array in a file, and the adapter will read and parse it accordingly.
@@ -691,7 +697,7 @@ $factory = new ConfigFactory();
$config = $factory->newinstance('php', $fileName);
```
-## Yaml
+### Yaml
!!! info "NOTE"
@@ -791,7 +797,7 @@ $callbacks = [
$config = $factory->newinstance('yaml', $fileName, $callbacks);
```
-## Custom Adapters
+### Custom
For additional adapters, explore the [Phalcon Incubator][phalcon-incubator].
## Dependency Injection
From fd4aa53375ab96973f86d4ef0669a866972a5880 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 30 Dec 2023 17:54:23 -0600
Subject: [PATCH 080/191] correcting repo link
---
mkdocs.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mkdocs.yml b/mkdocs.yml
index dabe9436d..29661476b 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -8,8 +8,8 @@ site_description: >-
offering lower resource consumption and high performance.
# Repository
-repo_name: phalcon/docs
-repo_url: https://github.com/phalcon/docs
+repo_name: phalcon/documentation
+repo_url: https://github.com/phalcon/documentation
# Copyright
copyright: Copyright © 2012 - present Phalcon Team
From da43961b2f267ae0b12fbd12de7c1e5e95807a89 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sun, 31 Dec 2023 10:07:59 -0600
Subject: [PATCH 081/191] adjustments to the text
---
docs/config.md | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/docs/config.md b/docs/config.md
index 4c8b8a8af..a70f33db8 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -7,7 +7,7 @@ Almost all applications require configuration data for proper operation. This co
It represents a tree whose leaves are configuration values. Each child node of a [Phalcon\Config\Config][config] is named, and is either an external node which contains a configuration value or a sub-collection which is itself a [Phalcon\Config\Config][config] instance holding nested values. It provides methods to access such configuration collections. Each [Phalcon\Config\Config][config] instance represents a virtual object which can be traversed in the fashion of true object properties.
-This component can be instantiated using a PHP array directly or by reading configuration files from various formats, as described further down in the adapters section. [Phalcon\Config\Config][config] extends the [Phalcon\Support\Collection][collection] object, inheriting its functionality.
+This class can be instantiated using a PHP array directly or by reading configuration files from various formats, as described further down in the adapters section. [Phalcon\Config\Config][config] extends the [Phalcon\Support\Collection][collection] object, inheriting its functionality.
```php
app->name; // PHALCON
```
-### Get
+### `get()`
Use the `get()` method and chain it to traverse nested objects:
@@ -200,7 +200,7 @@ Since [Phalcon\Config\Config][config] extends [Phalcon\Support\Collection][colle
## Path
-Using `path()` allows for easy retrieval of the value of a nested key, however deep that might be. A delimited string is passed, representing each level of the object, separating nesting with the use of a delimiter (by default `.`). As such, with one call, we can retrieve a value that is nested deep within the Config object.
+Using `path()` allows for easy retrieval of a sub-item, however deep it might be. The mandatory argument is a string indicating the requested node's path. The string is a pathname containing the names of each of the node's ancestors and its own, starting from level 1. The root node's pathname is the empty string and a level 1 node's pathname is its own name. The pathname of a node at level 2 or more consists of its parent's pathname followed by the delimiter (by default `.`) followed by its name.
```php
get('app')->get('name'); // PHALCON
echo $config->path('app.name'); // PHALCON
```
-`path()` also accepts a `defaultValue` which, if set, will be returned if the element is not found or is not set in the config object. The last parameter of `path()` is the delimiter to be used for splitting the passed string (`path`) which also denotes the nesting level.
+`path()` also accepts a `defaultValue` which, if set, will be returned if the element is not found or is not set in the config object. The last parameter `path()` accepts is the delimiter which separates the names in the pathname (mandatory argument).
```php
path('app-name', 'default', '-'); // PHALCON
echo $config->path('app-unknown', 'default', '-'); // default
```
-Use the `getPathDelimiter()` and `setPathDelimiter()` methods to get or set the delimiter that the component will use. The `delimiter` parameter in the `path()` method can then be used as an override for a special case, while the default delimiter is set using the getter and setter. The default delimiter is `.`.
+Use the `getPathDelimiter()` and `setPathDelimiter()` methods to get and set the delimiter that the Config will use by default.
Functional programming in conjunction with `path()` can be used to obtain configuration data:
@@ -256,6 +256,10 @@ echo config('app-name', 'default', '-'); // PHALCON
echo config('app-unknown', 'default', '-'); // default
```
+!!! warning "NOTE"
+
+ If the keys from your data contain special characters such as `.`, `-` etc., and you choose to use the same character for your delimiter when using the `path()` method, you will not get the desired results back, since `path()` will interpret the delimiter as a new nested level.
+
## Merge
There are times that we might need to merge configuration data coming from two different config objects. For instance, we might have one config object that contains our base/default settings, while a second config object loads options that are specific to the system the application is running on (i.e. test, development, production etc.). The system specific data can come from a `.env` file and loaded with a [DotEnv][dotenv] library.
From 76a1743e985d189a12d6646466f638b18555ac7f Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sun, 31 Dec 2023 10:48:42 -0600
Subject: [PATCH 082/191] micro and assets rework
---
docs/application-micro.md | 93 ++++++++++++++++++++-------------------
docs/assets.md | 83 ++++++++++++++++++++++------------
2 files changed, 102 insertions(+), 74 deletions(-)
diff --git a/docs/application-micro.md b/docs/application-micro.md
index f874b5737..ebf598418 100644
--- a/docs/application-micro.md
+++ b/docs/application-micro.md
@@ -1638,16 +1638,16 @@ $app->setEventsManager($manager);
## Middleware
-Middleware refers to classes that can be attached to your application, introducing another layer where business logic can exist. They run sequentially, following the order in which they are registered. This not only enhances maintainability by encapsulating specific functionality but also improves performance. A middleware class can halt execution when a particular business rule has not been satisfied, allowing the application to exit early without executing the full cycle of a request.
+Middleware in the context of the Micro application refers to classes that can be attached to enhance the application's architecture. These classes introduce an additional layer where business logic can be encapsulated, running sequentially based on their registration order. This not only contributes to maintainability by modularizing specific functionality but also enhances performance. Middleware classes can interrupt the execution flow when a specific business rule is not satisfied, allowing the application to exit early without completing the full request cycle.
!!! info "NOTE"
- The middleware handled by the Micro application **are not** compatible with [PSR-15][psr-15]. In future versions of Phalcon, the whole HTTP layer will be rewritten to align with PSR-7 and PSR-15.
+ The middleware managed by the Micro application is not compatible with [PSR-15][psr-15]. Future versions of Phalcon are expected to align the entire HTTP layer with PSR-7 and PSR-15.
-The presence of a [Phalcon\Events\Manager][events-manager] is essential for middleware to operate, so it has to be registered in our DI container.
+The presence of a [Phalcon\Events\Manager][events-manager] is crucial for middleware to operate; therefore, it must be registered in our Dependency Injection (DI) container.
### Attached events
-Middleware can be attached to a micro application in 3 different events. Those are:
+Middleware can be attached to a Micro application in three different events:
| Event | Description |
|----------|------------------------------------------------|
@@ -1657,11 +1657,11 @@ Middleware can be attached to a micro application in 3 different events. Those a
!!! warning "NOTE"
- You can attach as many middleware classes as you want in each of the above events. They will be executed sequentially when the relevant event fires.
+ Multiple middleware classes can be attached to each of the above events, and they will be executed sequentially when the relevant event fires.
-**before**
+`before` Event
+This event is ideal for halting the execution of the application if certain criteria are not met. In the following example, we check if the user is authenticated and halt execution with the necessary redirect.
-This event is perfect for stopping the execution of the application if certain criteria are not met. In the example below, we check if the user has been authenticated and stop execution with the necessary redirect.
```php
before(
);
```
-The code above executes before every route is executed. Returning `false` cancels the route execution.
+The code above executes before every route and returning `false` cancels the route execution.
-**after**
+`after` Event
-This event can be used to manipulate data or perform actions that are needed after the handler has finished executing.
+This event can be used to manipulate data or perform actions needed after the handler has finished executing.
```php
after(
}
);
```
-In the above example, the handler returns an array of data. The `after` event calls `json_encode` on it, thus returning valid JSON.
+In the above example, the handler returns an array of data, and the after event calls `json_encode`, returning valid JSON.
!!! info "NOTE"
- You will need to do a bit more work here to set the necessary headers for JSON. An alternative to the above code would be to use the Response object and `setJsonContent`
+ Additional work may be needed to set the necessary headers for JSON. An alternative to the above code would be to use the Response object and `setJsonContent`.
-**finish**
+`finish` Event
-This even will fire up when the whole request cycle has been completed.
+This event fires when the entire request cycle is completed.
```php
finish(
}
);
```
-In the above example we utilize the `finish` event to do some cache cleaning.
+In the above example, the `finish` event is utilized for cache cleaning.
### Activation
-Attaching middleware to your application is very easy as shown above, with the `before`, `after` and `finish` method calls.
+
+Attaching middleware to your application is straightforward using the `before`, `after`, and `finish` method calls.
```php
after(
);
```
-You can also use classes and attach them to the Events Manager as listener. Using this approach offers more flexibility and reduces the bootstrap file size, since the middleware logic is encapsulated in one file per middleware.
+Alternatively, classes can be used and attached to the Events Manager as listeners, providing more flexibility and reducing the bootstrap file size.
```php
after(
$application->setEventsManager($manager);
```
-We need a [Phalcon\Events\Manager][events-manager] object. This can be a newly instantiated object, or we can get the one that exists in our DI container (if you have used the `FactoryDefault` one, or if you have not set up a DI container, since it will be automatically created for you).
-
-We attach every middleware class in the `micro` hook in the Events Manager. We could also be a bit more specific and attach it to say the `micro:beforeExecuteRoute` event.
-
-We then attach the middleware class in our application on one of the three listening events discussed above (`before`, `after`, `finish`).
+A [Phalcon\Events\Manager][events-manager] object is required, and middleware classes are attached to the `micro` hook in the Events Manager. More specificity can be achieved by attaching classes to specific events, such as `micro:beforeExecuteRoute`.
### Implementation
-Middleware can be any kind of PHP callable functions. You can organize your code whichever way you like it to implement middleware. If you choose to use classes for your middleware, you will need them to implement the [Phalcon\Mvc\Micro\MiddlewareInterface][mvc-micro-middlewareinterface]
+
+Middleware can be any PHP callable function, and you have the flexibility to organize your code according to your preferences. If you choose to use classes for your middleware, they need to implement the [Phalcon\Mvc\Micro\MiddlewareInterface][mvc-micro-middlewareinterface].
```php
handle(
```
### Model injection
+
By using the [Phalcon\Mvc\Model\Binder][mvc-model-binder] class you can inject model instances into your routes:
```php
@@ -2322,12 +2321,14 @@ $app->handle(
$_SERVER["REQUEST_URI"]
);
```
-Since the Binder object is using internally PHP's Reflection API which requires additional CPU cycles, there is an option to set a cache to speed up the process. This can be done by using the second argument of `setModelBinder()` which can also accept a service name or just by passing a cache instance to the `Binder` constructor.
-Currently, the binder will only use the models primary key to perform a `findFirst()` on. An example route for the above would be `/invoices/view/1`.
+Since the Binder object uses PHP's Reflection API internally, which requires additional CPU cycles, there is an option to set a cache to speed up the process. This can be done by using the second argument of `setModelBinder()`, which can also accept a service name or just by passing a cache instance to the `Binder` constructor.
+
+Currently, the binder will only use the model's primary key to perform a `findFirst()`. An example route for the above would be `/invoices/view/1`.
### Views
-[Phalcon\Mvc\Micro][mvc-micro] does not have inherently a view service. We can however use the [Phalcon\Mvc\View\Simple][mvc-view-simple] component to render views.
+
+[Phalcon\Mvc\Micro][mvc-micro] does not inherently have a view service. However, you can use the [Phalcon\Mvc\View\Simple][mvc-view-simple] component to render views.
```php
get(
!!! warning "NOTE"
- The above example uses the [Phalcon\Mvc\View\Simple][mvc-view-simple] component, which uses relative paths instead of controllers and actions. You can use the [Phalcon\Mvc\View][mvc-view] component instead, but to do so you will need to change the parameters passed to `render()`.
+ The above example uses the [Phalcon\Mvc\View\Simple][mvc-view-simple] component, which uses relative paths instead of controllers and actions. You can use the [Phalcon\Mvc\View][mvc-view] component instead, but to do so, you will need to change the parameters passed to `render()`.
```php
get(
```
## Exceptions
+
Any exceptions thrown in the [Phalcon\Mvc\Micro][mvc-micro] component will be of type [Phalcon\Mvc\Micro\Exception][mvc-micro-exception]. You can use this exception to selectively catch exceptions thrown only from this component.
```php
@@ -2423,6 +2425,7 @@ try {
```
### Error Handling
+
The [Phalcon\Mvc\Micro][mvc-micro] application also has an `error` method, which can be used to trap any errors that originate from exceptions. The following code snippet shows basic usage of this feature:
```php
diff --git a/docs/assets.md b/docs/assets.md
index 0ca3981df..ee244e941 100644
--- a/docs/assets.md
+++ b/docs/assets.md
@@ -2,9 +2,10 @@
- - -
## Overview
-`Phalcon\Assets` is a component that allows you to manage static assets such as CSS stylesheets or JavaScript libraries in a web application.
-[Phalcon\Assets\Manager][assets-manager] is the component you can use to register your assets and use them throughout your application. If you are using the [Phalcon\Di\FactoryDefault][di-factorydefault] container, the Assets Manager is already registered for you. You can access it using the `assets` key from your Di container.
+`Phalcon\Assets` is a component that facilitates the management of static assets, such as CSS stylesheets or JavaScript libraries, in a web application.
+
+[Phalcon\Assets\Manager][assets-manager] is the key component for registering and utilizing assets in your application. If you are using the [Phalcon\Di\FactoryDefault][di-factorydefault] container, the Assets Manager is already registered and can be accessed using the `assets` key from your Di container.
```php
set(
)
```
-If you do use the [Phalcon\Di\FactoryDefault][di-factorydefault], the [Phalcon\Html\TagFactory][html-tagfactory] is already registered as a service with the name `tag` and automatically injected in the constructor of [Phalcon\Assets\Manager][assets-manager]. This is to ensure that objects are reused and memory usage is kept to a minimum. If you are registering the [Phalcon\Assets\Manager][assets-manager] on your own, and you already have the [Phalcon\Html\TagFactory][html-tagfactory] registered in your container, you can reuse it without creating a new instance.
+If you are using the [Phalcon\Di\FactoryDefault][di-factorydefault], the [Phalcon\Html\TagFactory][html-tagfactory] is already registered as a service with the name `tag` and automatically injected into the constructor of [Phalcon\Assets\Manager][assets-manager]. This ensures object reuse and minimal memory usage. If you register the [Phalcon\Assets\Manager][assets-manager] yourself and already have [Phalcon\Html\TagFactory][html-tagfactory] in your container, you can reuse it without creating a new instance.
## Assets
-Assets can be added to the manager or a collection using the Asset related classes. The [Phalcon\Assets\Asset][asset] class. The object accepts the necessary data to create the asset.
-
+
+Assets are added to the manager or a collection using the Asset-related classes. The [Phalcon\Assets\Asset][asset] class is fundamental. It accepts the necessary data to create an asset.
+
**type**
can be `css`, `js` or something else, depending on whether you want to extend the functionality of the component.
@@ -68,8 +70,7 @@ version of the asset
let the component auto version this asset or not
-
-Each asset has a unique key assigned to it. The key is computed using `sha256` and it is calculated as:
+Each asset has a unique key assigned to it. The key is computed using `sha256`, calculated as:
```php
$this->getType() . ":" . $this->getPath()
@@ -94,6 +95,7 @@ $asset = new Asset(
```
#### CSS
+
You can also use the [Phalcon\Assets\Asset\Css][asset-css] class to create a CSS asset. This class is a helper class that extends the [Phalcon\Assets\Asset][asset] class and internally sets the first parameter to `css`.
```php
@@ -112,6 +114,7 @@ $asset = new Css(
```
#### JS
+
You can also use the [Phalcon\Assets\Asset\Js][asset-js] class to create a JS asset. This class is a helper class that extends the [Phalcon\Assets\Asset][asset] class and internally sets the first parameter to `js`.
```php
@@ -130,6 +133,7 @@ $asset = new Js(
```
### Inline
+
There are times that the application needs generated CSS or JS to be injected into the view. You can use the [Phalcon\Assets\Inline][asset-inline] class to generate this content. The object can be created with the following parameters:
**type**
@@ -159,6 +163,7 @@ $asset = new Inline(
);
```
#### CSS
+
You can also use the [Phalcon\Assets\Inline\Css][asset-inline-css] class to create an inline CSS asset. This class is a helper class that extends the [Phalcon\Assets\Inline][asset-inline] class and internally sets the first parameter to `css`.
```php
@@ -172,6 +177,7 @@ $asset = new Css(
```
#### JS
+
You can also use the [Phalcon\Assets\Inline\Js][asset-inline-js] class to create an inline JS asset. This class is a helper class that extends the [Phalcon\Assets\Inline][asset-inline] class and internally sets the first parameter to `js`.
```php
@@ -185,7 +191,8 @@ $asset = new Js(
```
### Custom
-Implementing the [Phalcon\Assets\AssetInterface][asset-interface] enables you to create different asset classes that can be handled by the Asset Manager.
+
+Implementing the [Phalcon\Assets\AssetInterface][asset-interface] enables you to create different asset classes that can be handled by the [Assets Manager][assets-manager].
## Exception
Any exceptions thrown in the Assets Manager component will be of type [Phalcon\Assets\Exception][asset-exception]. You can use this exception to selectively catch exceptions thrown only from this component.
@@ -213,7 +220,8 @@ class IndexController extends Controller
## Adding Assets
### Files
-`Phalcon\Assets\Manager` supports two built-in assets: CSS and JavaScript assets. You can also create other asset types if you need. The assets manager internally stores two default collections of assets - one for JavaScript and another for CSS.
+
+[Phalcon\Assets\Manager][assets-manager] supports two built-in assets: CSS and JavaScript assets. You can also create other asset types if you need. The assets manager internally stores two default collections of assets - one for JavaScript and another for CSS.
You can easily add assets to these collections:
@@ -265,6 +273,7 @@ class IndexController extends Controller
```
### Inline
+
You can also add inline assets to the manager. Inline assets represent strings of CSS or JS that need to be injected in your views dynamically (not from an asset file). `addInlineCode()`, `addInlineCodeByType()`, `addInlineCss()` and `addInlineJs()` are available for your use.
```php
@@ -296,11 +305,12 @@ $manager
```
## Local/Remote Assets
-Local assets are those who are provided by the same application, and they are located in a public location (usually `public`). The URLs for local assets are generated using the [url][url] service.
-Remote assets are those such as common libraries like [jQuery][jquery], [Bootstrap][bootstrap], etc. that are provided by a [CDN][cdn].
+Local assets are those provided by the same application, located in a public location (usually `public`). The URLs for local assets are generated using the [url][url] service.
+
+Remote assets are those like common libraries such as [jQuery][jquery], [Bootstrap][bootstrap], etc., provided by a [CDN][cdn].
-The second parameter of `addCss()` and `addJs()` signifies whether asset is local or not (`true` is local, `false` is remote). By default, the assets manager will assume the asset is local:
+The second parameter of `addCss()` and `addJs()` signifies whether the asset is local or not (`true` is local, `false` is remote). By default, the assets manager will assume the asset is local:
```php
addJs('js/bootstrap.min.js');
```
### Get
-The _getter_ methods exposed by the component, allow you to get the collection from anywhere in your code and manipulate it according to your needs. The manager offers `get()`, `getCollection()`, `getCss()` and `getJs()`. These methods will return the collection that the manager stores. The `getCss()` and `getJs()` will return the built-in - pre registered - collections.
-The `collection()` method acts as a _creator_ and _getter_ at the same time. It allows you to create a collection and get it back so that you can then add assets to it. The `getCss()` and `getJs()` perform the same function i.e. create the collection if it does not exist and return it. Those two collections set the predefined `css` and `js` collections in the manager.
+The _getter_ methods exposed by the component allow you to retrieve the collection from anywhere in your code and manipulate it according to your needs. The manager offers `get()`, `getCollection()`, `getCss()`, and `getJs()`. These methods will return the collection stored by the manager. The getCss() and getJs() methods return the built-in, pre-registered collections.
+
+The `collection()` method acts as a creator and getter at the same time. It allows you to create a collection and retrieve it so that you can then add assets to it. The `getCss()` and `getJs()` methods perform the same function, creating the collection if it does not exist and returning it. These two collections set the predefined `css` and `js` collections in the manager.
```php
assets->set('outputJs', $collection);
```
## URL Prefixes
+
Collections can be URL-prefixed, allowing you to change the prefix easily based on the needs of your application. An example of this can be changing from local to production environments and using a different [CDN][cdn] URL for your assets:
```php
@@ -405,9 +417,11 @@ $headerCollection = $this
```
### Built-In Filters
-Assets can be filtered i.e. manipulated before their output to the view. Although Phalcon v3 offered minifiers for JavaScript and CSS, license limitations do not allow us to continue using those libraries. For v5 we are offering only the [Phalcon\Assets\Filters\None][filter-none] filter (which does not change the asset contents) and the [Phalcon\Assets\FilterInterface][filter-interface] interface, offering the ability to create custom filters.
+
+Assets can be filtered, i.e., manipulated before their output to the view. Although Phalcon v3 offered minifiers for JavaScript and CSS, license limitations do not allow us to continue using those libraries. For v5, we offer only the [Phalcon\Assets\Filters\None][filter-none] filter (which does not change the asset contents) and the [Phalcon\Assets\FilterInterface][filter-interface] interface, offering the ability to create custom filters.
### Custom Filters
+
Creating custom filters is very easy. You can use this extensibility to take advantage of existing and more advanced filtering/minification tools like [YUI][yui], [Sass][sass], [Closure][closure], etc.:
```php
@@ -507,6 +521,7 @@ class LicenseStamper implements FilterInterface
```
## Output
+
After all the assets have been added to their relevant collections you can use the output methods to _print_ HTML in your views. These methods are `output()`, `outputCss()`, `outputJs()`, `outputInline()`, `outputInlineCss()` and `outputInlineJs()`.
To output files:
@@ -634,7 +649,8 @@ The lines above will be translated to:
```
## Custom Output
-The `outputJs()` and `outputCss()` methods are available to generate the necessary HTML code according to each type of assets. You can override this method or print the assets manually in the following way:
+
+The `outputJs()` and `outputCss()` methods generate the necessary HTML code for each type of asset. You can override this method or print the assets manually, as shown below:
```php
```
!!! warning "NOTE"
- Using the auto version feature is not recommended for production environments, since Phalcon will need to read the modification time of the asset file for every request. This will result to unnecessary read operations on the file system.
+ Using the auto version feature is not recommended for production environments due to unnecessary file system read operations.
## Improving Performance
-There are many ways to optimize processing assets. One method is to allow your web server to handle the assets, thus improving response time. First we need to set up the Assets Manager. We will use a base controller, but you can use the manager anywhere you need to, accessing it from the Di container:
+
+To optimize processing assets, one method is to allow your web server to handle the assets, improving response time. Here's how you can set up the [Assets Manager][assets-manager]:
+
+**Base Controller**
```php
addGet(
// ...
```
-Finally, we need to create a controller to handle asset requests:
+**AssetsController**
```php
Date: Mon, 1 Jan 2024 17:40:58 +0200
Subject: [PATCH 083/191] fix supporters block on dark mode (#52)
---
docs/assets/css/extra.css | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 8321158a3..bcb35dc63 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -39,10 +39,8 @@
border-bottom-color: #273646;
}
-[data-md-color-scheme="state"] {
- .phalcon-blog__sponsors-items a {
- background-color: #ffffffb3;
- }
+[data-md-color-scheme="state"] .phalcon-blog__sponsors-items a {
+ background-color: #ffffffb3;
}
/* Releases page table */
From a830a7ac49a0435c1904bee5ec005e8987aff1ef Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Mon, 1 Jan 2024 15:27:56 -0600
Subject: [PATCH 084/191] corrections to docblocks
---
docs/api/phalcon_mvc.md | 54 +++++++++++++++++++++--------------------
1 file changed, 28 insertions(+), 26 deletions(-)
diff --git a/docs/api/phalcon_mvc.md b/docs/api/phalcon_mvc.md
index 8325842a9..485017387 100644
--- a/docs/api/phalcon_mvc.md
+++ b/docs/api/phalcon_mvc.md
@@ -3598,36 +3598,37 @@ This method replaces all previously set cache options
```php
public function columns( mixed $columns ): CriteriaInterface;
```
-
+
Sets the columns to be queried. The columns can be either a `string` or
-an `array`. The string can specify one or more columns, separated by
-commas, the same way that one uses the SQL select statement. You can
-use aliases, aggregate functions etc. If you need to reference other
-models you will need to reference them with their namespaces.
+an `array` of strings. The string can specify one or more columns,
+separated by commas, the same way that one uses the SQL select statement.
+You can use aliases, aggregate functions, etc. If you need to reference
+other models you will need to reference them with their namespaces.
When using an array as a parameter, you will need to specify one field
-per element. If a key is defined in our array, it will be used as the
-alias in the query
+per array element. If a non numeric key is defined in the array, it will
+be used as the alias in the query
```php
columns("id, name");
+$criteria->columns("id, category");
// Array, one column per element
$criteria->columns(
[
- "id",
- "name",
+ "inv_id",
+ "inv_total",
]
);
-// Array, named keys. The name of the key acts as an alias (`AS` clause)
+// Array with named key. The name of the key acts as an
+// alias (`AS` clause)
$criteria->columns(
[
- "name",
- "number" => "COUNT(*)",
+ "inv_cst_id",
+ "total_invoices" => "COUNT(*)",
]
);
@@ -7208,34 +7209,35 @@ public function columns( mixed $columns ): BuilderInterface;
```
Sets the columns to be queried. The columns can be either a `string` or
-an `array`. The string can specify one or more columns, separated by
-commas, the same way that one uses the SQL select statement. You can
-use aliases, aggregate functions etc. If you need to reference other
-models you will need to reference them with their namespaces.
+an `array` of strings. The string can specify one or more columns,
+separated by commas, the same way that one uses the SQL select statement.
+You can use aliases, aggregate functions, etc. If you need to reference
+other models you will need to reference them with their namespaces.
When using an array as a parameter, you will need to specify one field
-per element. If a key is defined in our array, it will be used as the
-alias in the query
+per array element. If a non-numeric key is defined in the array, it will
+be used as the alias in the query
```php
columns("id, name");
+$builder->columns("id, category");
// Array, one column per element
-$builder->columns(
+$criteria->columns(
[
- "id",
- "name",
+ "inv_id",
+ "inv_total",
]
);
-// Array, named keys. The name of the key acts as an alias (`AS` clause)
+// Array with named key. The name of the key acts as an
+// alias (`AS` clause)
$builder->columns(
[
- "name",
- "number" => "COUNT(*)",
+ "inv_cst_id",
+ "total_invoices" => "COUNT(*)",
]
);
From 0f82ffba5245967b28fac6633ff61640035ecb94 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Mon, 1 Jan 2024 15:28:22 -0600
Subject: [PATCH 085/191] text corrections
---
docs/config.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/config.md b/docs/config.md
index a70f33db8..78a8878ae 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -258,7 +258,7 @@ echo config('app-unknown', 'default', '-'); // default
!!! warning "NOTE"
- If the keys from your data contain special characters such as `.`, `-` etc., and you choose to use the same character for your delimiter when using the `path()` method, you will not get the desired results back, since `path()` will interpret the delimiter as a new nested level.
+ If the keys from your data contain special characters such as `.` or `-`, and you choose to use the same character for your delimiter when using the `path()` method, you will not get the desired results back, since `path()` will interpret the delimiter as a new nested level.
## Merge
From 5875a30fa141f9ab2173b469e2b621ba81d8f951 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Mon, 1 Jan 2024 15:29:00 -0600
Subject: [PATCH 086/191] corrected word
---
docs/api/phalcon_mvc.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/api/phalcon_mvc.md b/docs/api/phalcon_mvc.md
index 485017387..3449c8f0e 100644
--- a/docs/api/phalcon_mvc.md
+++ b/docs/api/phalcon_mvc.md
@@ -3606,7 +3606,7 @@ You can use aliases, aggregate functions, etc. If you need to reference
other models you will need to reference them with their namespaces.
When using an array as a parameter, you will need to specify one field
-per array element. If a non numeric key is defined in the array, it will
+per array element. If a non-numeric key is defined in the array, it will
be used as the alias in the query
```php
From 640fc8d25e45624d0ab2cfcde58d341197c315ad Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi
Date: Tue, 2 Jan 2024 00:58:39 +0200
Subject: [PATCH 087/191] fix supporters block on dark mode (#55)
---
docs/assets/css/extra.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index bcb35dc63..8d683ef38 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -39,7 +39,7 @@
border-bottom-color: #273646;
}
-[data-md-color-scheme="state"] .phalcon-blog__sponsors-items a {
+[data-md-color-scheme="slate"] .phalcon-blog__sponsors-items a {
background-color: #ffffffb3;
}
From 5e02e752e3a6a72abd5ec13eb1495ae5e4b8ed9c Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Tue, 2 Jan 2024 22:26:47 -0600
Subject: [PATCH 088/191] fixing a lot of typos
---
docs/acl.md | 74 ++--
docs/annotations.md | 2 +-
docs/api/phalcon_mvc.md | 18 +-
docs/application-cli.md | 38 +-
docs/application-micro.md | 68 +--
docs/application.md | 16 +-
docs/assets.md | 56 +--
docs/autoload.md | 62 +--
docs/cache.md | 152 ++++---
docs/coding-standard.md | 4 +-
docs/config.md | 62 +--
docs/contributions.md | 44 +-
docs/controllers.md | 32 +-
docs/datamapper.md | 705 +++++++++++++++++++++++++++++++-
docs/db-layer.md | 149 +++----
docs/db-migrations.md | 36 +-
docs/db-models-behaviors.md | 18 +-
docs/db-models-cache.md | 44 +-
docs/db-models-events.md | 10 +-
docs/db-models-metadata.md | 52 +--
docs/db-models-relationships.md | 46 +--
docs/db-models-transactions.md | 20 +-
docs/db-models-validation.md | 14 +-
docs/db-models.md | 210 +++++-----
docs/db-pagination.md | 34 +-
docs/db-phql.md | 104 ++---
docs/devtools.md | 18 +-
docs/di.md | 78 ++--
docs/dispatcher.md | 66 +--
docs/domain.md | 56 +--
docs/encryption-crypt.md | 36 +-
docs/encryption-security-jwt.md | 50 +--
docs/encryption-security.md | 78 ++--
docs/environments-devilbox.md | 18 +-
docs/events.md | 70 ++--
docs/filter-filter.md | 96 ++---
docs/filter-validation.md | 142 +++----
docs/flash.md | 36 +-
docs/forms.md | 76 ++--
docs/generating-backtrace.md | 4 +-
docs/html-attributes.md | 8 +-
docs/html-breadcrumbs.md | 18 +-
docs/html-escaper.md | 24 +-
docs/html-link.md | 18 +-
docs/html-tagfactory.md | 124 +++---
docs/http-factories.md | 2 +-
docs/http-request.md | 2 +-
docs/http-response.md | 2 +-
docs/http-server-request.md | 2 +-
docs/http-stream.md | 2 +-
docs/http-uploaded-file.md | 2 +-
docs/http-uri.md | 2 +-
docs/i18n.md | 10 +-
docs/image.md | 34 +-
docs/installation.md | 40 +-
docs/introduction.md | 31 +-
docs/logger.md | 73 ++--
docs/mvc-url.md | 40 +-
docs/mvc.md | 4 +-
docs/namespaces.md | 6 +-
docs/new-feature-request.md | 2 +-
docs/new-pull-request.md | 12 +-
docs/performance.md | 34 +-
docs/queue.md | 2 +-
docs/reproducible-tests.md | 2 +-
docs/request.md | 94 ++---
docs/response.md | 79 ++--
docs/routing.md | 90 ++--
docs/session.md | 55 ++-
docs/sponsors.md | 2 +-
docs/static-analysis.md | 30 +-
docs/storage.md | 80 ++--
docs/support-collection.md | 26 +-
docs/support-debug.md | 47 ++-
docs/support-helper.md | 20 +-
docs/support-registry.md | 16 +-
docs/support-version.md | 4 +-
docs/tag.md | 118 +++---
docs/testing-environment.md | 4 +-
docs/translate.md | 48 +--
docs/tutorial-basic.md | 44 +-
docs/tutorial-invo.md | 87 ++--
docs/tutorial-rest.md | 46 +--
docs/tutorial-vokuro.md | 114 +++---
docs/unit-testing.md | 26 +-
docs/upgrade.md | 84 ++--
docs/use-case.md | 2 +-
docs/views.md | 74 ++--
docs/volt.md | 130 +++---
docs/webserver-setup.md | 68 +--
90 files changed, 2727 insertions(+), 2051 deletions(-)
diff --git a/docs/acl.md b/docs/acl.md
index 1e2609e2e..4e9c324e2 100644
--- a/docs/acl.md
+++ b/docs/acl.md
@@ -2,9 +2,12 @@
- - -
## Overview
-The [Phalcon\Acl][acl-acl] component offers a lightweight and straightforward method for managing Access Control Lists (ACLs) and associated permissions. ACLs play a crucial role in regulating access to areas and underlying objects within an application.
+The [Phalcon\Acl][acl-acl] component offers a lightweight and straightforward
+method for managing Access Control Lists (ACLs) and associated permissions.
+ACLs play a crucial role in regulating access to areas and underlying objects
+within an application.
-In the context of programming, ACLs typically involve two key entities: the object seeking access (Role) and the object being accessed (Component or Resource). In Phalcon, these are referred to as [Roles][acl-role] and [Components][acl-component]. In a practical scenario, [Roles][acl-role] define the groups of users, and [Components][acl-component] represent areas of the application.
+In programming, ACLs typically involve two key entities: the object seeking access (Role) and the object being accessed (Component or Resource). For Phalcon, these are called [Roles][acl-role] and [Components][acl-component]. Looking at a practical scenario, [Roles][acl-role] define the groups of users, and [Components][acl-component] represent areas of the application.
!!! info "Use Case"
@@ -64,7 +67,7 @@ $acl->setDefaultAction(Enum::ALLOW);
The [Phalcon\Acl\Enum][acl-enum] class provides two constants for defining access levels:
- `Phalcon\Acl\Enum::ALLOW` (`1`)
-- `Phalcon\Acl\Enum::DENY` (`0` - default)
+- `Phalcon\Acl\Enum::DENY` (`0` – default)
These constants help specify access levels within your ACL.
@@ -107,7 +110,7 @@ $acl->addRole('guest');
```
## Adding Components
-A [Component][acl-component] in the context of Phalcon\Acl represents an area of the application where access is controlled. In an MVC application, this typically corresponds to a Controller. Although it's not mandatory, you can use the [Phalcon\Acl\Component][acl-component] class to define components in the application. It's also important to add related actions to a component so that the ACL understands what it should control.
+A [Component][acl-component] in the context of Phalcon\Acl represents an area of the application where access is controlled. In an MVC application, this typically corresponds to a Controller. Although it is not mandatory, you can use the [Phalcon\Acl\Component][acl-component] class to define components in the application. It is important to add related actions to a component so that the ACL understands what it should control.
There are two ways to add components to our list:
@@ -173,7 +176,7 @@ $acl->addComponent(
```
## Defining Access Controls
-After defining both the `Roles` and `Components`, the next step is to tie them together to create the access list. This is a critical step, as a small mistake here can inadvertently allow access to roles for components that the developer did not intend to. As mentioned earlier, the default access action for [Phalcon\Acl][acl-acl] is `Phalcon\Acl\Enum::DENY`, following the [white list][whitelist] approach.
+After defining both the `Roles` and `Components`, the next step is to tie them together to create the access list. This is a critical step, as a small mistake here can inadvertently allow access to roles for components that the developer did not intend to. As mentioned earlier, the default access action for [Phalcon\Acl][acl-acl] is `Phalcon\Acl\Enum::DENY`, following the [whitelist][whitelist] approach.
To associate Roles and Components, you use the `allow()` and `deny()` methods provided by the [Phalcon\Acl\Memory][acl-adapter-memory] class.
@@ -260,19 +263,24 @@ $acl = new Memory();
// (Roles and Components setup...)
// Check permissions
-$acl->isAllowed('manager', 'admin', 'dashboard'); // true - explicitly defined
-$acl->isAllowed('manager', 'session', 'login'); // true - defined with wildcard
-$acl->isAllowed('accounting', 'reports', 'view'); // true - defined with wildcard
-$acl->isAllowed('guest', 'reports', 'view'); // false - explicitly defined
-$acl->isAllowed('guest', 'reports', 'add'); // false - default access level
+$acl->isAllowed('manager', 'admin', 'dashboard'); // true – explicitly defined
+$acl->isAllowed('manager', 'session', 'login'); // true – defined with wildcard
+$acl->isAllowed('accounting', 'reports', 'view'); // true – defined with wildcard
+$acl->isAllowed('guest', 'reports', 'view'); // false – explicitly defined
+$acl->isAllowed('guest', 'reports', 'add'); // false – default access level
```
In the above example, the `isAllowed()` method checks whether a role has permission to access a specific component and action. It returns `true` if access is allowed, and `false` otherwise. This method is valuable for implementing role-based access control in your application.
## Function-Based Access
-Depending on the needs of your application, you might require an additional layer of calculations to allow or deny access to users through the ACL. The `isAllowed()` method in Phalcon's ACL accepts a fourth parameter, which is a callable such as an anonymous function.
-
-To take advantage of this functionality, you need to define your function when calling the `allow()` method for the role and component you need. For example, assume you need to allow access to all `manager` roles to the `admin` component except if their name is 'Bob'. To achieve this, you register an anonymous function that checks this condition.
+Depending on the needs of your application, you might require an additional layer
+of calculations to allow or deny access to users through the ACL. The `isAllowed()`
+method in Phalcon's ACL accepts a fourth parameter, which is a `callable` such as
+an anonymous function. To take advantage of this functionality, you need to define
+your function when calling the `allow()` method for the role and component you need.
+For example, assume you need to allow access to all `manager` roles to the
+`admin` component except if their name is 'Bob.' To achieve this, you register
+an anonymous function that checks this condition.
**Example:**
@@ -298,7 +306,7 @@ $acl->addComponent(
]
);
-// Set access level for role into components with a custom function
+// Set access level for `role` into `components` with a custom function
$acl->allow(
'manager',
'admin',
@@ -335,7 +343,7 @@ $acl->addComponent(
]
);
-// Set access level for role into components with a custom function
+// Set access level for `role` into `components` with a custom function
$acl->allow(
'manager',
'admin',
@@ -369,8 +377,8 @@ $acl->isAllowed(
!!! info "NOTE"
The fourth parameter must be an array. Each array element represents a parameter that your anonymous function accepts. The key of the element is the name of the parameter, while the value is what will be passed as the value of that parameter to the function.
-
-You can also omit passing the fourth parameter to `isAllowed()` if you wish. The default action for a call to `isAllowed()` without the last parameter is `Acl\Enum::DENY`. To change this behavior, you can make a call to `setNoArgumentsDefaultAction()`:
+
+You can also omit to pass the fourth parameter to `isAllowed()` if you wish. The default action for a call to `isAllowed()` without the last parameter is `Acl\Enum::DENY`. To change this behavior, you can make a call to `setNoArgumentsDefaultAction()`:
**Example:**
@@ -397,7 +405,7 @@ $acl->addComponent(
]
);
-// Set access level for role into components with a custom function
+// Set access level for `role` into `components` with a custom function
$acl->allow(
'manager',
'admin',
@@ -432,7 +440,7 @@ You can implement the [Phalcon\Acl\RoleAwareInterface][acl-roleaware] in your cu
use Phalcon\Acl\RoleAwareInterface;
-// Create our class which will be used as roleName
+// Create our class, which will be used as roleName
class ManagerRole implements RoleAwareInterface
{
protected $id;
@@ -466,7 +474,7 @@ You can implement the [Phalcon\Acl\ComponentAwareInterface][acl-componentaware]
use Phalcon\Acl\ComponentAwareInterface;
-// Create our class which will be used as componentName
+// Create our class, which will be used as componentName
class ReportsComponent implements ComponentAwareInterface
{
protected $id;
@@ -544,7 +552,7 @@ $levelOne = new ManagerRole(1, 'manager-1');
$levelTwo = new ManagerRole(2, 'manager');
$admin = new ManagerRole(3, 'manager');
-// id - name - userId
+// id – name – userId
$reports = new ReportsComponent(2, 'reports', 2);
// Check whether our user objects have access. Returns `false`
@@ -631,7 +639,7 @@ $aclFile = 'app/security/acl.cache';
// Check whether ACL data already exist
if (!is_file($aclFile)) {
- // The ACL does not exist - build it
+ // The ACL does not exist – build it
$acl = new Memory();
// Define roles, components, access, etc.
@@ -728,17 +736,17 @@ The [Phalcon\Acl\AdapterInterface][acl-adapter-adapterinterface] interface must
[acl]: https://en.wikipedia.org/wiki/Access_control_list
[acl-acl]: api/phalcon_acl.md
-[acl-adapter-abstractadapter]: api/phalcon_acl.md#acl-adapter-abstractadapter
-[acl-adapter-adapterinterface]: api/phalcon_acl.md#acl-adapter-adapterinterface
-[acl-adapter-memory]: api/phalcon_acl.md#acl-adapter-memory
-[acl-component]: api/phalcon_acl.md#acl-component
-[acl-componentaware]: api/phalcon_acl.md#acl-componentaware
-[acl-componentinterface]: api/phalcon_acl.md#acl-componentinterface
-[acl-enum]: api/phalcon_acl.md#acl-enum
-[acl-exception]: api/phalcon_acl.md#acl-exception
-[acl-role]: api/phalcon_acl.md#acl-role
-[acl-roleaware]: api/phalcon_acl.md#acl-roleaware
-[acl-roleinterface]: api/phalcon_acl.md#acl-roleinterface
+[acl-adapter-abstractadapter]: api/phalcon_acl.md#acladapterabstractadapter--
+[acl-adapter-adapterinterface]: api/phalcon_acl.md#acladapteradapterinterface--
+[acl-adapter-memory]: api/phalcon_acl.md#acladaptermemory-
+[acl-component]: api/phalcon_acl.md#aclcomponent-
+[acl-componentaware]: api/phalcon_acl.md#aclcomponentawareinterface--
+[acl-componentinterface]: api/phalcon_acl.md#aclcomponentinterface--
+[acl-enum]: api/phalcon_acl.md#aclenum-
+[acl-exception]: api/phalcon_acl.md#aclexception-
+[acl-role]: api/phalcon_acl.md#aclrole-
+[acl-roleaware]: api/phalcon_acl.md#aclroleawareinterface--
+[acl-roleinterface]: api/phalcon_acl.md#aclroleawareinterface--
[codeception]: https://codeception.com
[whitelist]: https://en.wikipedia.org/wiki/Whitelisting
[events]: events.md
diff --git a/docs/annotations.md b/docs/annotations.md
index 3f04b542a..c287a6139 100644
--- a/docs/annotations.md
+++ b/docs/annotations.md
@@ -213,7 +213,7 @@ return $result;
```
### Memory
-[Phalcon\Annotations\Adapter\Memory][annotations-adapter-memory] stores the parsed and processed annotations in memory. This adapter is suitable for development systems. The cache is rebuilt on every request, and therefore can immediately reflect changes, while developing your application.
+[Phalcon\Annotations\Adapter\Memory][annotations-adapter-memory] stores the parsed and processed annotations in memory. This adapter is suitable for development systems. The cache is rebuilt on every request, and therefore can immediately reflect changes while developing your application.
```php
setDefaultNamespace('MyApp\Tasks');
$container->setShared('dispatcher', $dispatcher);
```
-CLI applications need a specific dispatcher. `Phalcon\Cli\Dispatcher` offers the same functionality as the main dispatcher for MVC applications, but it is tailored to CLI applications. As expected, we instantiate the dispatcher object, we set our default namespace, and then register it in the DI container.
+CLI applications need a specific dispatcher. `Phalcon\Cli\Dispatcher` offers the same functionality as the main dispatcher for MVC applications, but it is tailored to CLI applications. As expected, we instantiate the dispatcher object, set our default namespace, and then register it in the DI container.
**Config**
@@ -136,7 +136,7 @@ Make sure to update the include path to be relative to where your `cli.php` file
```php
$console = new Console($container);
```
-As mentioned above, a CLI application is handled by the `Phalcon\Cli\Console` class. Here we instantiate it and pass in it the DI container.
+As mentioned above, a CLI application is handled by the `Phalcon\Cli\Console` class. Here we instantiate it and pass it to the DI container.
**Arguments**
@@ -284,7 +284,7 @@ php cli.php users add 4 5
9
```
-Parameters can also be accessed through the `Phalcon\Cli\Dispatcher` which is helpful when passing flags in, or an unknown number of parameters.
+Parameters can also be accessed through the `Phalcon\Cli\Dispatcher` which is helpful when passing flags in or an unknown number of parameters.
```php
get(
**Controllers**
-For medium applications, which expand on the micro architecture, you can organize handlers in controllers.
+For medium applications, which expand on the microarchitecture, you can organize handlers in controllers.
```php
mount($products);
With this simple change, all handlers remain uninstantiated until requested by a caller. Consequently, when a caller requests `/invoices/get/2`, our application instantiates the `InvoicesController` and calls the `get` method. The application now utilizes fewer resources.
#### Extra performance tip
-For large applications, there's no need to mount all collections, even if they are lazy-loaded. Phalcon uses `regex` to match routes, and to speed up the routing process, a _pre-filter_ can be run. For instance:
+For large applications, there's no need to mount all collections, even if they are lazy-loaded. Phalcon uses `regex` to match routes and to speed up the routing process, a _pre-filter_ can be run. For instance:
```php
$uri = new \Phalcon\Http\Message\Uri($_SERVER['REQUEST_URI']);
@@ -825,7 +825,7 @@ switch ($collection) {
}
```
-This approach allows Phalcon to handle numerous routes without a regex performance penalty. Using `explode()` proves faster than regex.
+This approach allows Phalcon to handle numerous routes without a regex performance penalty. Using `explode()` proves faster than regex.
#### Not found (404)
@@ -848,7 +848,7 @@ $app->notFound(
);
```
-Routes that have not been matched (404) can also be handled with Middleware, discussed below.
+Routes that have not been matched (404) can also be handled with Middleware, discussed below.
### HTTP methods
The [Phalcon\Mvc\Micro][mvc-micro] application provides a set of methods to bind the HTTP method with the intended route:
@@ -894,7 +894,7 @@ $app->get(
**map**
-Map allows you to attach the same endpoint to more than one HTTP method. The example below matches if the HTTP method is `GET` or `POST` and the route is `/repos/store/refs`
+`map` allows you to attach the same endpoint to more than one HTTP method. The example below matches if the HTTP method is `GET` or `POST` and the route is `/repos/store/refs`
```php
get(
## Dependency Injector
-When a micro application is created, a [Phalcon\Di\FactoryDefault][di-factorydefault] services container is created automatically.
+When a micro application is created, a [Phalcon\Di\FactoryDefault][di-factorydefault] services container is created automatically.
```php
get(
### Return Response
-A different approach returning data back to the caller is to return the [Phalcon\Http\Response][http-response] object directly from the application. When responses are returned by handlers, they are automatically sent by the application.
+A different approach to returning data back to the caller is to return the [Phalcon\Http\Response][http-response] object directly from the application. When responses are returned by handlers, they are automatically sent by the application.
```php
handle(
);
```
-Since the Binder object uses PHP's Reflection API internally, which requires additional CPU cycles, there is an option to set a cache to speed up the process. This can be done by using the second argument of `setModelBinder()`, which can also accept a service name or just by passing a cache instance to the `Binder` constructor.
+Since the Binder object uses PHP's Reflection API internally, which requires additional CPU cycles, there is an option to set a cache to speed up the process. This can be done by using the second argument of `setModelBinder()`, which can also accept a service name, or just by passing a cache instance to the `Binder` constructor.
Currently, the binder will only use the model's primary key to perform a `findFirst()`. An example route for the above would be `/invoices/view/1`.
@@ -2426,7 +2426,7 @@ try {
### Error Handling
-The [Phalcon\Mvc\Micro][mvc-micro] application also has an `error` method, which can be used to trap any errors that originate from exceptions. The following code snippet shows basic usage of this feature:
+The [Phalcon\Mvc\Micro][mvc-micro] application also has an `error` method, which can be used to trap any errors that originate from exceptions. The following code snippet shows the basic usage of this feature:
```php
error(
);
```
-[di-factorydefault]: api/phalcon_di.md#di-factorydefault
-[events-manager]: api/phalcon_events.md#events-manager
-[http-response]: api/phalcon_http.md#http-response
-[http-responseinterface]: api/phalcon_http.md#http-responseinterface
-[mvc-application]: api/phalcon_mvc.md#mvc-application
-[mvc-application-exception]: api/phalcon_mvc.md#mvc-application-exception
-[mvc-controller]: api/phalcon_mvc.md#mvc-controller
-[mvc-model-binder]: api/phalcon_mvc.md#mvc-model-binder
-[mvc-micro]: api/phalcon_mvc.md#mvc-micro
-[mvc-micro-collection]: api/phalcon_mvc.md#mvc-micro-collection
-[mvc-micro-collectioninterface]: api/phalcon_mvc.md#mvc-micro-collectioninterface
-[mvc-micro-exception]: api/phalcon_mvc.md#mvc-micro-exception
-[mvc-micro-lazyloader]: api/phalcon_mvc.md#mvc-micro-lazyloader
-[mvc-micro-middlewareinterface]: api/phalcon_mvc.md#mvc-micro-middlewareinterface
-[mvc-router]: api/phalcon_mvc.md#mvc-router
-[mvc-view]: api/phalcon_mvc.md#mvc-view
-[mvc-view-simple]: api/phalcon_mvc.md#mvc-view-simple
+[di-factorydefault]: api/phalcon_di.md#difactorydefault-
+[events-manager]: api/phalcon_events.md#eventsmanager-
+[http-response]: api/phalcon_http.md#httpresponse-
+[http-responseinterface]: api/phalcon_http.md#httpresponseinterface--
+[mvc-application]: api/phalcon_mvc.md#mvcapplication-
+[mvc-application-exception]: api/phalcon_mvc.md#mvcapplicationexception-
+[mvc-controller]: api/phalcon_mvc.md#mvccontroller--
+[mvc-model-binder]: api/phalcon_mvc.md#mvcmodelbinder-
+[mvc-micro]: api/phalcon_mvc.md#mvcmicro-
+[mvc-micro-collection]: api/phalcon_mvc.md#mvcmicrocollection-
+[mvc-micro-collectioninterface]: api/phalcon_mvc.md#mvcmicrocollectioninterface--
+[mvc-micro-exception]: api/phalcon_mvc.md#mvcmicroexception-
+[mvc-micro-lazyloader]: api/phalcon_mvc.md#mvcmicrolazyloader-
+[mvc-micro-middlewareinterface]: api/phalcon_mvc.md#mvcmicromiddlewareinterface--
+[mvc-router]: api/phalcon_mvc.md#mvcrouter-
+[mvc-view]: api/phalcon_mvc.md#mvcview-
+[mvc-view-simple]: api/phalcon_mvc.md#mvcviewsimple-
[psr-15]: https://www.php-fig.org/psr/psr-15/
[routing]: routing.md
[webserver-setup]: webserver-setup.md
diff --git a/docs/application.md b/docs/application.md
index 0bc17bab5..7d59a663c 100644
--- a/docs/application.md
+++ b/docs/application.md
@@ -54,7 +54,7 @@ public function getModule(
string $name
): array | object
```
-Gets the module definition registered in the application via module name
+Gets the module definition registered in the application via the module name
```php
public function getModules(): array
@@ -679,8 +679,8 @@ try {
| Event Name | Triggered |
|-----------------------|--------------------------------------------------------------|
| `boot` | Executed when the application handles its first request |
-| `beforeStartModule` | Before initialize a module, only when modules are registered |
-| `afterStartModule` | After initialize a module, only when modules are registered |
+| `beforeStartModule` | Before initializing a module, only when modules are registered |
+| `afterStartModule` | After initializing a module, only when modules are registered |
| `beforeHandleRequest` | Before execute the dispatch loop |
| `afterHandleRequest` | After execute the dispatch loop |
@@ -707,10 +707,10 @@ $manager->attach(
## External Resources
* [MVC examples on GitHub][mvc-examples]
-[application-abstractapplication]: api/phalcon_application.md#application-abstractapplication
-[application-exception]: api/phalcon_application.md#application-exception
-[mvc-application]: api/phalcon_mvc.md#mvc-application
-[mvc-application-exception]: api/phalcon_mvc.md#mvc-application-exception
-[mvc-moduledefinitioninterface]: api/phalcon_mvc.md#mvc-moduledefinitioninterface
+[application-abstractapplication]: api/phalcon_application.md#applicationabstractapplication--
+[application-exception]: api/phalcon_application.md#applicationexception-
+[mvc-application]: api/phalcon_mvc.md#mvcapplication-
+[mvc-application-exception]: api/phalcon_mvc.md#mvcapplicationexception-
+[mvc-moduledefinitioninterface]: api/phalcon_mvc.md#mvcmoduledefinitioninterface--
[mvc-examples]: https://github.com/phalcon/mvc
[events]: events.md
diff --git a/docs/assets.md b/docs/assets.md
index ee244e941..6716a01b1 100644
--- a/docs/assets.md
+++ b/docs/assets.md
@@ -44,7 +44,7 @@ Assets are added to the manager or a collection using the Asset-related classes.
**type**
-can be `css`, `js` or something else, depending on whether you want to extend the functionality of the component.
+can be `css`, `js`, or something else, depending on whether you want to extend the functionality of the component.
**path**
@@ -68,7 +68,7 @@ version of the asset
**autoVersion**
-let the component auto version this asset or not
+let the component auto-version this asset or not
Each asset has a unique key assigned to it. The key is computed using `sha256`, calculated as:
@@ -134,12 +134,12 @@ $asset = new Js(
### Inline
-There are times that the application needs generated CSS or JS to be injected into the view. You can use the [Phalcon\Assets\Inline][asset-inline] class to generate this content. The object can be created with the following parameters:
+There are times when the application needs generated CSS or JS to be injected into the view. You can use the [Phalcon\Assets\Inline][asset-inline] class to generate this content. The object can be created with the following parameters:
**type**
-can be `css`, `js` or something else, depending on whether you want to extend the functionality of the component.
-
+can be `css`, `js`, or something else, depending on whether you want to extend the functionality of the component.
+
**content**
the content to be injected
@@ -147,7 +147,7 @@ the content to be injected
**filter**
any filter attached to this asset
-
+
**attributes**
attributes relative to the asset
@@ -221,7 +221,7 @@ class IndexController extends Controller
## Adding Assets
### Files
-[Phalcon\Assets\Manager][assets-manager] supports two built-in assets: CSS and JavaScript assets. You can also create other asset types if you need. The assets manager internally stores two default collections of assets - one for JavaScript and another for CSS.
+[Phalcon\Assets\Manager][assets-manager] supports two built-in assets: CSS and JavaScript assets. You can also create other asset types if you need to. The assets manager internally stores two default collections of assets - one for JavaScript and another for CSS.
You can easily add assets to these collections:
@@ -402,7 +402,7 @@ $footerCollection->addJs('js/jquery.js');
$footerCollection->addJs('js/bootstrap.min.js');
```
-You can also chain the method calls if that syntax is more preferable:
+You can also chain the method calls if that syntax is preferable:
```php
setTargetUri($targetPath)
->setTargetPath($targetPath);
- // Store content to the disk and return fully qualified file path
+ // Store content to the disk and return a fully qualified file path
$contentPath = $this->assets->output(
$collection,
function (array $parameters) {
@@ -857,7 +857,7 @@ class AssetsController extends ControllerBase
}
```
-If precompiled assets exist in the file system they must be served directly by web server. So to get the benefit of static assets we have to update our server configuration. We will use an example configuration for Nginx. For Apache, it will be a little different:
+If precompiled assets exist in the file system they must be served directly by the web server. So to get the benefit of static assets we have to update our server configuration. We will use an example configuration for Nginx. For Apache, it will be a little different:
```nginx
location ~ ^/assets/ {
@@ -883,29 +883,29 @@ location @phalcon {
We need to create `assets/js` and `assets/css` directories in the document root of the application (eg. `public`).
-Every time the application requests assets such as `/assets/js/global.js` the application will check whether the asset exists. If yes, it will be handled by the web server. Alternatively it will be redirected to the `AssetsController` for handling from the application.
+Every time the application requests assets such as `/assets/js/global.js` the application will check whether the asset exists. If yes, it will be handled by the web server. Alternatively, it will be redirected to the `AssetsController` for handling from the application.
-This method is not recommended for production environments and high-load applications. However, the example does show what is possible using this component. The implementation you choose depends on the needs of your application.
+This method is not recommended for production environments and high-load applications. However, the example does show what is possible using this component. The implementation you choose depends on the needs of your application.
-In most cases, your web server, [CDN][cdn] or services such as [Varnish HTTP Cache][varnish] would be more preferable.
+In most cases, your web server, [CDN][cdn], or services such as [Varnish HTTP Cache][varnish] would be preferable.
-[asset]: api/phalcon_assets.md#assets-asset
-[asset-css]: api/phalcon_assets.md#assets-asset-css
-[asset-js]: api/phalcon_assets.md#assets-asset-js
-[asset-interface]: api/phalcon_assets.md#assets-assetinterface
-[asset-inline]: api/phalcon_assets.md#assets-inline
-[asset-inline-css]: api/phalcon_assets.md#assets-inline-css
-[asset-inline-js]: api/phalcon_assets.md#assets-inline-js
-[asset-exception]: api/phalcon_assets.md#assets-exception
-[assets-manager]: api/phalcon_assets.md#assets-manager
+[asset]: api/phalcon_assets.md#assetsasset-
+[asset-css]: api/phalcon_assets.md#assetsassetcss-
+[asset-js]: api/phalcon_assets.md#assetsassetjs-
+[asset-interface]: api/phalcon_assets.md#assetsassetinterface--
+[asset-inline]: api/phalcon_assets.md#assetsinline-
+[asset-inline-css]: api/phalcon_assets.md#assetsinlinecss-
+[asset-inline-js]: api/phalcon_assets.md#assetsinlinejs-
+[asset-exception]: api/phalcon_assets.md#assetsexception-
+[assets-manager]: api/phalcon_assets.md#assetsmanager-
[bootstrap]: https://getbootstrap.com
[cache-busting]: https://www.keycdn.com/support/what-is-cache-busting
[cdn]: https://en.wikipedia.org/wiki/Content_delivery_network
[closure]: https://developers.google.com/closure/compiler
-[collections]: api/phalcon_assets.md#assets-collection
-[di-factorydefault]: api/phalcon_di.md#di-factorydefault
-[filter-interface]: api/phalcon_assets.md#assets-filterinterface
-[filter-none]: api/phalcon_assets.md#assets-filters-none
+[collections]: api/phalcon_assets.md#assetscollection-
+[di-factorydefault]: api/phalcon_di.md#difactorydefault-
+[filter-interface]: api/phalcon_assets.md#assetsfilterinterface--
+[filter-none]: api/phalcon_assets.md#assetsfiltersnone-
[jquery]: https://jquery.com
[sass]: https://sass-lang.com
[html-tagfactory]: html-tagfactory.md
diff --git a/docs/autoload.md b/docs/autoload.md
index 5c4394e61..e56a49c01 100644
--- a/docs/autoload.md
+++ b/docs/autoload.md
@@ -6,16 +6,16 @@
The `Phalcon\Autoload\Loader` class has been renamed `Phalcon\Autoload\Loader`. The functionality remains the same.
## Overview
-[Phalcon\Autoload\Loader][loader] is an autoloader that implements [PSR-4][psr-4]. Just like any autoloader, depending on its setup, it will try and find the files your code is looking for based on file, class, namespace etc. Since this component is written in C, it offers the lowest overhead when processing its setup, thus offering a performance boost.
+[Phalcon\Autoload\Loader][loader] is an autoloader that implements [PSR-4][psr-4]. Just like any autoloader, depending on its setup, it will try and find the files your code is looking for based on file, class, namespace, etc. Since this component is written in C, it offers the lowest overhead when processing its setup, thus offering a performance boost.

-This component relies on PHP's [autoloading classes][autoloading] capability. If a class defined in the code has not been included yet, a special handler will try to load it. [Phalcon\Autoload\Loader][loader] serves as the special handler for this operation. By loading classes on a need to load basis, the overall performance is increased since the only file reads that occur are for the files needed. This technique is called [lazy initialization][lazy_initialization].
+This component relies on PHP's [autoloading classes][autoloading] capability. If a class defined in the code has not been included yet, a special handler will try to load it. [Phalcon\Autoload\Loader][loader] serves as the special handler for this operation. By loading classes on a need-to-load basis, the overall performance is increased since the only file reads that occur are for the files needed. This technique is called [lazy initialization][lazy_initialization].
The component offers options for loading files based on their class, file name, directories on your file system as well as file extensions.
## Registration
-Usually we would use the [spl_autoload_register()][spl-autoload-register] to register a custom autoloader for our application. [Phalcon\Autoload\Loader][loader] hides this complexity. After you define all your namespaces, classes, directories and files you will need to call the `register()` function, and the autoloader is ready to be used.
+Usually, we would use the [spl_autoload_register()][spl-autoload-register] to register a custom autoloader for our application. [Phalcon\Autoload\Loader][loader] hides this complexity. After you define all your namespaces, classes, directories, and files you will need to call the `register()` function, and the autoloader is ready to be used.
```php
setNamespaces(
$loader->register();
```
-`register()` uses [spl_autoload_register()][spl-autoload-register] internally. As a result it accepts also accepts the boolean `prepend` parameter. If supplied and is `true`, the autoloader will be prepended on the autoload queue instead of appended (default behavior).
+`register()` uses [spl_autoload_register()][spl-autoload-register] internally. As a result, it accepts also accepts the boolean `prepend` parameter. If supplied and is `true`, the autoloader will be prepended on the autoload queue instead of appended (default behavior).
You can always call the `isRegistered()` method to check if your autoloader is registered or not.
@@ -115,14 +115,14 @@ if (class_exists($className)) {
}
```
-In the above snippet, if `../processes/important-process.php` is a valid file, that could have been uploaded by a hacker or from a not so careful upload process, then an external user could execute the code without any authorization and subsequently get access to the whole application if not the server.
+In the above snippet, if `../processes/important-process.php` is a valid file, that could have been uploaded by a hacker or from a not-so-careful upload process, then an external user could execute the code without any authorization and subsequently get access to the whole application if not the server.
-To avoid most of these kind of attacks, [Phalcon\Autoload\Loader][loader] removes invalid characters from the class name.
+To avoid most of these kinds of attacks, [Phalcon\Autoload\Loader][loader] removes invalid characters from the class name.
## Namespaces
-A very popular way to organize your application is with directories, each representing a particular namespace. [Phalcon\Autoload\Loader][loader] can register those namespace to directory mapping and traverse those directories to search the file that your application is requiring.
+A very popular way to organize your application is with directories, each representing a particular namespace. [Phalcon\Autoload\Loader][loader] can register those namespaces to directory mapping and traverse those directories to search the file that your application requires.
-The `setNamespaces()` method accepts an array, where keys are the namespaces and values are the actual directories in the file system. The namespace separator will be replaced by the directory separator when the loader tries to find the classes.
+The `setNamespaces()` method accepts an array, where keys are the namespaces and values are the actual directories in the file system. The namespace separator will be replaced by the directory separator when the loader tries to find the classes.
```php
setNamespaces(
$loader->register();
```
-In the above example, whenever we reference a controller, the loader will search for it in `app/controllers` and its subdirectories. Similarly, for a model the search will occur in `app/models`.
+In the above example, whenever we reference a controller, the loader will search for it in `app/controllers` and its subdirectories. Similarly, for a model, the search will occur in `app/models`.
-You do not need to register the sub namespaces, if the actual files are located in subdirectories that map the namespace naming convention.
+You do not need to register the sub-namespaces, if the actual files are located in subdirectories that map the namespace naming convention.
So for instance the above example defines our `MyApp` namespace to point to `app/library`. If we have a file:
@@ -159,11 +159,11 @@ MyApp\Components
```
then the loader, as defined above, does not need to know about the `MyApp\Components` namespace location, or have it defined in the `
-()` declaration.
+()` declaration.
If the component referenced in the code is `MyApp\Components\Mail`, it will assume that it is a subdirectory of the root namespace. However, since we specified a different location for the `MyApp\Controllers` and `MyApp\Models` namespaces, the loader will look for those namespaces in the specified directories.
-The `setNamespaces()` method also accepts a second parameter `merge`. By default, it is `false`. You can however set it to `true` when having multiple calls to `setNamespaces()` so that the namespace definitions are merged.
+The `setNamespaces()` method also accepts a second parameter `merge`. By default, it is `false`. You can however set it to `true` when having multiple calls to `setNamespaces()` so that the namespace definitions are merged.
```php
setClasses(
$loader->register();
```
-In the above example, we are defining the relationship between a namespaced class and a file. As you can see, the loader will be as fast as it can be but the list will start growing, the more our application grows, making maintenance difficult. If however your application does not have that many components, there is no reason why you cannot use this method of autoloading components.
+In the above example, we are defining the relationship between a namespaced class and a file. As you can see, the loader will be as fast as it can be but the list will start growing, the more our application grows, making maintenance difficult. If however, your application does not have that many components, there is no reason why you cannot use this method of autoloading components.
-The `setClasses()` method also accepts a second parameter `merge`. By default, it is `false`. You can however set it to `true` when having multiple calls to `setClasses()` so that the class definitions are merged.
+The `setClasses()` method also accepts a second parameter `merge`. By default, it is `false`. You can however set it to `true` when having multiple calls to `setClasses()` so that the class definitions are merged.
```php
register();
These files are automatically loaded when the `register()` method is called.
-The `setFiles()` method also accepts a second parameter `merge`. By default, it is `false`. You can however set it to `true` when having multiple calls to `setFiles()` so that the file definitions are merged.
+The `setFiles()` method also accepts a second parameter `merge`. By default, it is `false`. You can however set it to `true` when having multiple calls to `setFiles()` so that the file definitions are merged.
```php
setDirectories(
$loader->register();
```
-The `setDirectories()` method also accepts a second parameter `merge`. By default, it is `false`. You can however set it to `true` when having multiple calls to `setDirectories()` so that the class definitions are merged.
+The `setDirectories()` method also accepts a second parameter `merge`. By default, it is `false`. You can however set it to `true` when having multiple calls to `setDirectories()` so that the class definitions are merged.
```php
setEventsManager($eventsManager);
$loader->register();
```
-In the above example, we create a new Events Manager object, attach a method to the `loader:beforeCheckPath` event and then set it in our autoloader. Every time the loader loops and looks for a particular file in a specific path, the path will be printed on screen.
+In the above example, we create a new Events Manager object, attach a method to the `loader:beforeCheckPath` event, and then set it in our autoloader. Every time the loader loops and looks for a particular file in a specific path, the path will be printed on the screen.
The `getCheckedPath()` holds the path that is scanned during each iteration of the internal loop. Also, you can use the `getfoundPath()` method, which holds the path of the found file during the internal loop.
@@ -568,7 +568,7 @@ Some things to keep in mind when using the autoloader:
* If a bytecode cache, such as [APCu][apcu], is installed, it will be used to get the requested file (an implicit caching of the file is performed)
## Debugging
-The `Phalcon\Autoload\Loader` can be instantiated with passing `true` to the constructor, so that you can enable debug mode. In debug mode, the loader will collect data about searching and finding files that are requested. You can then use the `getDebug()` method to output the debug messages, to diagnose issues.
+The `Phalcon\Autoload\Loader` can be instantiated by passing `true` to the constructor, so that you can enable debug mode. In debug mode, the loader will collect data about searching and finding files that are requested. You can then use the `getDebug()` method to output the debug messages, to diagnose issues.
```php
get('my-key');
@@ -59,7 +59,7 @@ $value = $cache->get('my-key', 'default');
```
If you wish to retrieve more than one key with one call, you can call `getMultiple()`, passing an array with the keys needed. The method will return an array of `key` => `value` pairs. Cache keys that do not exist or have expired will have `defaultValue` as a value (default `null`).
-
+
```php
$value = $cache->getMultiple(['my-key1', 'my-key2']);
@@ -74,7 +74,7 @@ $exists = $cache->has('my-key');
```
### `set` - `setMultiple`
-To save the data in the cache, you will need to use the `set()` method. The method accepts the key we wish to store the data under and the value of the item to store. The data needs to be of a type that supports serialization i.e. PHP type or an object that implements serialization. The last (optional) parameter is the TTL (time to live) value for this item. This option might not always be available, if the underlying adapter does not support it. The method will return `true` if the key exists, or `false` otherwise. If even one key is not successfully stored, the method will return `false`.
+To save the data in the cache, you will need to use the `set()` method. The method accepts the key we wish to store the data under and the value of the item to store. The data needs to be of a type that supports serialization i.e. PHP type or an object that implements serialization. The last (optional) parameter is the TTL (time to live) value for this item. This option might not always be available if the underlying adapter does not support it. The method will return `true` if the key exists, or `false` otherwise. If even one key is not successfully stored, the method will return `false`.
```php
$result = $cache->set('my-key', $data);
@@ -94,13 +94,13 @@ $value = $cache->setMultiple(
### `delete` - `deleteMultiple` - `clear`
To delete an item from the cache you need to call the `delete()` method with a key. The method returns `true` on success and `false` on failure.
-`
+`
```php
$result = $cache->delete('my-key');
```
If you wish to delete more than one key with one call, you can call `deleteMultiple()`, passing an array with the keys needed. The method returns `true` on success and `false` on failure. If even one key is not successfully deleted, the method will return `false`.
-`
+`
```php
$result = $cache->deleteMultiple(['my-key1', 'my-key2']);
```
@@ -196,7 +196,7 @@ The `Phalcon\Storage\Serializer` namespace offers classes that implement the [Se
!!! info "NOTE"
- The default serializer for all adapters is `Phalcon\Storage\Serializer\Php` which uses PHP's `serialize` and `unserialize` methods. These methods can suit most applications. However, the developer might want to use something more efficient such as [igbinary][igbinary] which is faster and achieves a better compression.
+ The default serializer for all adapters is `Phalcon\Storage\Serializer\Php` which uses PHP's `serialize` and `unserialize` methods. These methods can suit most applications. However, the developer might want to use something more efficient such as [igbinary][igbinary] which is faster and achieves better compression.
The cache adapter can be configured to use a different serializer. The available serializers are:
@@ -205,7 +205,7 @@ This serializer uses the `base64_encode` and `base64_decode` methods to serializ
### `Igbinary`
The `igbinary` serializes relies on the `igbinary_serialize` and `igbinary_unserialize` methods. Those methods are exposed via the [igbinary][igbinary] PHP extension, which has to be installed and loaded on the target system.
-
+
### `Json`
The `JSON` serializer uses `json_encode` and `json_decode`. The target system must have JSON support available for PHP.
@@ -219,7 +219,7 @@ This serializer can be used when using `Memcached`. It corresponds to the built-
This serializer can be used when using `Memcached`. It corresponds to the built-in PHP serializer that `Memcached` has.
### `Msgpack`
-Similar to `igbinary` the `msgpack` serializer uses `msgpack_pack` and `msgpack_unpack` for serializing and unserializing data. This, along with `igbinary` is one of the fastest and most efficient serializers. However, it requires that the [msgpack][msgpack] PHP extension is loaded on the target system.
+Similar to `igbinary` the `msgpack` serializer uses `msgpack_pack` and `msgpack_unpack` for serializing and unserializing data. This, along with `igbinary` is one of the fastest and most efficient serializers. However, it requires that the [msgpack][msgpack] PHP extension is loaded on the target system.
### `None`
This serializer does not transform the data at all. Both its `serialize` and `unserialize` get and set the data without altering it.
@@ -330,7 +330,7 @@ echo $garble->getData(); // "I came, I saw, I conquered."
```
## Serializer Factory
-Although all serializer classes can be instantiated using the `new` keyword, Phalcon offers the [Phalcon\Storage\SerializerFactory][storage-serializerfactory] class, so that developers can easily instantiate serializer classes. All the above serializers are registered in the factory and lazy loaded when called. The factory also allows you to register additional (custom) serializer classes. The only thing to consider is choosing the name of the serializer in comparison to the existing ones. If you define the same name, you will overwrite the built-in one.The objects are cached in the factory so if you call the `newInstance()` method with the same parameters during the same request, you will get the same object back.
+Although all serializer classes can be instantiated using the `new` keyword, Phalcon offers the [Phalcon\Storage\SerializerFactory][storage-serializerfactory] class, so that developers can easily instantiate serializer classes. All the above serializers are registered in the factory and lazy loaded when called. The factory also allows you to register additional (custom) serializer classes. The only thing to consider is choosing the name of the serializer in comparison to the existing ones. If you define the same name, you will overwrite the built-in one. The objects are cached in the factory so if you call the `newInstance()` method with the same parameters during the same request, you will get the same object back.
The example below shows how you can create a `Json` serializer either using the `new` keyword or the factory:
@@ -365,7 +365,7 @@ The parameters you can use for the factory are:
| `redis_php` | [Phalcon\Storage\Serializer\RedisPhp][storage-serializer-redis-php] |
## Adapters
-The `Phalcon\Cache\Adapter` namespace offers classes that implement the [Phalcon\Cache\Adapter\AdapterInterface][cache-adapter-adapterinterface] interface. It exposes common methods that are used to perform operations on the storage adapter or cache backend. These adapters act as wrappers to respective backend code.
+The `Phalcon\Cache\Adapter` namespace offers classes that implement the [Phalcon\Cache\Adapter\AdapterInterface][cache-adapter-adapterinterface] interface. It exposes common methods that are used to perform operations on the storage adapter or cache backend. These adapters act as wrappers to respective backend code.
The available methods are:
@@ -384,14 +384,14 @@ The available methods are:
!!! info "NOTE"
- The `getAdapter()` method returns the connected adapter. This offers more flexibility to the developer, since it can be used to execute additional methods that each adapter offers. For instance for the `Redis` adapter you can use the `getAdapter()` to obtain the connected object and call `zAdd`, `zRange` and other methods not exposed by the Phalcon adapter.
+ The `getAdapter()` method returns the connected adapter. This offers more flexibility to the developer since it can be used to execute additional methods that each adapter offers. For instance, for the `Redis` adapter you can use the `getAdapter()` to obtain the connected object and call `zAdd`, `zRange`, and other methods not exposed by the Phalcon adapter.
To construct one of these objects, you will need to pass a [Phalcon\Storage\SerializerFactory][storage-serializerfactory] object in the constructor and optionally some parameters required for the adapter of your choice. The list of options is outlined below.
The available adapters are:
### `Apcu`
-This adapter uses `Apcu` to store the data. In order to use this adapter, you will need to have [apcu][apcu] enabled in your target system. This class does not use an actual _adapter_, since the `apcu` functionality is exposed using the `apcu_*` PHP functions.
+This adapter uses `Apcu` to store the data. In order to use this adapter, you will need to have [apcu][apcu] enabled in your target system. This class does not use an actual _adapter_, since the `apcu` functionality is exposed using the `apcu_*` PHP functions.
| Option | Default |
|---------------------|------------|
@@ -400,7 +400,7 @@ This adapter uses `Apcu` to store the data. In order to use this adapter, you wi
| `serializer` | `null` |
| `prefix` | `ph-apcu-` |
-The following example demonstrates how to create a new `Apcu` cache adapter, which will use the [Phalcon\Storage\Serializer\Json][storage-serializer-json] serializer and have a default lifetime of 7200.
+The following example demonstrates how to create a new `Apcu` cache adapter, which will use the [Phalcon\Storage\Serializer\Json][storage-serializer-json] serializer and have a default lifetime of 7200.
```php
set('my-key', $data);
## Adapter Factory
Although all adapter classes can be instantiated using the `new` keyword, Phalcon offers the [Phalcon\Cache\AdapterFactory][cache-adapterfactory] class, so that you can easily instantiate cache adapter classes. All the above adapters are registered in the factory and lazy loaded when called. The factory also allows you to register additional (custom) adapter classes. The only thing to consider is choosing the name of the adapter in comparison to the existing ones. If you define the same name, you will overwrite the built-in one. The objects are cached in the factory so if you call the `newInstance()` method with the same parameters during the same request, you will get the same object back.
-The example below shows how you can create a `Apcu` cache adapter with the `new` keyword or the factory:
+The example below shows how you can create an `Apcu` cache adapter with the `new` keyword or the factory:
```php
set(
}
);
```
-[mvc-controller]: api/phalcon_mvc.md#mvc-controller
-[mvc-controller-bindmodelinterface]: api/phalcon_mvc.md#mvc-controller-bindmodelinterface
-[mvc-controllerinterface]: api/phalcon_mvc.md#mvc-controllerinterface
+[mvc-controller]: api/phalcon_mvc.md#mvccontroller--
+[mvc-controller-bindmodelinterface]: api/phalcon_mvc.md#mvccontrollerbindmodelinterface--
+[mvc-controllerinterface]: api/phalcon_mvc.md#mvccontrollerinterface--
[di-factorydefault]: api/phalcon_di.md#di-factorydefault
[request]: request.md
[response]: response.md
-[session-bag]: api/phalcon_session.md#session-bag
+[session-bag]: api/phalcon_session.md#sessionbag-
[dispatcher]: dispatcher.md
[events]: events.md
[application]: application.md
diff --git a/docs/datamapper.md b/docs/datamapper.md
index 6ce9dd1ac..37e681f03 100644
--- a/docs/datamapper.md
+++ b/docs/datamapper.md
@@ -627,12 +627,703 @@ The parameters available are:
## Query
### Factory
+The `Phalcon\DataMapper\Query` namespace offers a handy factory, which allows for a quick and easy creation of query objects, whether this is `select`, `insert`, `update` or `delete. The methods exposed by the [Phalcon\DataMapper\Query\QueryFactory][datamapper-query-queryfactory] accept a [Phalcon\DataMapper\Connection][datamapper-pdo-connection], binding the resulting object with the connection.
+
+#### Methods
+
+```php
+public function __construct(string selectClass = "")
+```
+QueryFactory constructor. Optionally accepts the name of a class that can be used for `Select` statements. By default, it is [Phalcon\DataMapper\Query\Select][datamapper-query-select].
+
+```php
+public function newBind(): Bind
+```
+Create a new Bind object
+
+```php
+public function newDelete(Connection $connection): Delete
+```
+Create a new Delete object
+
+```php
+public function newInsert(Connection $connection): Insert
+```
+Create a new Insert object
+
+```php
+public function newSelect(Connection $connection): Select
+```
+Create a new Select object
+
+```php
+public function newUpdate(Connection $connection): Update
+```
+Create a new Update object
+
+
+```php
+newSelect($connection);
+```
+
### Delete
+
+#### Methods
+
+
+```php
+public function __construct(Connection $connection, Bind $bind)
+```
+Delete constructor.
+
+```php
+public function andWhere(
+ string $condition,
+ mixed $value = null,
+ int $type = -1
+): Delete
+```
+Sets a `AND` for a `WHERE` condition
+
+```php
+public function appendWhere(
+ string $condition,
+ mixed $value = null,
+ int $type = -1
+): Delete
+```
+Concatenates to the most recent `WHERE` clause
+
+```php
+public function bindInline(mixed $value, int $type = -1): string
+```
+Binds a value inline
+
+```php
+public function bindValue(string key, mixed $value, int $type = -1): Delete
+```
+Binds a value - auto-detects the type if necessary
+
+```php
+public function bindValues(array values): Delete
+```
+Binds an array of values
+
+```php
+public function from(string table): Delete
+```
+Adds table(s) in the query
+
+```php
+public function getBindValues(): array
+```
+Returns all the bound values
+
+```php
+public function getStatement(): string
+```
+@return string
+
+```php
+public function limit(int $limit): Delete
+```
+Sets the `LIMIT` clause
+
+```php
+public function offset(int $offset): Delete
+```
+Sets the `OFFSET` clause
+
+```php
+public function orderBy(var $orderBy): Delete
+```
+Sets the `ORDER BY`
+
+```php
+public function orWhere(
+ string $condition,
+ mixed $value = null,
+ int $type = -1
+): Delete
+```
+Sets a `OR` for a `WHERE` condition
+
+```php
+public function perform()
+```
+Performs a statement in the connection
+
+```php
+public function quoteIdentifier(
+ string $name,
+ int $type = \PDO::PARAM_STR
+): string
+```
+Quotes the identifier
+
+```php
+public function reset(): Delete
+```
+Resets the internal array
+
+```php
+public function resetColumns(): Delete
+```
+Resets the columns
+
+```php
+public function resetFlags(): Delete
+```
+Resets the flags
+
+```php
+public function resetFrom(): Delete
+```
+Resets the from
+
+```php
+public function resetGroupBy(): Delete
+```
+Resets the group by
+
+```php
+public function resetHaving(): Delete
+```
+Resets the having
+
+```php
+public function resetLimit(): Delete
+```
+Resets the limit and offset
+
+```php
+public function resetOrderBy(): Delete
+```
+Resets the order by
+
+```php
+public function resetWhere(): Delete
+```
+Resets the where
+
+```php
+public function returning(array $columns): Delete
+```
+Adds the `RETURNING` clause
+
+```php
+public function setFlag(string $flag, bool $enable = true): void
+```
+Sets a flag for the query such as "DISTINCT"
+
+```php
+public function where(
+ string $condition,
+ mixed $value = null,
+ int $type = -1
+): Delete
+```
+Sets a `WHERE` condition
+
+```php
+public function whereEquals(array $columnsValues): Delete
+```
+sw
+
+```php
+protected function addCondition(
+ string $store,
+ string $andor,
+ string $condition,
+ mixed $value = null,
+ int $type = -1
+): void
+```
+Appends a conditional
+
+```php
+protected function appendCondition(
+ string $store,
+ string $condition,
+ mixed $value = null,
+ int $type = -1
+): void
+```
+Concatenates a conditional
+
+```php
+protected function buildBy(string $type): string
+```
+Builds a `BY` list
+
+```php
+protected function buildCondition(string $type): string
+```
+Builds the conditional string
+
+```php
+protected function buildFlags()
+```
+Builds the flags statement(s)
+
+```php
+protected function buildLimitEarly(): string
+```
+Builds the early `LIMIT` clause - MS SQLServer
+
+```php
+protected function buildLimit(): string
+```
+Builds the `LIMIT` clause
+
+```php
+protected function buildLimitCommon(): string
+```
+Builds the `LIMIT` clause for all drivers
+
+```php
+protected function buildLimitSqlsrv(): string
+```
+Builds the `LIMIT` clause for MSSQLServer
+
+```php
+protected function buildReturning(): string
+```
+Builds the `RETURNING` clause
+
+```php
+protected function indent(array $collection, string $glue = ""): string
+```
+Indents a collection
+
+```php
+protected function processValue(string $store, mixed $data): void
+```
+Processes a value (array or string) and merges it with the store
+
+
+
+
+1.2.7. DELETE
+1.2.7.1. Building The Statement
+1.2.7.1.1. FROM
+Use the from() method to specify FROM expression.
+
+$delete->from('foo');
+1.2.7.1.2. WHERE
+(All WHERE methods support implicit and sprintf() inline value binding.)
+
+The Delete WHERE methods work just like their equivalent Select methods:
+
+where() and andWhere() AND a WHERE condition
+orWhere() ORs a WHERE condition
+catWhere() concatenates onto the end of the most-recent WHERE condition
+whereSprintf() and andWhereSprintf() AND a WHERE condition with sprintf()
+orWhereSprintf() ORs a WHERE condition with sprintf()
+catWhereSprintf() concatenates onto the end of the most-recent WHERE condition with sprintf()
+1.2.7.1.3. ORDER BY
+Some databases (notably MySQL) recognize an ORDER BY clause. You can add one to the Delete with the orderBy() method; pass each expression as a variadic argument.
+
+// DELETE ... ORDER BY foo, bar, baz
+$delete
+->orderBy('foo')
+->orderBy('bar', 'baz');
+1.2.7.1.4. LIMIT and OFFSET
+Some databases (notably MySQL and SQLite) recognize a LIMIT clause; others (notably SQLite) recognize an additional OFFSET. You can add these to the Delete with the limit() and offset() methods:
+
+// LIMIT 10 OFFSET 40
+$delete
+->limit(10)
+->offset(40);
+1.2.7.1.5. RETURNING
+Some databases (notably PostgreSQL) recognize a RETURNING clause. You can add one to the Delete using the returning() method, specifying columns as variadic arguments.
+
+// DELETE ... RETURNING foo, bar, baz
+$delete
+->returning('foo')
+->returning('bar', 'baz');
+1.2.7.1.6. Flags
+You can set flags recognized by your database server using the setFlag() method. For example, you can set a MySQL LOW_PRIORITY flag like so:
+
+// DELETE LOW_PRIORITY foo WHERE baz = :_1_1_
+$delete
+->from('foo')
+->where('baz = ', $baz_value)
+->setFlag('LOW_PRIORITY');
+
+
+
+
+
### Insert
+
+#### Methods
+
+```php
+public function __construct(Connection $connection, Bind $bind)
+```
+Insert constructor.
+
+```php
+public function bindInline(mixed $value, int $type = -1): string
+```
+Binds a value inline
+
+```php
+public function bindValue(string $key, mixed $value, int $type = -1): Insert
+```
+Binds a value - auto-detects the type if necessary
+
+```php
+public function bindValues(array $values): Insert
+```
+Binds an array of values
+
+```php
+public function column(string $column, mixed $value = null, int $type = -1): Insert
+```
+Sets a column for the `INSERT` query
+
+```php
+public function columns(array $columns): Insert
+```
+Mass sets columns and values for the `INSERT`
+
+```php
+public function getBindValues(): array
+```
+Returns all the bound values
+
+```php
+public function getLastInsertId(string $name = null): string
+```
+Returns the id of the last inserted record
+
+```php
+public function getStatement(): string
+```
+Returns the statement produced
+
+```php
+public function into(string $table): Insert
+```
+Adds table(s) in the query
+
+```php
+public function perform()
+```
+Performs a statement in the connection
+
+```php
+public function quoteIdentifier(string $name, int $type = \PDO::PARAM_STR): string {
+```
+Quotes the identifier
+
+```php
+public function reset(): Insert
+```
+Resets the internal array
+
+```php
+public function resetColumns(): Insert
+```
+Resets the `columns`
+
+```php
+public function resetFlags(): Insert
+```
+Resets the `flags`
+
+```php
+public function resetFrom(): Insert
+```
+Resets the `from`
+
+```php
+public function resetGroupBy(): Insert
+```
+Resets the `group by`
+
+```php
+public function resetHaving(): Insert
+```
+Resets the `having`
+
+```php
+public function resetLimit(): Insert
+```
+Resets the `limit` and `offset`
+
+```php
+public function resetOrderBy(): Insert
+```
+Resets the `order by`
+
+```php
+public function resetWhere(): Insert
+```
+Resets the `where`
+
+```php
+public function returning(array $columns): Insert
+```
+Adds the `RETURNING` clause
+
+```php
+public function set(string $column, mixed $value = null): Insert
+```
+Sets a `column = value` condition
+
+```php
+public function setFlag(string $flag, bool $enable = true): void
+```
+Sets a flag for the query such as `DISTINCT`
+
+```php
+protected function buildFlags()
+```
+Builds the flags statement(s)
+
+```php
+protected function buildReturning(): string
+```
+Builds the `RETURNING` clause
+
+```php
+protected function indent(array $collection, string $glue = ""): string
+```
+Indents a collection
+
+
+#### Activation
+To instantiate a [Phalcon\DataMapper\Query\Insert][datamapper-query-insert] builder, you can use the [Phalcon\DataMapper\Query\QueryFactory][datamapper-query-queryfactory] with a [Phalcon\DataMapper\Connection][datamapper-pdo-connection].
+
+```php
+newInsert($connection);
+```
+
+#### Build
+
+The `into()` method is used to specify the table to insert data to.
+
+```php
+$insert->into('co_invoices');
+```
+
+##### Columns
+You can use the `column()` method to specify a column and its bound value. The last optional parameter is the bind type used by `PDO`. This is set automatically for `string`, `integer`, `float` and `null` values.
+
+```php
+$insert
+ ->into('co_invoices')
+ ->column('inv_total', 100.12)
+;
+// INSERT INTO co_invoices (inv_total) VALUES (:inv_total)
+```
+
+The `columns()` method returns the object back, thus offering a fluent interface:
+
+```php
+$insert
+ ->into('co_invoices')
+ ->column('inv_cst_id', 2)
+ ->column('inv_total', 100.12);
+ ->column('inv_status_flag', 0, PDO::PARAM_BOOL)
+;
+// INSERT INTO co_invoices (
+// inv_cst_id,
+// inv_total,
+// inv_status_flag
+// ) VALUES (
+// :inv_cst_id,
+// :inv_total,
+// :inv_status_flag
+// )
+```
+
+You can also use the `columns()` method which accepts an array of elements. If the key is a `string` it is considered the field name, and its value will be the value of the field. Alternatively, for an array element with a numeric key, the value of that element will be the field name.
+
+```php
+$insert
+ ->into('co_invoices')
+ ->columns(
+ [
+ 'inv_cst_id',
+ 'inv_total' => 100.12
+ ]
+ )
+;
+// INSERT INTO co_invoices (
+// inv_cst_id,
+// inv_total
+// ) VALUES (
+// :inv_cst_id,
+// :inv_total
+// )
+```
+
+!!! info "NOTE"
+
+ When using the `columns()` method, you cannot define the `PDO` type of each field/value pair.
+
+##### Values
+Bound values are automatically quoted and escaped. There are however cases, where we need to set a specific value to a field without it being escaped. A common example is to utilize the `NOW()` keyword assigned to a date field. For that purpose, we can use the `set()` method.
+
+```php
+$insert
+ ->into('co_invoices')
+ ->column('inv_total', 100.12)
+ ->set('inv_created_date', 'NOW()')
+;
+// INSERT INTO co_invoices (
+// inv_total,
+// inv_created_date
+// ) VALUES (
+// :inv_total,
+// NOW()
+// )
+```
+
+##### Statement
+The object can return the constructed statement by calling the `getStatement()` method.
+
+```php
+$insert
+ ->into('co_invoices')
+ ->column('inv_total', 100.12)
+ ->set('inv_created_date', 'NOW()')
+;
+
+echo $insert->getStatement();
+// INSERT INTO co_invoices (
+// inv_total,
+// inv_created_date
+// ) VALUES (
+// :inv_total,
+// NOW()
+// )
+```
+
+##### Returning
+Some databases (notably PostgreSQL) recognize a `RETURNING` clause. You can use the `returning()` method to do so, passing an array of fields to be returned.
+
+```php
+$insert
+ ->into('co_invoices')
+ ->columns(
+ [
+ 'inv_cst_id',
+ 'inv_total' => 100.12
+ ]
+ )
+ ->set('inv_id', null)
+ ->set('inv_status_flag', 1)
+ ->set('inv_created_date', 'NOW()')
+ ->columns(
+ [
+ 'inv_cst_id' => 1
+ ]
+ )
+ ->returning(
+ [
+ 'inv_id',
+ 'inv_cst_id'
+ ]
+ )
+ ->returning(
+ [
+ 'inv_total'
+ ]
+ )
+ ->set('inv_created_date', 'NOW()')
+;
+
+echo $insert->getStatement();
+// INSERT INTO co_invoices (
+// inv_cst_id,
+// inv_total,
+// inv_id,
+// inv_status_flag,
+// inv_created_date
+// ) VALUES (
+// :inv_cst_id,
+// :inv_total,
+// NULL,
+// 1,
+// NOW()
+// )
+// RETURNING inv_id, inv_cst_id, inv_total
+```
+
+##### Flags
+You can set flags recognized by your database server using the `setFlag()` method. For example, you can set a MySQL `LOW_PRIORITY` flag as follows:
+
+```php
+$insert
+ ->into('co_invoices')
+ ->column('inv_total', 100.12)
+ ->set('inv_created_date', 'NOW()')
+ ->setFlag('LOW_PRIORITY')
+;
+
+echo $insert->getStatement();
+// INSERT LOW_PRIORITY INTO co_invoices (
+// inv_total,
+// inv_created_date
+// ) VALUES (
+// :inv_total,
+// NOW()
+// )
+```
+
### Select
#### Activation
-To instantiate a `Phalcon\DataMapper\Query\Select` builder, you can use the `Phalcon\DataMapper\Query\QueryFactory` with a `Phalcon\DataMapper\Connection`.
+To instantiate a [Phalcon\DataMapper\Query\Select][datamapper-query-select] builder, you can use the [Phalcon\DataMapper\Query\QueryFactory][datamapper-query-queryfactory] with a [Phalcon\DataMapper\Connection][datamapper-pdo-connection].
```php
updateAsDict(
@@ -626,9 +626,9 @@ public function viewExists(
): bool
```
Generates SQL checking for the existence of a schema view
-
-### Custom
-The [Phalcon\Db\AdapterInterface][db-adapter-adapterinterface] interface must be implemented in order to create your own database adapters or extend the existing ones. Additionally, you can extend the [Phalcon\Db\AbstractAdapter][db-adapter-abstractadapter] that already has some implementation for your custom adapter.
+
+### Custom
+The [Phalcon\Db\AdapterInterface][db-adapter-adapterinterface] interface must be implemented to create your database adapters or extend the existing ones. Additionally, you can extend the [Phalcon\Db\AbstractAdapter][db-adapter-abstractadapter] that already has some implementation for your custom adapter.
### Escaping
Escaping identifiers is enabled by default. However, if you need to disable this feature, you can do so using the `setup()` method:
@@ -646,7 +646,7 @@ Escaping identifiers is enabled by default. However, if you need to disable this
## Factory
### `newInstance()`
Although all adapter classes can be instantiated using the `new` keyword, Phalcon offers the [Phalcon\Db\Adapter\PdoFactory][db-adapter-pdofactory] class, so that you can easily instantiate PDO adapter instances. All the above adapters are registered in the factory and lazy loaded when called. The factory allows you to register additional (custom) adapter classes. The only thing to consider is choosing the name of the adapter in comparison to the existing ones. If you define the same name, you will overwrite the built-in one. The objects are cached in the factory so if you call the `newInstance()` method with the same parameters during the same request, you will get the same object back.
-
+
The reserved names are:
| Name | Adapter |
@@ -692,7 +692,7 @@ $connection = $factory
```
### `load()`
-You can also use the `load()` method to create an adapter using a configuration object or an array. The example below uses a `ini` file to instantiate the database connection using `load()`. The `load()` method accepts a `Phalcon\Config\Config` object or an array with two elements: the name of the adapter (`adapter`) and options for the adapter (`options`).
+You can also use the `load()` method to create an adapter using a configuration object or an array. The example below uses an `ini` file to instantiate the database connection using `load()`. The `load()` method accepts a `Phalcon\Config\Config` object or an array with two elements: the name of the adapter (`adapter`) and options for the adapter (`options`).
```
[database]
@@ -728,7 +728,7 @@ $container->set(
## Dialects
### Built In
-Phalcon encapsulates the specific details of each database engine in dialects. [Phalcon\Db\Dialect][db-dialect] provides common functions and SQL generator to the adapters.
+Phalcon encapsulates the specific details of each database engine in dialects. [Phalcon\Db\Dialect][db-dialect] provides common functions and SQL generators to the adapters.
| Class | Description |
|--------------------------------------------------------|-----------------------------------------------------|
@@ -737,9 +737,9 @@ Phalcon encapsulates the specific details of each database engine in dialects. [
| [Phalcon\Db\Dialect\Sqlite][db-dialect-sqlite] | SQL specific dialect for SQLite database system |
### Custom
-The [Phalcon\Db\DialectInterface][db-dialectinterface] interface must be implemented in order to create your own database dialects or extend the existing ones. You can also enhance your current dialect by adding more commands/methods that PHQL will understand. For instance when using the MySQL adapter, you might want to allow PHQL to recognize the `MATCH ... AGAINST ...` syntax. We associate that syntax with `MATCH_AGAINST`
+The [Phalcon\Db\DialectInterface][db-dialectinterface] interface must be implemented to create your database dialects or extend the existing ones. You can also enhance your current dialect by adding more commands/methods that PHQL will understand. For instance, when using the MySQL adapter, you might want to allow PHQL to recognize the `MATCH ... AGAINST ...` syntax. We associate that syntax with `MATCH_AGAINST`
-We instantiate the dialect. We add the custom function so that PHQL understands what to do when it finds it during the parsing process. In the example below, we register a new custom function called `MATCH_AGAINST`. After that all we have to do is add the customized dialect object to our connection.
+We instantiate the dialect. We add the custom function so that PHQL understands what to do when it finds it during the parsing process. In the example below, we register a new custom function called `MATCH_AGAINST`. After that, all we have to do is add the customized dialect object to our connection.
```php
executeQuery(
!!! info "NOTE"
- There are more examples on how to extend PHQL in the [PHQL][db-phql] document.
+ There are more examples of how to extend PHQL in the [PHQL][db-phql] document.
## Connect
-To create a connection it's necessary instantiate the adapter class. It only requires an array with the connection parameters. The example below shows how to create a connection passing both required and optional parameters:
+To create a connection it's necessary to instantiate the adapter class. It only requires an array with the connection parameters. The example below shows how to create a connection passing both required and optional parameters:
| Adapter | Parameter | Status |
|--------------|--------------|----------|
@@ -812,7 +812,7 @@ To create a connection it's necessary instantiate the adapter class. It only req
| `Sqlite` | `dbname` | required |
Connecting to each adapter can be achieved by either the factory as demonstrated above or by passing the relevant options to the constructor of each class.
-
+
```php
insertAsDict(
Dynamic generation (alternative syntax)
## Update
-To update a row in the database, you can use raw SQL or use the methods present by the adapter:
+To update a row in the database, you can use raw SQL or use the methods presented by the adapter:
```php
update(
'inv_id = 4'
);
```
-Dynamic generation
+Dynamic generation
!!! danger "NOTE"
- With the syntax above, the variables for the `where` part of the `update` (`inv_id = 4`) is not escaped!
+ With the syntax above, the variables for the `where` part of the `update` (`inv_id = 4`) are not escaped!
```php
fetch()) {
}
```
-The `query()` method returns an instance of [Phalcon\Db\Result\Pdo][db-result-pdo]. These objects encapsulate all the functionality related to the returned resultset i.e. traversing, seeking specific records, count etc.
+The `query()` method returns an instance of [Phalcon\Db\Result\Pdo][db-result-pdo]. These objects encapsulate all the functionality related to the returned resultset i.e. traversing, seeking specific records, `count` etc.
```php
numRows();
```
### Binding
-Bound parameters are also supported. Although there is a minimal performance impact by using bound parameters, you are highly encouraged to use this methodology to eliminate the possibility of your code being subject to SQL injection attacks. Both string and positional placeholders are supported.
+Bound parameters are also supported. Although there is a minimal performance impact by using bound parameters, you are highly encouraged to use this methodology to eliminate the possibility of your code being subject to SQL injection attacks. Both string and positional placeholders are supported.
```php
query(
```
Binding with named placeholders
-When using numeric placeholders, you will need to define them as integers i.e. `1` or `2`. In this case `'1'` or `'2'` are considered strings and not numbers, so the placeholder could not be successfully replaced. With any adapter, data are automatically escaped using [PDO Quote][pdo_quote]. This function takes into account the connection charset, therefore it is recommended to define the correct charset in the connection parameters or in your database server configuration, as a wrong charset will produce undesired effects when storing or retrieving data.
+When using numeric placeholders, you will need to define them as integers i.e. `1` or `2`. In this case `'1'` or `'2'` are considered strings and not numbers, so the placeholder could not be successfully replaced. With any adapter, data are automatically escaped using [PDO Quote][pdo_quote]. This function takes into account the connection charset, therefore it is recommended to define the correct charset in the connection parameters or your database server configuration, as a wrong charset will produce undesired effects when storing or retrieving data.
Also, you can pass your parameters directly to the `execute` or `query` methods. In this case bound parameters are directly passed to PDO:
@@ -1413,7 +1413,7 @@ $invoices = $this
;
```
-Typed placeholders are also more powerful, since we can now bind a static array without having to pass each element independently as a placeholder:
+Typed placeholders are also more powerful since we can now bind a static array without having to pass each element independently as a placeholder:
```php
executeQuery(
);
```
-However, this solution requires that the developer pays special attention about how bound parameters are passed and their types. To make this task easier and avoid unexpected exceptions you can instruct Phalcon to do this casting for you:
+However, this solution requires that the developer pay special attention to how bound parameters are passed and their types. To make this task easier and avoid unexpected exceptions you can instruct Phalcon to do this casting for you:
```php
setEventsManager($manager);
```
-You can use the power of these events to shield your application from dangerous SQL operations.
+You can use the power of these events to shield your application from dangerous SQL operations.
```php
attach(
```
## Profiling
-The adapter includes the [Phalcon\Db\Profiler][db-profiler] component, that is used to analyze the performance of database operations to diagnose performance problems and discover bottlenecks.
+The adapter includes the [Phalcon\Db\Profiler][db-profiler] component, which is used to analyze the performance of database operations to diagnose performance problems and discover bottlenecks.
```php
getSQLStatement(), PHP_EOL,
'Total Elapsed Time: ', $profile->getTotalElapsedSeconds(), PHP_EOL;
```
-The profiler exposes the `getProfiles()` method, returning an array of `Phalcon\Db\Profiler\Item` objects. Each object contains relevant statistics, including calculations for seconds, microseconds and nanoseconds.
+The profiler exposes the `getProfiles()` method, returning an array of `Phalcon\Db\Profiler\Item` objects. Each object contains relevant statistics, including calculations for seconds, microseconds, and nanoseconds.
-You can also create your own profile class based on the [Phalcon\Db\Profiler][db-profiler] class to record real time statistics of the statements that are sent to the database:
+You can also create your profile class based on the [Phalcon\Db\Profiler][db-profiler] class to record real-time statistics of the statements that are sent to the database:
```php
tableExists('co_invoices');
```
-Check if there is a table called `co_invoices` in the database?
+Check if there is a table called `co_invoices` in the database.
```php
viewExists('vw_invoices');
Check if there is a view `vw_invoices` in the database
### Create
-Different database systems (MySQL, Postgresql etc.) offer the ability to create, alter or drop tables with the use of commands such as `CREATE`, `ALTER` or `DROP`. The SQL syntax differs based on which database system is used. `Phalcon\Db` adapters offers a unified interface to alter tables, without the need to differentiate the SQL syntax based on the target storage system.
+Different database systems (MySQL, Postgresql, etc.) offer the ability to create, alter or drop tables with the use of commands such as `CREATE`, `ALTER`, or `DROP`. The SQL syntax differs based on which database system is used. `Phalcon\Db` adapters offer a unified interface to alter tables, without the need to differentiate the SQL syntax based on the target storage system.
-An example on how to create a table is shown below:
+An example of how to create a table is shown below:
```php
true`). | Yes |
| `first` | Column must be placed at first position in the column order | Yes |
| `notNull` | Column can store null values | Yes |
| `primary` | `true` if the column is part of the table's primary key | Yes |
-| `scale` | `DECIMAL` or `NUMBER` columns may be have a scale to specify how many decimals should be stored | Yes |
-| `size` | Some type of columns like `VARCHAR` or `INTEGER` may have a specific size | Yes |
+| `scale` | `DECIMAL` or `NUMBER` columns maybe have a scale to specify how many decimals should be stored | Yes |
+| `size` | Some types of columns like `VARCHAR` or `INTEGER` may have a specific size | Yes |
| `type` | Column type. Must be a [Phalcon\Db\Column][db-column] constant (see below for a list) | No |
| `unsigned` | `INTEGER` columns may be `signed` or `unsigned`. This option does not apply to other types of columns | Yes |
@@ -1987,7 +1987,7 @@ The associative array passed in `createTable()` can have the following keys:
| `options` | An array with creation options. (specific to the database system) | Yes |
### Alter
-As your application grows, you might need to alter your database, as part of a refactoring or adding new features. Not all database systems allow you to modify existing columns or adding columns between two existing ones. [Phalcon\Db][db-column] is limited by these constraints.
+As your application grows, you might need to alter your database, as part of a refactoring or adding new features. Not all database systems allow you to modify existing columns or add columns between two existing ones. [Phalcon\Db][db-column] is limited by these constraints.
```php
dropTable('co_invoices');
```
-Drop the table `co_invoices` from active database
+Drop the table `co_invoices` from the active database
```php
dropTable('co_invoices', 'phalcon_db');
```
Drop the table `co_invoices` from the database `phalcon_db`
+
[pdo_quote]: https://www.php.net/manual/en/pdo.quote.php
[nested_transactions]: https://en.wikipedia.org/wiki/Nested_transaction
-[db-abstractdb]: api/phalcon_db.md#db-abstractdb
-[db-adapter-abstractadapter]: api/phalcon_db.md#db-adapter-abstractadapter
-[db-adapter-adapterinterface]: api/phalcon_db.md#db-adapter-adapterinterface
-[db-adapter-pdo-abstractpdo]: api/phalcon_db.md#db-adapter-pdo-abstractpdo
-[db-adapter-pdo-mysql]: api/phalcon_db.md#db-adapter-pdo-mysql
-[db-adapter-pdo-postgresql]: api/phalcon_db.md#db-adapter-pdo-postgresql
-[db-adapter-pdo-sqlite]: api/phalcon_db.md#db-adapter-pdo-sqlite
-[db-adapter-pdofactory]: api/phalcon_db.md#db-adapter-pdofactory
-[db-column]: api/phalcon_db.md#db-column
-[db-columninterface]: api/phalcon_db.md#db-columninterface
-[db-dialect]: api/phalcon_db.md#db-dialect
-[db-dialect-mysql]: api/phalcon_db.md#db-dialect-mysql
-[db-dialect-postgresql]: api/phalcon_db.md#db-dialect-postgresql
-[db-dialect-sqlite]: api/phalcon_db.md#db-dialect-sqlite
-[db-dialectinterface]: api/phalcon_db.md#db-dialectinterface
-[db-enum]: api/phalcon_db.md#db-enum
-[db-exception]: api/phalcon_db.md#db-exception
-[db-index]: api/phalcon_db.md#db-index
-[db-indexinterface]: api/phalcon_db.md#db-indexinterface
-[db-profiler]: api/phalcon_db.md#db-profiler
-[db-profiler-item]: api/phalcon_db.md#db-profiler-item
-[db-rawvalue]: api/phalcon_db.md#db-rawvalue
-[db-reference]: api/phalcon_db.md#db-reference
-[db-referenceinterface]: api/phalcon_db.md#db-referenceinterface
-[db-result-pdo]: api/phalcon_db.md#db-result-pdo
-[db-resultinterface]: api/phalcon_db.md#db-resultinterface
-[mvc-model]: api/phalcon_mvc.md#mvc-model
+[db-abstractdb]: api/phalcon_db.md#dbabstractdb--
+[db-adapter-abstractadapter]: api/phalcon_db.md#dbadapterabstractadapter--
+[db-adapter-adapterinterface]: api/phalcon_db.md#dbadapteradapterinterface--
+[db-adapter-pdo-abstractpdo]: api/phalcon_db.md#dbadapterpdoabstractpdo--
+[db-adapter-pdo-mysql]: api/phalcon_db.md#dbadapterpdomysql-
+[db-adapter-pdo-postgresql]: api/phalcon_db.md#dbadapterpdopostgresql-
+[db-adapter-pdo-sqlite]: api/phalcon_db.md#dbadapterpdosqlite-
+[db-adapter-pdofactory]: api/phalcon_db.md#dbadapterpdofactory-
+[db-column]: api/phalcon_db.md#dbcolumn-
+[db-columninterface]: api/phalcon_db.md#dbcolumninterface--
+[db-dialect]: api/phalcon_db.md#dbdialect--
+[db-dialect-mysql]: api/phalcon_db.md#dbdialectmysql-
+[db-dialect-postgresql]: api/phalcon_db.md#dbdialectpostgresql-
+[db-dialect-sqlite]: api/phalcon_db.md#dbdialectsqlite-
+[db-dialectinterface]: api/phalcon_db.md#dbdialectinterface--
+[db-enum]: api/phalcon_db.md#dbenum-
+[db-exception]: api/phalcon_db.md#dbexception-
+[db-index]: api/phalcon_db.md#dbindex-
+[db-indexinterface]: api/phalcon_db.md#dbindexinterface--
+[db-profiler]: api/phalcon_db.md#dbprofiler-
+[db-profiler-item]: api/phalcon_db.md#dbprofileritem-
+[db-rawvalue]: api/phalcon_db.md#dbrawvalue-
+[db-reference]: api/phalcon_db.md#dbreference-
+[db-referenceinterface]: api/phalcon_db.md#dbreferenceinterface--
+[db-result-pdo]: api/phalcon_db.md#dbresultpdoresult-
+[db-resultinterface]: api/phalcon_db.md#dbresultinterface--
+[mvc-model]: api/phalcon_mvc.md#mvcmodel--
[events]: events.md
[db-phql]: db-phql.md
[logger]: logger.md
diff --git a/docs/db-migrations.md b/docs/db-migrations.md
index 8e00482a7..94d5d1cf8 100644
--- a/docs/db-migrations.md
+++ b/docs/db-migrations.md
@@ -22,15 +22,15 @@ composer require --dev phalcon/migrations
## Quick start
-What you need for quick start:
+What you need for a quick start:
-* Configuration file in root of your project (you can also pass them as parameters inside CLI environment)
-* Create database tables structure
+* Configuration file in the root of your project (you can also pass them as parameters inside CLI environment)
+* Create database table structure
* Execute command to generate migrations
-After that you can execute that migrations (run) in another environment to create same DB structure.
+After that, you can execute that migration (run) in another environment to create the same DB structure.
-### Create configuration file
+### Create the configuration file
```php
true` in config file or `--ts-based` option in CLI environment.
-Also, you need to specify suffix `descr`, which could be anything you want, for example: semantic version.
+Use `'migrationsTsBased' => true` in the config file or `--ts-based` option in CLI environment.
+Also, you need to specify the suffix `descr`, which could be anything you want, for example: semantic version.
Current command
```
vendor/bin/phalcon-migrations generate --ts-based --descr=1.0.0
```
-Will produce folder name with such names
+Will produce folder names with such names
```sh
* 1582539287636860_1.0.0
diff --git a/docs/db-models-behaviors.md b/docs/db-models-behaviors.md
index 40487943a..8e2e1f8f7 100644
--- a/docs/db-models-behaviors.md
+++ b/docs/db-models-behaviors.md
@@ -2,7 +2,7 @@
- - -
## Overview
-[Behaviors][mvc-model-behavior] are shared constructs that several models may adopt in order to re-use code. Although you can use [traits][traits] to reuse code, behaviors have several benefits that make them more appealing. Traits require you to use exactly the same field names for common code to work. Behaviors are more flexible.
+[Behaviors][mvc-model-behavior] are shared constructs that several models may adopt in order to reuse code. Although you can use [traits][traits] to reuse code, behaviors have several benefits that make them more appealing. Traits require you to use exactly the same field names for common code to work. Behaviors are more flexible.
The ORM provides an API to implement behaviors in your models. Also, you can use the events and callbacks as seen before as an alternative to implement behaviors.
@@ -57,7 +57,7 @@ The following built-in behaviors are provided by the framework:
| Name | Description |
|----------------------------------------------------|------------------------------------------------------------------------------------------------------------|
-| [SoftDelete][mvc-model-behavior-softdelete] | Instead of permanently delete a record it marks the record as deleted changing the value of a flag column |
+| [SoftDelete][mvc-model-behavior-softdelete] | Instead of permanently deleting a record it marks the record as deleted changing the value of a flag column |
| [Timestampable][mvc-model-behavior-timestampable] | Allows to automatically update a model's attribute saving the datetime when a record is created or updated |
## Timestampable
@@ -163,7 +163,7 @@ class Invoices extends Model
}
```
-This behavior accepts two options: `field` and `value`, `field` determines what field must be updated and `value` the value to be deleted. Assuming that our table has the following rows:
+This behavior accepts two options: `field` and `value`, `field` determines what field must be updated, and `value` is the value to be deleted. Assuming that our table has the following rows:
```sql
mysql> select * from co_invoices;
@@ -232,7 +232,7 @@ Additionally, if you extend [Phalcon\Mvc\Model\Behavior][mvc-model-behavior], yo
| `getOptions(string $eventName = null)` | Returns the behavior options related to an event |
| `mustTakeAction(string $eventName)` | Checks whether the behavior must take action on certain event |
-The following behavior is an example, it implements the `Blameable` behavior which helps identify the user that is performed operations on a model:
+The following behavior is an example, it implements the `Blameable` behavior which helps identify the user that is performing operations on a model:
```php
set(
It is imperative to use a serializer that can properly serialize and unserialize objects without changing their state. `Php` and `Igbinary` are such serializers. `Json` will convert objects to `stdClass` and `Simple`/`Complex` resultsets will become arrays. Choosing a serializer that cannot store objects properly will produce errors when the cache is restored for your models.
-You have complete control in how you create and customize the cache component before registering it. You can check the [cache][cache] document for various options and customizations available when creating the cache component.
+You have complete control over how you create and customize the cache component before registering it. You can check the [cache][cache] document for various options and customizations available when creating the cache component.
Once the cache component is properly set up, resultsets can be cached by using the `cache` element in the query commands for models such as `find`, `findFirst` etc.
@@ -88,7 +88,7 @@ $invoices = Invoices::find(
Cache the resultset using `my-cache` as the key but now use the service `cache` from the DI container instead of the `modelsCache`
## Relationships
-You can also cache resultsets that are returned by relationships.
+You can also cache resultsets that are returned by relationships.
```php
getInvoices(
]
);
```
-In the above example we call the `getRelated` method on a `Customer` model to retrieve the invoices from the `invoices` relationship. We also pass the array with the necessary options to cache the resultset for 5 minutes, using `my-key` as the key.
+In the above example, we call the `getRelated` method on a `Customer` model to retrieve the invoices from the `invoices` relationship. We also pass the array with the necessary options to cache the resultset for 5 minutes, using `my-key` as the key.
-We can also use the magic method `getInvoices` which is `get` with the name of the relationship, in this case `invoices`.
+We can also use the magic method `getInvoices` which is `get` with the name of the relationship, in this case, `invoices`.
When a cached resultset needs to be invalidated, you can simply delete it from the cache using the key specified as seen above.
-What resultsets to cache and for how long will depend on the needs of your application. Resultsets that change frequently should not be cached, since the cache results will be invalidated quickly with subsequent changes to the underlying records that represent these resultsets.
+What results to cache and for how long will depend on the needs of your application. Resultsets that change frequently should not be cached, since the cache results will be invalidated quickly with subsequent changes to the underlying records that represent these resultsets.
!!! info "NOTE"
@@ -152,7 +152,7 @@ $invoices = Invoices::find(
);
```
-This gives us the freedom to cache specific queries, however if we want to cache globally every query performed over the model, we can override the `find()`/`findFirst()` methods to force every query to be cached:
+This gives us the freedom to cache specific queries, however, if we want to cache globally every query performed over the model, we can override the `find()`/`findFirst()` methods to force every query to be cached:
```php
cst_name, PHP_EOL;
}
```
-A customer can have more than one invoice. Therefore, in this example, the same customer record could be unnecessarily queried several times. To avoid this, we can set the relationship as `reusable`. This will instruct Phalcon to cache the related record in memory the first time it is accessed, and subsequent calls to the same record will return the data from the memory cached entity.
+A customer can have more than one invoice. Therefore, in this example, the same customer record could be unnecessarily queried several times. To avoid this, we can set the relationship as `reusable`. This will instruct Phalcon to cache the related record in memory the first time it is accessed, and subsequent calls to the same record will return the data from the memory-cached entity.
```php
inv_title = 'Invoice for ACME Inc.';
$invoice->save();
```
-If we want all objects created in our application use the same EventsManager, then we need to assign it to the Models Manager when setting it in the DI container:
+If we want all objects created in our application to use the same EventsManager, then we need to assign it to the Models Manager when setting it in the DI container:
```php
set(
```
### Memory
-This adapter uses the server's memory to store the metadata cache. The cache is available only during the request, and then the cache is lost. This cache is more suitable for development, since it accommodates the frequent changes in the database during development.
+This adapter uses the server's memory to store the metadata cache. The cache is available only during the request, and then the cache is lost. This cache is more suitable for development since it accommodates the frequent changes in the database during development.
```php
set(
```
### Stream
-This adapter uses the file system to store the table metadata. This adapter is suitable for production applications but not recommended since it introduces an increase in I/O.
+This adapter uses the file system to store the table metadata. This adapter is suitable for production applications but not recommended since it introduces an increase in I/O.
-The adapter can accept a `metaDadaDir` option with a directory on where the metadata will be stored. The default directory is the current directory.
+The adapter can accept a `metaDadaDir` option with a directory where the metadata will be stored. The default directory is the current directory.
```php
@@ -672,11 +672,11 @@ $container->set(
);
```
-### Introspection
+### Introspection
This strategy does not require any customization and is implicitly used by all the metadata adapters.
-### Annotations
-This strategy makes use of [annotations][annotations] to describe the columns in a model.
+### Annotations
+This strategy makes use of [annotations][annotations] to describe the columns in a model.
```php
set(
```
### Manual
-Using the introspection strategies presented above, Phalcon can obtain the metadata for each model automatically. However, you have the option to define the metadata manually. This strategy overrides any strategy that has been set on the metadata manager. Columns added, modified or removed from the mapped table must be manually updated in the model for everything to work properly.
+Using the introspection strategies presented above, Phalcon can obtain the metadata for each model automatically. However, you have the option to define the metadata manually. This strategy overrides any strategy that has been set on the metadata manager. Columns added, modified, or removed from the mapped table must be manually updated in the model for everything to work properly.
To set the metadata, we use the `metaData` method in a model:
@@ -908,16 +908,16 @@ class MyStrategy StrategyInterface
[apcu]: https://www.php.net/manual/en/book.apcu.php
[memcached]: https://www.memcached.org
[redis]: https://redis.io
-[mvc-model]: api/phalcon_mvc.md#mvc-model
-[mvc-model-metadata]: api/phalcon_mvc.md#mvc-model-metadata
-[mvc-model-metadata-apcu]: api/phalcon_mvc.md#mvc-model-metadata-apcu
-[mvc-model-metadata-libmemcached]: api/phalcon_mvc.md#mvc-model-metadata-libmemcached
-[mvc-model-metadata-memory]: api/phalcon_mvc.md#mvc-model-metadata-memory
-[mvc-model-metadata-redis]: api/phalcon_mvc.md#mvc-model-metadata-redis
-[mvc-model-metadata-strategy-annotations]: api/phalcon_mvc.md#mvc-model-metadata-strategy-annotations
-[mvc-model-metadata-strategy-introspection]: api/phalcon_mvc.md#mvc-model-metadata-strategy-introspection
-[mvc-model-metadata-strategyinterface]: api/phalcon_mvc.md#mvc-model-metadata-strategyinterface
-[mvc-model-metadata-stream]: api/phalcon_mvc.md#mvc-model-metadata-stream
-[mvc-model-metadatainterface]: api/phalcon_mvc.md#mvc-model-metadatainterface
+[mvc-model]: api/phalcon_mvc.md#mvcmodel--
+[mvc-model-metadata]: api/phalcon_mvc.md#mvcmodelmetadata--
+[mvc-model-metadata-apcu]: api/phalcon_mvc.md#mvcmodelmetadataapcu-
+[mvc-model-metadata-libmemcached]: api/phalcon_mvc.md#mvcmodelmetadatalibmemcached-
+[mvc-model-metadata-memory]: api/phalcon_mvc.md#mvcmodelmetadatamemory-
+[mvc-model-metadata-redis]: api/phalcon_mvc.md#mvcmodelmetadataredis-
+[mvc-model-metadata-strategy-annotations]: api/phalcon_mvc.md#mvcmodelmetadatastrategyannotations-
+[mvc-model-metadata-strategy-introspection]: api/phalcon_mvc.md#mvcmodelmetadatastrategyintrospection-
+[mvc-model-metadata-strategyinterface]: api/phalcon_mvc.md#mvcmodelmetadatastrategystrategyinterface--
+[mvc-model-metadata-stream]: api/phalcon_mvc.md#mvcmodelmetadatastream-
+[mvc-model-metadatainterface]: api/phalcon_mvc.md#mvcmodelmetadatainterface--
[cache-adapter-factory]: cache.md#adapter-factory
[annotations]: annotations.md
diff --git a/docs/db-models-relationships.md b/docs/db-models-relationships.md
index 7872a8340..6da743e49 100644
--- a/docs/db-models-relationships.md
+++ b/docs/db-models-relationships.md
@@ -2,7 +2,7 @@
- - -
## Overview
-[Database normalization][db-normalization] is a process where data is split into different tables and links are created between those tables, in order to increase flexibility, reduce data redundancy and improve data integrity. Relationships are defined in the `initialize` method of each model.
+[Database normalization][db-normalization] is a process where data is split into different tables and links are created between those tables, in order to increase flexibility, reduce data redundancy, and improve data integrity. Relationships are defined in the `initialize` method of each model.
The following types of relationships are available:
@@ -97,10 +97,10 @@ Unidirectional relations are those that are generated in relation to one another
The bidirectional relations build relationships in both models and each model defines the inverse relationship of the other.
## Setup
-In Phalcon, relationships must be defined in the `initialize()` method of a model. The methods `belongsTo()`, `hasMany()`, `hasManyToMany()`, `hasOne()` and `hasOneThrough()`, define the relationship between one or more fields from the current model to fields in another model. Each of these methods requires 3 parameters:
+In Phalcon, relationships must be defined in the `initialize()` method of a model. The methods `belongsTo()`, `hasMany()`, `hasManyToMany()`, `hasOne()`, and `hasOneThrough()`, define the relationship between one or more fields from the current model to fields in another model. Each of these methods requires 3 parameters:
-- local fields
-- referenced model
+- local fields
+- referenced model
- referenced fields
| Method | Description |
@@ -267,7 +267,7 @@ class Products extends Model
}
```
-The first parameter indicates the field of the local model used in the relationship; the second indicates the name of the referenced model, and the third the field name in the referenced model. You could also use arrays to define multiple fields in the relationship.
+The first parameter indicates the field of the local model used in the relationship; the second indicates the name of the referenced model, and the third is the field name in the referenced model. You could also use arrays to define multiple fields in the relationship.
Many-to-many relationships require 3 models and define the attributes involved in the relationship:
@@ -306,12 +306,12 @@ class Invoices extends Model
```
## Parameters
-Depending on the needs of our application we might want to store data in one table, that describe different behaviors. For instance, you might want to only have a table called `co_customers` which has a field `cst_status_flag` describing the _status_ of the customer (e.g. active, inactive, etc.).
+Depending on the needs of our application we might want to store data in one table, that describes different behaviors. For instance, you might want to only have a table called `co_customers` which has a field `cst_status_flag` describing the _status_ of the customer (e.g. active, inactive, etc.).
Using relationships, you can get only those `Customers` that relate to our `Invoices` that have a certain `cst_status_flag`. Defining that constraint in the relationship allows you to let the model do all the work.
It also accepts a closure, which is evaluated every time before the related records are accessed. This enables the conditions to be automatically updated between queries.
-
+
```php
getProducts() as $product) {
echo $invoice->prd_name;
}
```
-This magic getter also allows us to perform certain operations when accessing the relationship such as ordering the relationship:
+This magic-getter also allows us to perform certain operations when accessing the relationship such as ordering the relationship:
```php
prd_name;
}
```
-You can also add additional conditionals in the relationship:
+You can also add additional conditionals to the relationship:
```php
@@ -750,7 +750,7 @@ $customer->setRelated('invoices', [$invoice]);
```
## Aliases
-Accessing a relationship cam be achieved by using the name of the remote table. Due to naming conventions, this might not be that easy and could lead to confusion. As seen above, you can define an `alias` to the relationship.
+Accessing a relationship can be achieved by using the name of the remote table. Due to naming conventions, this might not be that easy and could lead to confusion. As seen above, you can define an `alias` to the relationship.
```php
getRelated(
```
## Virtual Foreign Keys
-By default, relationships do not have any constraints attached to them, to check related data when adding, updating or deleting records. You can however attach validations to your relationships, to ensure integrity of data. This can be done with the last parameter of the relationship related method.
+By default, relationships do not have any constraints attached to them, to check related data when adding, updating, or deleting records. You can however attach validations to your relationships, to ensure the integrity of data. This can be done with the last parameter of the relationship-related method.
The cross table `InvoicesProducts` can be slightly changed to demonstrate this functionality:
@@ -1201,8 +1201,8 @@ class InvoicesProducts extends Model
### Cascade/Restrict
Relationships that act as virtual foreign keys by default restrict the creation/update/deletion of records to maintain the integrity of data. You can define these constraints that mimic the RDBMS functionality for `CASCADE` and `RESTRICT` by using the `action` option in `foreignKey`. The [Phalcon\Mvc\Model\Relation][mvc-model-relation] underlying object offers two constants:
-- `Relation::ACTION_CASCADE`
-- `Relation::ACTION_RESTRICT`
+- `Relation::ACTION_CASCADE`
+- `Relation::ACTION_RESTRICT`
```php
save();
The code above gets a customer from our database. Two invoices are created and assigned to the `invoices` relationship of the customer as an array. The customer record is then saved, which also saves the two invoices in the database and links them to the customer.
-Although the syntax above is very handy, it is not always ideal to use it, especially when updating related records. Phalcon does not know which records need to be added or removed using an __update__, and as a result it will perform a replacement. In update situations, it is better to control the data yourself vs. leaving it to the framework to do that.
+Although the syntax above is very handy, it is not always ideal to use it, especially when updating related records. Phalcon does not know which records need to be added or removed using an __update__, and as a result, it will perform a replacement. In update situations, it is better to control the data yourself vs. leaving it to the framework to do that.
Saving data with the above syntax will implicitly create a transaction and commit it if all goes well. Messages generated during the save process of the whole transaction will be passed back to the user for more information.
@@ -1456,5 +1456,5 @@ if ( false === $customer->save() ) {
[db-normalization]: https://en.wikipedia.org/wiki/Database_normalization
-[mvc-model]: api/phalcon_mvc.md#mvc-model
-[mvc-model-relation]: api/phalcon_mvc.md#mvc-model-relation
+[mvc-model]: api/phalcon_mvc.md#mvcmodel--
+[mvc-model-relation]: api/phalcon_mvc.md#mvcmodelrelation-
diff --git a/docs/db-models-transactions.md b/docs/db-models-transactions.md
index badf83f5a..0a301c922 100644
--- a/docs/db-models-transactions.md
+++ b/docs/db-models-transactions.md
@@ -2,7 +2,7 @@
- - -
## Overview
-When a process performs multiple database operations, it is important to perform all these operations as a single unit of work. This way if one of the operations fails, we do not end up with corrupted data or orphaned records. Database transactions offer this functionality and ensure that all database operations have been executed successfully prior to storing the data in the database.
+When a process performs multiple database operations, it is important to perform all these operations as a single unit of work. This way if one of the operations fails, we do not end up with corrupted data or orphaned records. Database transactions offer this functionality and ensure that all database operations have been executed successfully prior to storing the data in the database.
Transactions in Phalcon allow you to commit all operations if they were executed successfully or rollback all operations if something went wrong.
@@ -61,7 +61,7 @@ class InvoicesController extends Controller
}
```
-## Implicit
+## Implicit
Existing relationships can be used to store records and their related instances. An operation like this implicitly creates a transaction to ensure that data is correctly stored:
```php
@@ -84,8 +84,8 @@ $customer->invoices = $invoice;
$customer->save();
```
-## Isolated
-Isolated transactions are executed in a new connection ensuring that all the generated SQL, virtual foreign key checks and business rules are isolated from the main connection. This kind of transaction requires a transaction manager that globally manages each transaction created ensuring that they are correctly rolled back or committed before ending the request:
+## Isolated
+Isolated transactions are executed in a new connection ensuring that all the generated SQL, virtual foreign key checks, and business rules are isolated from the main connection. This kind of transaction requires a transaction manager that globally manages each transaction created ensuring that they are correctly rolled back or committed before ending the request:
```php
hasChanged(
```php
public function hasSnapshotData(): bool
```
-Checks if the object has internal snapshot data
+Check if the object has internal snapshot data
```php
public function hasUpdated(
@@ -822,7 +822,7 @@ public static function query(
DiInterface $container = null
): CriteriaInterface
```
- Create a criteria for a specific model
+Create criteria for a specific model
```php
public function readAttribute(
@@ -977,7 +977,7 @@ public static function setup(
array $options
): void
```
-Enables / disables options in the ORM such as events, column renaming etc.
+Enables/disables options in the ORM such as events, column renaming, etc.
```php
final public function setWriteConnectionService(
@@ -1288,7 +1288,7 @@ final protected function setSource(
string $source
): ModelInterface
```
-Sets the table name to which model should be mapped
+Sets the table name to which the model should be mapped
```php
protected function skipAttributes(array $attributes)
@@ -1472,7 +1472,7 @@ class Invoices extends Model
The model `Invoices` now maps to `co_invoices` table. The `initialize()` method helps with setting up this model with a custom behavior i.e. a different table.
-The `initialize()` method is only called once during the request. This method is intended to perform initializations that apply for all instances of the model created within the application. If you want to perform initialization tasks for every instance created you can use the `onConstruct()` method:
+The `initialize()` method is only called once during the request. This method is intended to perform initializations that apply to all instances of the model created within the application. If you want to perform initialization tasks for every instance created you can use the `onConstruct()` method:
```php
getPropertyName` instead of `$model->getProperty_name`, `$model->findByPropertyName` instead of `$model->findByProperty_name`, etc.).
+If you use underscores in your property names, you must still use camel case in your getter/setter declarations for use with magic methods. (e.g. `$model->getPropertyName` instead of `$model->getProperty_name`, `$model->findByPropertyName` instead of `$model->findByProperty_name`, etc.).
-The ORM expects camel case naming and underscores are commonly removed. It is therefore recommended naming your properties in the manner shown throughout the documentation. You can use a column map (as described above) to ensure proper mapping of your properties to their database counterparts.
+The ORM expects camel case naming and underscores are commonly removed. It is therefore recommended to name your properties in the manner shown throughout the documentation. You can use a column map (as described above) to ensure proper mapping of your properties to their database counterparts.
## Records To Objects
Every instance of a model represents a row in the table. You can easily access record data by reading object properties. For example, for a table 'co_customers' with the records:
@@ -1676,11 +1676,11 @@ As you can see, there is no need to use raw SQL statements. [Phalcon\Mvc\Model][
## Finding Records
[Phalcon\Mvc\Model][mvc-model] also offers several methods for querying records.
-
-### `find`
+
+### `find`
The method returns a [Phalcon\Mvc\Model\Resultset][mvc-model-resultset], [Phalcon\Mvc\Model\Resultset\Complex][mvc-model-resultset-complex] or [Phalcon\Mvc\Model\Resultset\Simple][mvc-model-resultset-simple] collection of records even if the result returned is only one record.
-
- The method accept a variety of parameters to retrieve data:
+
+The method accepts a variety of parameters to retrieve data:
```php
()` method. This method expands on the `find()` method mentioned above. It allows you to quickly perform a select query from a table by using the property name in the method itself and passing it a parameter that contains the data you want to search for in that column.
@@ -2118,7 +2118,7 @@ class Invoices extends Model
}
```
-We have the properties `inv_cst_id`, `inv_id`, `inv_status_flag`, `inv_title`, `inv_created_at`. If we want to find all the invoices with `inv_total = 100` we can use:
+We have the properties `inv_cst_id`, `inv_id`, `inv_status_flag`, `inv_title`, `inv_created_at`. If we want to find all the invoices with `inv_total = 100` we can use:
```php
getFirst();
$invoice = $invoices->getLast();
```
-Phalcon's resultsets emulate scrollable cursors. You can get any row just by accessing its position, or seeking the internal pointer to a specific position.
+Phalcon's resultsets emulate scrollable cursors. You can get any row just by accessing its position or seeking the internal pointer to a specific position.
!!! info "NOTE"
@@ -2300,11 +2300,11 @@ foreach ($invoices as $invoice) {
}
```
### Custom Resultsets
-There are times that the application logic requires additional manipulation of the data as it is retrieved from the database. Previously, we would just extend the model and encapsulate the functionality in a class in the model or a trait, returning to the caller usually an array of transformed data.
+There are times when the application logic requires additional manipulation of the data as it is retrieved from the database. Previously, we would just extend the model and encapsulate the functionality in a class in the model or a trait, returning to the caller usually an array of transformed data.
With custom resultsets, you no longer need to do that. The custom resultset will encapsulate the functionality, that otherwise would be in the model, and can be reused by other models, thus keeping the code [DRY][dry]. This way, the `find()` method will no longer return the default [Phalcon\Mvc\Model\Resultset][mvc-model-resultset], but instead the custom one. Phalcon allows you to do this by using the `getResultsetClass()` in your model.
-First we need to define the resultset class:
+First, we need to define the resultset class:
```php
calculate();
```
### Filtering Resultsets
-The most efficient way to filter data is setting some search criteria, databases will use indexes set on tables to return data faster. Phalcon additionally allows you to filter the data using PHP:
+The most efficient way to filter data is by setting some search criteria, databases will use indexes set on tables to return data faster. Phalcon additionally allows you to filter the data using PHP:
```php
filter(
The above example will return only the paid invoices from our table (`inv_status_flag = 1`);
### Binding Parameters
-Bound parameters are also supported in [Phalcon\Mvc\Model][mvc-model]. You are encouraged to use this methodology to eliminate the possibility of your code being subject to SQL injection attacks. Both `string` and `integer` placeholders are supported.
+Bound parameters are also supported in [Phalcon\Mvc\Model][mvc-model]. You are encouraged to use this methodology to eliminate the possibility of your code being subject to SQL injection attacks. Both `string` and `integer` placeholders are supported.
!!! info "NOTE"
@@ -2464,11 +2464,11 @@ $invoices = Invoices::find(
Since the default bind type is `Phalcon\Db\Column::BIND_PARAM_STR`, there is no need to specify the 'bindTypes' parameter if all the columns are strings
-You can also bind arrays in the parameters, especially when using the `IN` SQL keyword.
+You can also bind arrays in the parameters, especially when using the `IN` SQL keyword.
!!! info "NOTE"
- You need to use a zero based array for arrays without missing elements
+ You need to use a zero-based array for arrays without missing elements
```php
value` elements, to avoid assigning each column manually. [Phalcon\Mvc\Model][mvc-model] will check if there are setters implemented for the columns passed in the array, giving priority to them, instead of assign directly the values of the attributes:
+You can also use the `assign()` method and pass an array of `field => value` elements, to avoid assigning each column manually. [Phalcon\Mvc\Model][mvc-model] will check if there are setters implemented for the columns passed in the array, giving priority to them, instead of directly the values of the attributes:
```php
save();
echo $invoice->inv_id; // 4
```
-[Phalcon\Mvc\Model][mvc-model] attempts to recognize the identity column from each table. However, depending on the database system, these columns might be serial columns, such as in the case of PostgreSQL or `auto_increment` columns in the case of MySQL.
+[Phalcon\Mvc\Model][mvc-model] attempts to recognize the identity column from each table. However, depending on the database system, these columns might be serial columns, such as in the case of PostgreSQL, or `auto_increment` columns in the case of MySQL.
PostgreSQL uses sequences to generate automatically numeric values for the primary key. Phalcon tries to obtain the generated value from the sequence `table_field_seq`, for example: `co_invoices_id_seq`. If the sequence name is different, you can always use the `getSequenceName()` method in the model, instructing Phalcon the sequence it needs to use for the primary key:
@@ -3168,7 +3168,7 @@ class Invoices extends Model
If the system-wide dynamic update is disabled, the SQL `UPDATE` statements are by default created with every column defined in the model (full all-field SQL update). You can change specific models to make dynamic updates, in this case, just the fields that had changed are used to create the final SQL statement.
-In some cases this could improve the performance by reducing the traffic between the application and the database server, especially when the target table has blob/text fields:
+In some cases, this could improve the performance by reducing the traffic between the application and the database server, especially when the target table has blob/text fields:
```php
hasChanged('inv_total')); // true
var_dump($invoice->hasChanged('inv_cst_id')); // false
```
-Snapshots are updated on model creation/update. Using `hasUpdated()` and `getUpdatedFields()` can be used to check if fields were updated after a create/save/update, but it could potentially cause problems to your application if you execute `getChangedFields()` in `afterUpdate()`, `afterSave()` or `afterCreate()`.
+Snapshots are updated on model creation/update. Using `hasUpdated()` and `getUpdatedFields()` can be used to check if fields were updated after a create/save/update, but it could potentially cause problems to your application if you execute `getChangedFields()` in `afterUpdate()`, `afterSave()` or `afterCreate()`.
You can disable this functionality by using:
@@ -3336,7 +3336,7 @@ phalcon.orm.update_snapshot_on_save = 0
```
Using this functionality will have the following effect:
-
+
```php
property = value`.
+ `Phalcon\Mvc\Model::assign()` (which is used also when creating/updating/saving model) is always using setters if they exist when data arguments are passed, even when it's required or necessary. This will add some additional overhead to your application. You can change this behavior by adding `phalcon.orm.disable_assign_setters = 1` to your ini file, it will just simply use `$this->property = value`.
## Integers vs. Strings
If you want to get integer values back from `int` related database fields, you will need to do the following:
@@ -3909,7 +3909,7 @@ In v5, the parameters used to instantiate PDO have changed. More specifically th
You can change the name of the parameters, or you can change the `PDO::ATTR_EMULATE_PREPARES` to `true`, when registering your database provider.
-## Stand-Alone Component
+## Stand-Alone Component
You can use [Phalcon\Mvc\Model][mvc-model] on its own, performing the necessary setup on your own if you wish. The example below demonstrates how you can achieve that.
```php
@@ -3951,34 +3951,34 @@ class Invoices extends Model
echo Invoices::count();
```
-[db-rawvalue]: api/phalcon_db.md#db-rawvalue
+[db-rawvalue]: api/phalcon_db.md#dbrawvalue-
[DRY]: https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
-[mvc-model]: api/phalcon_mvc.md#mvc-model
-[mvc-model-binder]: api/phalcon_mvc.md#mvc-model-binder
-[mvc-model-binder-bindableinterface]: api/phalcon_mvc.md#mvc-model-binder-bindableinterface
-[mvc-model-binderinterface]: api/phalcon_mvc.md#mvc-model-binderinterface
-[mvc-model-criteria]: api/phalcon_mvc.md#mvc-model-criteria
-[mvc-model-criteriainterface]: api/phalcon_mvc.md#mvc-model-criteriainterface
-[mvc-model-exception]: api/phalcon_mvc.md#mvc-model-exception
-[mvc-model-manager]: api/phalcon_mvc.md#mvc-model-manager
-[mvc-model-managerinterface]: api/phalcon_mvc.md#mvc-model-managerinterface
-[mvc-model-query]: api/phalcon_mvc.md#mvc-model-query
-[mvc-model-query-builder]: api/phalcon_mvc.md#mvc-model-query-builder
-[mvc-model-query-builderinterface]: api/phalcon_mvc.md#mvc-model-query-builderinterface
-[mvc-model-query-lang]: api/phalcon_mvc.md#mvc-model-query-lang
-[mvc-model-query-status]: api/phalcon_mvc.md#mvc-model-query-status
-[mvc-model-query-statusinterface]: api/phalcon_mvc.md#mvc-model-query-statusinterface
-[mvc-model-queryinterface]: api/phalcon_mvc.md#mvc-model-queryinterface
-[mvc-model-relation]: api/phalcon_mvc.md#mvc-model-relation
-[mvc-model-relationinterface]: api/phalcon_mvc.md#mvc-model-relationinterface
+[mvc-model]: api/phalcon_mvc.md#mvcmodel--
+[mvc-model-binder]: api/phalcon_mvc.md#mvcmodelbinder-
+[mvc-model-binder-bindableinterface]: api/phalcon_mvc.md#mvcmodelbinderbindableinterface--
+[mvc-model-binderinterface]: api/phalcon_mvc.md#mvcmodelbinderinterface--
+[mvc-model-criteria]: api/phalcon_mvc.md#mvcmodelcriteria-
+[mvc-model-criteriainterface]: api/phalcon_mvc.md#mvcmodelcriteriainterface--
+[mvc-model-exception]: api/phalcon_mvc.md#mvcmodelexception-
+[mvc-model-manager]: api/phalcon_mvc.md#mvcmodelmanager-
+[mvc-model-managerinterface]: api/phalcon_mvc.md#mvcmodelmanagerinterface--
+[mvc-model-query]: api/phalcon_mvc.md#mvcmodelquery-
+[mvc-model-query-builder]: api/phalcon_mvc.md#mvcmodelquerybuilder-
+[mvc-model-query-builderinterface]: api/phalcon_mvc.md#mvcmodelquerybuilderinterface--
+[mvc-model-query-lang]: api/phalcon_mvc.md#mvcmodelquerylang--
+[mvc-model-query-status]: api/phalcon_mvc.md#mvcmodelquerystatus-
+[mvc-model-query-statusinterface]: api/phalcon_mvc.md#mvcmodelquerystatusinterface--
+[mvc-model-queryinterface]: api/phalcon_mvc.md#mvcmodelqueryinterface--
+[mvc-model-relation]: api/phalcon_mvc.md#mvcmodelrelation-
+[mvc-model-relationinterface]: api/phalcon_mvc.md#mvcmodelrelationinterface--
[mvc-model-resultinterface]: api/phalcon_mvc.md#mvc-model-resultinterface
-[mvc-model-resultset]: api/phalcon_mvc.md#mvc-model-resultset
-[mvc-model-resultset-complex]: api/phalcon_mvc.md#mvc-model-resultset-complex
-[mvc-model-resultset-simple]: api/phalcon_mvc.md#mvc-model-resultset-simple
-[mvc-model-resultsetinterface]: api/phalcon_mvc.md#mvc-model-resultsetinterface
-[mvc-model-row]: api/phalcon_mvc.md#mvc-model-row
-[mvc-model-validationfailed]: api/phalcon_mvc.md#mvc-model-validationfailed
-[mvc-modelinterface]: api/phalcon_mvc.md#mvc-modelinterface
+[mvc-model-resultset]: api/phalcon_mvc.md#mvcmodelresultset--
+[mvc-model-resultset-complex]: api/phalcon_mvc.md#mvcmodelresultsetcomplex-
+[mvc-model-resultset-simple]: api/phalcon_mvc.md#mvcmodelresultsetsimple-
+[mvc-model-resultsetinterface]: api/phalcon_mvc.md#mvcmodelresultsetinterface--
+[mvc-model-row]: api/phalcon_mvc.md#mvcmodelrow-
+[mvc-model-validationfailed]: api/phalcon_mvc.md#mvcmodelvalidationfailed-
+[mvc-modelinterface]: api/phalcon_mvc.md#mvcmodelinterface--
[pdo-statements]: https://php.net/manual/en/pdo.prepared-statements.php
[db]: db-layer.md
[creating-models]: #creating-models
diff --git a/docs/db-pagination.md b/docs/db-pagination.md
index 9692c7423..35b5aac62 100644
--- a/docs/db-pagination.md
+++ b/docs/db-pagination.md
@@ -2,7 +2,7 @@
- - -
## Overview
-A paginator is a component which helps with splitting a large amount of data gradually. An example would be displaying all the posts of a blog, 5 at a time. The Phalcon Paginator accepts parameters and based on those returns the relevant _slice_ of the whole resultset so that the developer can present the paginated data.
+A paginator is a component that helps with splitting a large amount of data gradually. An example would be displaying all the posts of a blog, 5 at a time. The Phalcon Paginator accepts parameters and based on those returns the relevant _slice_ of the whole resultset so that the developer can present the paginated data.
```php
paginate();
```
-The example above uses an array as the source, and limits the results to 2 records at a time. It will return elements with id `3` and `4` because the `page` has been set to `2`.
+The example above uses an array as the source and limits the results to 2 records at a time. It will return elements with id `3` and `4` because the `page` has been set to `2`.
## Adapters
-For the source of the data, the component uses adapters. It comes with the following adapters:
+For the source of the data, the component uses adapters. It comes with the following adapters:
| Adapter | Description |
|--------------------------------------------------------------------------|----------------------------------------------------------------------------------------|
@@ -72,7 +72,7 @@ The methods exposed are:
### Model
The [Phalcon\Paginator\Adapter\Model][paginator-adapter-model] adapter uses a [Phalcon\Mvc\Model\Resultset][mvc-model-resultset] as the source of the data. This is the result of the `find()` method on a model.
-
+
```php
paginate();
```
### Query Builder
-The [Phalcon\Paginator\Adapter\QueryBuilder][paginator-adapter-querybuilder] adapter uses a [Phalcon\Mvc\Model\Query\Builder][mvc-model-query-builder] object to perform a PHQL query against the database.
+The [Phalcon\Paginator\Adapter\QueryBuilder][paginator-adapter-querybuilder] adapter uses a [Phalcon\Mvc\Model\Query\Builder][mvc-model-query-builder] object to perform a PHQL query against the database.
```php
paginate()` returns a [Phalcon\Paginator\Repository][paginator-repository] object that contains the paginated data. It can be used for generating the pagination in a view for instance:
+In the example above `$currentPage` contains an integer, user-supplied variable, for the page to be displayed. The `$paginator->paginate()` returns a [Phalcon\Paginator\Repository][paginator-repository] object that contains the paginated data. It can be used for generating the pagination in a view for instance:
```php
@@ -641,15 +641,15 @@ class MyPaginator implements PaginatorInterface
}
```
-[mvc-model-query-builder]: api/phalcon_mvc.md#mvc-model-query-builder
-[mvc-model-resultset]: api/phalcon_mvc.md#mvc-model-resultset
-[paginator-adapter-abstractadapter]: api/phalcon_paginator.md#paginator-adapter-abstractadapter
-[paginator-adapter-adapterinterface]: api/phalcon_paginator.md#paginator-adapter-adapterinterface
-[paginator-adapter-model]: api/phalcon_paginator.md#paginator-adapter-model
-[paginator-adapter-nativearray]: api/phalcon_paginator.md#paginator-adapter-nativearray
-[paginator-adapter-querybuilder]: api/phalcon_paginator.md#paginator-adapter-querybuilder
-[paginator-exception]: api/phalcon_paginator.md#paginator-exception
-[paginator-paginatorfactory]: api/phalcon_paginator.md#paginator-paginatorfactory
-[paginator-repository]: api/phalcon_paginator.md#paginator-repository
-[paginator-repositoryinterface]: api/phalcon_paginator.md#paginator-repositoryinterface
+[mvc-model-query-builder]: api/phalcon_mvc.md#mvcmodelquerybuilder-
+[mvc-model-resultset]: api/phalcon_mvc.md#mvcmodelresultset--
+[paginator-adapter-abstractadapter]: api/phalcon_paginator.md#paginatoradapterabstractadapter--
+[paginator-adapter-adapterinterface]: api/phalcon_paginator.md#paginatoradapteradapterinterface--
+[paginator-adapter-model]: api/phalcon_paginator.md#paginatoradaptermodel-
+[paginator-adapter-nativearray]: api/phalcon_paginator.md#paginatoradapternativearray-
+[paginator-adapter-querybuilder]: api/phalcon_paginator.md#paginatoradapterquerybuilder-
+[paginator-exception]: api/phalcon_paginator.md#paginatorexception-
+[paginator-paginatorfactory]: api/phalcon_paginator.md#paginatorpaginatorfactory-
+[paginator-repository]: api/phalcon_paginator.md#paginatorrepository-
+[paginator-repositoryinterface]: api/phalcon_paginator.md#paginatorrepositoryinterface--
[config]: config.md
diff --git a/docs/db-phql.md b/docs/db-phql.md
index 178dca5df..3765631a6 100644
--- a/docs/db-phql.md
+++ b/docs/db-phql.md
@@ -1,14 +1,14 @@
# Phalcon Query Language (PHQL)
- - -
-## Overview
-Phalcon Query Language, PhalconQL or simply PHQL is a high-level, object-oriented SQL dialect that allows you to write queries using a standardized SQL-like language. PHQL is implemented as a parser (written in C) that translates syntax in that of the target RDBMS.
+## Overview
+Phalcon Query Language, PhalconQL, or simply PHQL is a high-level, object-oriented SQL dialect that allows you to write queries using a standardized SQL-like language. PHQL is implemented as a parser (written in C) that translates syntax into that of the target RDBMS.
To achieve the highest performance possible, Phalcon provides a parser that uses the same technology as [SQLite][sqlite]. This technology provides a small in-memory parser with a very low memory footprint that is also thread-safe.
-The parser first checks the syntax of the PHQL statement to be parsed, then builds an intermediate representation of the statement, and finally it converts it to the respective SQL dialect of the target RDBMS.
+The parser first checks the syntax of the PHQL statement to be parsed, then builds an intermediate representation of the statement, and finally, it converts it to the respective SQL dialect of the target RDBMS.
-In PHQL, we have implemented a set of features to make your access to databases more securely:
+In PHQL, we have implemented a set of features to make your access to databases more secure:
* Bound parameters are part of the PHQL language helping you to secure your code
* PHQL only allows one SQL statement to be executed per call preventing injections
@@ -387,9 +387,9 @@ WHERE inv_cst_id IN (
```
### Results
-Depending on the columns we query as well as the tables, the result types will vary.
+Depending on the columns we query as well as the tables, the result types will vary.
-If you retrieve all the columns from a single table, you will get back a fully functional [Phalcon\Mvc\Model\Resultset\Simple][mvc-model-resultset-simple] object back. The object returned is a _complete_ and can be modified and re-saved in the database because they represent a complete record of the associated table.
+If you retrieve all the columns from a single table, you will get back a fully functional [Phalcon\Mvc\Model\Resultset\Simple][mvc-model-resultset-simple] object. The object returned is a _complete_ and can be modified and re-saved in the database because it represents a complete record of the associated table.
The following examples return identical results:
@@ -433,7 +433,7 @@ foreach ($invoices as $invoice) {
}
```
-Any queries that use specific columns do not return _complete_ objects, and therefore database operations cannot be performed on them. However, they are much smaller than their complete counterparts and offer micro optimizations in your code.
+Any queries that use specific columns do not return _complete_ objects, and therefore database operations cannot be performed on them. However, they are much smaller than their complete counterparts and offer micro-optimizations in your code.
```php
success()) {
}
```
-Since we tried to insert a negative number for the `inv_total` the `beforeCreate` was invoked prior to saving the record. As a result the operation fails and the relevant error messages are being sent back.
+Since we tried to insert a negative number for the `inv_total` the `beforeCreate` was invoked prior to saving the record. As a result, the operation fails and the relevant error messages are being sent back.
## Update
-Updating rows uses the same rules as inserting rows. For that operation we use the `UPDATE` command. Just as with inserting rows, when a record is updated the events related to the update operation will be executed for each row.
+Updating rows uses the same rules as inserting rows. For that operation, we use the `UPDATE` command. Just as with inserting rows, when a record is updated the events related to the update operation will be executed for each row.
Updating one column
@@ -1475,7 +1475,7 @@ An `UPDATE` statement performs the update in two phases:
* If the `UPDATE` has a `WHERE` clause it retrieves all the objects that match these criteria,
* Based on the queried objects it updates the requested attributes storing them in the database
-This way of operation allows that events, virtual foreign keys and validations to be executed during the updating process. In short, the code:
+This way of operation allows events, virtual foreign keys, and validations to be executed during the updating process. In short, the code:
```php
success()) {
```
## Query Builder
-[Phalcon\Mvc\Model\Query\Builder][mvc-model-query-builder] is a very handy builder that allows you to construct PHQL statements in an object-oriented way. Most methods return the buider object, allowing you to use a fluent interface and is flexible enough allowing you to add conditionals if you need to without having to create complex `if` statements and string concatenations constructing the PHQL statement.
+[Phalcon\Mvc\Model\Query\Builder][mvc-model-query-builder] is a very handy builder that allows you to construct PHQL statements in an object-oriented way. Most methods return the builder object, allowing you to use a fluent interface, and is flexible enough allowing you to add conditionals if you need to without having to create complex `if` statements and string concatenations constructing the PHQL statement.
The PHQL query:
@@ -1856,8 +1856,8 @@ public function betweenHaving(
string $operator = BuilderInterface::OPERATOR_AND
): BuilderInterface
```
-Appends a `BETWEEN` condition to the current `HAVING` conditions clause. The method accepts the expression, minimum and maximum as well as the operator for the `BETWEEN` (`OPERATOR_AND` or `OPERATOR_OR`)
-
+Appends a `BETWEEN` condition to the current `HAVING` conditions clause. The method accepts the expression, minimum and maximum as well as the operator for the `BETWEEN` (`OPERATOR_AND` or `OPERATOR_OR`)
+
```php
forUpdate(true);
```php
public function from(mixed $models): BuilderInterface
```
-Sets the models for the query. The method accepts either a `string` or an `array`. If you specify an array with specific `keys`, they will be used as aliases for the relevant models.
+Sets the models for the query. The method accepts either a `string` or an `array`. If you specify an array with specific `keys`, they will be used as aliases for the relevant models.
```php
executeQuery($phql);
```
-The delimiters are dynamically translated to valid delimiters depending on the database system where the application connecting to.
+The delimiters are dynamically translated to valid delimiters depending on the database system to which the application connecting.
## Custom Dialect
-Due to differences in SQL dialects based on the RDBMS of your choice, not all methods are supported. However, you can extend the dialect, so that you can use additional functions that your RDBMS supports.
+Due to differences in SQL dialects based on the RDBMS of your choice, not all methods are supported. However, you can extend the dialect, so that you can use additional functions that your RDBMS supports.
For the example below, we are using the `MATCH_AGAINST` method for MySQL.
@@ -3056,7 +3056,7 @@ $invoices = $modelsManager
;
```
-The above will create a `GROUP_CONCAT` based on the parameters passed to the method. If three parameters passed we will have a `GROUP_CONCAT` with a `DISTINCT`, `ORDER BY` and `SEPARATOR`, if two parameters passed we will have a `GROUP_CONCAT` with `SEPARATOR` and if only one parameter passed just a `GROUP_CONCAT`
+The above will create a `GROUP_CONCAT` based on the parameters passed to the method. If three parameters are passed we will have a `GROUP_CONCAT` with a `DISTINCT`, `ORDER BY`, and `SEPARATOR`, if two parameters are passed we will have a `GROUP_CONCAT` with `SEPARATOR`, and if only one parameter passed just a `GROUP_CONCAT`
## Caching
PHQL queries can be cached. You can also check the [Models Caching][db-models-cache] document for more information.
@@ -3087,8 +3087,8 @@ $invoice = $query->execute(
## Lifecycle
Being a high-level language, PHQL gives developers the ability to personalize and customize different aspects in order to suit their needs. The following is the life cycle of each PHQL statement executed:
-* The PHQL is parsed and converted into an Intermediate Representation (IR) which is independent of the SQL implemented by database system
-* The IR is converted to valid SQL according to the database system associated to the model
+* The PHQL is parsed and converted into an Intermediate Representation (IR) which is independent of the SQL implemented by the database system
+* The IR is converted to valid SQL according to the database system associated with the model
* PHQL statements are parsed once and cached in memory. Further executions of the same statement result in a slightly faster execution
## Raw SQL
@@ -3165,13 +3165,13 @@ Some things to keep in mind when using PHQL:
* Aliased classes are not replaced by full namespaced classes since this only occurs in PHP code and not inside strings.
* If column renaming is enabled avoid, using column aliases with the same name as columns to be renamed, this may confuse the query resolver.
-[di-injectable]: api/phalcon_di.md#di-injectable
-[mvc-model-manager]: api/phalcon_mvc.md#mvc-model-manager
-[mvc-model-query]: api/phalcon_mvc.md#mvc-model-query
-[mvc-model-query-builder]: api/phalcon_mvc.md#mvc-model-query-builder
-[mvc-model-resultset]: api/phalcon_mvc.md#mvc-model-resultset
-[mvc-model-resultset-complex]: api/phalcon_mvc.md#mvc-model-resultset-complex
-[mvc-model-resultset-simple]: api/phalcon_mvc.md#mvc-model-resultset-simple
+[di-injectable]: api/phalcon_di.md#diinjectable--
+[mvc-model-manager]: api/phalcon_mvc.md#mvcmodelmanager-
+[mvc-model-query]: api/phalcon_mvc.md#mvcmodelquery-
+[mvc-model-query-builder]: api/phalcon_mvc.md#mvcmodelquerybuilder-
+[mvc-model-resultset]: api/phalcon_mvc.md#mvcmodelresultset--
+[mvc-model-resultset-complex]: api/phalcon_mvc.md#mvcmodelresultsetcomplex-
+[mvc-model-resultset-simple]: api/phalcon_mvc.md#mvcmodelresultsetsimple-
[pdo-constants]: https://www.php.net/manual/en/pdo.constants.php
[sqlite]: https://en.wikipedia.org/wiki/Lemon_Parser_Generator
[db-models]: db-models.md
diff --git a/docs/devtools.md b/docs/devtools.md
index 3d3a9914d..58f89c178 100644
--- a/docs/devtools.md
+++ b/docs/devtools.md
@@ -2,13 +2,13 @@
- - -
## Overview
-These tools help you to generate skeleton code, maintain your database structure and helps to speedup development. Core components of your application can be generated with a simple command, allowing you to easily develop applications using Phalcon.
+These tools help you to generate skeleton code, maintain your database structure, and helps to speed up development. Core components of your application can be generated with a simple command, allowing you to easily develop applications using Phalcon.
You can use the Phalcon Devtools either from the command line (terminal) or the web interface.
## Installation
-Phalcon Devtools can be installed using [composer][composer]. Make sure you have installed first.
+Phalcon Devtools can be installed using [composer][composer]. Make sure you have installed it first.
Install Phalcon Devtools globally
```bash
@@ -19,7 +19,7 @@ Or only inside your project
composer require phalcon/devtools
```
-Test your installation by typing: `phalcon`
+Test your installation by typing: `phalcon`
```bash
$ phalcon
@@ -73,7 +73,7 @@ You can use Phalcon tools to generate pre-defined project skeletons for your app
$ phalcon create-project store
```
-The above recommended project structure was generated:
+The above-recommended project structure was generated:

@@ -91,7 +91,7 @@ Usage:
project [name] [type] [directory] [enable-webtools]
Arguments:
- help Shows this help text
+ help Shows this help text
Example
phalcon project store simple
@@ -188,7 +188,7 @@ Options:
--namespace=s Model's namespace [optional]
--get-set Attributes will be protected and have setters/getters [optional]
--extends=s Model extends the class name supplied [optional]
- --excludefields=l Excludes fields defined in a comma separated list [optional]
+ --excludefields=l Excludes fields defined in a comma-separated list [optional]
--doc Helps to improve code completion on IDEs [optional]
--directory=s Base path on which project is located [optional]
--output=s Folder where models are located [optional]
@@ -306,7 +306,7 @@ class Customers extends Model
}
```
-Options for generating different type of model blueprints can be found using
+Options for generating different types of model blueprints can be found using
```bash
phalcon model --help
@@ -315,7 +315,7 @@ phalcon model --help
### Scaffold a CRUD
Scaffolding is a quick way to generate some major pieces of an application. If you want to create the models, views, and controllers for a new resource in a single operation, scaffolding is the tool for the job.
-Once the code is generated, it will have to be customized to meet your needs. Many developers avoid scaffolding entirely, opting to write all or most of their source code from scratch. The generated code can serve as a guide to better understand of how the framework works or develop prototypes. The code below shows a scaffold based on the table `customers`:
+Once the code is generated, it will have to be customized to meet your needs. Many developers avoid scaffolding entirely, opting to write all or most of their source code from scratch. The generated code can serve as a guide to better understand how the framework works or develop prototypes. The code below shows a scaffold based on the table `customers`:
```bash
$ phalcon scaffold --table-name customers
@@ -336,7 +336,7 @@ When browsing the recently generated controller, you will see a search form and

-The `create page` allows you to create products applying validations on the Products model. Phalcon will automatically validate not null fields producing warnings if any of them is required.
+The `create page` allows you to create products by applying validations on the Products model. Phalcon will automatically validate not null fields producing warnings if any of them is required.

diff --git a/docs/di.md b/docs/di.md
index c9712615c..7bd6c45e2 100644
--- a/docs/di.md
+++ b/docs/di.md
@@ -36,7 +36,7 @@ $invoice = new InvoiceComponent();
$invoice->calculate();
```
-We use the `calculate` method to get our data. Inside the method, we create a new database connection to MySQL with set credentials and after that we execute a query. Although this is a perfectly valid implementation, it is impractical and will hinder the maintenance of our application later on, due to the fact that our connection parameters or type of the database are hard coded in the component. If in the future we need to change those, we will have to change them in this component and any other component designed in this manner.
+We use the `calculate` method to get our data. Inside the method, we create a new database connection to MySQL with set credentials and after that, we execute a query. Although this is a perfectly valid implementation, it is impractical and will hinder the maintenance of our application later on, due to the fact that our connection parameters or type of the database are hardcoded in the component. If in the future we need to change those, we will have to change them in this component and any other component designed in this manner.
```php
calculate();
The component now can simply access the dependencies it requires when it needs them. If a dependency is not required, it will not be initialized ensuring minimum usage of memory. Our component is now highly decoupled. For instance, if we change the database connection in any way, it will not affect the component, while as far as maintenance is concerned, we only need to change the code in one place.
-[Phalcon\Di\Di][di] is a component implementing Dependency Injection and a Service Locator. Since Phalcon is highly decoupled, [Phalcon\Di\Di][di] is essential to integrate the different components of the framework. The developer can also use this component to inject dependencies and manage global instances of the different classes used in the application. It also implements the [Inversion of Control][ioc] pattern. Because of this, the objects do not receive their dependencies using setters or constructors, but requesting a service dependency injector. This reduces the overall complexity since there is only one way to get the required dependencies within a component.
+[Phalcon\Di\Di][di] is a component implementing Dependency Injection and a Service Locator. Since Phalcon is highly decoupled, [Phalcon\Di\Di][di] is essential to integrate the different components of the framework. The developer can also use this component to inject dependencies and manage global instances of the different classes used in the application. It also implements the [Inversion of Control][ioc] pattern. Because of this, the objects do not receive their dependencies using setters or constructors but request a service dependency injector. This reduces the overall complexity since there is only one way to get the required dependencies within a component.
Additionally, this pattern increases testability in the code, thus making it less prone to errors.
@@ -604,7 +604,7 @@ public function setShared(
Registers an _always shared_ service in the services container
## Registering Services
-The framework itself or the developer can register services. When a component A requires component B (or an instance of its class) to operate, it can request component B from the container, rather than creating a new instance component B.
+The framework itself or the developer can register services. When component A requires component B (or an instance of its class) to operate, it can request component B from the container, rather than creating a new instance of component B.
This approach offers the following advantages:
* We can easily replace a component with one created by ourselves or a third party.
@@ -628,7 +628,7 @@ $container->set(
```
### Class Instances
-This type expects an object. Due to the fact that object does not need to be resolved as it is already an object, one could say that it is not really a dependency injection, however it is useful if you want to force the returned dependency to always be the same object/value:
+This type expects an object. Due to the fact that the object does not need to be resolved as it is already an object, one could say that it is not really a dependency injection, however, it is useful if you want to force the returned dependency to always be the same object/value:
```php
set(
);
```
-Both service registrations above produce the same result. The array definition however, allows you to change the service parameters if you need to:
+Both service registrations above produce the same result. The array definition, however, allows you to change the service parameters if you need to:
```php
'parameter', 'value' => 1234]` |
| `service` | Represents another service in the service container | `['type' => 'service', 'name' => 'request']` |
-Resolving a service whose definition is complex may be slightly slower than simple definitions seen previously. However, these provide a more robust approach to define and inject services. Mixing different types of definitions is allowed, and you can decide which way is the most appropriate for you to register the services according to the application needs.
+Resolving a service whose definition is complex may be slightly slower than simple definitions seen previously. However, these provide a more robust approach to defining and injecting services. Mixing different types of definitions is allowed, and you can decide which way is the most appropriate for you to register the services according to the application needs.
### Array Syntax
The array syntax is also available to register services:
@@ -1048,18 +1048,18 @@ $container['request'] = [
In the examples above, when the framework needs to access the request data, it will ask for the service identified as `request` in the container. The container in turn will return an instance of the required service. The component can be easily replaced with a different class if a need arises.
-As shown in the above examples, each of the ways used to set/register a service has advantages and disadvantages. It is up to the developer and the particular requirements that will designate which one is used. Setting a service by a string is simple, but lacks flexibility. Setting services using an array offers a lot more flexibility, but makes the code more complicated. The lambda function is a good balance between the two, but could lead to more maintenance than one would expect.
+As shown in the above examples, each of the ways used to set/register a service has advantages and disadvantages. It is up to the developer and the particular requirements that will designate which one is used. Setting a service by a string is simple, but lacks flexibility. Setting services using an array offers a lot more flexibility, but makes the code more complicated. The lambda function is a good balance between the two but could lead to more maintenance than one would expect.
!!! info "NOTE"
- [Phalcon\Di\Di][di] offers lazy loading for every service it stores. Unless the developer chooses to instantiate an object directly and store it in the container, any object stored in it (via array, string, etc.) will be lazy loaded i.e. instantiated only when requested.
+ [Phalcon\Di\Di][di] offers lazy loading for every service it stores. Unless the developer chooses to instantiate an object directly and store it in the container, any object stored in it (via array, string, etc.) will be lazy-loaded i.e. instantiated only when requested.
### Load From Config
**YAML**
This feature will load services by parsing a YAML file:
-
+
```yaml
; /app/config/services.yml
@@ -1085,7 +1085,7 @@ $container->get('/app/config/services.yml');
**PHP**
You can also load services using a PHP array:
-
+
```php
// /app/config/services.php
@@ -1183,7 +1183,7 @@ $session = $container->getSession();
The first call to `get` in the container resolves the service and returns the object back. The subsequent call to `getSession` will return the same object.
-An alternative way to register shared services is to pass `true` as third parameter of `set`:
+An alternative way to register shared services is to pass `true` as the third parameter of `set`:
```php
set(
$component = $container->get('IndexController');
```
-In the above example we are _replacing_ the `IndexController` with another component of our choosing.
+In the above example we are _replacing_ the `IndexController` with another component of our choosing.
Also, you can adjust your code to always instantiate your classes using the service container, even if they are not registered as services. The container will fall back to the autoloader you have defined to load the class itself. By using this technique, you can replace any class in the future by implementing a different definition for it.
## Automatic Injecting
-If a class or component requires the DI itself to locate services, the DI can automatically inject itself to the instances it creates. To take advantage of this, all you need is to implement the [Phalcon\Di\InjectionAwareInterface][di-injectionawareinterface] in your classes:
+If a class or component requires the DI itself to locate services, the DI can automatically inject itself into the instances it creates. To take advantage of this, all you need is to implement the [Phalcon\Di\InjectionAwareInterface][di-injectionawareinterface] in your classes:
```php
get('inv-component');
`$invoiceComponent->setDi($container)` is automatically called
-For your convenience you can also extend the [Phalcon\Di\AbstractInjectionAware][di-abstractinjectionaware] class which contains the above code and exposes the protected `$container` property for you to use.
+For your convenience, you can also extend the [Phalcon\Di\AbstractInjectionAware][di-abstractinjectionaware] class which contains the above code and exposes the protected `$container` property for you to use.
```php
set(
);
```
-If the desired schema is:
+If the desired schema is:
```
https://example.com/controller/key1:value1/key2:value
@@ -549,7 +549,7 @@ $container->set(
```
## Getting
-When a route provides named parameters you can receive them in a controller, a view or any other component that extends [Phalcon\Di\Injectable][di-factorydefault]
+When a route provides named parameters you can receive them in a controller, a view, or any other component that extends [Phalcon\Di\Injectable][di-factorydefault]
```php
set(
The code above can be used as is or adjusted to help with legacy URL transformations or other use cases where we need to manipulate the action name.
### Model Injection
-There are instances that you might want to inject automatically model instances that have been matched with the parameters passed in the URL.
+There are instances that you might want to inject automatically model instances that have been matched with the parameters passed in the URL.
Our controller is:
@@ -746,9 +746,9 @@ $container->set(
}
);
```
-In the example above, we get the controller class and active method from the dispatcher. Looping through the parameters, we use reflection to check the method to be executed. We calculate the model name and also check if the parameter is expecting a model name. If yes, we override the parameter by passing the model found. If an exception was thrown, we can handle that accordingly, for instance if the class or action do not exist or the record has not been found.
+In the example above, we get the controller class and active method from the dispatcher. Looping through the parameters, we use reflection to check the method to be executed. We calculate the model name and also check if the parameter is expecting a model name. If yes, we override the parameter by passing the model found. If an exception was thrown, we can handle that accordingly, for instance, if the class or action does not exist or the record has not been found.
-The above example has been simplified. You can adjust it according to your needs and inject any kind of dependency or model to an action before it gets executed.
+The above example has been simplified. You can adjust it according to your needs and inject any kind of dependency or model into an action before it gets executed.
The dispatcher also comes with an option to handle this internally for all models passed into a controller action by using the [Phalcon\Mvc\Model\Binder][mvc-model-binder] object.
@@ -773,7 +773,7 @@ return $dispatcher;
Also, by using the [Phalcon\Mvc\Model\Binder\BindableInterface][mvc-model-binder-bindableinterface] in controllers, you can define the models binding in base controllers.
-In the example below, we have a base controller `CrudController` which `InvoicesController` extends from.
+In the example below, we have a base controller `CrudController` which `InvoicesController` extends from.
```php
setShared(
);
```
-We can move this method in a plugin class:
+We can move this method to a plugin class:
```php
decrypt($text, $key);
The method will also internally use signing by default. You can always use `useSigning(false)` prior to the method call to disable it.
## Base64 Encrypt
-The `encryptBase64()` can be used to encrypt a string in a URL friendly way. It uses `encrypt()` internally and accepts the `text` and optionally the `key` of the element to encrypt. There is also a third parameter `safe` (defaults to `false`) which will perform string replacements for non URL _friendly_ characters such as `+` or `/`.
+The `encryptBase64()` can be used to encrypt a string in a URL-friendly way. It uses `encrypt()` internally and accepts the `text` and optionally the `key` of the element to encrypt. There is also a third parameter `safe` (defaults to `false`) which will perform string replacements for non URL _friendly_ characters such as `+` or `/`.
## Base64 Decrypt
-The `decryptBase64()` can be used to decrypt a string in a URL friendly way. Similar to `encryptBase64()` it uses `decrypt()` internally and accepts the `text` and optionally the `key` of the element to encrypt. There is also a third parameter `safe` (defaults to `false`) which will perform string replacements for previously replaced non URL _friendly_ characters such as `+` or `/`.
+The `decryptBase64()` can be used to decrypt a string in a URL-friendly way. Similar to `encryptBase64()` it uses `decrypt()` internally and accepts the `text` and optionally the `key` of the element to encrypt. There is also a third parameter `safe` (defaults to `false`) which will perform string replacements for previously replaced non URL _friendly_ characters such as `+` or `/`.
## Exceptions
-Exceptions thrown in the [Phalcon\Encryption\Crypt][crypt] component will be of type [Phalcon\Encryption\Crypt\Exception][config-exception]. If however you are using signing and the calculated hash for `decrypt()` does not match, [Phalcon\Encryption\Crypt\Mismatch][crypt-mismatch] will be thrown. You can use these exceptions to selectively catch exceptions thrown only from this component.
+Exceptions thrown in the [Phalcon\Encryption\Crypt][crypt] component will be of type [Phalcon\Encryption\Crypt\Exception][config-exception]. If however, you are using signing and the calculated hash for `decrypt()` does not match, [Phalcon\Encryption\Crypt\Mismatch][crypt-mismatch] will be thrown. You can use these exceptions to selectively catch exceptions thrown only from this component.
```php
getErrors())
```
-The above example gives a general view on how the component can be used to generate, parse and validate JSON Web Tokens.
+The above example gives a general view on how the component can be used to generate, parse, and validate JSON Web Tokens.
## Objects
-There are several utility components that live in the `Phalcon\Encryption\Security\JWT\Token` namespace, that help with the issuing, parsing and validating JWT tokens
+There are several utility components that live in the `Phalcon\Encryption\Security\JWT\Token` namespace, that help with the issuing, parsing, and validating of JWT tokens
### Enum
@@ -150,7 +150,7 @@ class Enum
### Token
-[Phalcon\Encryption\Security\JWT\Token\Token][security-jwt-token-token] is the component responsible for storing and calculating the JWT token. It accepts the headers, claims (as [Phalcon\Encryption\Security\JWT\Token\Item][security-jwt-token-item] objects) and signature objects in its constructor and exposes:
+[Phalcon\Encryption\Security\JWT\Token\Token][security-jwt-token-token] is the component responsible for storing and calculating the JWT token. It accepts the headers, claims (as [Phalcon\Encryption\Security\JWT\Token\Item][security-jwt-token-item] objects), and signature objects in its constructor and exposes:
```php
public function getClaims(): Item
@@ -203,11 +203,11 @@ $signer = new Hmac();
**None**
-This signer is provided mostly for development purposes. You should always sign your JWT tokens.
+This signer is provided mostly for development purposes. You should always sign your JWT tokens.
**HMAC**
-The HMAC signer supports the `sha512`, `sha384`, and `sha256` algorithms. If none is supplied, the `sha512` is automatically selected. If you supply a different algorithm, a [Phalcon\Encryption\Security\JWT\Exceptions\UnsupportedAlgorithmException][security-jwt-exceptions-unsupportedalgorithmexception] will be raised. The algorithm is set in the constructor.
+The HMAC signer supports the `sha512`, `sha384`, and `sha256` algorithms. If none is supplied, the `sha512` is automatically selected. If you supply a different algorithm, a [Phalcon\Encryption\Security\JWT\Exceptions\UnsupportedAlgorithmException][security-jwt-exceptions-unsupportedalgorithmexception] will be raised. The algorithm is set in the constructor.
```php
@@ -228,7 +228,7 @@ The component utilizes the [hmac_equals][hmac_equals] and [hash_hmac][hash_hmac]
public function getAlgHeader(): string
```
-Returns a string identifying the algorithm. For the HMAC algorithms it will return:
+Returns a string identifying the algorithm. For the HMAC algorithms, it will return:
| Algorithm | `getAlgHeader` |
|:---------:|:--------------:|
@@ -250,7 +250,7 @@ Verifies that the hashed source string is the same as the hash of the payload wi
## Issuing Tokens
-A Builder component ([Phalcon\Encryption\Security\JWT\Builder][security-jwt-builder]) is available, utilizing chained methods, and ready to be used to create JWT tokens. All you have to do is instantiate the Builder object, configure your token and call `getToken()`. This will return a [Phalcon\Encryption\Security\Token\Token][security-jwt-token-token] object which contains all the necessary information for your token. When instantiating the builder component, you have to supply the signer class. In the example below we use the [Phalcon\Encryption\Security\JWT\Signer\Hmac][security-jwt-signer-hmac] signer.
+A Builder component ([Phalcon\Encryption\Security\JWT\Builder][security-jwt-builder]) is available, utilizing chained methods, and ready to be used to create JWT tokens. All you have to do is instantiate the Builder object, configure your token, and call `getToken()`. This will return a [Phalcon\Encryption\Security\Token\Token][security-jwt-token-token] object which contains all the necessary information for your token. When instantiating the builder component, you have to supply the signer class. In the example below we use the [Phalcon\Encryption\Security\JWT\Signer\Hmac][security-jwt-signer-hmac] signer.
All setters in this component are chainable.
@@ -362,7 +362,7 @@ Sets the audience (`exp`). If the `$timestamp` is less than the current time, a
```php
public function setId(string $id): Builder
```
-Sets the id (`jti`).
+Sets the id (`jti`).
```php
public function setIssuedAt(int $timestamp): Builder
@@ -498,7 +498,7 @@ Validates the id. If it is not the same as the `jti` value stored in the token,
```php
public function validateIssuedAt(int $timestamp): Validator
```
-Validates the issued at time. If the `iat` value stored in the token is greater than now, a [Phalcon\Encryption\Security\JWT\Exceptions\ValidatorException][security-jwt-exceptions-validatorexception] will be thrown.
+Validates the `issued at` time. If the `iat` value stored in the token is greater than now, a [Phalcon\Encryption\Security\JWT\Exceptions\ValidatorException][security-jwt-exceptions-validatorexception] will be thrown.
```php
public function validateIssuer(string $issuer): Validator
@@ -648,7 +648,7 @@ var_dump($errors);
## Exceptions
-Any exceptions thrown in the Security component will be of the namespace `Phalcon\Encryption\Security\JWT\*`. You can use this exception to selectively catch exceptions thrown only from this component. There are two exceptions raised. First if you supply the wrong algoritm string when instantiating the [Phalcon\Encryption\Security\JWT\Signer\Hmac][security-jwt-signer-hmac] component. This exception is [Phalcon\Encryption\Security\JWT\Exceptions\UnsupportedAlgorithmException][security-jwt-exceptions-unsupportedalgorithmexception].
+Any exceptions thrown in the Security component will be of the namespace `Phalcon\Encryption\Security\JWT\*`. You can use this exception to selectively catch exceptions thrown only from this component. There are two exceptions raised. First, if you supply the wrong algorithm string when instantiating the [Phalcon\Encryption\Security\JWT\Signer\Hmac][security-jwt-signer-hmac] component. This exception is [Phalcon\Encryption\Security\JWT\Exceptions\UnsupportedAlgorithmException][security-jwt-exceptions-unsupportedalgorithmexception].
The second exception is thrown when validating a JWT. This exception is [Phalcon\Encryption\Security\JWT\Exceptions\ValidatorException][security-jwt-exceptions-validatorexception].
@@ -697,17 +697,17 @@ class IndexController extends Controller
[rfc-7519]: https://datatracker.ietf.org/doc/html/rfc7519
[hash-hmac]: https://www.php.net/manual/en/function.hash-hmac.php
[hash-equals]: https://www.php.net/manual/en/function.hash-hmac.php
-[security-jwt-builder]: api/phalcon_encryption.md#encryption-security-jwt-builder
-[security-jwt-exceptions-unsupportedalgorithmexception]: api/phalcon_encryption.md#encryption-security-jwt-exceptions-unsupportedalgorithmexception
-[security-jwt-exceptions-validatorexception]: api/phalcon_encryption.md#encryption-security-jwt-exceptions-validatorexception
-[security-jwt-signer-abstractsigner]: api/phalcon_encryption.md#encryption-security-jwt-signer-abstractsigner
-[security-jwt-signer-hmac]: api/phalcon_encryption.md#encryption-security-jwt-signer-hmac
-[security-jwt-signer-none]: api/phalcon_encryption.md#encryption-security-jwt-signer-none
-[security-jwt-signer-signerinterface]: api/phalcon_encryption.md#encryption-security-jwt-signer-signerinterface
-[security-jwt-token-abstractitem]: api/phalcon_encryption.md#encryption-security-jwt-token-abstractitem
-[security-jwt-token-enum]: api/phalcon_encryption.md#encryption-security-jwt-token-enum
-[security-jwt-token-item]: api/phalcon_encryption.md#encryption-security-jwt-token-item
-[security-jwt-token-parser]: api/phalcon_encryption.md#encryption-security-jwt-token-parser
-[security-jwt-token-signature]: api/phalcon_encryption.md#encryption-security-jwt-token-signature
-[security-jwt-token-token]: api/phalcon_encryption.md#encryption-security-jwt-token-token
-[security-jwt-validator]: api/phalcon_encryption.md#encryption-security-jwt-validator
+[security-jwt-builder]: api/phalcon_encryption.md#encryptionsecurityjwtbuilder-
+[security-jwt-exceptions-unsupportedalgorithmexception]: api/phalcon_encryption.md#encryptionsecurityjwtexceptionsunsupportedalgorithmexception-
+[security-jwt-exceptions-validatorexception]: api/phalcon_encryption.md#encryptionsecurityjwtexceptionsvalidatorexception-
+[security-jwt-signer-abstractsigner]: api/phalcon_encryption.md#encryptionsecurityjwtsignerabstractsigner--
+[security-jwt-signer-hmac]: api/phalcon_encryption.md#encryptionsecurityjwtsignerhmac-
+[security-jwt-signer-none]: api/phalcon_encryption.md#encryptionsecurityjwtsignernone-
+[security-jwt-signer-signerinterface]: api/phalcon_encryption.md#encryptionsecurityjwtsignersignerinterface--
+[security-jwt-token-abstractitem]: api/phalcon_encryption.md#encryptionsecurityjwttokenabstractitem--
+[security-jwt-token-enum]: api/phalcon_encryption.md#encryptionsecurityjwttokenenum-
+[security-jwt-token-item]: api/phalcon_encryption.md#encryptionsecurityjwttokenitem-
+[security-jwt-token-parser]: api/phalcon_encryption.md#encryptionsecurityjwttokenparser-
+[security-jwt-token-signature]: api/phalcon_encryption.md#encryptionsecurityjwttokensignature-
+[security-jwt-token-token]: api/phalcon_encryption.md#encryptionsecurityjwttokentoken-
+[security-jwt-validator]: api/phalcon_encryption.md#encryptionsecurityjwtvalidator-
diff --git a/docs/encryption-security.md b/docs/encryption-security.md
index f18f9c3d1..60f23c4c7 100644
--- a/docs/encryption-security.md
+++ b/docs/encryption-security.md
@@ -7,7 +7,7 @@
Requires PHP's [openssl][openssl] extension to be present in the system
-[Phalcon\Encryption\Security][security] is a component that helps developers with common security related tasks, such as password hashing and Cross-Site Request Forgery protection ([CSRF][wiki-csrf]).
+[Phalcon\Encryption\Security][security] is a component that helps developers with common security-related tasks, such as password hashing and Cross-Site Request Forgery protection ([CSRF][wiki-csrf]).
!!! info "NOTE"
@@ -15,13 +15,13 @@
## Password Hashing
-Storing passwords in plain text is a bad security practice. Anyone with access to the database will immediately have access to all user accounts thus being able to engage in unauthorized activities. To combat that, many applications use popular one way hashing methods [md5][md5] and [sha1][sha1]. However, hardware evolves on a daily basis and as processors become faster, these algorithms are becoming vulnerable to brute force attacks. These attacks are also known as [rainbow tables][rainbow-tables].
+Storing passwords in plain text is a bad security practice. Anyone with access to the database will immediately have access to all user accounts thus being able to engage in unauthorized activities. To combat that, many applications use popular one-way hashing methods [md5][md5] and [sha1][sha1]. However, hardware evolves on a daily basis and as processors become faster, these algorithms are becoming vulnerable to brute-force attacks. These attacks are also known as [rainbow tables][rainbow-tables].
-The security component uses [bcrypt][bcrypt] as the hashing algorithm. Thanks to the [Eksblowfish][eksblowfish] key setup algorithm, we can make the password encryption as `slow` as we want. Slow algorithms minimize the impact of brute force attacks.
+The security component uses [bcrypt][bcrypt] as the hashing algorithm. Thanks to the [Eksblowfish][eksblowfish] key setup algorithm, we can make the password encryption as `slow` as we want. Slow algorithms minimize the impact of brute-force attacks.
[Bcrypt][bcrypt], is an adaptive hash function based on the Blowfish symmetric block cipher cryptographic algorithm. It also introduces a security or work factor, which determines how slow the hash function will be to generate the hash. This effectively negates the use of FPGA or GPU hashing techniques.
-Should hardware becomes faster in the future, we can increase the work factor to mitigate this. The salt is generated using pseudo-random bytes with the PHP's function [openssl_random_pseudo_bytes][openssl-random-pseudo-bytes].
+Should hardware become faster in the future, we can increase the work factor to mitigate this. The salt is generated using pseudo-random bytes with the PHP's function [openssl_random_pseudo_bytes][openssl-random-pseudo-bytes].
This component offers a simple interface to use the algorithm:
@@ -36,7 +36,7 @@ echo $security->hash('Phalcon');
// $2y$08$ZUFGUUk5c3VpcHFoVUFXeOYoA4NPFEP4G9gcm6rdo3jFPaNFdR2/O
```
-We can now check if a value sent to us by a user through the UI of our application, is identical to our hashed string:
+We can now check if a value sent to us by a user through the UI of our application is identical to our hashed string:
```php
hash('Phalcon');
echo $security->checkHash($password, $hashed); // true / false
```
-The above example simply shows how the `checkHash()` can be used. In production applications we will definitely need to sanitize input, and also we need to store the hashed password in a data store such as a database. Using controllers, the above example can be shown as:
+The above example simply shows how the `checkHash()` can be used. In production applications, we will definitely need to sanitize input, and also we need to store the hashed password in a data store such as a database. Using controllers, the above example can be shown as:
```php
checkHash($password, $hashed); // true / false
```
The `workFactor` (or `cost`) is used when:
-- We are using a legacy hash (i.e. one that does not use the `password_hash` method) and in particular the `Phalcon\Encryption\Security::CRYPT_BLOWFISH_A` or `Phalcon\Encryption\Security::CRYPT_BLOWFISH_X`.
-- We are using a non legacy hash (i.e. using `password_hash`) with the `Phalcon\Encryption\Security::CRYPT_DEFAULT` or `Phalcon\Encryption\Security::CRYPT_BCRYPT` algorithms.
+- We are using a legacy hash (i.e. one that does not use the `password_hash` method) and in particular the `Phalcon\Encryption\Security::CRYPT_BLOWFISH_A` or `Phalcon\Encryption\Security::CRYPT_BLOWFISH_X`.
+- We are using a non-legacy hash (i.e. using `password_hash`) with the `Phalcon\Encryption\Security::CRYPT_DEFAULT` or `Phalcon\Encryption\Security::CRYPT_BCRYPT` algorithms.
## Argon2i
`Phalcon\Encryption\Security` also supports the new [Argon2i][argon2i] hashing algorithm. This algorithm is the winner of the [Password Hashing Competition][password-hashing-competition] and is considered to be the best algorithm for hashing passwords. It is also the default algorithm used by PHP's `password_hash()` method.
@@ -213,7 +213,7 @@ class IndexController extends Controller
## CSRF Protection
Cross-Site Request Forgery (CSRF) is another common attack against websites and applications. Forms designed to perform tasks such as user registration or adding comments are vulnerable to this attack.
-The idea is to prevent the form values from being sent outside our application. To fix this, we generate a [random nonce][random-nonce] (token) in each form, add the token in the session and then validate the token once the form posts data back to our application by comparing the stored token in the session to the one submitted by the form:
+The idea is to prevent the form values from being sent outside our application. To fix this, we generate a [random nonce][random-nonce] (token) in each form, add the token in the session, and then validate the token once the form posts data back to our application by comparing the stored token in the session to the one submitted by the form:
```php
@@ -227,7 +227,7 @@ The idea is to prevent the form values from being sent outside our application.
```
-Then in the controller's action you can check if the CSRF token is valid:
+Then in the controller's action, you can check if the CSRF token is valid:
```php
base58(); // 4kUgL2pdQMSCQtjE
**`base58()`**
-Generates a random `base58` string. If the `$len` parameter is not specified, `16` is assumed. It may be larger in the future. The result may contain alphanumeric characters except `0` (zero), `O` (capital `o`), `I` (capital `i`) and `l` (lower case `L`).
+Generates a random `base58` string. If the `$len` parameter is not specified, `16` is assumed. It may be larger in the future. The result may contain alphanumeric characters except `0` (zero), `O` (capital `o`), `I` (capital `i`), and `l` (lowercase `L`).
It is similar to `base64()` but has been modified to avoid both non-alphanumeric characters and letters which might look ambiguous when printed.
@@ -388,7 +388,7 @@ echo $random->base62(); // z0RkwHfh8ErDM1xw
**`base64()`**
-Generates a random `base64` string. If the `$len` parameter is not specified, `16` is assumed. It may be larger in the future. The length of the result string is usually greater of `$len`. The size formula is:
+Generates a random `base64` string. If the `$len` parameter is not specified, `16` is assumed. It may be larger in the future. The length of the result string is usually greater than `$len`. The size formula is:
`4 * ($len / 3)` rounded up to a multiple of 4.
@@ -404,9 +404,9 @@ echo $random->base64(12); // 3rcq39QzGK9fUqh8
**`base64Safe()`**
-Generates a URL safe random `base64` string. If the `$len` parameter is not specified, `16` is assumed. It may be larger in the future. The length of the result string is usually greater of `$len`.
+Generates a URL-safe random `base64` string. If the `$len` parameter is not specified, `16` is assumed. It may be larger in the future. The length of the result string is usually greater than `$len`.
-By default, padding is not generated because `=` may be used as a URL delimiter. The result may contain `A-Z`, `a-z`, `0-9`, `-` and `_`. `=` is also used if `$padding` is `true`. See [RFC 3548][rfc-3548] for the definition of URL-safe `base64`.
+By default, padding is not generated because `=` may be used as a URL delimiter. The result may contain `A-Z`, `a-z`, `0-9`, `-`, and `_`. `=` is also used if `$padding` is `true`. See [RFC 3548][rfc-3548] for the definition of URL-safe `base64`.
```php
uuid(); // 1378c906-64bb-4f81-a8d6-4ae1bfcdec22
```
## Dependency Injection
-If you use the [Phalcon\Di\FactoryDefault][factorydefault] container, the [Phalcon\Encryption\Security][security] is already registered for you. However, you might want to override the default registration in order to set your own `workFactor()`. Alternatively if you are not using the [Phalcon\Di\FactoryDefault][factorydefault] and instead are using the [Phalcon\Di\Di][di] the registration is the same. By doing so, you will be able to access your configuration object from controllers, models, views and any component that implements `Injectable`.
+If you use the [Phalcon\Di\FactoryDefault][factorydefault] container, the [Phalcon\Encryption\Security][security] is already registered for you. However, you might want to override the default registration in order to set your own `workFactor()`. Alternatively, if you are not using the [Phalcon\Di\FactoryDefault][factorydefault] and instead are using the [Phalcon\Di\Di][di] the registration is the same. By doing so, you will be able to access your configuration object from controllers, models, views, and any component that implements `Injectable`.
An example of the registration of the service as well as accessing it is below:
@@ -547,9 +547,9 @@ Also in your views (Volt syntax)
[rfc-3548]: https://www.ietf.org/rfc/rfc3548.txt
[rfc-4122]: https://www.ietf.org/rfc/rfc4122.txt
[secure-random]: https://ruby-doc.org/stdlib-2.2.2/libdoc/securerandom/rdoc/SecureRandom.html
-[security]: api/phalcon_encryption.md#encryption-security
-[security-exception]: api/phalcon_encryption.md#encryption-security-exception
-[security-random]: api/phalcon_encryption.md#encryption-security-random
+[security]: api/phalcon_encryption.md#encryptionsecurity-
+[security-exception]: api/phalcon_encryption.md#encryptionsecurityexception-
+[security-random]: api/phalcon_encryption.md#encryptionsecurityrandom-
[sha1]: https://php.net/manual/en/function.sha1.php
[wiki-csrf]: https://en.wikipedia.org/wiki/Cross-site_request_forgery
[di]: di.md
diff --git a/docs/environments-devilbox.md b/docs/environments-devilbox.md
index 297eb2932..ffdb69b51 100644
--- a/docs/environments-devilbox.md
+++ b/docs/environments-devilbox.md
@@ -3,11 +3,11 @@
## Overview
-[Devilbox][devilbox] is a modern and highly customizable dockerized PHP stack supporting full LAMP and MEAN and running on all major platforms. The main goal is to easily switch and combine any version required for local development. It supports an unlimited number of projects for which vhosts, SSL certificates and DNS records are created automatically. Reverse proxies per project are supported to ensure listening server such as NodeJS can also be reached. Email catch-all and popular development tools will be at your service as well. Configuration is not necessary, as everything is already pre-setup.
+[Devilbox][devilbox] is a modern and highly customizable dockerized PHP stack supporting full LAMP and MEAN and running on all major platforms. The main goal is to easily switch and combine any version required for local development. It supports an unlimited number of projects for which vhosts, SSL certificates, and DNS records are created automatically. Reverse proxies per project are supported to ensure listening servers such as NodeJS can also be reached. Email catch-all and popular development tools will be at your service as well. Configuration is not necessary, as everything is already pre-setup.
Furthermore, the Devilbox provides an identical and reproducible development environment for different host operating systems.
-This example will use `phalcon` to install Phalcon from within the Devilbox PHP container. After completing the steps listed below, you will have a working Phalcon setup ready to be served via http and https.
+This example will use `phalcon` to install Phalcon from within the Devilbox PHP container. After completing the steps listed below, you will have a working Phalcon setup ready to be served via HTTP and HTTPS.
## Configuration
@@ -80,7 +80,7 @@ devilbox@php-8.0 in /shared/httpd/my-phalcon $ tree -L 1
Symlinking the actual webroot directory to `htdocs` is important. The web server expects every project's document root to be in `/htdocs/`. This is the path where it will serve the files. This is also the path where the entry point of your application (usually `index.php`) needs to reside.
-Some frameworks however, store files and content in nested directories of unknown levels. It is therefore impossible to set this as a pre-set for the environment. You will therefore have to manually set a symlink back to the expected path that your framework requires.
+Some frameworks, however, store files and content in nested directories of unknown levels. It is therefore impossible to set this as a pre-set for the environment. You will therefore have to manually set a symlink back to the expected path that your framework requires.
```bash
devilbox@php-8.0 in /shared/httpd/my-phalcon $ ln -s phalconphp/public/ htdocs
@@ -105,22 +105,22 @@ As you can see in the above listing, the `htdocs` folder that is required by the
### DNS Record
-If you **have** Auto DNS configured already, you can skip this section, because DNS entries will be available automatically by the bundled DNS server.
+If you **have** Auto DNS configured already, you can skip this section because DNS entries will be available automatically by the bundled DNS server.
If you **do not have** Auto DNS configured, you will need to add the following line to your host operating system `/etc/hosts` file (or `C:\Windows\System32\drivers\etc` on Windows):
```bash
127.0.0.1 my-phalcon.loc
```
-
-### Open your Browser
+
+### Open your Browser
Open your browser and navigate to `http://my-phalcon.loc` or `https://my-phalcon.loc`
### Create Custom Vhost Config File (Nginx Only)
-By default routes will not work if using Nginx. To fix this, you will need to create a custom vhost configuration.
+By default, routes will not work if using Nginx. To fix this, you will need to create a custom vhost configuration.
In your project folder, you will need to create a folder called `.devilbox` unless you changed `HTTPD_TEMPLATE_DIR` in your `.env`
@@ -148,9 +148,9 @@ Save the file as `nginx.yml` and ensure not to use any tabs in the file or devil
- [Devilbox.com][devilbox]
- [Devilbox Documentation][devilbox-documentation]
- [HOST_PATH_HTTPD_DATADIR][host-path-httpd-datadir]
-- [Enter the PHP container][enter-container]
+- [Enter the PHP container][enter-container]
- [Work inside the PHP container][work-in-container]
-- [Available tools][available-tools]
+- [Available tools][available-tools]
- [TLD_SUFFIX][tld-suffix]
- [Docker Toolbox and Symlinks][docker-toolbox-symlinks]
- [Add project hosts entry on MacOS][hosts-mac]
diff --git a/docs/events.md b/docs/events.md
index 081dac09a..434d0197f 100644
--- a/docs/events.md
+++ b/docs/events.md
@@ -2,7 +2,7 @@
- - -
## Overview
-The purpose of this component is to intercept the execution of components in the framework by creating _hooks_. These hooks allow developers to obtain status information, manipulate data or change the flow of execution during the process of a component. The component consists of a [Phalcon\Events\Manager][events-manager] that handles event propagation and execution of events. The manager contains various [Phalcon\Events\Event][events-event] objects, which contain information about each hook/event.
+The purpose of this component is to intercept the execution of components in the framework by creating _hooks_. These hooks allow developers to obtain status information, manipulate data, or change the flow of execution during the process of a component. The component consists of a [Phalcon\Events\Manager][events-manager] that handles event propagation and execution of events. The manager contains various [Phalcon\Events\Event][events-event] objects, which contain information about each hook/event.
```php
query(
);
```
-In the above example, we are using the events manager to listen to the `afterQuery` event produced by the `db` service, in this case MySQL. We use the `attach` method to attach our event to the manager and use the `db:afterQuery` event. We add an anonymous function as the handler for this event, which accepts a [Phalcon\Events\Event][events-event] as the first parameter. This object contains contextual information regarding the event that has been fired. The database connection object as the second. Using the connection variable we print out the SQL statement. You can always pass a third parameter with arbitrary data specific to the event, or even a logger object in the anonymous function so that you can log your queries in a separate log file.
+In the above example, we are using the events manager to listen to the `afterQuery` event produced by the `db` service, in this case, MySQL. We use the `attach` method to attach our event to the manager and use the `db:afterQuery` event. We add an anonymous function as the handler for this event, which accepts a [Phalcon\Events\Event][events-event] as the first parameter. This object contains contextual information regarding the event that has been fired. The database connection object as the second. Using the connection variable we print out the SQL statement. You can always pass a third parameter with arbitrary data specific to the event, or even a logger object in the anonymous function so that you can log your queries in a separate log file.
!!! warning "NOTE"
You must explicitly set the Events Manager to a component using the `setEventsManager()` method in order for that component to trigger events. You can create a new Events Manager instance for each component, or you can set the same Events Manager to multiple components as the naming convention will avoid conflicts
-
+
## Handlers
The events manager wires a handler to an event. A handler is a piece of code that will do something when the event fires. As seen in the above example, you can use an anonymous function as your handler:
@@ -348,18 +348,18 @@ $eventsManager->attach(
);
```
-First we attach the listener to the `dispatcher` component and the `beforeException` event. This means that the events manager will fire only for that event calling our listener. We could have just changed the hook point to `dispatcher` so that we are able in the future to add more dispatcher events in the same listener.
+First, we attach the listener to the `dispatcher` component and the `beforeException` event. This means that the events manager will fire only for that event calling our listener. We could have just changed the hook point to `dispatcher` so that we are able in the future to add more dispatcher events in the same listener.
-The `beforeException` function accepts the `$event` as the first parameter, the `$dispatcher` as the second and the `$ex` exception thrown from the dispatcher component. Using those, we can then figure out if a handler (or controller) or an action were not found. If that is the case, we forward the user to a specific module, controller and action. If our user is not logged in, then we send them to the login page. Alternatively, we just log the exception message in our logger.
+The `beforeException` function accepts the `$event` as the first parameter, the `$dispatcher` as the second, and the `$ex` exception thrown from the dispatcher component. Using those, we can then figure out if a handler (or controller) or an action was not found. If that is the case, we forward the user to a specific module, controller, and action. If our user is not logged in, then we send them to the login page. Alternatively, we just log the exception message in our logger.
-The example demonstrates clearly the power of the events manager, and how you can alter the flow of the application using listeners.
+The example demonstrates clearly the power of the events manager, and how you can alter the flow of the application using listeners.
## Events: Trigger
You can create components in your application that trigger events to an events manager. Listeners attached to those events will be invoked when the events are fired. In order to create a component that triggers events, we need to implement the [Phalcon\Events\EventsAwareInterface][events-eventsawareinterface].
-
+
### Custom Component
Let's consider the following example:
-
+
```php
newInstance();
```
-You can now use the locator wherever you need and sanitize content as per the needs of your application.
+You can now use the locator wherever you need and sanitize content as per the needs of your application.
## Filter
-The [Phalcon\Filter\Filter][filter-filter] component implements a locator service and can be used as a stand-alone component, without initializing the built-in filters.
+The [Phalcon\Filter\Filter][filter-filter] component implements a locator service and can be used as a stand-alone component, without initializing the built-in filters.
```php
hello('World');
!!! warning "NOTE"
- Where appropriate, the sanitizers will cast the value to the type expected. For example the `absint` sanitizer will remove all non-numeric characters from the input, cast the input to an integer and return its absolute value.
+ Where appropriate, the sanitizers will cast the value to the type expected. For example, the `absint` sanitizer will remove all non-numeric characters from the input, cast the input to an integer, and return its absolute value.
!!! warning "NOTE"
- To use the prefedined filters, you will need to obtain an instance of `Phalcon\Filter\Filter` using the `Phalcon\Filter\FilterFactory` as shown above.
+ To use the predefined filters, you will need to obtain an instance of `Phalcon\Filter\Filter` using the `Phalcon\Filter\FilterFactory` as shown above.
The following are the built-in filters provided by this component:
@@ -63,25 +63,25 @@ The following are the built-in filters provided by this component:
```php
AbsInt( mixed $input ): int
```
-Removes any non-numeric characters, casts the value to integer and returns its absolute value. Internally it uses [filter_var] for the integer part, [intval][intval] for casting and [absint][absint].
+Removes any non-numeric characters, casts the value to an integer, and returns its absolute value. Internally it uses [filter_var] for the integer part, [intval][intval] for casting, and [absint][absint].
#### `alnum`
```php
Alnum( mixed $input ): string | array
```
-Removes all characters that are not numbers or characters of the alphabet. It uses [preg_replace][preg_replace] which can also accept arrays of strings as the parameters.
+Removes all characters that are not numbers or characters of the alphabet. It uses [preg_replace][preg_replace] which can also accept arrays of strings as the parameters.
#### `alpha`
```php
Alpha( mixed $input ): string | array
```
-Removes all characters that are not characters of the alphabet. It uses [preg_replace][preg_replace] which can also accept arrays of strings as the parameters.
+Removes all characters that are not characters of the alphabet. It uses [preg_replace][preg_replace] which can also accept arrays of strings as the parameters.
#### `bool`
```php
BoolVal( mixed $input ): bool
```
-Casts the value to a boolean.
+Casts the value to a boolean.
It also returns `true` if the value is:
@@ -109,25 +109,25 @@ Removes all characters except letters, digits and ``!#$%&*+-/=?^_`{\|}~@.[]``. I
```php
FloatVal( mixed $input ): float
```
-Removes all characters except digits, dot, plus and minus sign and casts the value as a `double`. Internally it uses [filter_var][filter_var] and `(double)`.
+Removes all characters except digits, dots, plus and minus signs and casts the value as a `double`. Internally it uses [filter_var][filter_var] and `(double)`.
#### `int`
```php
IntVal( mixed $input ): int
```
-Remove all characters except digits, plus and minus sign and casts the value as an integer. Internally it uses [filter_var][filter_var] and `(int)`.
+Remove all characters except digits, plus and minus sign, and casts the value as an integer. Internally it uses [filter_var][filter_var] and `(int)`.
#### `lower`
```php
Lower( mixed $input ): string
```
-Converts all characters to lowercase. If the [mbstring][mbstring] extension is loaded, it will use [mb_convert_case][mb_convert_case] to perform the transformation. As a fallback it uses the [strtolower][strtolower] PHP function, with [utf8_decode][utf8_decode].
+Converts all characters to lowercase. If the [mbstring][mbstring] extension is loaded, it will use [mb_convert_case][mb_convert_case] to perform the transformation. As a fallback, it uses the [strtolower][strtolower] PHP function, with [utf8_decode][utf8_decode].
#### `lowerFirst`
```php
LowerFirst( mixed $input ): string
```
-Converts the first character of the input to lower case. Internally it uses [lcfirst][lcfirst].
+Converts the first character of the input to lowercase. Internally it uses [lcfirst][lcfirst].
#### `regex`
```php
@@ -151,7 +151,7 @@ Performs a replacement on the input based on the `from` and `to` passed paramete
```php
Special( mixed $input ): string
```
-Escapes all HTML characters of the input, as well as `'"<>&` and characters with ASCII value less than 32. Internally it uses [filter_var][filter_var].
+Escapes all HTML characters of the input, as well as `'"<>&`, and characters with ASCII values less than 32. Internally it uses [filter_var][filter_var].
#### `specialFull`
```php
@@ -169,7 +169,7 @@ Encode HTML entities. Internally it uses [htmlspecialchars][htmlspecialchars].
```php
StringValLegacy( mixed $input ): string
```
-This filter will work only for PHP versions lower than 8.1. It is available for backwards compatibility. Internally it uses [filter_var][filter_var].
+This filter will work only for PHP versions lower than 8.1. It is available for backward compatibility. Internally it uses [filter_var][filter_var].
#### `striptags`
```php
@@ -187,7 +187,7 @@ Removes all leading and trailing whitespace from the input. Internally it uses [
```php
Upper( mixed $input ): string
```
-Converts all characters to uppercase. If the [mbstring][mbstring] extension is loaded, it will use [mb_convert_case][mb_convert_case] to perform the transformation. As a fallback it uses the [strtoupper][strtoupper] PHP function, with [utf8_decode][utf8_decode].
+Converts all characters to uppercase. If the [mbstring][mbstring] extension is loaded, it will use [mb_convert_case][mb_convert_case] to perform the transformation. As a fallback, it uses the [strtoupper][strtoupper] PHP function, with [utf8_decode][utf8_decode].
#### `upperFirst`
```php
@@ -238,7 +238,7 @@ const FILTER_URL = 'url';
```
## Methods
-The [Phalcon\Filter\Filter][filter-filter] acts as a service locator and implements the `__call()` method. As a result, you can use any filter as a method directly on the locator. The names of the methods are the same as the ones defined by the constants. To use the built-in filters, you will need to obtain an instance of `Phalcon\Filter\Filter` using the `Phalcon\Filter\FilterFactory`.
+The [Phalcon\Filter\Filter][filter-filter] acts as a service locator and implements the `__call()` method. As a result, you can use any filter as a method directly on the locator. The names of the methods are the same as the ones defined by the constants. To use the built-in filters, you will need to obtain an instance of `Phalcon\Filter\Filter` using the `Phalcon\Filter\FilterFactory`.
```php
upperfirst(string $input): string
$filter->upperwords(string $input): string|null
$filter->url(string $input): string|null
```
-
+
## Sanitizing Data
-Sanitizing is the process which removes specific characters from a value, that are not required or desired by the user or application. By sanitizing input we ensure that application integrity will be intact.
+Sanitizing is the process that removes specific characters from a value, that are not required or desired by the user or application. By sanitizing input, we ensure that application integrity will be intact.
```php
sanitize('!100a019.01a', 'float');
```
## Controllers
-You can access the [Phalcon\Filter\Filter][filter-filter] object from your controllers when accessing `GET` or `POST` input data (through the request object). The first parameter is the name of the variable to be obtained; the second is the sanitizer to be applied on it. The second parameter can also be an array with any number of sanitizers that you want to apply.
+You can access the [Phalcon\Filter\Filter][filter-filter] object from your controllers when accessing `GET` or `POST` input data (through the request object). The first parameter is the name of the variable to be obtained; the second is the sanitizer to be applied on it. The second parameter can also be an array with any number of sanitizers that you want to apply.
```php
sanitize('127.0.0.1', 'ipv4');
## Combining Sanitizers
-There are times when one sanitizer is not enough for your data. For instance a very common usage is the `striptags` and `trim` sanitizers for text input. The [Phalcon\Filter\Filter][filter-filter] component offers the ability to accept an array of names for sanitizers to be applied on the input value. The following example demonstrates this:
+There are times when one sanitizer is not enough for your data. For instance, a very common usage is the `striptags` and `trim` sanitizers for text input. The [Phalcon\Filter\Filter][filter-filter] component offers the ability to accept an array of names for sanitizers to be applied to the input value. The following example demonstrates this:
```php
sanitize('127.0.0.1', 'ipv4');
[utf8_decode]: https://www.php.net/manual/en/function.utf8-decode.php
[filter-exception]: api/phalcon_filter.md#filter-exception
[filter-filter]: api/phalcon_filter.md#filter
-[filter-filterfactory]: api/phalcon_filter.md#filter-filterfactory
-[filter-filterinterface]: api/phalcon_filter.md#filter-filterinterface
-[filter-sanitize-absint]: api/phalcon_filter.md#filter-sanitize-absint
-[filter-sanitize-alnum]: api/phalcon_filter.md#filter-sanitize-alnum
-[filter-sanitize-alpha]: api/phalcon_filter.md#filter-sanitize-alpha
-[filter-sanitize-boolval]: api/phalcon_filter.md#filter-sanitize-boolval
-[filter-sanitize-email]: api/phalcon_filter.md#filter-sanitize-email
-[filter-sanitize-floatval]: api/phalcon_filter.md#filter-sanitize-floatval
-[filter-sanitize-intval]: api/phalcon_filter.md#filter-sanitize-intval
-[filter-sanitize-lower]: api/phalcon_filter.md#filter-sanitize-lower
-[filter-sanitize-lowerfirst]: api/phalcon_filter.md#filter-sanitize-lowerfirst
-[filter-sanitize-regex]: api/phalcon_filter.md#filter-sanitize-regex
-[filter-sanitize-remove]: api/phalcon_filter.md#filter-sanitize-remove
-[filter-sanitize-replace]: api/phalcon_filter.md#filter-sanitize-replace
-[filter-sanitize-special]: api/phalcon_filter.md#filter-sanitize-special
-[filter-sanitize-specialfull]: api/phalcon_filter.md#filter-sanitize-specialfull
-[filter-sanitize-stringval]: api/phalcon_filter.md#filter-sanitize-stringval
-[filter-sanitize-striptags]: api/phalcon_filter.md#filter-sanitize-striptags
-[filter-sanitize-trim]: api/phalcon_filter.md#filter-sanitize-trim
-[filter-sanitize-upper]: api/phalcon_filter.md#filter-sanitize-upper
-[filter-sanitize-upperfirst]: api/phalcon_filter.md#filter-sanitize-upperfirst
-[filter-sanitize-upperwords]: api/phalcon_filter.md#filter-sanitize-upperwords
-[filter-sanitize-url]: api/phalcon_filter.md#filter-sanitize-url
-[factorydefault]: api/phalcon_di.md#di-factorydefault
-[http-request]: api/phalcon_html.md#http-request
+[filter-filterfactory]: api/phalcon_filter.md#filterfilterfactory-
+[filter-filterinterface]: api/phalcon_filter.md#filterfilterinterface--
+[filter-sanitize-absint]: api/phalcon_filter.md#filtersanitizeabsint-
+[filter-sanitize-alnum]: api/phalcon_filter.md#filtersanitizealnum-
+[filter-sanitize-alpha]: api/phalcon_filter.md#filtersanitizealpha-
+[filter-sanitize-boolval]: api/phalcon_filter.md#filtersanitizeboolval-
+[filter-sanitize-email]: api/phalcon_filter.md#filtersanitizeemail-
+[filter-sanitize-floatval]: api/phalcon_filter.md#filtersanitizefloatval-
+[filter-sanitize-intval]: api/phalcon_filter.md#filtersanitizeintval-
+[filter-sanitize-lower]: api/phalcon_filter.md#filtersanitizelower-
+[filter-sanitize-lowerfirst]: api/phalcon_filter.md#filtersanitizelowerfirst-
+[filter-sanitize-regex]: api/phalcon_filter.md#filtersanitizeregex-
+[filter-sanitize-remove]: api/phalcon_filter.md#filtersanitizeremove-
+[filter-sanitize-replace]: api/phalcon_filter.md#filtersanitizereplace-
+[filter-sanitize-special]: api/phalcon_filter.md#filtersanitizespecial-
+[filter-sanitize-specialfull]: api/phalcon_filter.md#filtersanitizespecialfull-
+[filter-sanitize-stringval]: api/phalcon_filter.md#filtersanitizestringval-
+[filter-sanitize-striptags]: api/phalcon_filter.md#filtersanitizestriptags-
+[filter-sanitize-trim]: api/phalcon_filter.md#filtersanitizetrim-
+[filter-sanitize-upper]: api/phalcon_filter.md#filtersanitizeupper-
+[filter-sanitize-upperfirst]: api/phalcon_filter.md#filtersanitizeupperfirst-
+[filter-sanitize-upperwords]: api/phalcon_filter.md#filtersanitizeupperwords-
+[filter-sanitize-url]: api/phalcon_filter.md#filtersanitizeurl-
+[factorydefault]: api/phalcon_di.md#difactorydefault-
+[http-request]: api/phalcon_http.md#httprequest-
diff --git a/docs/filter-validation.md b/docs/filter-validation.md
index 03093bb26..926112d97 100644
--- a/docs/filter-validation.md
+++ b/docs/filter-validation.md
@@ -102,7 +102,7 @@ public function getLabel(
string $field
): string
```
-Get label for field
+Get a label for the field
```php
public function getMessages(): Messages
@@ -346,7 +346,7 @@ $validator->add(
```
### Between
-Validates that a value is between an inclusive range of two values. The validation passes if for a value `L`, minimum is less or equal than `L` and `L` is less or equal than the maximum. The boundaries are included in this validation. The formula is:
+Validates that a value is between an inclusive range of two values. The validation passes if for a value `L`, the minimum is less or equal to `L`, and `L` is less or equal to the maximum. The boundaries are included in this validation. The formula is:
```
minimum <= value <= maximum
@@ -395,8 +395,8 @@ $validator->add(
);
```
-### Callback
-By using [Phalcon\Filter\Validation\Validator\Callback][validation-validator-callback] you can execute custom function which must return boolean or new validator class which will be used to validate the same field. By returning `true` validation will be successful, returning `false` will mean validation failed. When executing this validator Phalcon will pass data depending on what it is - if it's an entity (i.e. a model, a `stdClass` etc.) then entity will be passed, otherwise data (i.e an array like `$_POST`). There is example:
+### Callback
+By using [Phalcon\Filter\Validation\Validator\Callback][validation-validator-callback] you can execute a custom function that must return boolean or a new validator class which will be used to validate the same field. By returning `true` validation will be successful, returning `false` will mean validation failed. When executing this validator Phalcon will pass data depending on what it is - if it's an entity (i.e. a model, a `stdClass` etc.) then the entity will be passed, otherwise data (i.e. an array like `$_POST`). There is an example:
```php
add(
```
### ExclusionIn
-Check if a value is not included into a list of values
+Check if a value is not included in a list of values
```php
add(
### File MimeType
Checks if a value has a correct file mime type
-
+
```php
add(
)
);
```
-
+
### File Resolution Equal
-Checks if a file has the right resolution
+Check if a file has the right resolution
```php
add(
```
### File Resolution Max
-Checks if a file has the right resolution
+Check if a file has the right resolution
```php
add(
```
### File Resolution Min
-Checks if a file has the right resolution
+Check if a file has the right resolution
```php
add(
$validator->add(
[
"terms",
- "anotherTerms",
+ "otherTerms",
],
new Identical(
[
"accepted" => [
"terms" => "yes",
- "anotherTerms" => "yes",
+ "otherTerms" => "yes",
],
"message" => [
"terms" => "Terms and conditions must be accepted",
- "anotherTerms" => "Another terms must be accepted",
+ "otherTerms" => "Other terms must be accepted",
],
]
)
@@ -1171,7 +1171,7 @@ $validator->add(
```
### InclusionIn
-Check if a value is included into a list of values
+Check if a value is included in a list of values
```php
add(
)
);
```
-
+
### Numericality
Check for a valid numeric value
@@ -1351,7 +1351,7 @@ $validation->add(
```
### StringLength
-Validates that a string has the specified maximum and minimum constraints. The validation passes if for a string length `L`, minimum is less or equal than `L` and `L` is less or equal than the maximum. The boundaries are included in this validation. The formula is:
+Validates that a string has the specified maximum and minimum constraints. The validation passes if for a string length `L`, the minimum is less or equal to `L` and `L` is less or equal to the maximum. The boundaries are included in this validation. The formula is:
```
minimum <= string length <= maximum
@@ -1418,7 +1418,7 @@ $validation->add(
```
### StringLength Max
-Validates that a string has the specified maximum constraints. The validation passes if for a string length `L` it is less or equal than the maximum. The formula is:
+Validates that a string has the specified maximum constraints. The validation passes if for a string length `L` it is less or equal to the maximum. The formula is:
```
string length <= maximum
@@ -1468,7 +1468,7 @@ $validation->add(
```
### StringLength Min
-Validates that a string has the specified minimum constraints. The validation passes if for a string length `L` it is more or equal than the minimum. The formula is:
+Validates that a string has the specified minimum constraints. The validation passes if for a string length `L` it is more or equal to the minimum. The formula is:
```
minimum <= string length
@@ -1517,7 +1517,7 @@ $validation->add(
);
```
-### Uniqueness
+### Uniqueness
Check that a field is unique in the related table
```php
@@ -1540,7 +1540,7 @@ $validator->add(
);
```
-Different attribute from the field:
+Different attributes from the field:
```php
add(
);
```
-Combination of fields in model:
+Combination of fields in the model:
```php
add(
)
);
```
-Multiple fields with keys (each except will be applied to value it defined by key)
+Multiple fields with keys (each except will be applied to the value defined by the key)
```php
add(
);
```
-### Url
-Checks if a value has an url format
+### Url
+Checks if a value has a url format
```php
add(
"url",
new Url(
[
- "message" => ":field must be a url",
+ "message" => ":field must be a URL",
]
)
);
@@ -1886,10 +1886,10 @@ $validation->setFilters('name', 'trim');
$validation->setFilters('email', 'trim');
```
-Filtering and sanitizing is performed using the [filter][filter-filter] component. You can add more filters to this component or use the built-in ones.
+Filtering and sanitizing are performed using the [filter][filter-filter] component. You can add more filters to this component or use the built-in ones.
## Events
-When validations are organized in classes, you can implement the `beforeValidation()` and `afterValidation()` methods to perform additional checks, filters, clean-up, etc. If the `beforeValidation()` method returns false the validation is automatically cancelled:
+When validations are organized in classes, you can implement the `beforeValidation()` and `afterValidation()` methods to perform additional checks, filters, clean-up, etc. If the `beforeValidation()` method returns false the validation is automatically canceled:
```php
setOption('cancelOnFail', true);
}
@@ -2084,46 +2084,46 @@ try {
```
-[messages-message]: api/phalcon_messages.md#messages-message
-[messages-messages]: api/phalcon_messages.md#messages-messages
-[validation]: api/phalcon_filter.md#filter-validation
-[validation-abstractcombinedfieldsvalidator]: api/phalcon_filter.md#filter-validation-abstractcombinedfieldsvalidator
-[validation-abstractvalidator]: api/phalcon_filter.md#filter-validation-abstractvalidator
-[validation-abstractvalidatorcomposite]: api/phalcon_filter.md#filter-validation-abstractvalidatorcomposite
-[validation-exception]: api/phalcon_filter.md#filter-validation-exception
-[validation-validationinterface]: api/phalcon_filter.md#filter-validation-validationinterface
-[validation-validator-alnum]: api/phalcon_filter.md#filter-validation-validator-alnum
-[validation-validator-alpha]: api/phalcon_filter.md#filter-validation-validator-alpha
-[validation-validator-between]: api/phalcon_filter.md#filter-validation-validator-between
-[validation-validator-callback]: api/phalcon_filter.md#filter-validation-validator-callback
-[validation-validator-confirmation]: api/phalcon_filter.md#filter-validation-validator-confirmation
-[validation-validator-creditcard]: api/phalcon_filter.md#filter-validation-validator-creditcard
-[validation-validator-date]: api/phalcon_filter.md#filter-validation-validator-date
-[validation-validator-digit]: api/phalcon_filter.md#filter-validation-validator-digit
-[validation-validator-email]: api/phalcon_filter.md#filter-validation-validator-email
-[validation-validator-exception]: api/phalcon_filter.md#filter-validation-validator-exception
-[validation-validator-exclusionin]: api/phalcon_filter.md#filter-validation-validator-exclusionin
-[validation-validator-file]: api/phalcon_filter.md#filter-validation-validator-file
-[validation-validator-file-abstractfile]: api/phalcon_filter.md#filter-validation-validator-file-abstractfile
-[validation-validator-file-mimetype]: api/phalcon_filter.md#filter-validation-validator-file-mimetype
-[validation-validator-file-resolution-equal]: api/phalcon_filter.md#filter-validation-validator-file-resolution-equal
-[validation-validator-file-resolution-max]: api/phalcon_filter.md#filter-validation-validator-file-resolution-max
-[validation-validator-file-resolution-min]: api/phalcon_filter.md#filter-validation-validator-file-resolution-min
-[validation-validator-file-size-equal]: api/phalcon_filter.md#filter-validation-validator-file-size-equal
-[validation-validator-file-size-max]: api/phalcon_filter.md#filter-validation-validator-file-size-max
-[validation-validator-file-size-min]: api/phalcon_filter.md#filter-validation-validator-file-size-min
-[validation-validator-identical]: api/phalcon_filter.md#filter-validation-validator-identical
-[validation-validator-inclusionin]: api/phalcon_filter.md#filter-validation-validator-inclusionin
-[validation-validator-ip]: api/phalcon_filter.md#filter-validation-validator-ip
-[validation-validator-numericality]: api/phalcon_filter.md#filter-validation-validator-numericality
-[validation-validator-presenceof]: api/phalcon_filter.md#filter-validation-validator-presenceof
-[validation-validator-regex]: api/phalcon_filter.md#filter-validation-validator-regex
-[validation-validator-stringlength]: api/phalcon_filter.md#filter-validation-validator-stringlength
-[validation-validator-stringlength-max]: api/phalcon_filter.md#filter-validation-validator-stringlength-max
-[validation-validator-stringlength-min]: api/phalcon_filter.md#filter-validation-validator-stringlength-min
-[validation-validator-uniqueness]: api/phalcon_filter.md#filter-validation-validator-uniqueness
-[validation-validator-url]: api/phalcon_filter.md#filter-validation-validator-url
-[validation-validatorcompositeinterface]: api/phalcon_filter.md#filter-validation-validatorcompositeinterface
-[validation-validatorfactory]: api/phalcon_filter.md#filter-validation-validatorfactory
-[validation-validatorinterface]: api/phalcon_filter.md#filter-validation-validatorinterface
+[messages-message]: api/phalcon_messages.md#messagesmessage-
+[messages-messages]: api/phalcon_messages.md#messagesmessages-
+[validation]: api/phalcon_filter.md#filtervalidation-
+[validation-abstractcombinedfieldsvalidator]: api/phalcon_filter.md#filtervalidationabstractcombinedfieldsvalidator--
+[validation-abstractvalidator]: api/phalcon_filter.md#filtervalidationabstractvalidator--
+[validation-abstractvalidatorcomposite]: api/phalcon_filter.md#filtervalidationabstractvalidatorcomposite--
+[validation-exception]: api/phalcon_filter.md#filtervalidationexception-
+[validation-validationinterface]: api/phalcon_filter.md#filtervalidationvalidationinterface--
+[validation-validator-alnum]: api/phalcon_filter.md#filtervalidationvalidatoralnum-
+[validation-validator-alpha]: api/phalcon_filter.md#filtervalidationvalidatoralpha-
+[validation-validator-between]: api/phalcon_filter.md#filtervalidationvalidatorbetween-
+[validation-validator-callback]: api/phalcon_filter.md#filtervalidationvalidatorcallback-
+[validation-validator-confirmation]: api/phalcon_filter.md#filtervalidationvalidatorconfirmation-
+[validation-validator-creditcard]: api/phalcon_filter.md#filtervalidationvalidatorcreditcard-
+[validation-validator-date]: api/phalcon_filter.md#filtervalidationvalidatordate-
+[validation-validator-digit]: api/phalcon_filter.md#filtervalidationvalidatordigit-
+[validation-validator-email]: api/phalcon_filter.md#filtervalidationvalidatoremail-
+[validation-validator-exception]: api/phalcon_filter.md#filtervalidationvalidatorexception-
+[validation-validator-exclusionin]: api/phalcon_filter.md#filtervalidationvalidatorexclusionin-
+[validation-validator-file]: api/phalcon_filter.md#filtervalidationvalidatorfile-
+[validation-validator-file-abstractfile]: api/phalcon_filter.md#filtervalidationvalidatorfileabstractfile--
+[validation-validator-file-mimetype]: api/phalcon_filter.md#filtervalidationvalidatorfilemimetype-
+[validation-validator-file-resolution-equal]: api/phalcon_filter.md#filtervalidationvalidatorfileresolutionequal-
+[validation-validator-file-resolution-max]: api/phalcon_filter.md#filtervalidationvalidatorfileresolutionmax-
+[validation-validator-file-resolution-min]: api/phalcon_filter.md#filtervalidationvalidatorfileresolutionmin-
+[validation-validator-file-size-equal]: api/phalcon_filter.md#filtervalidationvalidatorfilesizeequal-
+[validation-validator-file-size-max]: api/phalcon_filter.md#filtervalidationvalidatorfilesizemax-
+[validation-validator-file-size-min]: api/phalcon_filter.md#filtervalidationvalidatorfilesizemin-
+[validation-validator-identical]: api/phalcon_filter.md#filtervalidationvalidatoridentical-
+[validation-validator-inclusionin]: api/phalcon_filter.md#filtervalidationvalidatorinclusionin-
+[validation-validator-ip]: api/phalcon_filter.md#filtervalidationvalidatorip-
+[validation-validator-numericality]: api/phalcon_filter.md#filtervalidationvalidatornumericality-
+[validation-validator-presenceof]: api/phalcon_filter.md#filtervalidationvalidatorpresenceof-
+[validation-validator-regex]: api/phalcon_filter.md#filtervalidationvalidatorregex-
+[validation-validator-stringlength]: api/phalcon_filter.md#filtervalidationvalidatorstringlength-
+[validation-validator-stringlength-max]: api/phalcon_filter.md#filtervalidationvalidatorstringlengthmax-
+[validation-validator-stringlength-min]: api/phalcon_filter.md#filtervalidationvalidatorstringlengthmin-
+[validation-validator-uniqueness]: api/phalcon_filter.md#filtervalidationvalidatoruniqueness-
+[validation-validator-url]: api/phalcon_filter.md#filtervalidationvalidatorurl-
+[validation-validatorcompositeinterface]: api/phalcon_filter.md#filtervalidationvalidatorcompositeinterface
+[validation-validatorfactory]: api/phalcon_filter.md#filtervalidationvalidatorfactory
+[validation-validatorinterface]: api/phalcon_filter.md#filtervalidationvalidatorinterface
[filter-filter]: filter-filter.md
diff --git a/docs/flash.md b/docs/flash.md
index 533bc4b26..0eaee0aee 100644
--- a/docs/flash.md
+++ b/docs/flash.md
@@ -28,7 +28,7 @@ $flash->error('Something went wrong');
```
### Session
-[Phalcon\Flash\Session][flash-session] can be used to output messages set in the component. The component transparently stores the messages in the session to be used after a redirect.
+[Phalcon\Flash\Session][flash-session] can be used to output messages set in the component. The component transparently stores the messages in the session to be used after a redirect.
```php
` tags. There is also a mapping of message type to CSS class that you can take advantage of based on the stylesheet you use in your application. By default, the component uses the following mapping:
+The component (irrespective of the adapter) offers automatic styling of messages on the screen. This means that messages will be wrapped in `
From 92508410fa8fbe8906d4f36e34a4b032bde50447 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Tue, 9 Jan 2024 19:00:34 -0600
Subject: [PATCH 093/191] repositioning the api link
---
docs/api/index.md | 5 +++++
mkdocs.yml | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/docs/api/index.md b/docs/api/index.md
index 89f46ea03..f4e7b342a 100644
--- a/docs/api/index.md
+++ b/docs/api/index.md
@@ -1,3 +1,8 @@
+---
+hide:
+ - toc
+---
+
# API Index
- - -
diff --git a/mkdocs.yml b/mkdocs.yml
index 29661476b..71dd28af6 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -2350,7 +2350,6 @@ nav:
- DI Container: di.md
- MVC: mvc.md
- Namespaces: namespaces.md
- - API Index: api/index.md
- Database:
- Layer: db-layer.md
- PHQL: db-phql.md
@@ -2416,3 +2415,4 @@ nav:
- Helper: support-helper.md
- Registry: support-registry.md
- Version: support-version.md
+ - API: api/index.md
From bf43cd91aac8cac8f52e3520cc1a3d2997c48355 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 13 Jan 2024 15:33:14 -0600
Subject: [PATCH 094/191] correcting version number
---
docs/autoload.md | 18 +++++++++---------
docs/upgrade.md | 4 ++--
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/docs/autoload.md b/docs/autoload.md
index e56a49c01..cb3507703 100644
--- a/docs/autoload.md
+++ b/docs/autoload.md
@@ -6,7 +6,7 @@
The `Phalcon\Autoload\Loader` class has been renamed `Phalcon\Autoload\Loader`. The functionality remains the same.
## Overview
-[Phalcon\Autoload\Loader][loader] is an autoloader that implements [PSR-4][psr-4]. Just like any autoloader, depending on its setup, it will try and find the files your code is looking for based on file, class, namespace, etc. Since this component is written in C, it offers the lowest overhead when processing its setup, thus offering a performance boost.
+[Phalcon\Autoload\Loader][loader] is an autoloader that implements [PSR-4][psr-4]. Just like any autoloader, depending on its setup, it will try to find the files your code is looking for based on file, class, namespace, etc. Since this component is written in C, it offers the lowest overhead when processing its setup, thus offering a performance boost.

@@ -15,7 +15,7 @@ This component relies on PHP's [autoloading classes][autoloading] capability. If
The component offers options for loading files based on their class, file name, directories on your file system as well as file extensions.
## Registration
-Usually, we would use the [spl_autoload_register()][spl-autoload-register] to register a custom autoloader for our application. [Phalcon\Autoload\Loader][loader] hides this complexity. After you define all your namespaces, classes, directories, and files you will need to call the `register()` function, and the autoloader is ready to be used.
+Usually, we would use the [spl_autoload_register()][spl-autoload-register] to register a custom autoloader for our application. [Phalcon\Autoload\Loader][loader] hides this complexity. After you define all your namespaces, classes, directories and files you will need to call the `register()` function, and the autoloader is ready to be used.
```php
Date: Sun, 14 Jan 2024 19:20:19 -0600
Subject: [PATCH 095/191] updating installation instructions
---
docs/installation.md | 4 ++++
docs/tutorial-basic.md | 2 +-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/docs/installation.md b/docs/installation.md
index 5d4432ba0..0afc03853 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -101,6 +101,10 @@ Since Phalcon is compiled as a PHP extension, its installation is somewhat diffe
The preferred method of installation is through [PECL][install-pecl].
+!!! warning "NOTE"
+
+ To install phalcon with PECL you will need at least 4GB of RAM, otherwise the PECL build command will fail.
+
### PECL
The PECL installation method is available for Windows, Linux, and macOS. Under Windows pre-compiled dll files are available, while under Linux and macOS, Phalcon will be compiled locally. To install Phalcon using PECL make sure you have [pecl/pear][install-pecl] installed.
```
diff --git a/docs/tutorial-basic.md b/docs/tutorial-basic.md
index 72d596a23..f5a3acfd3 100644
--- a/docs/tutorial-basic.md
+++ b/docs/tutorial-basic.md
@@ -18,7 +18,7 @@ One of the key features of Phalcon is that it is loosely coupled. Because of tha
```text
.
└── tutorial
- ├── app
+ ├── src
│ ├── controllers
│ │ ├── IndexController.php
│ │ └── SignupController.php
From 60f0ac210763d2b08aa4f5240a0397373e9c9eca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=BDan=20Matic=20Pratnemer?=
<71486730+ZanMaticPratnemer@users.noreply.github.com>
Date: Wed, 17 Jan 2024 12:00:04 +0100
Subject: [PATCH 096/191] Add note on softDelete not triggering afterDelete
event
---
docs/db-models-behaviors.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/docs/db-models-behaviors.md b/docs/db-models-behaviors.md
index 8e2e1f8f7..f4bb4ef6a 100644
--- a/docs/db-models-behaviors.md
+++ b/docs/db-models-behaviors.md
@@ -201,6 +201,10 @@ mysql> select * from co_invoices;
You will need to ensure to specify the _deleted_ condition to filter your records so that you can get deleted or not deleted results back. This behavior does not support automatic filtering.
+!!! warning "NOTE"
+
+ Adding this behaviour to a model prevents its _afterDelete_ event from being triggered, since the record isn't actually deleted.
+
## Custom
The ORM provides an API to create your own behaviors. A behavior must be a class implementing the [Phalcon\Mvc\Model\BehaviorInterface][mvc-model-behaviorinterface] or extend [Phalcon\Mvc\Model\Behavior][mvc-model-behavior] which exposes most of the methods required for implementing custom behaviors.
From fba58219d9d004f12a172b67e524d2a32972c06f Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Thu, 18 Jan 2024 09:40:15 -0600
Subject: [PATCH 097/191] fixing return for dispatcher forward
---
docs/api/phalcon_mvc.md | 2 +-
docs/tutorial-invo.md | 24 ++++++++++++------------
docs/tutorial-vokuro.md | 4 ++--
3 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/docs/api/phalcon_mvc.md b/docs/api/phalcon_mvc.md
index f95dafb9e..016de87bc 100644
--- a/docs/api/phalcon_mvc.md
+++ b/docs/api/phalcon_mvc.md
@@ -203,7 +203,7 @@ class PeopleController extends \Phalcon\Mvc\Controller
public function saveAction()
{
// Forwards flow to the index action
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
"controller" => "people",
"action" => "index",
diff --git a/docs/tutorial-invo.md b/docs/tutorial-invo.md
index e14ec27de..ba0bb3725 100644
--- a/docs/tutorial-invo.md
+++ b/docs/tutorial-invo.md
@@ -430,7 +430,7 @@ If the user is not found, we forward them to the login page with a `Wrong email/
```php
dispatcher->forward(
+$this->dispatcher->forward(
[
'controller' => 'session',
'action' => 'index',
@@ -1120,7 +1120,7 @@ if (count($products) === 0) {
'The search did not find any products'
);
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'index',
@@ -1405,7 +1405,7 @@ In the creation case, we get the data submitted and assign them to a new `Produc
public function createAction()
{
if (true !== $this->request->isPost()) {
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'index',
@@ -1493,7 +1493,7 @@ if (true !== $form->isValid($data, $product)) {
$this->flash->error($message->getMessage());
}
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'new',
@@ -1518,7 +1518,7 @@ if ($product->save() === false) {
$this->flash->error($message->getMessage());
}
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'new',
@@ -1532,7 +1532,7 @@ $this->flash->success(
'Product was created successfully'
);
-return $this->dispatcher->forward(
+$this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'index',
@@ -1557,7 +1557,7 @@ public function editAction($id)
'Product was not found'
);
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'index',
@@ -1583,7 +1583,7 @@ The data found is bound to the form by passing the model as the first parameter.
public function saveAction()
{
if (true !== $this->request->isPost()) {
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'index',
@@ -1599,7 +1599,7 @@ public function saveAction()
'Product does not exist'
);
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'index',
@@ -1617,7 +1617,7 @@ public function saveAction()
$this->flash->error($message->getMessage());
}
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'new',
@@ -1632,7 +1632,7 @@ public function saveAction()
$this->flash->error($message->getMessage());
}
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'new',
@@ -1646,7 +1646,7 @@ public function saveAction()
'Product was updated successfully'
);
- return $this->dispatcher->forward(
+ $this->dispatcher->forward(
[
'controller' => 'products',
'action' => 'index',
diff --git a/docs/tutorial-vokuro.md b/docs/tutorial-vokuro.md
index d60a0444f..03a2102a4 100644
--- a/docs/tutorial-vokuro.md
+++ b/docs/tutorial-vokuro.md
@@ -1146,7 +1146,7 @@ class SessionController extends ControllerBase
);
if ($user->save()) {
- return $this->dispatcher->forward([
+ $this->dispatcher->forward([
'controller' => 'index',
'action' => 'index',
]);
@@ -1212,7 +1212,7 @@ $user = new Users(
);
if ($user->save()) {
- return $this
+ $this
->dispatcher
->forward(
[
From 65699559ab8b7ca4c9d6eb0d3295559882b3b007 Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi
Date: Sun, 4 Feb 2024 12:08:06 +0200
Subject: [PATCH 098/191] fix dark mode color (#62)
---
docs/assets/css/extra.css | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 8d683ef38..7c687d177 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -43,6 +43,10 @@
background-color: #ffffffb3;
}
+[data-md-color-scheme="slate"] .md-typeset a {
+ color: #00bda4 !important;
+}
+
/* Releases page table */
.version-th-center, .version-td-center {
text-align: center;
From c3fd65c4f5e3a5d0ce78780d1dff6931aa2cd2aa Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi
Date: Mon, 5 Feb 2024 00:15:33 +0200
Subject: [PATCH 099/191] fix color (#63)
---
docs/assets/css/extra.css | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 7c687d177..bb3a7d311 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -47,6 +47,10 @@
color: #00bda4 !important;
}
+[data-md-color-scheme="slate"] .md-nav__item .md-nav__link--active {
+ color: #00bda4 !important;
+}
+
/* Releases page table */
.version-th-center, .version-td-center {
text-align: center;
From fda763705b7f926d7613072a00bf471e15622772 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Thu, 8 Feb 2024 12:18:55 -0600
Subject: [PATCH 100/191] 5.6.1 update
---
docs/api/phalcon_cache.md | 4 +-
docs/api/phalcon_cli.md | 4 +-
docs/api/phalcon_datamapper.md | 101 +++++++++++++++---------------
docs/api/phalcon_db.md | 86 +++++++++----------------
docs/api/phalcon_di.md | 4 +-
docs/api/phalcon_filter.md | 4 +-
docs/api/phalcon_html.md | 4 --
docs/api/phalcon_mvc.md | 111 ++++++++++++++++++---------------
docs/api/phalcon_storage.md | 6 +-
9 files changed, 150 insertions(+), 174 deletions(-)
diff --git a/docs/api/phalcon_cache.md b/docs/api/phalcon_cache.md
index e011502e5..ef6a1d9a9 100644
--- a/docs/api/phalcon_cache.md
+++ b/docs/api/phalcon_cache.md
@@ -91,13 +91,13 @@ Deletes multiple cache items in a single operation.
```php
-protected function doGet( string $key, mixed $defaultValue = null );
+protected function doGet( string $key, mixed $defaultValue = null ): mixed;
```
Fetches a value from the cache.
```php
-protected function doGetMultiple( mixed $keys, mixed $defaultValue = null );
+protected function doGetMultiple( mixed $keys, mixed $defaultValue = null ): array;
```
Obtains multiple cache items by their unique keys.
diff --git a/docs/api/phalcon_cli.md b/docs/api/phalcon_cli.md
index af6ca4bcc..1a8184647 100644
--- a/docs/api/phalcon_cli.md
+++ b/docs/api/phalcon_cli.md
@@ -546,13 +546,13 @@ Handles routing information received from command-line arguments
```php
-public function setDefaultAction( string $actionName );
+public function setDefaultAction( string $actionName ): Router;
```
Sets the default action name
```php
-public function setDefaultModule( string $moduleName );
+public function setDefaultModule( string $moduleName ): Router;
```
Sets the name of the default module
diff --git a/docs/api/phalcon_datamapper.md b/docs/api/phalcon_datamapper.md
index 48502290c..dc26c6b18 100644
--- a/docs/api/phalcon_datamapper.md
+++ b/docs/api/phalcon_datamapper.md
@@ -1497,11 +1497,59 @@ Quotes the identifier
```php
-public function reset();
+public function reset(): void;
```
Resets the internal array
+```php
+public function resetColumns(): void;
+```
+Resets the columns
+
+
+```php
+public function resetFlags(): void;
+```
+Resets the flags
+
+
+```php
+public function resetFrom(): void;
+```
+Resets the from
+
+
+```php
+public function resetGroupBy(): void;
+```
+Resets the group by
+
+
+```php
+public function resetHaving(): void;
+```
+Resets the having
+
+
+```php
+public function resetLimit(): void;
+```
+Resets the limit and offset
+
+
+```php
+public function resetOrderBy(): void;
+```
+Resets the order by
+
+
+```php
+public function resetWhere(): void;
+```
+Resets the where
+
+
```php
public function setFlag( string $flag, bool $enable = bool ): void;
```
@@ -1957,7 +2005,7 @@ Sets a `OR` for a `HAVING` condition
```php
-public function reset(): Select;
+public function reset(): void;
```
Resets the internal collections
@@ -2054,53 +2102,6 @@ public function reset(): void;
```
Resets the internal store
-```php
-public function resetColumns();
-```
-Resets the `columns`
-
-
-```php
-public function resetFrom();
-```
-Resets the `from`
-
-
-```php
-public function resetWhere();
-```
-Resets the `wheew`
-
-
-```php
-public function resetGroupBy();
-```
-Resets the `groupBy`
-
-
-```php
-public function resetHaving();
-```
-Resets the `having`
-
-
-```php
-public function resetOrderBy();
-```
-Resets the `orderBy`
-
-
-```php
-public function resetLimit();
-```
-Resets the `limit` and `offset`
-
-
-```php
-public function resetFlags();
-```
-Resets the `flags`
-
```php
public function returning( array $columns ): Update;
@@ -2112,3 +2113,5 @@ Adds the `RETURNING` clause
public function set( string $column, mixed $value = null ): Update;
```
Sets a column = value condition
+
+
diff --git a/docs/api/phalcon_db.md b/docs/api/phalcon_db.md
index b477e6687..7a0b9c5b8 100644
--- a/docs/api/phalcon_db.md
+++ b/docs/api/phalcon_db.md
@@ -9,26 +9,40 @@ hide:
-## Db\AbstractDb 
+## Db\Adapter\AbstractAdapter 
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/AbstractDb.zep)
+[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Adapter/AbstractAdapter.zep)
- __Namespace__
- - `Phalcon\Db`
+ - `Phalcon\Db\Adapter`
- __Uses__
- - `\PDO`
+ - `Phalcon\Db\ColumnInterface`
+ - `Phalcon\Db\DialectInterface`
+ - `Phalcon\Db\Enum`
+ - `Phalcon\Db\Exception`
+ - `Phalcon\Db\Index`
+ - `Phalcon\Db\IndexInterface`
+ - `Phalcon\Db\RawValue`
+ - `Phalcon\Db\Reference`
+ - `Phalcon\Db\ReferenceInterface`
+ - `Phalcon\Events\EventsAwareInterface`
+ - `Phalcon\Events\ManagerInterface`
- __Extends__
- __Implements__
+ - `AdapterInterface`
+ - `EventsAwareInterface`
-Phalcon\Db and its related classes provide a simple SQL database interface
+Base class for Phalcon\Db\Adapter adapters.
+
+This class and its related classes provide a simple SQL database interface
for Phalcon Framework. The Phalcon\Db is the basic class you use to connect
your PHP application to an RDBMS. There is a different adapter class for each
brand of RDBMS.
@@ -57,13 +71,13 @@ try {
);
$result = $connection->query(
- "SELECTFROM robots LIMIT 5"
+ "SELECTFROM co_invoices LIMIT 5"
);
$result->setFetchMode(Enum::FETCH_NUM);
- while ($robot = $result->fetch()) {
- print_r($robot);
+ while ($invoice = $result->fetch()) {
+ print_r($invoice);
}
} catch (Exception $e) {
echo $e->getMessage(), PHP_EOL;
@@ -71,50 +85,6 @@ try {
```
-### Methods
-
-```php
-public static function setup( array $options ): void;
-```
-Enables/disables options in the Database component
-
-
-
-
-## Db\Adapter\AbstractAdapter 
-
-[Source on GitHub](https://github.com/phalcon/cphalcon/blob/5.0.x/phalcon/Db/Adapter/AbstractAdapter.zep)
-
-
-- __Namespace__
-
- - `Phalcon\Db\Adapter`
-
-- __Uses__
-
- - `Phalcon\Db\ColumnInterface`
- - `Phalcon\Db\DialectInterface`
- - `Phalcon\Db\Enum`
- - `Phalcon\Db\Exception`
- - `Phalcon\Db\Index`
- - `Phalcon\Db\IndexInterface`
- - `Phalcon\Db\RawValue`
- - `Phalcon\Db\Reference`
- - `Phalcon\Db\ReferenceInterface`
- - `Phalcon\Events\EventsAwareInterface`
- - `Phalcon\Events\ManagerInterface`
-
-- __Extends__
-
-
-- __Implements__
-
- - `AdapterInterface`
- - `EventsAwareInterface`
-
-Base class for Phalcon\Db\Adapter adapters
-
-
### Properties
```php
/**
@@ -669,6 +639,12 @@ public function setNestedTransactionsWithSavepoints( bool $nestedTransactionsWit
Set if nested transactions should use savepoints
+```php
+public static function setup( array $options ): void;
+```
+Enables/disables options in the Database component
+
+
```php
public function sharedLock( string $sqlQuery ): string;
```
@@ -1692,12 +1668,6 @@ protected $type = mysql;
### Methods
-```php
-public function __construct( array $descriptor );
-```
-Constructor for Phalcon\Db\Adapter\Pdo
-
-
```php
public function addForeignKey( string $tableName, string $schemaName, ReferenceInterface $reference ): bool;
```
diff --git a/docs/api/phalcon_di.md b/docs/api/phalcon_di.md
index 7e4397d81..a9c577573 100644
--- a/docs/api/phalcon_di.md
+++ b/docs/api/phalcon_di.md
@@ -262,7 +262,7 @@ return [
];
```
-@link https://docs.phalcon.io/en/latest/reference/di.html
+@link https://docs.phalcon.io/latest/di/
```php
@@ -298,7 +298,7 @@ user:
className: \Acme\User
```
-@link https://docs.phalcon.io/en/latest/reference/di.html
+@link https://docs.phalcon.io/latest/di/
```php
diff --git a/docs/api/phalcon_filter.md b/docs/api/phalcon_filter.md
index 68c47ac89..df832de39 100644
--- a/docs/api/phalcon_filter.md
+++ b/docs/api/phalcon_filter.md
@@ -1165,7 +1165,7 @@ public function setValidators( array $validators ): Validation;
```php
-public function validate( mixed $data = null, mixed $entity = null ): Messages;
+public function validate( mixed $data = null, mixed $entity = null ): Messages | bool;
```
Validate a set of data according to a set of rules
@@ -1517,7 +1517,7 @@ Adds labels for fields
```php
-public function validate( mixed $data = null, mixed $entity = null ): Messages;
+public function validate( mixed $data = null, mixed $entity = null ): Messages | bool;
```
Validate a set of data according to a set of rules
diff --git a/docs/api/phalcon_html.md b/docs/api/phalcon_html.md
index 06d4ff183..e47e98351 100644
--- a/docs/api/phalcon_html.md
+++ b/docs/api/phalcon_html.md
@@ -1793,10 +1793,6 @@ protected $type = search;
Class Select
-@property string $elementTag
-@property bool $inOptGroup
-@property string $selected
-
### Properties
```php
diff --git a/docs/api/phalcon_mvc.md b/docs/api/phalcon_mvc.md
index 016de87bc..3fac05dc6 100644
--- a/docs/api/phalcon_mvc.md
+++ b/docs/api/phalcon_mvc.md
@@ -2671,8 +2671,8 @@ $invoice->update();
!!! warning "NOTE"
- When retrieving the record with `findFirst()`, you need to get the full
- object back (no `columns` definition) but also retrieve it using the
+ When retrieving the record with `findFirst()`, you need to get the full
+ object back (no `columns` definition) but also retrieve it using the
primary key. If not, the ORM will issue an `INSERT` instead of `UPDATE`.
@@ -3510,19 +3510,19 @@ Sets cache instance
- `CriteriaInterface`
- `InjectionAwareInterface`
-Phalcon\Mvc\Model\Criteria
-
This class is used to build the array parameter required by
Phalcon\Mvc\Model::find() and Phalcon\Mvc\Model::findFirst() using an
object-oriented interface.
```php
-$robots = Robots::query()
- ->where("type = :type:")
- ->andWhere("year < 2000")
- ->bind(["type" => "mechanical"])
+where("inv_cst_id = :customerId:")
+ ->andWhere("inv_created_date < '2000-01-01'")
+ ->bind(["customerId" => 1])
->limit(5, 10)
- ->orderBy("name")
+ ->orderBy("inv_title")
->execute();
```
@@ -3598,12 +3598,11 @@ This method replaces all previously set cache options
```php
public function columns( mixed $columns ): CriteriaInterface;
```
-
Sets the columns to be queried. The columns can be either a `string` or
-an `array` of strings. If the argument is a (single, non-embedded) string,
-its content can specify one or more columns, separated by commas, the same
-way that one uses the SQL select statement. You can use aliases, aggregate
-functions, etc. If you need to reference other models you will need to
+an `array` of strings. If the argument is a (single, non-embedded) string,
+its content can specify one or more columns, separated by commas, the same
+way that one uses the SQL select statement. You can use aliases, aggregate
+functions, etc. If you need to reference other models you will need to
reference them with their namespaces.
When using an array as a parameter, you will need to specify one field
@@ -3655,10 +3654,11 @@ public function createBuilder(): BuilderInterface;
```
Creates a query builder from criteria.
-```php
-$builder = Robots::query()
- ->where("type = :type:")
- ->bind(["type" => "mechanical"])
+where("inv_cst_id = :customerId:")
+ ->bind(["customerId" => 1])
->createBuilder();
```
@@ -3779,19 +3779,21 @@ public function innerJoin( string $model, mixed $conditions = null, mixed $alias
Adds an INNER join to the query
```php
+innerJoin(
- Robots::class
+ Invoices::class
);
$criteria->innerJoin(
- Robots::class,
- "r.id = RobotsParts.robots_id"
+ Invoices::class,
+ "inv_cst_id = Customers.cst_id"
);
$criteria->innerJoin(
- Robots::class,
- "r.id = RobotsParts.robots_id",
- "r"
+ Invoices::class,
+ "i.inv_cst_id = Customers.cst_id",
+ "i"
);
```
@@ -3802,25 +3804,27 @@ public function join( string $model, mixed $conditions = null, mixed $alias = nu
Adds an INNER join to the query
```php
+join(
- Robots::class
+ Invoices::class
);
$criteria->join(
- Robots::class,
- "r.id = RobotsParts.robots_id"
+ Invoices::class,
+ "inv_cst_id = Customers.cst_id"
);
$criteria->join(
- Robots::class,
- "r.id = RobotsParts.robots_id",
- "r"
+ Invoices::class,
+ "i.inv_cst_id = Customers.cst_id",
+ "i"
);
$criteria->join(
- Robots::class,
- "r.id = RobotsParts.robots_id",
- "r",
+ Invoices::class,
+ "i.inv_cst_id = Customers.cst_id",
+ "i",
"LEFT"
);
```
@@ -3832,10 +3836,12 @@ public function leftJoin( string $model, mixed $conditions = null, mixed $alias
Adds a LEFT join to the query
```php
+leftJoin(
- Robots::class,
- "r.id = RobotsParts.robots_id",
- "r"
+ Invoices::class,
+ "i.inv_cst_id = Customers.cst_id",
+ "i"
);
```
@@ -3890,10 +3896,12 @@ public function rightJoin( string $model, mixed $conditions = null, mixed $alias
Adds a RIGHT join to the query
```php
+rightJoin(
- Robots::class,
- "r.id = RobotsParts.robots_id",
- "r"
+ Invoices::class,
+ "i.inv_cst_id = Customers.cst_id",
+ "i"
);
```
@@ -7208,7 +7216,6 @@ $builder->betweenWhere("price", 100.25, 200.50);
```php
public function columns( mixed $columns ): BuilderInterface;
```
-
Sets the columns to be queried. The columns can be either a `string` or
an `array` of strings. If the argument is a (single, non-embedded) string,
its content can specify one or more columns, separated by commas, the same
@@ -7227,7 +7234,7 @@ be used as the alias in the query
$builder->columns("id, category");
// Array, one column per element
-$criteria->columns(
+$builder->columns(
[
"inv_id",
"inv_total",
@@ -7766,14 +7773,15 @@ Appends a BETWEEN condition to the current conditions
public function columns( mixed $columns ): BuilderInterface;
```
Sets the columns to be queried. The columns can be either a `string` or
-an `array`. The string can specify one or more columns, separated by
-commas, the same way that one uses the SQL select statement. You can
-use aliases, aggregate functions etc. If you need to reference other
-models you will need to reference them with their namespaces.
+an `array` of strings. If the argument is a (single, non-embedded) string,
+its content can specify one or more columns, separated by commas, the same
+way that one uses the SQL select statement. You can use aliases, aggregate
+functions, etc. If you need to reference other models you will need to
+reference them with their namespaces.
When using an array as a parameter, you will need to specify one field
-per element. If a key is defined in our array, it will be used as the
-alias in the query
+per array element. If a non-numeric key is defined in the array, it will
+be used as the alias in the query
```php
columns(
```
-
```php
public function distinct( mixed $distinct ): BuilderInterface;
```
@@ -8690,10 +8697,10 @@ Sets the object's state
Phalcon\Mvc\Model\Resultset
-This component allows to `Phalcon\Mvc\Model` returns large resultsets with the minimum memory consumption
+This component allows to Phalcon\Mvc\Model returns large resultsets with the minimum memory consumption
Resultsets can be traversed using a standard foreach or a while statement. If a resultset is serialized
-it will dump all the rows into a big array, serialize it and return the resulting string. Then
-`unserialize` will retrieve the rows as they were before serializing.
+it will dump all the rows into a big array. Then unserialize will retrieve the rows as they were before
+serializing.
```php
@@ -13769,6 +13776,7 @@ use Phalcon\Mvc\View\Engine\Volt\Compiler;
$compiler = new Compiler();
// {% set a = ['first': 1] %}
+
$source = [
"type" => 306,
"assignments" => [
@@ -13809,7 +13817,6 @@ echo $compiler->compileSet($source);
```
-
```php
public function compileString( string $viewCode, bool $extendsMode = bool ): string;
```
diff --git a/docs/api/phalcon_storage.md b/docs/api/phalcon_storage.md
index 6504ccb0d..76bb2de40 100644
--- a/docs/api/phalcon_storage.md
+++ b/docs/api/phalcon_storage.md
@@ -430,7 +430,7 @@ protected function doGet( string $key );
```php
-protected function phpApcuDec( mixed $key, int $step = int, mixed $success = null, int $ttl = int ): bool | int;
+protected function phpApcuDec( mixed $key, int $step = int ): bool | int;
```
@todo Remove the below once we get traits
@@ -448,13 +448,13 @@ protected function phpApcuExists( mixed $key ): bool | array;
```php
-protected function phpApcuFetch( mixed $key, mixed $success = null ): mixed;
+protected function phpApcuFetch( mixed $key ): mixed;
```
```php
-protected function phpApcuInc( mixed $key, int $step = int, mixed $success = null, int $ttl = int ): bool | int;
+protected function phpApcuInc( mixed $key, int $step = int ): bool | int;
```
From 1f354007b27b3912fc05c44b0a6bbdd92ed7e26f Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi
Date: Fri, 9 Feb 2024 00:10:19 +0200
Subject: [PATCH 101/191] add hover on fix links (#69)
---
docs/assets/css/extra.css | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index bb3a7d311..26debab5d 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -51,6 +51,14 @@
color: #00bda4 !important;
}
+[data-md-color-scheme="slate"] .md-typeset a:hover {
+ color: #02d3b8 !important;
+}
+
+[data-md-color-scheme="slate"] .md-nav__item .md-nav__link--active:hover {
+ color: #02d3b8 !important;
+}
+
/* Releases page table */
.version-th-center, .version-td-center {
text-align: center;
From 1e1e6ebb6b8f9c6f77c9064031fc2e0acd214fb7 Mon Sep 17 00:00:00 2001
From: Thomas Perale
Date: Tue, 27 Feb 2024 10:40:37 +0100
Subject: [PATCH 102/191] Fix deprecated reference to setTitle in Controllers
documentation
---
docs/controllers.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/controllers.md b/docs/controllers.md
index e17f2d90e..18ab94605 100644
--- a/docs/controllers.md
+++ b/docs/controllers.md
@@ -82,7 +82,7 @@ class InvoicesController extends Controller
{
public function initialize()
{
- $this->tag->setTitle('Invoices Management');
+ $this->tag->title()->set('Invoices Management');
}
public function listAction(int $page = 1, int $perPage = 25)
From 2221c83355f84cad8ef5bc188c6b17b0c2ddac2c Mon Sep 17 00:00:00 2001
From: sinbad
Date: Thu, 7 Mar 2024 10:02:30 +0500
Subject: [PATCH 103/191] replace Phalcon\DataMapper\Connection to
Phalcon\DataMapper\Pdo\Connection
---
docs/datamapper.md | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/docs/datamapper.md b/docs/datamapper.md
index 37e681f03..856392a9f 100644
--- a/docs/datamapper.md
+++ b/docs/datamapper.md
@@ -42,7 +42,7 @@ You will only need to substitute the values in `<>` with the respective values f
```php
getStatement();
### Select
#### Activation
-To instantiate a [Phalcon\DataMapper\Query\Select][datamapper-query-select] builder, you can use the [Phalcon\DataMapper\Query\QueryFactory][datamapper-query-queryfactory] with a [Phalcon\DataMapper\Connection][datamapper-pdo-connection].
+To instantiate a [Phalcon\DataMapper\Query\Select][datamapper-query-select] builder, you can use the [Phalcon\DataMapper\Query\QueryFactory][datamapper-query-queryfactory] with a [Phalcon\DataMapper\Pdo\Connection][datamapper-pdo-connection].
```php
Date: Wed, 13 Mar 2024 00:41:50 +0200
Subject: [PATCH 104/191] update logotype (#80)
---
mkdocs.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mkdocs.yml b/mkdocs.yml
index 71dd28af6..e46d0aa6d 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -69,7 +69,7 @@ theme:
text: Titillium Web
code: Source Code Pro
favicon: assets/images/favicon.ico
- logo: https://assets.phalcon.io/phalcon/images/svg/phalcon-logo-white-105x40.svg
+ logo: https://assets.phalcon.io/phalcon/images/svg/phalcon-logo-35x39.svg
# Plugins
plugins:
From 704fc6024d91e46b73b914a06bf04f968c617936 Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Thu, 14 Mar 2024 12:16:25 -0500
Subject: [PATCH 105/191] update for 5.6.2
---
docs/api/phalcon_di.md | 2 ++
docs/api/phalcon_support.md | 3 +++
2 files changed, 5 insertions(+)
diff --git a/docs/api/phalcon_di.md b/docs/api/phalcon_di.md
index a9c577573..0380f09d7 100644
--- a/docs/api/phalcon_di.md
+++ b/docs/api/phalcon_di.md
@@ -20,9 +20,11 @@ hide:
- __Uses__
+ - `stdClass`
- __Extends__
+ `stdClass`
- __Implements__
diff --git a/docs/api/phalcon_support.md b/docs/api/phalcon_support.md
index fe3e5de73..0dfaa82c0 100644
--- a/docs/api/phalcon_support.md
+++ b/docs/api/phalcon_support.md
@@ -2952,8 +2952,10 @@ ServiceLocator implementation for helpers
@method string decrement(string $text, string $separator = '_')
@method string dirFromFile(string $file)
@method string dirSeparator(string $directory)
+@method string dynamic(string $text, string $leftDelimiter = "{", string $rightDelimiter = "}", string $separator = "|")
@method string encode($data, int $options = 0, int $depth = 512)
@method bool endsWith(string $haystack, string $needle, bool $ignoreCase = true)
+@method mixed filter(array $collection, callable|null $method)
@method mixed first(array $collection, callable $method = null)
@method string firstBetween(string $text, string $start, string $end)
@method mixed firstKey(array $collection, callable $method = null)
@@ -2965,6 +2967,7 @@ ServiceLocator implementation for helpers
@method string humanize(string $text)
@method bool includes(string $haystack, string $needle)
@method string increment(string $text, string $separator = '_')
+@method string interpolate(string $message, array $context = [], string $leftToken = "%", string $rightToken = "%")
@method bool isAnagram(string $first, string $second)
@method bool isBetween(int $value, int $start, int $end)
@method bool isLower(string $text, string $encoding = 'UTF-8')
From a0d0ea5123d614a90b84dc18a999bf1bea474a70 Mon Sep 17 00:00:00 2001
From: sinbad
Date: Thu, 21 Mar 2024 10:45:37 +0500
Subject: [PATCH 106/191] query string params in url
---
docs/mvc-url.md | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/docs/mvc-url.md b/docs/mvc-url.md
index 3bfd4c637..a54c4b656 100644
--- a/docs/mvc-url.md
+++ b/docs/mvc-url.md
@@ -216,6 +216,28 @@ echo $url->get(
The above will produce `/portal/invoices/edit/1`.
+If you pass additional parameters as a second argument in the array, these key/value pairs will be automatically added to the generated URL's query string:
+
+```php
+get(
+ [
+ 'for' => 'invoices-edit',
+ 'id' => 1,
+ ], [
+ 'is_paymented' => 'true',
+ 'some_key' => 'some_value'
+ ]
+);
+
+// /portal/invoices/edit/1?is_paymented=true&some_key=some_value
+```
+
### mod_rewrite
For developers that are utilizing `mod_rewrite` in their Apache installations, [Phalcon\Mvc\Url][url] offers the necessary functionality to replace `mod_rewrite`. This is especially useful if the target system does not have the module installed, or you cannot install it yourself.
From 3ad60839772a2f2e5e585a865725c3c45e2ac500 Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi
Date: Sat, 23 Mar 2024 00:11:38 +0200
Subject: [PATCH 107/191] update logotype (#90)
---
docs/assets/css/extra.css | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css
index 26debab5d..e46646f12 100644
--- a/docs/assets/css/extra.css
+++ b/docs/assets/css/extra.css
@@ -98,3 +98,8 @@
.legend-future {
border-left: 1.2em solid #c1e6f5;
}
+
+.md-header__button.md-logo img,
+.md-header__button.md-logo svg {
+ height: 2rem !important;
+}
\ No newline at end of file
From 8b554d5965d225aa00aed920bdb56dcc12a9798f Mon Sep 17 00:00:00 2001
From: Nikolaos Dimopoulos
Date: Sat, 20 Apr 2024 09:22:16 -0500
Subject: [PATCH 108/191] correcting example
---
docs/forms.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/forms.md b/docs/forms.md
index 4db6bcf56..d3769c645 100644
--- a/docs/forms.md
+++ b/docs/forms.md
@@ -993,8 +993,8 @@ In the view:
```php
renderDecorated('nameLast');
-echo $element->renderDecorated('nameFirst');
+echo $form->renderDecorated('nameLast');
+echo $form->renderDecorated('nameFirst');
```
## Events
From 398e7e0257ca2d84d350d9621db15b16bbe203d2 Mon Sep 17 00:00:00 2001
From: "n[oO]ne"
Date: Wed, 1 May 2024 18:27:33 +0700
Subject: [PATCH 109/191] refactor: added description for new php init setting.
---
docs/forms.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/docs/forms.md b/docs/forms.md
index d3769c645..b53501163 100644
--- a/docs/forms.md
+++ b/docs/forms.md
@@ -662,6 +662,11 @@ class Preferences
```
For the above entity class, the `getReceiveEmails` and `getTimezone` methods will be used instead of the `receiveEmails` and `timezone` properties.
+!!! warning "NOTE"
+
+ The default behavior of `Phalcon\Forms\Form::bind()` is to bind all form fields to the Model. To only bind the
+ fields that exist in the model, set `phalcon.form.strict_entity_property_check` value to `1`.
+
## Elements
Phalcon provides a set of built-in elements to use in your forms, all these elements are located in the `Phalcon\Forms\Element` namespace:
From aa3b6994450a141fdf53d14338df716fe279055f Mon Sep 17 00:00:00 2001
From: Ihor Sychevskyi
Date: Mon, 6 May 2024 01:47:49 +0300
Subject: [PATCH 110/191] remove unnecessary favicons (#137)
---
.../favicons/android-chrome-192x192.png | Bin 15246 -> 0 bytes
.../favicons/android-chrome-512x512.png | Bin 42474 -> 0 bytes
docs/assets/favicons/site.webmanifest | 18 ------------------
3 files changed, 18 deletions(-)
delete mode 100644 docs/assets/favicons/android-chrome-192x192.png
delete mode 100644 docs/assets/favicons/android-chrome-512x512.png
delete mode 100644 docs/assets/favicons/site.webmanifest
diff --git a/docs/assets/favicons/android-chrome-192x192.png b/docs/assets/favicons/android-chrome-192x192.png
deleted file mode 100644
index 8b3ad71b58b897052bdad9edf67b36342f53cf08..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 15246
zcmZ{Lbx<5nwDqvK1PvZwae})O+@0XT5@2x+PJqP{G!Wc1xVt-n;O_437X0n+tNN(_`@@
z-P1#J=cd17Z!}>5OWX9y*MTU~ptaIIi8bsBL>x;cA6nSJ-7(LN)uQR$sgY
zT8RIaFb)_{0-;6+RazJiw2vr3n(m%npki{6nB)N^I+`m_a*BbrGm$%=wdAwbM}bao
zaPq*M=lPa5g0V%Xj#XgDKokFzz^Em8IhFDSq#7S$z%p*oEp?m}1(&}AUfvAdMuiV
zU?PC%pEh@igK8Ro)xwm1rB@VAi=+@BMp!5h{h#lL!m}
zeXj;J3LV)SgASN)$%!_PF7KVl8k)u6;NUutb0b6N;^Px`thrNY8-aYyWXGgrU!g6v
z?gAnA#mqVSn6wk5^cr*n%0aUtWHhXZ3s>Uj#_yj%a`N(4@!%EIPLK&2Q7U(6N*b5M
zegpQ@XTYS7>;~t%Us=tR>p+x9JG@vP>25(N=Y9L|W}tjKYXQZclQ(wSuV26ZtoI8U
zq+s^t_x4J)$>cUI&mqD?1nFQd4WE^{?mJ_h(DzUr{ft9M+^eMe?ziRFmF#D|8#a|<$!4PN&0
zG^|vOOm(+&s?7L>C`sXZ+|se}3W%fXCsYJL5drs-n`GpB)7QP9Cs(*!6sNnVws|pb
zb^=d!(|@W669X%UBpuShu?QjAt*ySze_}sT(m;$bvqnQ}(by9P5Ej%UWoqoj
zp8^U$FtHC|-bI@+E|m)Lku8%bV4
zB8hMY^7sj5bwUN_6<1HIx{T=PMjb>qcR~p;6@^9{B^6PQ+YACbi*a#pqnNGc}hexrK{px4z#2rA`lUGM36VBaXQMc$OW#Q
zIfv&mSQv5$MZsXhP)G8XMG$N5?&cdwVJ}%!ynXJ32kACB-MCs)pDDGoH5DLIPg-&t
zL!Dv?hiU>5yd+?g;_FS
zm&_Oq;=Ur#7f^V^!T(c=Mpezv%M%bmS&OS-F#_B+YLD5w=7qi_
zVe@T?IB3tC^qQJN`+3V>2%*M6CEOFG{2;wi>mzCl=~iv%q8XCtimZ7YU`y#wK6l`9
zKPp^F>%QbV{0|q(gy|%pNgRVu&d=RtLrdw)^#QUgSsE-
zJA@2=toZ8wY+zs@U6frscj5_B7mcLy~WSGY;uVSIB!FRP#LL(TedGPGue6vQd*f9AI{y4^-L1w#nSFM@y9
z+dr_F!);{prk))5Jl<-#CORsP)+Z7<3VaZ&q+(~{WSC6FfpFULHotdT#?a|w@;zR^
zuo{ogr0GynigIga_CGJuTK{4EXzpzH_~-s=*O=*7?Fi|;BM3flEoNwktsp;tapkyg
zxR%ypsUPg@Nh_p=lO!O_FzLNQnWcnl#y1?9>{eO9XbaxF!0$(roMr^l3n&rU6W-go
z*zWYrU@lDm=BF{tsTx`CAxQPcEMI>DM4PRbEqUlP
zNs0|Ke!BV-iNAHXAlNaQON{3oKObZ}%O%Z7r;3h4?QdbJq1k-(-YMU{wkdCtnVBCi
zgkP`ot@(;CUI!SNZ}Q!EJ$o`$W~Tk4PB1~Lwc4da!X+|B-mG;O!ZsL-tY|7%Qk
zc+6U4^=Q2NxOWRWoNGjf&^{W!sGle4x`U0&+OLPSC)O9
zrn<@|0>lmggVi_1(M+7VfjOHS()j-@LY8~HDNwjX>Ms^5#FnS5ijk1C&phv1=o0=>
z8|%m+hlL&l|NKAis!dF|x
z(|TjBEqM2czX3;KCjEWWBdib3nRuA@fU+T6+WXW>wOyfH&IjnP?*7r^02)g
zJopz2ev~W>H4LST|K#_}!wxdk6XD@-27k=h&CFr7;gkrQQkl)6{BL6C>hc-Iu#_>3
z@-}a!n~slL7}wJC(v2mEc>#mucwD(2#vc^0-b&PZb_!+Rtv3#s7PGZ%9pd2R8W@i!
z{BmTb<7P~eBRIb7DL0F$Z0E^8efd*6pSl%=9`oTj&*wOH#t()F7E_;;3Eo=l<_b3;
zm{|DO-H1p9RdLaQ5AuVF2#!*=P~cpI1)05)A`sYw5OdFLccFQqc=WuFmBkNaK8(=q
zZL@5<)^qC4a0Acsx_aXKBH0ODqqTzgEk+t_IwMYEc|Nx8@r{j9QDnw2R5E-}wPF9A8){5sjKT$%a#a>&0^>uRwUu$bSBiGXAbZu%mK!SirT!s-L0_W!o
zwu(RCx$QsO)Z|#M$!or2gj0NW{{{ePd7vpmgNR<6J!2mzpIPmV^?Z;AgkS~#a6)>MRi3MC
z4fj3D@76gIvfL#IJ02AlVHY2)neXUnXmouHMcX?Iu1;<-#~T$T^~h9C1wf{4HU6tU
zvSQIBHEgMY|Csi~iB0^plf-6Vz@HN5Y;G(y_5T+JMpu7Vj4$p3rc6n7MB({#G=+L%
zf{Lkk7?eceY(Bk4DHdR2_NJBKay(uNM87{K6V1>6B~CpE|8}s*Cpuj+K-u^C*y&@q
zk0F~+=ooBO$;4OM?vFyz6PZluJwL1+cg!Z{>Bd1*^?HVh`3CDxt4%Dsh!p|C#?v29
zP()9_k9g$48J`KOuMC0QTcP@{av_`$LyVc2H@l1Dr*plZ}E{o66
zo;m|njKtq9g!%OE-@p9l|Gv+-b8d+66L)qKClSx|Geu{*VQ7DRrJw-B%&r|R%T>Fj
zFFr1^>2=R+AWLXKjgC>GY>c?>Zqn!OQDJ6nonxey`4;jD~p(KD!Ly6&D
zekVDxBwyIcv|5@jgB=uZ(XTXi>+1Oka(LWxk%KYY&jtp|nC!lo$iDn~F=}6PG^{vM
zIJkLnX*^Ua!T`kY%0!`*x!s=&ZNC4Re{GRwxf%I8wUc#iStUTjXlr0%xlUduu~HH&
z)xu7p-?3}x(Cl)+_wO5tCXB}-Z3zKRD|zVQBw~jv68|*jfPtQ93BAsapMQS^dkqHub+tehgo(8z+AJh$5Ld
zxXP2rJy&7EyNc$g>>3DG
z(6TeI_maU&1uf?56D?xYu)hB3cGuu7xVCxaKAofxZM|Y(VH*jJj1&RZ_kd{TUz8%Uk2#GUhFk
zkU|N2BxC(19RX{af){a7y}lIO(eL+LPhy
zt;9Og^KQ>!XmxeuJ#?-PIM@rkl
z)2tOUdyb!i)VxjvCHt7d>$(8o73?8(Xi`_|?kzK$CA$6Giag8hmqPkuEI6FG=4
zB+=L_T}8(h&n~=+e?Nk3f-XnQ4`adjIJl~7oZb_QnEd;{yv0hZIm7NSG4l@oJYz#&
zg_hf*j=bgv1CM<@3s(+G$&{D%BWI5k-w7q5FUIP(Wm4ZL0$o6sHnI+oi;D}ic!?YK
zz)WeZz%4g~Wa#`qCn7RYOq%P+TUvDqX_cyM_N^c#T-wYAlp4IPkEfmuKcZu7pL+d>JeCV23>#|7oWJ*hqE267U{gMb?2r6zz
za^PMAVI
z!BlC1+xWH8R9^hA@SVvrWw
z^367spWja$6#(2WRXiQ#|1pBJySkVYvS-wiQs`Gc-1XChDkd0EFP+#{
z?mYsrE|1k&`Qd6~wUW~Rf_Q=b+0Sv7c%0*Q@3
zBGR|)(+%8vKHgcw(
zz8cDSu*uYkMkdAv0np>vg`P6BQe?+ip|MXavtcn$o180A-V(P*HFQh1ydWsdw{kd5
zXlf%OURxPf(KuhU2SjWRKZWk^me$g%GvL!_df(-RbVjeUE)}Bc;!*HjeFk*vHWuD1
z{R{QSrVZbUNu<}gGhgwDfun}H-QruY(XZP9_E?O`O;yd8(-#rxUca9kEsC{j5mgQN
zrAc@xi^ulPSY*E1$;Q{qV!SSk=T;Vk2-
z4GSG3FIGtpK}xq>uJoz0#q(ob&r;o#R{r|{AvX4P*aATa9UWdGDBrBHQmb1l0%H2<
zv$?wbMUh7Ege?g?*0i0YuA{Y@uAIY@-(pHh%1?q*A#EeK-%^l5hjh@cr4Gh$MrO40
z82lZp;MLw8suNemt<3X%m^jS;+~V&Uh_6Qh9=+~AsUskUYIESG)^$E>W(Coxui_Z#u@?17^J0zng2@D~o$4t*y!6=#LEWOI3(*KbZY$sF^dE
z@o3~1>L})JKq;$Z;p(&qNSxg8%A5(vrLUB`;0oVBFFp_mj&kdOBl6MhSojErEN
z@!AkK$zjUf&Y6%ACAYI~*F~(Uee2e4+>g`eDarQHqynO7kfntoB%ew{&ov4`SQ6Ss
z>x&MJl>~LC{3w*L=n0(4D>tdv|E~vr^$g=xTT61h51iEo*_shIRy(d#R@bdwR6%+y
z_0w`eMj}p|QeV%?9x~uqpl-Z7c4%}Q=f0o}0Na`^QX`t0lO3dxtjg_3kh?HFZfhlA
zFt7H`A@-YJP<1*N$nuOe48R1n22vhZqLo=K>XyM`fi6G(vyPYeCLWEv-yQ7d;Bi;C
zU@A0kc*
zb*q2(;>Er64;AQ;<~ss8i~kf0Ch@-n5dMO`X?`+LU(oRRUD}YPM)4yMW(@#
zv{%UsS57%zozie=KWLm%wQApSezNsen%zBvKhhE+U^7}~(~d;00~Y@auAw0r$zXAy
zj!K9@m4d~j!61CN=#Oh;n=zf{_{#CY(vjvQkkcB%7Dhll#>A4V)5Kc3WFlm?Ub{90
z!;+`2+l&`KFz$rmmyyJz|U9iVHxES1O?%QA?B4N)N(G>tqn7=0N|
zI;g0a%0vKdJKGq`02Y}c+@vYvi;$oRGvVi82Uz=@onO8-_frQrM$;T)hc*)gt;l`1w$
zG1u02a1#keTQfo4!(};-%Z7Ni@8;S>BR8t
zT*Zf~8)lwx)+EIn!9*prQmtjPL^taXkEd6EOJj@yAmRChP275(0F`PfX`b%yI0_w;
ztwf1lWqlFN1kLyGvZJ$44h@r{BMZEmwDP$$<7&7JVM($$>TkKCK=vpHP?!+c|w}?xC3&F&|z@34!MnEjo
zE5pQ48^o71)&42wbgAAieb^v)1w!FQg;=ZSGuM6@aC;La?8Q7A8X7cQ36+tp)59xg@H@^Xj6*Pw*r>Zd
zi9U(Cre4tIp+*S#>7zRf$a=&%<8qNL*2epDPgKj(#tw49e24?xI)TfL?h1=k(8Si3
zE*ZJTNUveNbvW;Zl#iCAsif8khWuNfdSuJ(BnAv(oYPD2JmaF8zTx-oO9^h0l-2~%
zFE8uCEwN{=kDe7fw$YWekEv4M|LI^GGReo7*mL#Ro<3zFCe-uRrr*C-7XBh45E?ci
zVDaDI-~wljEJFm;K567xTUoaKCN!jJh-TU*;fPnQPVIyydb6olp=!!^f~{3e?vKLI&uq3MnL
z3bnj8M@4pic2#>Tq@F=ug{`j%5!J54sJc{5rrIdV6M%LV+LTI)o8t`HFr}xEG!UanpQuhoBW*aU
zN9MGNEB?0m$Ze)sjs
z*jrkm*;?D9So0A7sP0vF{5;dlwPo7>ddGRvO?!UsOC3HFV46oCZJdFnUTqu+kt9{P
zB?O$lrG2sQZ9#GRQ
zbWeY-G4Lq$?<%m>t|}jyoc&_WMSPS>vIMi;qU9NfFLR}l$|yEhIZPm4Y^HP=@oKlr$$wvlpxL_C&vCw
zLWv$NJFj2bZ=sr|C0|Kln;OE;K(nu@Y2YI6A?5LL?y)f>*};EH%Z;1#({D*cPYLt%
zt5h*kCeokpog(sOm)Qy9Hz+he|#F5QSQfb5FNMXOukg$e+TB|8d6HjPEO&Mp+i|Uz~{C2y+8HZ_JUW&5SCs5Sqfp8`Dpy_
zbl$khk0^CVG5H@MzetbUZOg#$7iCjB`$ga9@neTOf|877gjy0pr)z6#
zKcI$)2wA(mQIWm%6v{o83o@u(9bDf5YNcpMKe){Q>ETz>G1lHwkMevW=zL?e(qvz4
zkmXLKdo16=TZ3=6Q#KhNUS7$tjpktQ$A0|u&_B&4y5QVIBYz?qzzf_RxisGxeXAHU
z+ui#kZr?)O=`5*eGrYw_9vZZjFuMlwh~?|>{78#bM2@_#UcZLWqHOo_o<=FjJf!7|
z5_T&Q^6>bV`PYZo3MoyUjKlrC4xG*t!SqvahqgIG+&)z%xJrV~#nSF$DJriY$!rH@
zD{fC9#~411)ea3BUs4f-T{nDK;9`(2#=iYhhAw(e+l6@fvL|tkZ230xmGY_PBlcKzHvsZfe?*fjI
ztILe$TGH*IvGGs4QU`uEOEAs}I44gqy}T>+?2aY?d~CKWD{MZ-2DR6%v3X9f+~9%A
zUau|+{HH3LX`b87t#s2w&$T}dTdrQrxF>&lecqvh5R7*8zgk*bKS&xG8Lg4;9MW{PqfYGwY_2WL|IDRz-q4=vD3$^?Ip8(@oEg@x_*-GfSiiBbA|8%
zFZ{Hn=2Hra&83r@V#_$tQq>zaxH!AXB-r;;s3SC}(8mt?^bvNnB_lihii_h`jQP!+
z=6Bkp9rHW00CqH)ejTp`6cd<#*{!xNY_u=&Y0QpQVSk{lltpf`E2GmL#Aw{OJd%o6
z*ik0@4ztA8qm#Wk6)uv9+x92V0Pu2BN{aq^_09{Ne9Se$=<8*s$*#@R)Rbzo-Sk}E
zA^PrEre7Wy<;U&u!bhvKmz0&GoK6?)g6CTg1c=OnKNZbrTF(|+%KD5KfppP%F3%BD
z%^jJ`+rtAtg}lphSUygsK=w%m#x;T1xOE*Hz+Y`KmO*h$E4OO~*K&|~zMk08UW+u#
ziDz%zEEU7Fy?T7pTXfe
zm_c&L9(+G0zd?c5@!U*@O^kvz$Z6qMKk>KNzd{x;390dse-u;(Na6?dpk)DS-Cd
z4s>plu5w4=u=5$r4n~YlO5&Hs4q{7QfUpzUyT{p|l;7y1dW_@3G*&!*ml^I1dl{2G|Y&
z54+ZiKD(|UZ^URlVU4%!6ZFZz-@d9w4d$8yK(dlH->2C1(61eamAcG7R=sZDeA>7O
zU}~06crQOWcH`yK#COR)P9z5cmuWw8Lkj?GoM%`Fk7ew$bxAEbxIu)8o$KexhahTE
z^B#ym1ADB?PJp45OZbnW*#vj+-O-(~k1BQ87j~RFs2Bnj5?)9Mpb=cCxRer+c;M3f
zVWCR^n+O|}B=8lYrlvOj14sY?ICgT1ijO~XuWev14YdAg#mCsk>P>a~cy3j7`xVPU
za~|Itr`geq$#2inRa-nOc~xPv)N4=IEa}B%?XHJ6BD~Ca$?QC^LFTqdUG0s%`X@6X
zihHo~@Z2=E+_3-G9||U>FPcUB6QHtaTQ4f8@VJ<92l>@&vyzNkRj>D}Mg%W7xxY(8
z2ffPF^yUy;_wm#3)Hf`D7VZVU+QqQA9`4KEB2}{p$bNMtM!q#1b)+O9+9C%q5wj*N
zA?#Q909bx9UBB#>6d2ogY4)+#96*dZ18sOE+@AEv0DKl^X7e}W&8%My!SdZ5%TB5q
z-@p`W?Jojox8yaCuv`P7)3y?FmGUw(vL#~-F}KF^bEUwlx}2@Hg!+U83OAoej|cxY
zotEnz(dWy&4uzNao=Y5c*$PaMN=v|+kl)MG^zYxlNe#*p(bN5@pl;;T2QEL}t#Ff6
zeuoy76LIs_Q`z-I&9_)#E$Y8RmefHm9)g9jjMgJYc*74g?Y=$>118|>0{9kHj!xbI
zI`Z-l{_yyouF~=5Ez6~W*~MAxEnI3>yCdj`mCLIlkPJ5YNge$%UPV~0hjF!8=p6jn
z4Kh*;z*@
zVNqD%iL4Wrgu?+w$eKEs6JU^2rb?uV>DTJWZxV*q)q-0Lwc4H_gqq#Qnpb
zFss3XXv3^V6g2?5e>jTkDhs>!ZZy
zER;^xiZgw8e5ifYn1Ik<*WUAAJ>lPjux12fc`MH4=mLKT#A=skvD1B+ToN=fA%aWY
z+*NMXR&x<5rv>H|W8&&fxweR?f9LF`Q<_3+TH1&d~CW@|ZJ$DoyrL@n$f1c>k1@EW7~TfdV~cOw)G
zUAWe^s}mF8=Q~9`EZdR!+E>4W%K9ch8trm5BD%4Z)3_f2csq#Rvh+u_}&30ZzfMKhe41>(S`Tb0#df>d7aJ(<@Km3r;!&V
zeUK}dvNPNL6tZvc&|cHQZh{C@Qv=-{6s^|{s$Shszlme9nBe17MxH5ze;qly2kbA`
zmVqaS_)nV0Kcx{qDpt%nz*j;ha->=7^a-h88g<3V13Q7C=|4zi>kXgO_OD$3hSj#|
zA_fPon*!$%?W;fKixwZ~q3#sMAAwCa?_Vp$3B`Tfrh(5F++6MleK7aC^8WpM`~I~y
zHJFr${nzdOUZ-)IQP1zC^7ixGp1=tl#|9{Wq73=h6P<1Ao%9)_auE
zC|s+=zJ%|weY}B+t6@tA^N1kW@bpr@t}$WRB0Jh)Mdib_`qSR{&57P#dX`P+NQa-+
z>N2;$xnwjQYWX5z{&4}E$PR7C(M&pB{b!Gj
zM9IV+kB3eDj6BZxGHNT@gx^OYWXlpVmeEOiezcitHEJym2WCaWAjkWH@iFy|Mi^cqMs8D7)MJ~aVU`m{Zocxre}4dxk7cvMAsK
ze~Wr9UeAYa6-#zYcts@G^QImZliGMKL+8kj#egI2@@KeCEY_4G32STXFzu3OGALH4
z<#;^+UyOde%jZyxB8-cs?`7QWb4o^c@SXImxoJ4rk~eTJNu_4D=6A=Voc=^Pc{}ij3FfN`
zLiTMOItn^Cvzo=QMmp{)3kaG8zut_93Mm8;i{uTBipC9?s7i6hbyV#IeuDe98+qvh
zU0PhsIKLEnV1X}2JfBU>M39(_PrT*7qOLM~U(D=gHKy9Y{%SE&exqWitfHXMO!@x(
zK$%`aX(@A*J0aU!q&UF9KUvyhN=8cNEo0muIaa7{>8y4rt*VSi9NfS4$T-&(%>4r8
z)ciP_14H?k$vXX$m#*!Z>;?>dIP70jIMUWCGo^?dTN#sx3|bqD2UmB!XbLf$evf@k~Is7j58(bBc7rhn82w8=ZENK{23VismdQ_u8
zNEIjnFwK_jJG0Z#(&oMCR8K6jvh;bo3a)hBisJSumC@|-rF)u2E8KvR&VnrZ;ZL4+A`Oq$
z+OESC*}AOOGRT?=TU)<1fKd`*{!<554?!Fo7qAU#$=F3=50nCk$c)}inG^1uuCyq^
zx$J!_9`bh?u=XJqGgM`x86QtfpnsKGPi#{MBl+^Zjt+^^be-xaYhwpd)aswi!C0ND
zoU-!Bz~gEQBF|O_95r}u-b2%f
zZ5oHqozw}(+TY_yVG>4EnD4g15Z6z?Y}Qm9K*kM}1tOUIo-cC^-)*^2L!)lI+E(z)
zSiYQpf@PM__4cX*m7WJ0>U5|>aMLb{8M@9#wTq2Sv0~M%6sBa*J2>w3Yvzea;AK7M
zK)h=m2LS&?{F>M%tgf!^<#IA92dp}oSzgRn*=3yu9!(?@06<2Ex0XQX&_pD9KX1(q
zHWV*|fq{z;wrs|?czE#y#H8+&Q+bsS?ycJ@iIqTr{IWEV%I823y5FLb=m(>9D_)S%
zs1FZVfGpXHMVdX_qNkPKWkc^%SWm0JG?nn_FK660@K6}!gQzCiue2fL!~_Jp2lM8H
z!hs3^xa-tj1@clql}G-3&YYJ=l@!zBxllN&qgmyF+et2~D(rC(#sZw&ipdA^kVKLI
zlarJBU%q^?M>^+hZkDCE#$bhmlA*5KxSY524D*cYrjiNy;1NBNEuT_BxBm?AhW<+g
z-Zhi{62r<#Esv>TcpFyp!H3sjmHE)6xj)3R=jr|mS$ZAag4hgHNkJ}OF*k>&{=K9x
zBqX$Qu#vmf5i=-(3j@KePq!St6Zmxb2EgoN9u`uh5S)kShS
z3|_d17s*SC0J7z;M{0kM=aZLE<*MArtgC)jyFc%=WUP)F5>Ai$67){SZvPe?f0)z{
z%`4Zpra*RqusitF_h(@P@F(=WA%Qz?EdX!o$jL|b9PqpyVktA}&OWg#GdbL-mj?hX
zS$e$~-&`Y<7js8`AO%{PQIoExT8xdyaNV6!_vHZJQ42K`upBE5?vynEQSWu}w&LXE
zbOzqGnEI()Uvtk}iK85=0TzAm9i2@Vox`%C@*j>y4Qcg^k<>g_B_nL1r!{}gaw+s1
zH>*V1be*1t5A72Ld^>I{bg8k>fvcJ
z<`x_h0M}UYy!sq|=0Mvw1(bqq-y$e@SWbk6Q|Nn~J;cj*SRGi(7EHB`4ciDB#nKG0
z0rW&~VUffYQ@=6avx&M-&GMUWd<>Ls5LUR?0}o~F--Q_&-uLAN4O|xoE9puNqPGX(
zl1pbi&VOVBBIt!(4#IY@m>V0GxR7A97T|a0{Ss_Eu;>uHSKDgu@TrVt
ze=|TJn9*ZO6cq>;dsG7(oDZfEjG
zv*j(KENV7Z)tB#G6*%dn7%h@sUJp1B-$FiKB=rBHXm_V8!BQ@@e7p#$|EN^PW{?Xq
z`Ed>hYYvHoF;Q~KU(bV$TtCAGHTqcRy0JwFC36u>|8xX*V!(MDBg5W-1YCk+r&hr0
z*B)YYguaM*bp>KXzQV9Q9Yzx6y`(@f7?ssE5LmxAE@i~0{ajHowBD~;F>jpm*k3xC
zCghWjCHnKC0Wgx9VJ@Yv)Cn|ryqKyGaM}zS{BP@J(kpWDN6?FJEbAm}PbjU6w62TU
zXBTrpQ)hEn0dTT&va_&rvvBfia&QQ8@CtIUGqH0Dva^R=jll99{#OM%2Qw>(=l@;d
zzTEW`R)P4x9zHriT--l9n*;9d?yOe!HeXFYJDRgPI9sHi3X{Noq~oQj>!R`59qj1r
z0I{+)2fKJWnuDzzT}%PMBW>#v1I0<3fniW}Xjpzn1AwPSXEjB~qsCK=eG88VmV$Ek
vn88!mXo834r~md2_rB{z9)ikcDX;>Egg7pj5t
diff --git a/docs/assets/favicons/android-chrome-512x512.png b/docs/assets/favicons/android-chrome-512x512.png
deleted file mode 100644
index 5277bb95b7d8da0b72108f91261e628d05a79c7a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 42474
zcmYhj1z1&G&^Ej|99rNY-5p8`NOvnKARy8$-3^CM0RaI?K@p_8+0004hgaDZ6;I}jHU;n^w
zP-|&bX#l87z_~F+1OH8DuJlS30DM^h03HSa55EH60RRsk0Qh4903zuCK;tSJT#
zpqsr^lmqS`{(NpLOa?!}a#qrJ0|4@84__!1Bn2P94>8=8Rpl`@p%geUoHr&tf}lh|
zSx#Epdmg#u{iy_O~BiKU-)Uy~Z#hAWUcCbF=bk&mFz?VQz98b#vtN$`QWE
z+6Llyd&tcH=P%`|FRdo|NHQ{Wj>IR`s3xV7#rghry7JQK1Xy!bJUx1J>zVAQ%ECI=
z8!BI?AeS9uTz`8$@mbGX_I8t*2Zt#F>FO`kGv=^Y83D>U6l
zhJaHc4f|YYEyR>cbgXP-IX?P71Mr6dWY-ZbP|rtY1?*h47Kar2gahVr*)$aplR(Cb
z>LWuSt;MyJ?)W*mLy6YoSH70L!(`^|Q60>@9mgFL2y2Cq@{q~1pXU?#yww|4alFRe
zSimV|VG6pZd~v6gk7&uoXfm~^dE6C+8j!w{F6{Qr5OBghv5b!S<}l38{jVN*3C=$a
zoc~RXTFhVqN;?w_D|~shf}>U0^9EcsyZ2+dQ+7F~laiQtNV?cpLQG#P)Ag(sYkhxn>CON3-z&~*X!G<3IdHenfwnlAF
zCo=P)g@@1kxgOp3e0qu6!VnVXEm)DiLoyd&7RT%Ku&qwuwzgxeiXMp2VzvIto^_pc
zty+B2;smb4Rt#JsNw!ZULYg3qlA%PwaWU}BCI#8f+ml}C0*<}bD>Ow#*QJ<6JL3#(
z;%2Y#45~)nfupPsqtip5`1YBO>M_*BDb*aV4+ipy<^n9@c-0>aS0HcCG2oGNk~ekA
zCtZE-CZxnO@UaJ-&UbA#%>ggO-TyfQhsa{KzQiT<9x^vUa5IbvWnesU69_H=`nx1u
z%`;acqa01oAaFMfAC{?(`Pbu71%D;Z`>|1;`7>!FWusc;9Vl1yLGJSL1VXfJ>{mEX
zM)gI?{wKPY(Kz1cZ?k|(I31v_iY_*#qAGwKD4A{1_RJ+Ww-*9MqI9zSx)1exf!YFB
zkYUT+FXp&xM+Wls%xZuOgvj_#47~ZR`oE
zwmRrOFd2CVK4SvT0uo{U0yXy&P`(#CAu+F2G`PU=qix`yeg?<0Wb?`I^6~j@N$C
zvZ(60$HRz{IzYnpR>*aCqM)jJ!({o?vokU}N2CG#(}F
z#N6DKQqjNGlM@p(>vD8LJ2EZDWnK7=C*4irZz*Pp8QoVWL36WX>Oqj1TQiBH0Km`B
ziyU2}cK@
z%@_M!@9~>XZ;Uu_{S_eVEt(PKqh2%nG|Zx)9MMmsOaM?BaDDEF;vYDXpg^!gpE>0z
zBrb3pVL6ye4&qeAVRQ6g8SLIqO&yW(H=I@sIr6+!kK!^eDzRMjQIn5l_@rfT7nwQh
zr8WeRibNzpLWE9B}-Ru^8FL3Am0+34YvbdtH4(N
zN<&XU^=ITytG#rHIg_a|&Erto(*Qa_!3KrMc8XicAK6MFMy2J&T(x=}>?lW2c1dRF
zdC-1jm~pG&S!XPH3NNx_@a*fSvaS};g9%upB<6H9E8lq1fnMl_1pxLd?YE4u9Eo9i
z>(I)PB&)fc)Kt&!Nbk8-0%vEqv7uy%&D#8MrXc>cOM;paH!c!88Ma>cfQ`|8tSdor
zRjaEtf}hhH(+yCN5VbbDeQ>*rtw7Oiq&a
z$7g4MT3!giga>BGzJAX$-F7-!JuGX4QtiJk$BwyYdEp@yR-#ID{6F9;YZ`|}n;R67
zlamq1iRBxR$h`m!mi)c7b?|{&l5*A{oH7aViYrd$5PcuFwk`3XDD2z^vp
z^|dd$r3~qck&x+m=UQ$IZ_nF}8b*M16WOPa(`7;kcY-H6Dc6)5w0iS8jjVscoDKSB
z4t4%OL2x&I9l4x9^@0*7Y0E;|(bhy)g(vxoVR
zV%&!p#!EtV!+^rZ!GR1$JO!rd&s~^z-N($TS{p6;lb|4I_hRNXrT|o;WG`i|&$yR`
zFGr#}>%U+R|L1K$)V4Pm)`lo=wpfxgGYz0!Wj}<%K^S&d<*w7?;QsdQ+etTjKfkL3
zbQKCA`QthH&7(ztG{Fm(H*e-;2U9s?KP*+45Wg!76}o)^uOLh>Bs(iRJPZudU=(KZuVz8m
zHa{s3n{4&5p1Z56HV3zkrQ-!Ct+;pwrO5q969crHB6I3>Qch~lhl~u7o$Wz;Z!XoQ
zT2iSin32emsfJ*O?wL_i3AYCB$UWfPcW}BoW+p#%;`#9~n_Kj8kKXEW19Y`}x^rgr
z($Uosruey|Nai=qbZ
zWH=mwX#mh$k4FN#XgbY;Quz4etTU!+4_0uuUz*h*1JO|_hU5@hSaCB-EA@`|k=8Bl
zjZR>cm4{;aI_c`HRs1J~D)18kNR6Cl`OzJPW2j|g1{cmR%;TSqgyyhDNI;xrTF1_~
zr-=i3u2nERcRx_BmJ|e!st|`+gM2B+NOAAdDT(*FePAZAI=fjlb!$(JX8=>qQ6VIx5q0+qOr2Wn1&no<{J{PMHzx+Kc}Pb{0S)q
z(mPhV$M6jUj0(uu@1Is_@I+hX8voRcjAo5W3Sijz58}oshix^-h&O{wF<#lGJJBX4goPiri#bok~5@^jR)+KXM-S#xnha?R=QMx
z(es~X7a(TDi0=~<6C{{XR6upf)g1j%ai?S7Y-&fD+PTNEr4zAZDUgWlWKqJr`Byy0
zo+Ex7YWPw9p7`@i%Znx1KkjTR`dMP^i8LNOJ&SCs3IJeoeZJp9A5rH~*^(~R*lFud
zqx$ltpNP14_KX95-##IVI&;*~nL#-1&G}ba=pyK5-Rxt6+d3phT%xd^bSLaSC;+&+
zx#fEPnC?7y%thx&pZx-yA~
zrJW`thm@n)uZ^4UMd-CW@7tt-Od?eS;h^;!&j$zC#MvYOeOgUz=xA2(VetyocgQ4QG
z%14PIzqzSHd?)ol1$;u7Q4sOeqQ&7{fzbORl%VIBdtm5o>m>|cmFk*&iGuNKyOL%4
zfgu`WPcKTO?z^!QsYxGD
zi~Cu)+Ki{<+n=fr=8r>nTmYbzV!mKm$ZbodgxX%hK;z|l?C`$BeiN`Y7;lOB
z97}#NCpnq0a%yRMe~Cv;GvzJ08;Tkawz;bRuXL9f%nX!gKniZ?#z{(8iq+f)o}O05
z9ne=Q^*FSoW^w6Wd2-0sVnKoihKH9JMPcgRg(e#uhIBaa+7M-hDZOMEuT>UiF%$6f
z>qLzF#@4|6%TV4edFcm$_I>xygK39&&gBs*iuX&+kD@g-HK+#>x99Ee2bFt!0TpmH
zZ0{UoEc|7h-$Os^kT$xyOk{CZqngI~ydDE<4T-6#^{=JgGK$8VPN1}M61fhFCcq=Qw=giv5AH|7uYq&xhG&>O=kZkhisBO?@3Lp&
zr3sWWW#hf!NG0VY85EjBX&RiW(QSpS(tP3-5^#8{s_W3E;Cobx4-CnS+4<;%;}d9V
z1Sy+vB%n#N*uljn-lSx#ao~UQb%cRFABjmwAaqseLr&@)O)yt7
zbreP|c9gZiM9yrLxndzWpFg*H3R52Yia9|`-rftvn~zE%aYSW=09JB*n~
z6ZE~Zw)<=>`F;qDkq?i4OyaqjeUZKZn!#feQp9_lwST<^kgomLc7}z}LV_?BMdMHFNEnPAZn`4DXK9v!SkT;SOS%
zooZQdI=HMrpoGwm;WY)#9gtf0slaTlu?9f$qgr{Hb2e}fHkrT3SMwt_Qpr+
z88;rQ(Ko390On^Wl}j7HC|Oz7&gAZ^_3k3DiDPKC#Wq^Ewc^MQjFrkBueD-dpKm}Aqv_TgF44W@B>
zWvI+Qh5MUW%RPJkw_eU`p(WHw=q=qV*z#xz$7KOh0~B~%vbJxq(&tUXMBzJcM(cl`
zYS3C8#tAw|F++;~13>q+=%=i$et&>3Qh?`;0+!V_pRo=@n5P#
zg{PWtX>-cn`I4Z3B((|mz_<}e?&=k
zP%1@U`f(lb>lHic3++{H8~Hcui|^)wd3xGM4nb^e+~{|NPnv_zU{>D)J>*NWcS%F5I3>n#8`
z^t=ys#9_^rk87s;N>)*-I!r#nHUxQvpXZtQ3Li&1m8V|C1lE|
zsDtY9wGZssweMSiS@Es8Nqy~aCu0qxkWGlkqZQVSk3l=qs-Mt|e-z*rmsF
zdM!G3c>j@iq9|GhI7X$BGh@`gox#85`QgAf9cr;>(g1_$&@HmsZFfH8Z3Sd!RDhO+
zaV()s+}1>usX5Ely{L0vjERQsSEixT6mSDOpVB!>Hne{@R;5~?Id{LUk{!dLXSoqJ
z*HLH?omW+V*^w*NFnG{G`-GHGi%8mJ{ym}OCFlWnC
zoB*qMbn{LolXicL8$QPFcQ8?uAlO7eD;)mFQApax;
z(FVqey|$^Z^hW>(7~nk%;NAwF_qQbUx`~a9*487W%QgpPA^3Ng(g}SB=lyXp
zRs8g>LrnDkEZoNukAoDG_tTy{d4dNf%OsB=Pr)3+U}pJN5eRK-nt^ri;~V?U?8!O^
zigVryLzGw2mPajd{v$v&Q%>NRl6_)@8mGnIeP
z+Sb+6Gc$q
ze!ENa7`E~w+nxs0kenHZJTI}6Ndd!9AJcd5{>;T_c&_RBm^~MRu5!xj91M+&NFbxp
zr+=5?=rDFkup$^*YFM?xUwwdm2!DUyw-{rr&70;}#mbzOV7#_Qy8T51
zRgnn<(zV>9^q>R>K_0?oLr*qqV8hOjehOP*_)+w5oEl8#7n4Fyf;Mp|x4i=g4#Bv1
zY|rR$;)7_G&xCM+J(?I2&jlkG%cE0mHB4VFXd~Z7MjT%%_wTY$@d3PG-E6gOW6%A0
zox}3v@`V=Ds{E+oqpDs(NWRNkZT}Q$-mt!S`2!CG`!Ab&VX)de6aWzcO=MxY(He`u
zA=vN5`7}XyS-BXAUbVM!O!>~7bAU1fWfl$OcFKfDEbHUPsjYazcF;^-VIFh&m$ufx
zCxp0MRT`xQA_n8-Ssq_5uKp^|k#q@cLF$2x8kF1zO;@Z0&_eH!Jz9=B?#)-hw3b9U
z2XwJNPZY;Kr!iG`?lO$I$(=nU1rcpcLknn>L9!6_frDQ&(bHjlRmI8z3WM=-Cmuq@
zPv&EOb^9nL1o0N(0hru{+SM*=D-0%cL(sguN^&D
zO^P4YI}R!i7N8acv)szK7caj8fs8Hcg|EVPs0eu#1WUe=%~dH)Gf3%jsN}S$f12qBV&>HOQOU{u(u2w?%0F92Gi
zCcy2zbJpS>9{9HppU*SrUo6P=EForu{>V93cnJ~H0qq}>?t6{}s>gG4HCT|B7G9fs
za)+}~n&R{kiJH}nAL62Ra#A*hy<(*~rYz&A3AMqJ>tgeH&IL;IkZj=${n0nsycO}g
z(73JSAXDW!F(7!s;zAOWIs_3K9Ubk2=ZUlKh1bp}<3(13;*yF~JNx3K(!Eo!A*&RE
zl(JwP3u>+_qUFvN8n^cJwHTs>8bXe)gDm6t-{r%O786_PYX3kk!cxa-SZQ!L4C;qW
zYUb+!rL+LtkR(JP;I+NA)sEKKet*y$a<4`t(@%^bn={;r3~-BUSO#hM1>Y(cXaK;jD
z?~&N(iIOq0^|(f0h66xR2%eK76v{p!vSx)9rgckaJ$xqlIs**cbj
z7c3aQba{;tWh`#=lLWlz3=UBktqE)X9_jmB(arrfavXH&
z%>R66iH{cBA(FJ@FG1zPvgNJe!Cq!A3CzvX81=kBRfZsFsK0;CuQ_!2>FgyN^o~w+
z7DYqF=4_nIjX&)(IwmB6LnSMq1;&uxplf9>C7lh*bf{Q4Wqo{BnU+~_-aL(qc6iVV
z3)2868K8`DRR7J+3%S@-v+}}Cj%k_e->L@y)~h@LB8Pa1$CMQNvFxO+>LzW}OOh|t
zU(mjGVe5f>U=Ri7Vr0Kb;?XS(4#%WlHV(3If0EewyF2uS2w>Nd=TrgHIN$Mnd2@Af
zDNJcA(Iw0=&$&)KDfd~CZ*>=Sr*c97T`51knYpRFX(`B~PX(kUK~fXs%gCrXC69u2
zI65MEsZURl@N1wQS{meu+4`=M@>%_FrxMXC(!KK_szRF)dtlNMLpTvr>vHXbDWf;j
zYWl0ZSYjO3Aqh4xUGPU^1$vj7&ksrf?*PyC$t}czN7K$8@?!wjEW#J->|%owPax}Z
zt;J6ws
z_6;RfsD3MRD25wNFC@w{rGjvMZhP3!2&}tQA2j8eVl;N8Y{2`
z6;22fEMyuzpPHhI^HCieMG+$ZBpZkp?CR7&DJ()kNTU96DZtZ;0Aluj_#L~l`pZ$h
zY76DfVqx|Zlz&`6ZuaQ-HZpT+cBwJpEjOI3?-3xLtE+RwPjGyjfF^MF!a3&uV0s!(
zJB%Ra`Bq+8wfs4=Nx9ws62g_UGujG*5TjJ;vE6i?$-B#_D!wbjpt%3rbiTZz#Ceg0
zlDpn%cQ8P5^sib9lb&aT(#;fGaIhUZ*4D7-;Q2L@3a>{jx&!Bo@&6*WZ_EDqpVvfpUZhc%&-Wt-CfnO;C2p(T
zCc}=F8d5a{4%DNl{OaNO7`ui7&H3eeSwe0VVC+6+X-9dqI$cMu1yo@?X7T#CMWry6
z^K32+j;pyiOOQSII)L%rdg+sDS@J|_%>*X79(B#It}k#vY6lX1Sg4YI8~k8iBx-=#
z#`MhLl`vGC`^$ebv8I(%cS}PKA|h-y8^$gcmgn9K7IXGlqM`EVRvoPYA@*9P=R)3|82<)xzPHoXu@r4Wj9
zXU5FoT`KGnGpQo2t_1(LXng*f5;Y_
z&tECHJmw{7LZ%@z=qX~sgaGMM^YaZSIGEE40iSE~sF@e=@@n!7J=yG|!eHq_e%Pr-
z?T@}ZRvg5`KvXf&Nj#$;`CKGnFr^XlX2;!jAgrmy64XzN3uHAvF32iO57&$oSScz|
z3;Q;Ko?<~AQnv6^l;XLZ3_-d`kjO}rnXs9{H6p@8<`=VkPh@cny@Ds3#8(5@t;yPD
z6Xk=dMO`2~m<{coqyB8Q)No}_4ptjA+^Lp9ji$m!&05LSc$5tCI=puMRC=$oLZi}^
zzE@#J{ktsku2JT_lu}sd<4?Ra9JrhteJDJ5twBu^!A$Ie0>B4THtl*x_JMlZwJVfB
zHG!h^PZAirX*sb+Ha?8UA!Agu#1)y^U!25pj|iBKUU``fst*2i&0V?i|
z$gFG866b@ji^x#kvN{wh*E<_EZV1+9G|%gfc;$JD*k3)idJTr7s=RfmNtB}>no<)FF;06G
zS#hVI=xdzMUfP#M5j^HQa&t3?-ZP+)h1qAs4=jS&gSJT)@&CvxSWP1~d{52RFA*01
zCWm(QkYOV~(X;>6&>Iobn2Yn%T}o<+{HH@?5~^S-|LFfmfH;&<(JQ5ZaI{Q>|PnSxVC)p
zB1YDeEv^YXog?_b(`kXV=U@Rg0?bDibi+@w71wG{Z-5{{22-X9ZgEmAQk4q@hE*~G
z5-*_%qBTnSD*q@jlxNht-gRH?gDpg)3g~vBal_>31|R!af`3+Kf((OxEz^tXcl+ks{DhN>f6F9AI3^ihu~6}DKIV#WJMAF>oLqwwB^d;XYM-
zn3UtwYLFMtN`bTa0usu*a3Cj{y4SfjMKGUf5B5*Q*D|te(c~sBT4+1wHyI!OvX-hw
zif}Ox7r#|Gvi%<&B{VQ8iGSM|+^tf{ETC}?%#ZH4;V&(Fd8xkc6>+X#p#)nzJbw5G
zhv#WOpZqOD9D$!gMDMW@V&)hdWvd2!bIpR0j|mYubvWQ}U2{S2`i7cqMJH}P;3Hl3
zHpXQOp(s9A(~Vg7d-An|Nv*HKdKakdNnX&*Y&ue5EgMuO1HDJm?gv28cbNJSob$
zEVS?MzQdlh@(6uxs$f4}cvEmbTY8QN;V%1#{8fmI)pzH(2mOShRrCqFXFLgJzOK9ly|AK==p$^%whVO`%e;
z406mk7DlUVKK$>b+|u6KjRqsOuT@2R72@?dE=eYHNzfWyrBAZTK)rUpU&*Ga-x`i{
z3+KASMVL=kS~|~D6)hUZWQ1VvWN?X6ZJ{gF5S*qK(*0d$=84RR43J2EHxG6YJZXe*
zb`n%Ek88q}YgRx4f@5^ka~2}mn!`K)nawF=hqBt-rD6G;CdElI=3A04nEMN2Vd4J_
zIVCk+6D0Y;5B7||lHsg>S>MKNpE*;E?34hDf#I=EJWnoFcbVB|%CuM)@RqSw)c~V~
zwx0&`#ReJ~9+*px5rRV^P2EG%tsuXY3=?py2U=SbstyTd-Zt^r
zp0|MKdOD*C;ep^DvWkHR2K?#eJRKb!OGHNl7AVQtqq_G1Gs}y~r6|nzitjWt+@R-1
znMmjKOt~Hf`rnzh>3+*0^iIb@)Ht;H3Ebz9)3p
zfc-C}g-WotDh@=PVR@bMji&$DcteX4ZD4URsRg=}W~yHp_=j
z!ivI_vE_=8ftQ#VkIvIm!idV-hFjwa;e1N!>a^+<0g&K|{U9#746IuH#91hD?&jvE
z_M`I~yXD4h3h6Tla8cTEBE3IV2BKrsfmIGIOi3Z05_d4BAidtX=d)2E_HSo1?HeI_
z?F(YsBXg$i6M5wtKFi+D5PVjE3+zg{j8zdpQYUHHG-5UqaE7c-tv`MGv|pZeuU@et
zDogOs02oPK(p3ioUNC#$gb+uYKY3E2y7QF)cJ~LD@ePIVGFXjGJhIN#FHW+qEinE^
zZUVnzy&!r2)X@dd!>wpDmGH0k`1C+H6v8?jhOEs^sm)n$l030CLF6M^O3%m74b9
z6UE;LugYm*COxXkT@&o7^e*qJU-sfeopcw4vFT`TSoCrcqR?``$Z@Me3h5nzaT#Vc
zl4Tnc7v~SQ?YB)-<~_Mh=N~oXt{S5*c|y&|I7J${Q*XnCG*wOh?J-UoJsZfQJ;dFCX&UJ99W`A<5m0BjM{kA*sq3fv5Agn%av
z9ITBqDQqWxQp#PXBHMkb2r^z!YGeeEO_xi|jq?bKRG}RU>vAX#?M#Xvka}Q!FsEjj
z+L=EM1sLJRoGLk|g8wU-2khM5>PfXey3iHcLrX->3v74Rc_-7|SCk2ZPob(82n+lo
zd5HC7V62x#jm|Glud~48U>}i|Q?cmih2;rLxY|2KbrQuXBkl{BMz4Y&j2~2d`h?bG
zhiu3lKD>8YpqDwpKKppM$rQbYmkqmU*0;21Rwv{i>J%MljT&n9(piDKO_+yHIA+1A
zVAfD(HN~&vS!(q9W0Dvv86hnT0W08WQl&S7x)uP8=e+wtMG#WMoe^2Y%Uj*DC$RKB
zn{7lSD!%#o15EK{sHQjg)4$?=5h;xP)%w~!E}G1c@*NL;IRf6nSG1w^AFByP!&d_q
znZ(5dNOsS7;VwDvWZ58uT7~qsopN(ae{(iYQ3qV(KUXBj7NAjRMPa$6amxMqxyuuo
zlZ6?TGj7WGv`fVl#ej0d4jP#LUzq!0(rIoZ>Q`Cuy}0l}5a1h)
zqEjQ7w+NyQ{{hC2CXz>k*hH~O#Jr)1VGvk)*<`LT5&r7+gd~LV56U?$psL6oCq!DkL#&
zm|vkE3(v7v3lD?`Q1e(-bg`)ZZ(8y{8XY`4&@8U~yW$uk<{p
z=kj3+dwj%>)?tAsXpW4NlZ%g+v6jWidft1aKHwkGHX1R}^+l*LAlH$H0`~*fxH+-T
zFuvw6O{Vz?uF?m6r!
zD4(0wzUBuBh!479^+`1{RyWY^J5p*-_$fsC40cniZ5Y95iojXsMW^q^VXFZ
z+K!9QieiXMZByYO|MrBfh{a3y$$3DJ24RoNODT65j^+%JwVj$lyy&JhA>UQ!o4#>I
zuY}A*A`Lf47%acGxN`eecV!@n8VAQe3-H#|QJq@e4BNEFe2axZ_Sf4RzUHSYm+vlO
z3sVU1KWHY((==5||Agr#*H?9gqPA>I2QLb5Iq!L&D|WoPb2*Okcc`SU#`1jem@l_)
zXlQd=Z|I8<%29Q3Msf8q)`ldbv@U>oVPVj$CA%>$0)y{_>0uK1tNVw+qNu3fUy?_U
z2~aPoW&<5he3-5uzse_~y3L;n2Uz*pq{!(gi{%t)r^r
z@aokBI*`^GdW`}0gLjH-<-N2>*LyIO{~`j}(1~3(6iv^5d4p-r*vyD!IBJ-Wq7~N`
zSI!Cf~t{$!cQ%Z?@$floI<3&{8!wOTKak*3vDx7=+_VCzX1p!8Z_
z-MTe*R0JQvpCG6dHa%c<=5fxzW!oM7UN>YS?G$xH;`NKBlDynZ$F_Fmm@-QZY1iv&}DO8Pa)g#K
z>}UZw{h3VTl>s)&P|ND|ws=~TL~>+N`U3a{Mm#DZsi~YTQUW
zg2%)Z?k(8oy<}!xMNiBLl3|etscJ&LK7nw_>T~^GV&rUc%Vw7wVR$ZA0563qTM1|6
zH#=T6!|wyW)~Akhyj6%FSn!1J#pUxUDJgP5s^1s!2@n3X=OI}lW`rBSeXDV^j*>Rp
z`lwnMeRmYsvN3|&!^@LdH%-SuS-;sk1gRGx1K8}_%j-G`LV4_Z6wYgbvI3Yl*qobvho|00F
zf%pxyo$0rBC2d9x6%E+PLpT|xMfwF)2u>tf>SRkFPBJ4Prqz}H$vdL5+6JYBO(|*
z#R6BjHi=XHuV=knhR62KRflM6a7D$sX(0dhViOC!ym?!W3DuwL8z$bpR?
z<|c=^Zp{QP=212-^%#|y@B)5RsNY2bIUiS`lgulb5Twalyf>Kqbpl^zd`sUI09%I6
z<36L-jzjK!@$b>l)qoo*RaI3jSJxBKF&AEF>+93S`MJn%>%MY7d!ZhG5fuaw0>&?i
zJbb&eH}D?3#F0}}|Ey-O>w|PGqfnF
z38`5{$#iW*@`|he4F=(u1Y7=;=eD@_BCOD~`~l{8wBO6i4`L|^E}W9bYXJmNg@B5b
zfd`InhA2TARVyVn?&jbX%7$WIVI5_?V+k^G79r!-(N|xXl{rs9Lvv84_)eDC?Ae;q
z)Od0b(Kog?Gxc7A*8TDCuO!=(uRldZpewq&pZO-w@#{zpomefj?Tgz8Yl`y>aa_N;
zq;m5Hl^rL08KvYd;Eu4}##(5PiejjiT$s-Yyn7WX%-{XRz!g6&zo^KeJaRa2;;UA$
z59wQvWt>lk7AGp&&pAMadJ%P`J7wWjiE<
ztho?G<$i*O_D79GfExd6;QzjSk9RJ!{&miEnPndOm+?Y7Q?I|C`DG=yo3!D!8vp9s
zT6{{tn-D=8P(*@`j&49kR=Pdf5w27HOOd>SQiACbiEieEFpZn~&E{UVn2?=Iy|`=%
zybM{{hhl2t>=XXN=TEm|OHl{8BqS9yb#e{=tha!s_j%*(#cE~
z+=JYb;_?AC6_rvLj2-a)o7`AffaCCSI7*cYOBPcXADQs(nMrrpcod~1HmJW!kK^0<
zG$H%*s+Q{d?Od<%EAs%4Q@SsmVe5aAw1TJ@lp35so41-f=Dq)kB?T0Lc#sL=0SuCc
zdh|z-+^+%`H}V~ff-?SS7IQAG%lgv~SsqUX1_nh%>P%Xbje^DY{E9;EDjRF*ktCc^
z)svsYp>gP_PydvxjSgjR?4T8*^or8tyxF*R2n>VkfJzJ3CguswGyI;rhqeP33hJmiAh@Xi1ZIv=v
zU()KIN(ISV=bt`7qyB<5ik@*p_s$TQ3Fto*
zgpVID>x8*t!3mZfSEen0{|V+2;gvMm>>l5-+Y7EMQTJ4mt|%^b72EZluGMd^^GRgT
zPMP|6alxLfh56y{!PY2vC*=lAJ5h?jqx|9$5`k^`Y@|Tch3EA{zzh|ryqJY$!!YFk
z_BZKB{2;RGnI+$V35#H7i%Cj7*YrQKG1GS69NFwAd~Au~7BXieqpbSmEHE_%J4%@J
zt;@2cHxV3{1QcIfUtjMxkn+Uok6Hi$y#JZmj^iJ>A8Qn03XzN)(}jCwmtmFZ&T*O9
zQ1d7(5U@b;G?w=V0gOHB6hS8LUFlWTp(ybVkA5wV$K|vKN^YoTXs9eKFWrE7=ck}G
zC>{J`TH1p3a8BLGyBakN=lVD@{>X@LUp#gk_7%WLTBLB7EJ{ruKa3wGDN4}%?Musd
z!qtEX3!bg*&G1|SKVN-hpHPJZ!b2pWUV^_)5dUn?C$(h6kMlZvXrwbM8BMUA5~Fc_
z-E0`VIx#snB}{^l(RVqk_xN(BfvaL_B^P)0??$fU3x#&~d)jbKt##9Vq`Wak#aR-f
zRh&<8NZoK2Mo#@Ch?Rpun_nCE%pepZV6o6*?9V2uvL)%=mYOgh=zoEPHCGGN9p7G(4F7Z7;Rv=TPMipJWvZ6rT2XS
z)2=xlSD#j@5QP?3n5awt;n0(cRn}0DGi3FLCwNJzU?C-qF2xq!j)Le3?{}*Shsn|q
zJsg+#0QaVlsvT-4A5u`MR*}7#iw0(Jow0UB{@_o4{;x{bN?9sMuG+JHofBjur)LrN
z>jQj9++ciu?)mB=+S>1H-4&nEA+k^RtD+UOvk#YsfFLv&mP|72GM(;uSVS@HFqOF5
zm@(GmWuks;d8w(T(MgEb#>T|qet*j?CI%MG
zQ_p+fXgAX;mc*!gMak;c?t-V6zG%OW`)^sS=in8(Rqd1+sPlocSy%tfBVr=)@bOs?rlTSYi}Bm>~GDtppOOGXJfX#iIByuGw-JaM$^%
zxRcIO5;?ymV!r~Oxx~Oa{)0NR=#m|GnI5#(QbtS9z}!)NWCbJuLLN9;)Cd~L^QSOM
zlK9-@!vWz@eQ&ka$sKP{@6P4(@+EKxgfA
z@>!3FEyHlDUrN869KRr!W=m@a%hL2={^0m
ztfR$ixao)FCGuP9l+@Jc(o#2sh-cu^$OxiqMsnXrjcZoR9w0X)CQWKEK<>j
z;Q`<|CO&Al9YE55V63D~_F#Ry(XY0j{wn}mnJE^uzgjX|ghEdq-4;)=H*gyqzjt>M
zm|dC)Rrhjq{jD(}bxPZQUJmg|i@bXF0PRNdYcJqNP@dYlfkF=6R@*7n*DX_bevlvT*lId$rQWBW4!8>cc6%j1&>4d2ERy}|
zpEWk0`GBys`7fgH%=5Retz|{yt!OGe1-(wbJ#u6SvuQlt^`rjM6aV7OLiBk{+hyot
zLJulWv#S_Efq3J;a_Z^|{8P>>0NN1pNubuG26ncB&&Q18@)xG@xwK>|YbgXu<
z5x)n?<=