Upgrade Guide¶
Upgrading to V5¶
So you have decided to upgrade to v5! Congratulations!!
Phalcon v5 contains a lot of changes in components and interfaces. Upgrading is going to be a time-consuming task, depending on how big and complex your application is. We hope that this document will make your upgrade journey smoother and also offer insight as to why certain changes were made and how they will help the framework in the future.
We will outline the areas that you need to pay attention to and make necessary changes so that your code can run as smoothly as it has been with v4. Although the changes are significant, it is more of a methodical task than a daunting one.
需求¶
PHP 8.0¶
Phalcon v5 supports only PHP 8.0 and above. PHP 8.0 主动支持 has already expired, including security fixes. We will be supporting this version for a while longer, offering developers more time to upgrade their applications.
Since Phalcon 4, we have been following the PHP releases and adjusting Phalcon accordingly to work with those releases.
安装¶
Phalcon can be installed using PECL.
Alternative installation
Download the latest zephir.phar来自点击这里. Add it to a folder that can be accessed by your system.
Clone the repository
编译 Phalcon
You will need to add the following line to your php.ini (in some cases both the CLI and web versions of it)
检查模块
If the above does not work, check the php.ini that your CLI is looking for. If you are using phpinfo() and a web browser to check if Phalcon has been loaded, make sure that your php.ini file that your web server is looking for contains the extension=phalcon.so. You will need to restart your web server after you add the new line in php.ini.
General Notes¶
One of the biggest changes with this release is that we no longer have top-level classes. All top-level classes have been moved into relevant namespaces (except Phalcon\Tag). For instance Phalcon\Loader has been moved to Phalcon\Autoload\Loader. This change was necessary for the future expansion of the project.
Summary
| v4 | v5 | 
|---|---|
Phalcon\Cache |  Phalcon\Cache\Cache |  
Phalcon\Collection |  Phalcon\Support\Collection |  
Phalcon\Config |  Phalcon\Config\Config |  
Phalcon\Container |  Phalcon\Container\Container |  
Phalcon\Crypt |  Phalcon\Encryption\Crypt |  
Phalcon\Debug |  Phalcon\Support\Debug |  
Phalcon\Di |  Phalcon\Di\Di |  
Phalcon\Escaper |  Phalcon\Html\Escaper |  
Phalcon\Exception |  Removed | 
Phalcon\Filter |  Phalcon\Filter\Filter |  
Phalcon\Helper |  Removed in favor of Phalcon\Support\Helper |  
Phalcon\Loader |  Phalcon\Autoload\Loader |  
Phalcon\Logger |  Phalcon\Logger\Logger |  
Phalcon\Kernel |  Removed | 
Phalcon\Registry |  Phalcon\Support\Registry |  
Phalcon\Security |  Phalcon\Encryption\Security |  
Phalcon\Text |  Removed in favor of Phalcon\Support\Helper |  
Phalcon\Url |  Phalcon\Mvc\Url |  
Phalcon\Validation |  Phalcon\Filter\Validation |  
Phalcon\Version |  Phalcon\Support\Version |  
Changes¶
Acl¶
The ACL component has had some methods and components renamed. The functionality remains the same as in previous versions.
- Renamed 
Phalcon\Acl\ComponentAware到Phalcon\Acl\ComponentAwareInterface - Renamed 
Phalcon\Acl\RoleAware到Phalcon\Acl\RoleAwareInterface 
Acl\Adapter\Memory - Acl\Adapter\AdapterInterface¶
 - Added 
getInheritedRoles()to return an array of the inherited roles in the adapter. 
注解¶
应用程序¶
Phalcon\Application\AbstractApplication¶
 - The 
getEventsManager()now returns aPhalcon\Events\ManagerInterface或null 
资源管理¶
The 资源管理 component has had changes to the interface as well and some methods were renamed. The functionality remains the same as in previous versions.
Phalcon\Assets\Asset¶
 getAssetKey()now usessha256to compute the key- Renamed 
getLocal()到isLocal() - Renamed 
setLocal()到setIsLocal() 
Phalcon\Assets\Collection¶
 - The class now uses 
ArrayIterator而不是Iterator - Renamed 
getLocal()到isLocal() - Renamed 
setLocal()到setIsLocal() - Renamed 
getTargetLocal()到getTargetIsLocal() - Renamed 
setTargetLocal()到setTargetIsLocal() - Removed 
getPosition(),current(),key(),next(),rewind(),valid() 
Phalcon\Assets\Inline¶
 getAssetKey()now usessha256to compute the key
Phalcon\Assets\Manager¶
 __construct()requires aPhalcon\Html\TagFactoryas the first parameter
addCss()now requires$localto bebool和$attributesto be an array
public function addCss(
    string $path,
    bool $local = true,
    bool $filter = true,
    array $attributes = [],
    string $version = null,
    bool $autoVersion = false
): Manager
addInlineCss()now requires$filterto bebool和$attributesto be an array
public function addInlineCss(
    string $content,
    bool $filter = true,
    array $attributes = []
): Manager 
addJs()now requires$localto bebool和$attributesto be an array
public function addJs(
    string $path,
    bool $local = true,
    bool $filter = true,
    array $attributes = [],
    string $version = null,
    bool $autoVersion = false
): Manager
addInlineJs()now requires$filterto bebool和$attributesto be an array
public function addInlineJs(
    string $content,
    bool $filter = true,
    array $attributes = []
): Manager 
- Added 
has()method to return if a collection exists 
Autoload¶
The 自动加载加载器 component has been moved from the parent namespace. Some method names have been changed and new functionality introduced.
Phalcon\Autoload\Loader¶
 __construct(bool $isDebug = false)The constructor now accepts a boolean, which allows the loader to collect and store debug information during the discovery and loading process of files, classes, etc. If the variable is set totrue,getDebug()will return an array with all the debugging information during the autoload operation. This mode is only for debugging purposes and must not be used in production environments.
