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.
Requirements¶
PHP 8.1¶
Phalcon v5.9 supports only PHP 8.1 and above. PHP 8.1 active support 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.
Installation¶
Phalcon can be installed using PECL.
Alternative installation
Download the latest zephir.phar from here. Add it to a folder that can be accessed by your system.
Clone the repository
Compile Phalcon
You will need to add the following line to your php.ini (in some cases both the CLI and web versions of it)
Check the module
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\ComponentAwaretoPhalcon\Acl\ComponentAwareInterface - Renamed
Phalcon\Acl\RoleAwaretoPhalcon\Acl\RoleAwareInterface
Acl\Adapter\Memory - Acl\Adapter\AdapterInterface¶
- Added
getInheritedRoles()to return an array of the inherited roles in the adapter.
Annotations¶
Application¶
Phalcon\Application\AbstractApplication¶
- The
getEventsManager()now returns aPhalcon\Events\ManagerInterfaceornull
Assets¶
The Assets 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()toisLocal() - Renamed
setLocal()tosetIsLocal()
Phalcon\Assets\Collection¶
- The class now uses
ArrayIteratorinstead ofIterator - Renamed
getLocal()toisLocal() - Renamed
setLocal()tosetIsLocal() - Renamed
getTargetLocal()togetTargetIsLocal() - Renamed
setTargetLocal()tosetTargetIsLocal() - 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 bebooland$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 bebooland$attributesto be an array
public function addInlineCss(
string $content,
bool $filter = true,
array $attributes = []
): Manager
addJs()now requires$localto bebooland$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 bebooland$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 Autoload\Loader 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()
Cache¶
The Cache component has been moved to the Cache namespace.
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\CachetoPhalcon\Cache\Cache - The component has been refactored and the dependency to
PSRhas been removed. more
Phalcon\Cache\CacheInterface¶
- A new interface has been introduced (
Phalcon\Cache\CacheInterface) to offer more flexibility when extending the cache object.
Cli¶
Collection¶
The Collection component has been moved to the Support namespace. more
Config¶
The Config component has been moved to the Config namespace.
Phalcon\Config\Config¶
- Moved
Phalcon\ConfigtoPhalcon\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 namespace. more
DataMapper¶
Db¶
Phalcon\Db\Adapter\Pdo\AbstractPdo¶
- Changed
connect(array descriptor = null): booltoconnect(array descriptor = []): void - Changed
execute(string $sqlStatement, $bindParams = null, $bindTypes = null): booltoexecute(string $sqlStatement, array $bindParams = [], array $bindTypes = []) -> bool - Changed
getErrorInfo()togetErrorInfo(): array - Changed
getInternalHandler(): \PDOtogetInternalHandler(): mixed - Changed
lastInsertId($sequenceName = null): int | booltolastInsertId(string $name = null) -> string | bool - Changed
query(string $sqlStatement, $bindParams = null, $bindTypes = null): ResultInterface | booltoquery(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 toVARBINARYandBINARYfields - 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
connectionIdtoint - Added property
realSqlStatementto store the real SQL statement executed - Changed
delete($table, $whereCondition = null, $placeholders = null, $dataTypes = null): booltodelete($table, string $whereCondition = null, array $placeholders = [], array $dataTypes = []): bool - Changed
fetchAll(string $sqlQuery, int $fetchMode = Enum::FETCH_ASSOC, $bindParams = null, $bindTypes = null): arraytofetchAll(string $sqlQuery, int $fetchMode = Enum::FETCH_ASSOC, array $bindParams = [], array $bindTypes = []): array - Changed
fetchOne(string $sqlQuery, $fetchMode = Enum::FETCH_ASSOC, $bindParams = null, $bindTypes = null): arraytofetchOne(string $sqlQuery, $fetchMode = Enum::FETCH_ASSOC, array $bindParams = [], array $bindTypes = []): array - Changed
getEventsManager(): ManagerInterfacetogetEventsManager(): 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(): booltoclose(): void - Changed
connect(array $descriptor = null): booltoconnect(array $descriptor = []): void - Changed
delete($table, $whereCondition = null, $placeholders = null, $dataTypes = null): booltodelete($table, string $whereCondition = null, array $placeholders = [], array $dataTypes = []): bool - Changed
execute(string $sqlStatement, $placeholders = null, $dataTypes = null): booltoexecute(string $sqlStatement, array $bindParams = [], array $bindTypes = []): bool - Changed
fetchAll(string $sqlQuery, int $fetchMode = 2, $placeholders = null): arraytofetchAll(string $sqlQuery, int $fetchMode = 2, array $bindParams = [], array $bindTypes = []): array - Changed
fetchOne(string $sqlQuery, int $fetchMode = 2, $placeholders = null): array;tofetchOne(string $sqlQuery, int $fetchMode = 2, array $bindParams = [], array $bindTypes = []): array - Added
getDefaultValue(): RawValue - Changed
getInternalHandler(): \PDOtogetInternalHandler(): mixed - Changed
lastInsertId($sequenceName = null): int | booltolastInsertId(string $name = null) -> string | bool - Changed
query(string $sqlStatement, $bindParams = null, $bindTypes = null): ResultInterface | booltoquery(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()togetServices()
Phalcon\Db\Dialect\*¶
- Added support for comments
- Added support for
SMALLINTfor Postgresql
Phalcon\Db\Result\ResultPdo¶
- Renamed
Phalcon\Db\Result\PdotoPhalcon\Db\Result\ResultPdo
Phalcon\Db\Column¶
- Added support for comments
- Added
TYPE_BINARYconstant - Added
TYPE_VARBINARYconstant - Added
getComment(): string | null
Phalcon\Db\DialectInterface¶
- Changed
getSqlExpression(array $expression, string $escapeChar = null, $bindCounts = null): string;togetSqlExpression(array $expression, string $escapeChar = null, array $bindCounts = []): string
Phalcon\Db\Dialect¶
- Changed
getColumnList(array $columnList, string $escapeChar = null, $bindCounts = null): stringtogetColumnList(array $columnList, string $escapeChar = null, array $bindCounts = []): string - Changed
getSqlColumn($column, string $escapeChar = null, $bindCounts = null): stringtogetSqlColumn($column, string $escapeChar = null, array $bindCounts = []): string - Changed
getSqlExpression(array $expression, string $escapeChar = null, $bindCounts = null): string;togetSqlExpression(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)todataseek(int $number)
Debug¶
The Debug component has been moved to the Support namespace. more
Di¶
The Di component has been moved to the Di namespace.
Phalcon\Di\Di¶
- Moved
Phalcon\DitoPhalcon\Di\Di - The
tagservice now returns an instance ofPhalcon\Html\TagFactory - The (new)
helperservice returns an instance ofPhalcon\Support\HelperFactory
Dispatcher¶
Phalcon\Dispatcher\AbstractDispatcher¶
- Changed
getEventsManager(): ManagerInterfacetogetEventsManager(): ManagerInterface | null
Phalcon\Dispatcher\Exception¶
- Changed
Phalcon\Dispatcher\Exceptionto extend\Exception
Domain¶
Encryption¶
Phalcon\Encryption\Crypt¶
- Moved
Phalcon\CrypttoPhalcon\Encryption\Crypt - Two new constants introduced
DEFAULT_ALGORITHM = "sha256"andDEFAULT_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\CryptInterfacetoPhalcon\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\ExceptiontoPhalcon\Encryption\Crypt\Exception\Exception
Phalcon\Encryption\Crypt\Exception\Mismatch¶
- Moved
Phalcon\Crypt\MismatchtoPhalcon\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
Escaper¶
The Escaper component has been moved to the Html namespace. more
Events¶
Phalcon\Events\AbstractEventsAware¶
- Added abstract
Phalcon\Events\AbstractEventsAware
Phalcon\Events\Event¶
- Changed
public function __construct(string $type, object $source, $data = null, bool $cancelable = true)to__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
Exception¶
Phalcon\Exception¶
The class has been removed.
Factory¶
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 namespace.
Phalcon\Filter\Filter¶
- Moved
Phalcon\FiltertoPhalcon\Filter\Filter
Phalcon\Filter\Exception¶
- Changed
Phalcon\Filter\Exceptionto extend\Exception
Phalcon\Filter\Factory¶
- Changed
getAdapters()togetServices()
Phalcon\Filter\Filter¶
- Added
__call()to allow using filter names as methods i.e.$filter->upper($input)
Phalcon\Filter\Validation¶
- Added
getValueByEntity()andgetValueByData()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): <ValidationInterfacetoadd($field, ValidatorInterface $validator): <ValidationInterface - Changed
rule(string $field, ValidatorInterface $validator): <ValidationInterfacetorule($field, ValidatorInterface $validator): <ValidationInterface
Phalcon\Filter\Validation\ValidatorFactory¶
- Changed
getAdapters()togetServices()
Flash¶
Phalcon\Flash\AbstractFlash¶
- Added the ability to define CSS icon classes (
setCssIconClasses()) - Changed
getTemplate(string $cssClasses): stringtogetTemplate(string $cssClasses, string $cssIconClasses): string
Phalcon\Flash\Exception¶
- Changed
Phalcon\Flash\Exceptionto extend\Exception
Phalcon\Flash\Session¶
- Added
SESSION_KEYconstant - Changed
has($type = null): booltohas(string $type = null): bool - Changed
message(string $type, string $message): string | nulltomessage(string $type, $message): string | null
Forms¶
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\CheckboxandPhalcon\Html\Helper\Input\Radiorespectively. The classes usecheckedanduncheckedparameters to set the state of each control. If thecheckedparameter is identical to the$valuethen the control will be checked. If theuncheckedparameter is present, it will be set if the$valueis not the same as thecheckedparameter. more
Helper¶
The Helper component has been moved to the Support namespace. more
Html¶
Phalcon\Html\Escaper¶
- Moved
Phalcon\EscapertoPhalcon\Html\Escaper - Changed the
flagsproperty that controls the flags forhtmlspecialchars()is set to11which 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\EscaperInterfacetoPhalcon\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\HelpertoPhalcon\Html\Helper - The component has been refactored and offers more functionality now. more
Phalcon\Html\Link¶
- The component has been refactored and the dependency to
PSRhas been removed. more
Phalcon\Html\TagFactory¶
- Added
__call(string $name, array $arguments)to allow calling helper objects as methods. more - 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
Image¶
Loader¶
The class has been moved to the Phalcon\Autoload namespace more
Logger¶
The Logger component has been moved to the Logger namespace.
Phalcon\Logger\Logger¶
- Moved
Phalcon\LoggertoPhalcon\Logger\Logger - The component has been refactored and the dependency to
PSRhas been removed. more - 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
LogicExceptioninstead ofUnexpectedValueException
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 = [])(dateTimeaccepts aDateTimeImmutableobject)
Phalcon\Logger\LoggerInterface¶
- A new interface has been introduced (
Phalcon\Logger\LoggerInterface) to offer more flexibility when extending the cache object.
Messages¶
Phalcon\Messages\Exception¶
- Changed
Phalcon\Messages\Exceptionto extend\Exception
Mvc¶
Phalcon\Mvc\Micro\Collection¶
- Changed the methods to accept a
callableas the$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()and__unserialize()methods
Phalcon\Mvc\Model\Resultset\Simple¶
- Changed the constructor to accept
mixedfor$cache:__construct(mixed $columnMap, mixed $model, mixed $result, mixed $cache = null, bool $keepSnapshots = false) - Added
__serialize()and__unserialize()methods
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 returnstringornull - Renamed:
existsBelongsTo()tohasBelongsTo()existsMany()tohasHasMany()existsOne()tohasHasOne()existsOneThrough()tohasHasOneThrough()existsManyToMany()tohasHasManyToMany()
Phalcon\Mvc\Model\Manager¶
- Changed
getEventsManager()to returnEventManagerInterfaceornull - Changed
getModelSchema(ModelInterface $model)to returnstringornull - 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()(ornull)
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\CacheInterfaceorPsr\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 returnManagerInterfaceornull
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 returnsstringornullgetName()now returnsstringornull
Phalcon\Mvc\Router\Route¶
beforeMatch(callable $callback): RouteInterfacenow accepts acallablegetHostname()now returnsstringornullgetName()now returnsstringornull
Phalcon\Mvc\ModelInterface¶
- Changed
average(array $parameters = [])to accept an array - Changed
cloneResultset()to defaultkeepSnapshots = false - Changed
findFirst(mixed $parameters = null): mixed | nullto returnnullinstead offalse - Changed
getSchema(): string | nullto returnstringornull
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
Registry¶
The Registry component has been moved to the Support namespace. more
Security¶
The Security component has been moved to the Encryption namespace. more
Session¶
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
Storage¶
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,retryIntervalandreadTimeoutfor 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()and__unserialize()methods - 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
Support¶
The Support namespace contains classes that are used throughout the framework. The classes moved here are: - Collection - Debug - Helper - Registry
Phalcon\Support\Collection¶
- Moved
Phalcon\CollectiontoPhalcon\Support\Collection get()will return thedefaultValueif thekeyis not set. It will also return thedefaultValueif thekeyis 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¶
- This class has been renamed from
ReadOnlyin order to avoid collisions with PHP 8.x reserved words.
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, andStrstatic 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()inPhalcon\Support\Helper\HelperFactoryto offer an easier access to objects i.e.$this->helperFactory->dirFromFile()
Tag¶
Note, that this component will be removed in future versions of the framework.
Phalcon\Tag¶
- Added
preload(mixed $parameters): stringto parse preloading link headers
Text¶
The Phalcon\Text component has been deprecated. It has been replaced with the Phalcon\Support\HelperFactory. more
Translate¶
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 namespace. more
Validation¶
The Validation component has been moved to the Filter namespace. more
Version¶
The Version component has been moved to the Support namespace. more
Volt¶
Since the tag service has changed from Phalcon\Tag to 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. more...