use Phalcon\Autoload\Loader;
use Adapter\Another;
$loader = new Loader(true);
$loader
    ->addNamespace('Base', './Namespaces/Base/')
    ->addNamespace('Adapter', './Namespaces/Adapter/')
    ->addNamespace('Namespaces', './Namespaces/')
;
$loader->autoload(Another::class);
var_dump($loader->getDebug());
// [
//     'Loading: Adapter\Another',
//     'Class: 404: Adapter\Another',
//     'Require: 404: ./Namespaces/Adapter/Another.php',
//     'Require: ./Namespaces/Another.php',
//     'Namespace: Namespaces\Adapter - ./Namespaces/Another.php',
// ];
add*methods have been introduced to help with the setup of the autoloaderaddClass(string $name, string $file): LoaderaddDirectory(string $directory): LoaderaddExtension(string $extension): LoaderaddFile(string $file): LoaderaddNamespace(string $name, string|array $directories, bool $prepend = false): LoadergetCheckedPath()now returns either a string or anull(if not populated yet)getDebug()returns an array of debug information, if the Loader has been instantiated with$isDebug = truegetDirs()has been renamed togetDirectories()getFoundPath()now returns either a string or anull(if not populated yet)registerClasses()has been renamed tosetClasses()registerDirs()has been renamed tosetDirectories()registerExtensions()has been renamed tosetExtensions()setExtensions()now accepts a second parameter (bool$merge) which allows you to merge the data set with what is already set in the LoaderregisterFiles()has been renamed tosetFiles()registerNamespaces()has been renamed tosetNamespaces()
缓存¶
The 缓存 component has been moved to the Cache命名空间下。
Phalcon\Cache\AdapterFactory¶
 - The constructor now requires a 
Phalcon\Storage\SerializerFactoryto be passed as the first parameter - The 
getAdapters()protected method has been renamed togetServices() - A new protected method 
getExceptionClass()was introduced to return the exception class to throw from this factory when necessary 
Phalcon\Cache\CacheFactory¶
 - A new protected method 
getExceptionClass()was introduced to return the exception class to throw from this factory when necessary 
Phalcon\Cache\Cache¶
 - Moved 
Phalcon\Cache到Phalcon\Cache\Cache - The component has been refactored and the dependency to 
PSRhas been removed. 更多 
Phalcon\Cache\CacheInterface¶
 - A new interface has been introduced (
Phalcon\Cache\CacheInterface) to offer more flexibility when extending the cache object. 
Cli¶
集合¶
The 集合 component has been moved to the Support命名空间下。更多
配置¶
The 配置 component has been moved to the Config命名空间下。
Phalcon\Config\Config¶
 - Moved 
Phalcon\Config到Phalcon\Config\Config 
Phalcon\Config\ConfigInterface¶
 - A new interface has been introduced (
Phalcon\Config\ConfigInterface) to offer more flexibility when extending the config object. 
Container¶
The Container component has been removed from the framework. It is in our roadmap to develop a new container that will support auto wiring, as well as providers. Additionally, the container will be designed and implemented in such a way that could be used as a PSR-11 container (with the help of a Proxy class).
Crypt¶
The Crypt component has been moved to the Encryption命名空间下。更多
DataMapper¶
数据库¶
Phalcon\Db\Adapter\Pdo\AbstractPdo¶
 - Changed 
connect(array descriptor = null): bool到connect(array descriptor = []): void - Changed 
execute(string $sqlStatement, $bindParams = null, $bindTypes = null): bool到execute(string $sqlStatement, array $bindParams = [], array $bindTypes = []) -> bool - Changed 
getErrorInfo()到getErrorInfo(): array - Changed 
getInternalHandler(): \PDO到getInternalHandler(): mixed - Changed 
lastInsertId($sequenceName = null): int | bool到lastInsertId(string $name = null) -> string | bool - Changed 
query(string $sqlStatement, $bindParams = null, $bindTypes = null): ResultInterface | bool到query(string $sqlStatement, array $bindParams = [], array $bindTypes = []): ResultInterface | bool 
Phalcon\Db\Adapter\Pdo\Mysql¶
 - Changed bind type for 
Column::TYPE_BIGINTto beColumn::BIND_PARAM_STR - Added bind type for 
Column::TYPE_BINARYto cater toVARBINARY和BINARYfields - Added support for comments
 
Phalcon\Db\Adapter\Pdo\Postgresql¶
 - Changed bind type for 
Column::TYPE_BIGINTto beColumn::BIND_PARAM_STR - Added support for comments
 
Phalcon\Db\Adapter\AbstractAdapter¶
 - Changed property 
connectionId到int - Added property 
realSqlStatementto store the real SQL statement executed - Changed 
delete($table, $whereCondition = null, $placeholders = null, $dataTypes = null): bool到delete($table, string $whereCondition = null, array $placeholders = [], array $dataTypes = []): bool - Changed 
fetchAll(string $sqlQuery, int $fetchMode = Enum::FETCH_ASSOC, $bindParams = null, $bindTypes = null): array到fetchAll(string $sqlQuery, int $fetchMode = Enum::FETCH_ASSOC, array $bindParams = [], array $bindTypes = []): array - Changed 
fetchOne(string $sqlQuery, $fetchMode = Enum::FETCH_ASSOC, $bindParams = null, $bindTypes = null): array到fetchOne(string $sqlQuery, $fetchMode = Enum::FETCH_ASSOC, array $bindParams = [], array $bindTypes = []): array - Changed 
getEventsManager(): ManagerInterface到getEventsManager(): ManagerInterface | null - Added 
getSQLVariables(): arrayto return the SQL variables used - Added 
supportsDefaultValue(): boolto allow checking for adapters that support theDEFAULTkeyword 
Phalcon\Db\Adapter\AdapterInterface¶
 - Changed 
close(): bool到close(): void - Changed 
connect(array $descriptor = null): bool到connect(array $descriptor = []): void - Changed 
delete($table, $whereCondition = null, $placeholders = null, $dataTypes = null): bool到delete($table, string $whereCondition = null, array $placeholders = [], array $dataTypes = []): bool - Changed 
execute(string $sqlStatement, $placeholders = null, $dataTypes = null): bool到execute(string $sqlStatement, array $bindParams = [], array $bindTypes = []): bool - Changed 
fetchAll(string $sqlQuery, int $fetchMode = 2, $placeholders = null): array到fetchAll(string $sqlQuery, int $fetchMode = 2, array $bindParams = [], array $bindTypes = []): array - Changed 
fetchOne(string $sqlQuery, int $fetchMode = 2, $placeholders = null): array;到fetchOne(string $sqlQuery, int $fetchMode = 2, array $bindParams = [], array $bindTypes = []): array - Added 
getDefaultValue(): RawValue - Changed 
getInternalHandler(): \PDO到getInternalHandler(): mixed - Changed 
lastInsertId($sequenceName = null): int | bool到lastInsertId(string $name = null) -> string | bool - Changed 
query(string $sqlStatement, $bindParams = null, $bindTypes = null): ResultInterface | bool到query(string $sqlStatement, array $bindParams = [], array $bindTypes = []): ResultInterface | bool - Added 
supportsDefaultValue(): bool 
Phalcon\Db\Adapter\PdoFactory¶
 - Added 
getExceptionClass()to return the exception class for the factory - Renamed 
getAdapters()到getServices() 
Phalcon\Db\Dialect\*¶
 - Added support for comments
 - Added support for 
SMALLINTfor Postgresql 
Phalcon\Db\Result\ResultPdo¶
 - Renamed 
Phalcon\Db\Result\Pdo到Phalcon\Db\Result\ResultPdo 
Phalcon\Db\Column¶
 - Added support for comments
 - Added 
TYPE_BINARY常量读取特定模型的列映射信息 - Added 
TYPE_VARBINARY常量读取特定模型的列映射信息 - Added 
getComment(): string | null 
Phalcon\Db\DialectInterface¶
 - Changed 
getSqlExpression(array $expression, string $escapeChar = null, $bindCounts = null): string;到getSqlExpression(array $expression, string $escapeChar = null, array $bindCounts = []): string 
Phalcon\Db\Dialect¶
 - Changed 
getColumnList(array $columnList, string $escapeChar = null, $bindCounts = null): string到getColumnList(array $columnList, string $escapeChar = null, array $bindCounts = []): string - Changed 
getSqlColumn($column, string $escapeChar = null, $bindCounts = null): string到getSqlColumn($column, string $escapeChar = null, array $bindCounts = []): string - Changed 
getSqlExpression(array $expression, string $escapeChar = null, $bindCounts = null): string;到getSqlExpression(array $expression, string $escapeChar = null, array $bindCounts = []): string 
Phalcon\Db\Exception¶
 - Changed 
Phalcon\Db\Exceptionto extend\Exception 
Phalcon\Db\Profiler¶
 - Changed 
Phalcon\Db\Profilerto usehrtime()internally to calculate metrics 
Phalcon\Db\ResultInterface¶
 - Changed 
dataSeek(long $number)到dataseek(int $number) 
调试¶
The 调试 component has been moved to the Support命名空间下。更多
Di¶
The Di component has been moved to the Di命名空间下。
Phalcon\Di\Di¶
 - Moved 
Phalcon\Di到Phalcon\Di\Di - The 
tagservice now returns an instance ofPhalcon\Html\TagFactory - The (new) 
helperservice returns an instance ofPhalcon\Support\HelperFactory 
分派器¶
Phalcon\Dispatcher\AbstractDispatcher¶
 - Changed 
getEventsManager(): ManagerInterface到getEventsManager(): ManagerInterface | null 
Phalcon\Dispatcher\Exception¶
 - Changed 
Phalcon\Dispatcher\Exceptionto extend\Exception 
域名¶
加密¶
Phalcon\Encryption\Crypt¶
 - Moved 
Phalcon\Crypt到Phalcon\Encryption\Crypt - Two new constants introduced 
DEFAULT_ALGORITHM = "sha256"和DEFAULT_CIPHER = "aes-256-cfb" - The 
__constructnow setsuseSigningastrue(previouslyfalse) - The 
__constructaccepts a third parameter (nullby default), which is aPhalcon\Encryption\Crypt\PadFactory 
use Phalcon\Encryption\Crypt;
use Phalcon\Encryption\Crypt\PadFactory;
$padFactory = new PadFactory();
$crypt      = new Crypt("aes-256-cfb", true, $padFactory);
If no padFactory is passed, a new one will be created in the component.
Phalcon\Encryption\Crypt::getAvailableHashAlgos()was renamed toPhalcon\Encryption\Crypt::getAvailableHashAlgorithms()Phalcon\Encryption\Crypt::getHashAlgo()was renamed toPhalcon\Encryption\Crypt::getHashAlgorithm()Phalcon\Encryption\Crypt::setHashAlgo()was renamed toPhalcon\Encryption\Crypt::setHashAlgorithm()
Phalcon\Encryption\Crypt\CryptInterface¶
 - Moved 
Phalcon\Crypt\CryptInterface到Phalcon\Encryption\Crypt\CryptInterface - Changed 
Phalcon\Encryption\Crypt\CryptInterface::decryptBase64()to accept astringvariable as thekey - Changed 
Phalcon\Encryption\Crypt\CryptInterface::encryptBase64()to accept astringvariable as thekey - Added 
Phalcon\Encryption\Crypt\CryptInterface::useSigning(bool useSigning) 
Phalcon\Encryption\Crypt\Exception\Exception¶
 - Moved 
Phalcon\Crypt\Exception到Phalcon\Encryption\Crypt\Exception\Exception 
Phalcon\Encryption\Crypt\Exception\Mismatch¶
 - Moved 
Phalcon\Crypt\Mismatch到Phalcon\Encryption\Crypt\Exception\Mismatch 
Phalcon\Encryption\Crypt¶
 - Moved from 
Phalcon\Crypt 
Phalcon\Encryption\PadFactory¶
 - Added 
Phalcon\Encryption\PadFactoryto allow for different padding schemes during encryption and decryption of data 
Phalcon\Encryption\Padding\*¶
 - Added 
Phalcon\Encryption\Padding\PadInterfaceto allow for custom padding classes - Added 
Phalcon\Encryption\Padding\Ansi - Added 
Phalcon\Encryption\Padding\Iso10126 - Added 
Phalcon\Encryption\Padding\IsoIek - Added 
Phalcon\Encryption\Padding\Noop - Added 
Phalcon\Encryption\Padding\Pkcs7 - Added 
Phalcon\Encryption\Padding\Space - Added 
Phalcon\Encryption\Padding\Zero 
转义器¶
The 转义器 component has been moved to the Html命名空间下。更多
事件¶
Phalcon\Events\AbstractEventsAware¶
 - Added abstract 
Phalcon\Events\AbstractEventsAware 
Phalcon\Events\Event¶
 - Changed 
public function __construct(string $type, object $source, $data = null, bool $cancelable = true)到__construct(string $type, $source = null, $data = null, bool $cancelable = true)($sourceis now nullable) 
Phalcon\Events\Exception¶
 - Changed 
Phalcon\Events\Exceptionto extend\Exception 
Phalcon\Events\Manager¶
 - Added 
isValidHandler(): boolto return if the internal handler is valid or not 
异常¶
Phalcon\Exception¶
 The class has been removed.
工厂¶
Phalcon\Factory\AbstractConfigFactory¶
 - Added abstract 
Phalcon\Factory\AbstractConfigFactoryto check configuration elements 
Phalcon\Factory\AbstractFactory¶
 - Changed 
init()to read fromgetServices() 
Phalcon\Factory\Exception¶
 - Changed 
Phalcon\Factory\Exceptionto extend\Exception 
Filter¶
The Filter component has been moved to the Filter命名空间下。
Phalcon\Filter\Filter¶
 - Moved 
Phalcon\Filter到Phalcon\Filter\Filter 
Phalcon\Filter\Exception¶
 - Changed 
Phalcon\Filter\Exceptionto extend\Exception 
Phalcon\Filter\Factory¶
 - Changed 
getAdapters()到getServices() 
Phalcon\Filter\Filter¶
 - Added 
__call()to allow using filter names as methods i.e.$filter->upper($input) 
Phalcon\Filter\Validation¶
 - Added 
getValueByEntity()和getValueByData()for more options to retrieve data 
Phalcon\Filter\Validation\Validator\Exception¶
 - Changed 
Phalcon\Filter\Validation\Validator\Exceptionto extend\Exception 
AbstractValidator.zep¶
 - Added the ability to define 
allowEmptyto any validator (in the parameters) 
Phalcon\Filter\Validation\Exception¶
 - Changed 
Phalcon\Filter\Validation\Exceptionto extend\Exception 
Phalcon\Filter\Validation\ValidationInterface¶
 - Changed 
add(string $field, ValidatorInterface $validator): <ValidationInterface到add($field, ValidatorInterface $validator): <ValidationInterface - Changed 
rule(string $field, ValidatorInterface $validator): <ValidationInterface到rule($field, ValidatorInterface $validator): <ValidationInterface 
Phalcon\Filter\Validation\ValidatorFactory¶
 - Changed 
getAdapters()到getServices() 
Flash¶
Phalcon\Flash\AbstractFlash¶
 - Added the ability to define CSS icon classes (
setCssIconClasses()) - Changed 
getTemplate(string $cssClasses): string到getTemplate(string $cssClasses, string $cssIconClasses): string 
Phalcon\Flash\Exception¶
 - Changed 
Phalcon\Flash\Exceptionto extend\Exception 
Phalcon\Flash\Session¶
 - Added 
SESSION_KEY常量读取特定模型的列映射信息 - Changed 
has($type = null): bool到has(string $type = null): bool - Changed 
message(string $type, string $message): string | null到message(string $type, $message): string | null 
表单¶
Phalcon\Forms\Element\* classes now use the new Phalcon\Html\TagFactory to generate HTML code. As a result, the functionality has changed slightly. The main difference is that a Phalcon\Html\TagFactory has to be set in the form object so that elements can be rendered. If the Phalcon\Html\TagFactory is not set, then the component will search the Di container (Phalcon\Di\DiInterface) for a service with the name tag. If you are using Phalcon\Di\FactoryDefault as your container, then the tag service is already defined for you.
Phalcon\Forms\Element\AbstractElement¶
 - Added 
getTagFactory()to return thePhalcon\Html\TagFactoryobject used internally, as well assetTagFactory(TagFactory $tagFactory): AbstractElementto set it. 
Phalcon\Forms\Element\Check¶
 Phalcon\Forms\Element\Radio¶
 - The classes now use the 
Phalcon\Html\Helper\Input\Checkbox和Phalcon\Html\Helper\Input\Radio。这些类使用checked和unchecked参数来设置每个控件的状态。如果checked参数与$value相同,则控件将被选中。如果存在unchecked参数,并且$value不等于checkedparameter. [more][html-tagfactory] 
辅助函数¶
The 辅助函数 component has been moved to the Support命名空间下。更多
Html¶
Phalcon\Html\Escaper¶
 - Moved 
Phalcon\Escaper到Phalcon\Html\Escaper - Changed the 
flagsproperty that controls the flags forhtmlspecialchars()被设置为11which corresponds toENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401. - Method names changed to be more verbose.
 - Added 
attributes(string input)for escaping HTML attributes (replacesescapeHtmlAttr()) - Added 
css(string $input)for escaping CSS (replacesescapeCss() - Added 
html(string $input = null)for escaping HTML (replacesescapeHtml()) - Added 
js(string $input)for escaping JS (replacesescapeJs()) - Added 
setFlags(int $flags)to set the flagshtmlspecialchars()(replacessetHtmlQuoteType()) - Added 
url(string $input)for escaping URL strings (replacesescapeUrl()) escapeCss()now raises a deprecated warningescapeJs()now raises a deprecated warningescapeHtml()now raises a deprecated warningescapeUrl()now raises a deprecated warningsetHtmlQuoteType()now raises a deprecated warning
Phalcon\Html\Escaper\EscaperInterface¶
 - Moved 
Phalcon\Escaper\EscaperInterface到Phalcon\Html\Escaper\EscaperInterface - Added 
attributes(string input) - Added 
css(string $input) - Added 
html(string $input = null) - Added 
js(string $input) - Added 
setFlags(int $flags) - Added 
url(string $input) - Removed 
escapeCss() - Removed 
escapeJs() - Removed 
escapeHtml() - Removed 
escapeUrl() - Removed 
setHtmlQuoteType() 
Phalcon\Html\Escaper\Exception¶
 - This class has been moved to this namespace 
Phalcon\Escaper. - Changed 
Phalcon\Html\Escaper\Exceptionto extend\Exception 
Phalcon\Html\Helper¶
 - Moved 
Phalcon\Helper到Phalcon\Html\Helper - The component has been refactored and offers more functionality now. [more][html-tagfactory]
 
Phalcon\Html\Link¶
 - The component has been refactored and the dependency to 
PSRhas been removed. [more][html-link] 
Phalcon\Html\TagFactory¶
 - Added 
__call(string $name, array $arguments)to allow calling helper objects as methods. [more][html-tagfactory] - Added 
has(string $name) -> boolAddedset(string $name, mixed $method): void - The 
getAdapters()protected method has been renamed togetServices() - A new protected method 
getExceptionClass()was introduced to return the exception class to throw from this factory when necessary 
Phalcon\Html\Exception¶
 - Changed 
Phalcon\Html\Exceptionto extend\Exception 
Http¶
Phalcon\Http\Cookie¶
 - Changed 
__construct()and made$httpOnly = false 
Phalcon\Http\Cookie\Escaper¶
 - Changed 
Phalcon\Http\Request\Exceptionto extend\Exception 
Phalcon\Http\Message¶
 - The namespace has been removed
 
Phalcon\Http\Request¶
 - Added 
getPreferredIsoLocaleVariant(): stringto return the preferred ISO locale variant. 
Phalcon\Http\Request\Exception¶
 - Changed 
Phalcon\Http\Cookie\Exceptionto extend\Exception 
Phalcon\Http\Response\Cookie¶
 - Added 
isSent(): boolto return if the cookie has been sent or not 
Phalcon\Http\Response\Headers¶
 - Added 
isSent(): boolto return if the headers have been sent or not 
Phalcon\Http\Response\Exception¶
 - Changed 
Phalcon\Http\Response\Exceptionto extend\Exception 
Phalcon\Http\Server¶
 - The namespace has been removed
 
图像¶
加载器¶
The class has been moved to the Phalcon\Autoload namespace 更多
日志记录¶
The 日志记录 component has been moved to the Logger命名空间下。
Phalcon\Logger\Logger¶
 - Moved 
Phalcon\Logger到Phalcon\Logger\Logger - The component has been refactored and the dependency to 
PSRhas been removed. 更多 - The interface method calls are much stricter now.
 
Phalcon\Logger\AbstractLogger¶
 - Added 
Phalcon\Logger\AbstractLoggerwith common functionality, to be used by packages that wish to alter interfaces to the logger while keeping the same functionality (see proxy-psr3) 
Phalcon\Logger\Adapter\Stream¶
 - Failing to write to the file will throw a 
LogicException而不是UnexpectedValueException 
Phalcon\Logger\Formatter\FormatterInterface¶
 - Changed 
process(Item $item): string(previously it returnedarray|string) 
Phalcon\Logger\Formatter\Json¶
 - Changed 
format()to encode JSON with the following options by default:JSON_HEX_TAG,JSON_HEX_APOS,JSON_HEX_AMP,JSON_HEX_QUOT,JSON_UNESCAPED_SLASHES,JSON_THROW_ON_ERROR, 
Phalcon\Logger\AdapterFactory¶
 - The constructor now requires a 
Phalcon\Storage\SerializerFactoryto be passed as the first parameter - The 
getAdapters()protected method has been renamed togetServices() - A new protected method 
getExceptionClass()was introduced to return the exception class to throw from this factory when necessary 
Phalcon\Logger\Exception¶
 - Changed 
Phalcon\Logger\Exceptionto extend\Exception 
Phalcon\Logger\Item¶
 - Changed 
__construct(string $message, string $levelName, int $level, DateTimeImmutable $dateTime, array $context = [])(dateTime接收一个对象来将所有收集到的信息记录到文件中。默认情况下,DateTimeImmutableobject) 
Phalcon\Logger\LoggerInterface¶
 - A new interface has been introduced (
Phalcon\Logger\LoggerInterface) to offer more flexibility when extending the cache object. 
消息¶
Phalcon\Messages\Exception¶
 - Changed 
Phalcon\Messages\Exceptionto extend\Exception 
Mvc¶
Phalcon\Mvc\Micro\Collection¶
 - Changed the methods to accept a 
callable作为$handlerinstead of mixed delete(string $routePattern, callable $handler, string $name = null)get(string $routePattern, callable $handler, string $name = null)head(string $routePattern, callable $handler, string $name = null)map(string $routePattern, callable $handler, string $name = null)mapVia(string $routePattern, callable $handler, mixed $method, string $name = null)options(string $routePattern, callable $handler, string $name = null)patch(string $routePattern, callable $handler, string $name = null)post(string $routePattern, callable $handler, string $name = null)put(string $routePattern, callable $handler, string $name = null)
Phalcon\Mvc\Micro\Exception¶
 - Changed 
Phalcon\Mvc\Micro\Exceptionto extend\Exception 
Phalcon\Mvc\Model\MetaData\Strategy\Annotations¶
 Phalcon\Mvc\Model\MetaData\Strategy\Annotations::getMetaData()will now return a string instead of an integer when encounteringBIGINTfields
Phalcon\Mvc\Model\MetaData\Stream¶
 - Changed the constructor to accept an array 
__construct(array $options = []) 
Phalcon\Mvc\Model\Query\BuilderInterface¶
 - Corrected 
having()signaturehaving(string $conditions, array $bindParams = [], array $bindTypes = []) - Changed 
orderBy()to accept an array or a stringorderBy(array | string $orderBy) 
Phalcon\Mvc\Model\Resultset\Complex¶
 - Changed 
current()to returnmixed - Added 
__serialize()和__unserialize()新方法 
Phalcon\Mvc\Model\Resultset\Simple¶
 - Changed the constructor to accept 
mixed针对$cache:__construct(mixed $columnMap, mixed $model, mixed $result, mixed $cache = null, bool $keepSnapshots = false) - Added 
__serialize()和__unserialize()新方法 
Phalcon\Mvc\Model\CriteriaInterface¶
 - Corrected 
where()signaturewhere(string $conditions, mixed $bindParams = null, mixed $bindTypes = null) 
Phalcon\Mvc\Model\Exception¶
 - Changed 
Phalcon\Mvc\Model\Exceptionto extend\Exception 
Phalcon\Mvc\Model\ManagerInterface¶
 - Changed 
$optionsparameter to be an array: addBelongsTo(ModelInterface $model, mixed $fields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterfaceaddHasMany(ModelInterface $model, mixed $fields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterfaceaddHasOne(ModelInterface $model, mixed $fields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterfaceaddHasOneThrough(ModelInterface $model, mixed $fields, string $intermediateModel, mixed $intermediateFields, mixed $intermediateReferencedFields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterfaceaddHasManyToMany(ModelInterface $model, mixed $fields, string $intermediateModel, mixed $intermediateFields, mixed $intermediateReferencedFields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterface- Changed 
getModelSchema(ModelInterface $model)to returnstring或null - Renamed:
 existsBelongsTo()到hasBelongsTo()existsMany()到hasHasMany()existsOne()到hasHasOne()existsOneThrough()到hasHasOneThrough()existsManyToMany()到hasHasManyToMany()
Phalcon\Mvc\Model\Manager¶
 - Changed 
getEventsManager()to returnEventManagerInterface或null - Changed 
getModelSchema(ModelInterface $model)to returnstring或null - Changed 
$optionsparameter to be an array: addBelongsTo(ModelInterface $model, mixed $fields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterfaceaddHasMany(ModelInterface $model, mixed $fields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterfaceaddHasOne(ModelInterface $model, mixed $fields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterfaceaddHasOneThrough(ModelInterface $model, mixed $fields, string $intermediateModel, mixed $intermediateFields, mixed $intermediateReferencedFields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterfaceaddHasManyToMany(ModelInterface $model, mixed $fields, string $intermediateModel, mixed $intermediateFields, mixed $intermediateReferencedFields, string $referencedModel, mixed $referencedFields, array options = []): RelationInterface- Marked as 
@deprecated: existsBelongsTo()existsMany()existsOne()existsOneThrough()existsManyToMany()- Added (replacing the 
exists*methods): hasBelongsTo()hasHasMany()hasHasOne()hasHasOneThrough()hasHasManyToMany()- Added 
getBuilder()to return the builder that was created withcreateBuilder()(或null) 
Phalcon\Mvc\Model\ResultsetInterface¶
 getCache()now returnsnullor an object (mixed)
Phalcon\Mvc\Model\Resultset¶
 __construct()accepts an object in the$cacheparameter. The object has implementPhalcon\Cache\CacheInterface或Psr\SimpleCache\CacheInterfacegetCache()now returnsnullor an object (mixed)
Phalcon\Mvc\Router¶
 - Changed 
add(),addConnect(),addDelete(),addGet(),addHead(),addOptions(),addPatch(),addPost(),addPurge(),addPut(),addTrace(),attach()to acceptintas$position - Changed 
getEventsManager()to returnManagerInterface或null 
Phalcon\Mvc\RouterInterface¶
 - Changed 
add(),addConnect(),addDelete(),addGet(),addHead(),addOptions(),addPatch(),addPost(),addPurge(),addPut(),addTrace(),attach()to acceptintas$position 
Phalcon\Mvc\Router\Exception¶
 - Changed 
Phalcon\Mvc\Router\Exceptionto extend\Exception 
Phalcon\Mvc\Router\RouteInterface¶
 getHostname()now returnsstring或nullgetName()now returnsstring或null
Phalcon\Mvc\Router\Route¶
 beforeMatch(callable $callback): RouteInterfacenow accepts acallablegetHostname()now returnsstring或nullgetName()now returnsstring或null
Phalcon\Mvc\ModelInterface¶
 - Changed 
average(array $parameters = [])to accept an array - Changed 
cloneResultset()to defaultkeepSnapshots = false - Changed 
findFirst(mixed $parameters = null): mixed | nullto returnnull而不是false - Changed 
getSchema(): string | nullto returnstring或null 
Phalcon\Mvc\View¶
 - Marked as 
@deprecatedexists() - Added 
has()(replacing theexists()method) 
Phalcon\Mvc\View\Exception¶
 - Changed 
Phalcon\Mvc\View\Exceptionto extend\Exception 
Phalcon\Mvc\View\Engine\Volt\Compiler¶
 - Removed 
compileCache() 
Phalcon\Mvc\Url¶
 - Moved from 
Phalcon\Url 
Phalcon\Mvc\Url\Exception¶
 - Moved from 
Phalcon\Url\Exception - Changed 
Phalcon\Mvc\Url\Exceptionto extend\Exception 
Phalcon\Mvc\Url\UrlInterface¶
 - Moved from 
Phalcon\Url\UrlInterface 
Phalcon\Paginator\Exception¶
 - Changed 
Phalcon\Paginator\Exceptionto extend\Exception 
Phalcon\Paginator\PaginatorFactory¶
 - The 
getAdapters()protected method has been renamed togetServices() - A new protected method 
getExceptionClass()was introduced to return the exception class to throw from this factory when necessary 
注册表¶
The 注册表 component has been moved to the Support命名空间下。更多
安全¶
The 安全 component has been moved to the Encryption命名空间下。更多
会话¶
Phalcon\Session\Adapter\AbstractAdapter¶
 - Changed 
gc(int $maxlifetime): int | boolto accept onlyintfor the parameter 
Phalcon\Session\Adapter\Noop¶
 - Changed 
gc(int $maxlifetime): int | boolto accept onlyintfor the parameter 
Phalcon\Session\Adapter\Stream¶
 - Changed 
__construct()to throw an exception if the save path is empty 
Phalcon\Session\BagInterface¶
 - Added interface for 
Phalcon\Session\Bag 
Phalcon\Session\Exception¶
 - Changed 
Phalcon\Session\Exceptionto extend\Exception 
存储¶
Phalcon\Storage\Adapter\AdapterInterface¶
 - Added 
setForever(string $key, mixed $value):to set an item in the store forever 
Phalcon\Storage\Adapter\Apcu¶
 - Added 
setForever(string $key, mixed $value):to set an item in the store forever 
Phalcon\Storage\Adapter\Libmemcached¶
 - Added 
setForever(string $key, mixed $value):to set an item in the store forever 
Phalcon\Storage\Adapter\Memory¶
 - Added 
setForever(string $key, mixed $value):to set an item in the store forever 
Phalcon\Storage\Adapter\Redis¶
 - Added 
setForever(string $key, mixed $value):to set an item in the store forever - Added 
timeout,connectTimeout,retryInterval和readTimeoutfor constructor options 
Phalcon\Storage\Adapter\Stream¶
 - Added 
setForever(string $key, mixed $value):to set an item in the store forever 
Phalcon\Storage\Serializer\AbstractSerializer¶
 - Added 
__serialize()和__unserialize()新方法 - Added 
isSuccess(): boolto return when the data was serialized/unserialized successfully 
Phalcon\Storage\Serializer\Base64¶
 - Changed 
unserializeto set the data to an empty string in case of a failure 
Phalcon\Storage\Serializer\Igbinary¶
 - Changed 
unserializeto set the data to an empty string in case of a failure 
Phalcon\Storage\Serializer\Msgpack¶
 - Changed 
unserializeto set the data to an empty string in case of a failure 
Phalcon\Storage\Serializer\Php¶
 - Changed 
unserializeto set the data to an empty string in case of a failure 
Phalcon\Storage\Serializer\*¶
 - Added stub serializers for Memcached and Redis when in need to use the built-in serializers for those storages:
 Phalcon\Storage\Serializer\MemcachedIgbinaryPhalcon\Storage\Serializer\MemcachedJsonPhalcon\Storage\Serializer\MemcachedPhpPhalcon\Storage\Serializer\RedisIgbinaryPhalcon\Storage\Serializer\RedisJsonPhalcon\Storage\Serializer\RedisMsgpackPhalcon\Storage\Serializer\RedisNonePhalcon\Storage\Serializer\RedisPhp
Phalcon\Storage\Exception¶
 - Changed 
Phalcon\Storage\Exceptionto extend\Exception 
Phalcon\Storage\AdapterFactory¶
 - The 
getAdapters()protected method has been renamed togetServices() - A new protected method 
getExceptionClass()was introduced to return the exception class to throw from this factory when necessary 
Phalcon\Storage\SerializerFactory¶
 - The 
getAdapters()protected method has been renamed togetServices() - A new protected method 
getExceptionClass()was introduced to return the exception class to throw from this factory when necessary 
支持¶
The Support namespace contains classes that are used throughout the framework. The classes moved here are: - 集合 - 调试 - 辅助函数 - 注册表
Phalcon\Support\Collection¶
 - Moved 
Phalcon\Collection到Phalcon\Support\Collection get()will return thedefaultValue如果没有使用keyis not set. It will also return thedefaultValue如果没有使用keyis set and the value isnull. This aligns with the 3.x behavior.
Phalcon\Support\Collection\CollectionInterface¶
 - A new interface has been introduced (
Phalcon\Support\Collection\CollectionInterface) to offer more flexibility when extending the collection object. 
Phalcon\Support\Collection\ReadOnlyCollection¶
 - 该类已从
ReadOnly重命名,以避免与 PHP 8.x 的保留字冲突。 
Phalcon\Support\Debug\Exception¶
 - Changed 
Phalcon\Support\Debug\Exceptionto extend\Exception 
Phalcon\Support\Helper\Exception¶
 - Changed 
Phalcon\Support\Helper\Exceptionto extend\Exception 
Phalcon\Helper\*¶
 Arr,Fs,Json,Number和Strstatic classes have been removed and replaced with one class per method in the relevant namespace. For examplePhalcon\Helper\Arr::has()is notPhalcon\Support\Helper\Arr\Has::__invoke()- Added 
Phalcon\Support\Helper\HelperFactoryservice locator to easily create objects from thePhalcon\Support\Helpernamespace - Added 
__call()的调用Phalcon\Support\Helper\HelperFactoryto offer an easier access to objects i.e.$this->helperFactory->dirFromFile() 
标签¶
Note, that this component will be removed in future versions of the framework.
Phalcon\Tag¶
 - Added 
preload(mixed $parameters): stringto parse preloading link headers 
文本¶
The Phalcon\Text component has been deprecated. It has been replaced with the Phalcon\Support\HelperFactory. 更多
翻译¶
Phalcon\Translate\Adapter\AbstractAdapter¶
 - Changed 
__construct(InterpolatorFactory $interpolator, array $options = []to default to an empty array for$options 
Phalcon\Translate\Adapter\Csv¶
 - Marked as 
@deprecatedexists() - Added 
has() 
Phalcon\Translate\Adapter\Gettext¶
 - Marked as 
@deprecatedexists() - Added 
has() 
Phalcon\Translate\Adapter\NativeArray¶
 - Marked as 
@deprecatedexists() - Added 
has() - Added 
toArray()to return the translation array back 
Phalcon\Translate\Exception¶
 - Changed 
Phalcon\Translate\Exceptionto extend\Exception 
Phalcon\Translate\InterpolatorFactory¶
 - The 
getAdapters()protected method has been renamed togetServices() - A new protected method 
getExceptionClass()was introduced to return the exception class to throw from this factory when necessary 
Phalcon\Translate\TranslateFactory¶
 - The 
getAdapters()protected method has been renamed togetServices() - A new protected method 
getExceptionClass()was introduced to return the exception class to throw from this factory when necessary 
URL¶
The URL component has been moved to the Mvc命名空间下。更多
验证¶
The 验证 component has been moved to the Filter命名空间下。更多
版本¶
The 版本 component has been moved to the Support命名空间下。更多
Volt¶
Since the tag service has changed from Phalcon\Tag到Phalcon\Html\TagFactory several helper methods used in Volt have changed also. The biggest change is the form() helper in Volt.
If you wish to keep your Volt code the way it is, without changing method signatures, you will have to rename your form() calls to formLegacy(). formLegacy() will use the Phalcon\Tag component as before. However, if you wish to use the new Phalcon\Html\TagFactory component, you can keep the method call as is (i.e. form() but you will need to change the signature of the helper method. 更多...