Skip to content

Latest commit

 

History

History
1404 lines (1012 loc) · 59 KB

CHANGELOG.md

File metadata and controls

1404 lines (1012 loc) · 59 KB

v1.2.3 (2023-1-23)

General

  • Updated PSR logger to support newer versions of PHP

v1.2.2 (2022-2-20)

General

  • Updated to use GitHub Actions instead of Travis CI
  • Updated class signatures to work in PHP 8.1
  • Updated CI to test with PHP 8.1

Console

  • Fixed bug when running an app locally with spaces in the path

v1.2.1 (2021-3-22)

Routing

  • Updated to use opis/closure over jeremeamia/superclosure for serializing closure routes

Sessions

  • Fixed bug that prevented sessions from being opened

v1.2.0 (2021-3-15)

General

  • Updated to require PHP 7.3
  • Added support for PHP 8.0
  • Updated to use PHPUnit 9.5

Databases

  • Connection and Statement now compose PDO rather than extend it

v1.1.13 (2020-4-5)

HTTP

  • Added same-site support to cookies

v1.1.12 (2020-1-15)

Validation

  • Can now indicate that fields with an empty value should still be validated by calling Rules::validateEmpty()

v1.1.11 (2019-12-29)

Query Builders

  • Added Expression to support SQL expressions in INSERT and UPDATE values

v1.1.10 (2019-12-14)

General

  • Fixed #13 by adding support for PHP 7.4

v1.1.9 (2019-11-18)

General

  • Fixed various PHPDoc typos and CS

Authorization

  • Fixed bug that caused Roles::getRolesForSubject() to return RoleMemberships instead of Roles.

Databases

  • Fixed #112 and added php apex migrations:fix command to fix the migrations DB schema

v1.1.8 (2019-10-24)

Databases

  • Updated migrations to roll back transactions on failure

v1.1.7 (2019-03-03)

IOC

  • Added IBootstrapperRegistry::registerBootstrapper()
  • Deprecated IBootstrapperRegistry::registerEagerBootstrapper() and IBootstrapperRegistry::registerLazyBootstrapper()

v1.1.6 (2019-02-16)

HTTP

  • Fixed bug that prevented CSRF checks from working when using _method to manually set the request method

v1.1.5 (2018-03-13)

Databases

  • Fixed migrations, which were running in reverse order

ORM

  • Added support for IDs that are objects

Validation

  • Fixed bug that prevented you from using custom rules twice

v1.1.4 (2017-22-23)

Databases

  • Fixed bugs that caused DB migrations to not work with MySQL
  • Migration bootstrapper now reads from an environment var to determine the database driver to use

v1.1.3 (2017-12-22)

Framework

  • Fixed #92, which caused php apex app:runlocally to not work on Ubuntu due to the file path to the router not being correct

IO

  • Namespaced all sensitive native PHP functions for better security

v1.1.2 (2017-11-18)

IO

  • Added Opulence\IO\Streams\MultiStream

v1.1.1 (2017-10-23)

General

  • Fixed build scripts

IO

  • Fixed the package name (was opulence/files, now is opulence/io)

v1.1.0 (2017-10-22)

General

  • Opulence now requires at least PHP 7.1
  • Updated PHPUnit to 6.2
  • Moved all test directories into a Test directory within each library

Applications

  • Deprecated all classes in this library (support will be dropped in Opulence 2.0)

Collections

  • Added the collection library

Database

  • Added database migration support

Files

  • All classes have been deprecated in the Opulence\Files namespace and moved to the Opulence\IO namespace

Framework

  • Added php apex make:migration
  • Added php apex migrations:up
  • Added php apex migrations:down

IO

  • Added stream support

IoC

  • Deprecated Bootstrapper::run() and shutDown()

v1.0.10 (2017-04-15)

Framework

* Added more PHPDoc to some template files

HTTP

  • Fixed #86 (bug with adding response headers)

v1.0.9 (2017-01-28)

Console

* Fixed options so that their default values are used if no value is specified

Framework

* Added `php apex app:runlocally` command to make it easier to run your application locally

v1.1.0 (2017-?-?)

General

* Bumped minimum PHP version to PHP 7.1

Deprecations

* Version parameter in `Opulence\Applications\Application::construct()` * Version parameter in `Opulence\Console\Kernel::construct()` * Version parameter in `Opulence\Console\Commands\AboutCommand::construct()` * `Opulence\Ioc\Bootstrappers\Bootstrapper::run()` and `shutDown()` * `Opulence\Orm\IUnitOfWork::setConnection()`

v1.0.8 (2017-01-26)

Framework

* Added ability to generate an empty controller via `php apex make:controller`

ORM

* Fixed `UnitOfWork` and `CachedSqlDataMapper` to execute scheduled actions (eg scheduled inserts/deletions/updates) in the same order they're scheduled, rather than by grouping them

v1.0.7 (2017-01-21)

IoC

* Annotated exceptions

v1.0.6 (2017-01-19)

Console

* Fixed various CS issues in console `make*` templates

IoC

* `Opulence\Ioc\Bootstrappers\Bootstrapper::__construct()` no longer final

ORM

* Added type-hinting to data mapper parameters and return values

v1.0.5 (2017-01-16)

Console

* Fixed #52 (improperly iterating over string when it contains multibyte chars) * Fixed #62 (`php apex app:rename` was allowing bad namespaces)

Framework

* Fixed #55 (`Authority` was being instantiated with incorrect parameters)

IoC

* Fixed #54 (no longer assigning resolved parameters to array by reference) * Added micro-optimizations for performance improvements

ORM

* Fixed #45 (reuse results of reflection across Id getter and setter)

Views

* Fixed bug that caused `.gitignore` files to be deleted by view cache's `flush()` methods

v1.0.4 (2017-01-06)

General

* Fixed CS issues

IoC

* Greatly simplified logic inside `Opulence\IoC\Container` * Added `Opulence\IoC\InstanceBinding` * Fixed factory bindings so that they're called directly rather than through `$container->callClosure()`

Views

* Added optional `$checkVars` parameter to `Opulence\Views\Caching\ICache::get()`, `has()`, and `set()` * Previously, Opulence was incorrectly caching views by including the variables' values, which made it relatively useless when used in the Fortune transpiler * Now, this parameter defaults to `false`. To enable caching a view by its variables` values, simply set it to `true` in the various cache methods.

v1.0.3 (2017-01-02)

General

* Updated copyright years

Framework

* Fixed PHPUnit to be 5.6.* in `opulence/framework` (it was errantly still requiring 5.4.*) * Updated the various `Assertions` classes to extend the namespaced `PHPUnit\Framework\TestCase` class rather than the soon-to-be-outdated `PHPUnit_Framework_TestCase`

IoC

* Fixed #38 (`hasBinding()` was not falling back to universal bindings when checking a targeted binding)

v1.0.2 (2016-12-16)

Console

* Fixed bug that occurred with `null` short option names

v1.0.1 (2016-12-11)

HTTP

* Fixed incorrect `use` statement in `Opulence\Http\Requests\Request`

QueryBuilders

* Changed `Opulence\QueryBuilders\Conditions\NotBetweenCondition` to not inherit from `BetweenCondition` * Changed `Opulence\QueryBuilders\Conditions\NotInCondition` to not inherit from `InCondition`

Routing

* Simplified route parsing (#35)

Validation

* Changed `Opulence\Validation\Rules\NotInRule` to not inherit from `InRule`

v1.0.0 (2016-12-05)

General

* Released v1.0.0

v1.0.0-rc4 (2016-12-02)

General

* Fixed broken unit tests in Windows due to different newline characters

Environments

* Fixed `Opulence\Environments\Environment::setVar()` so that it does not overwrite existing environment variables

Views

* Added `Opulence\Views\Caching\ArrayCache` for testing purposes

v1.0.0-rc3 (2016-11-24)

General

* Bumped PHPUnit version to 5.6

IoC

* Closed #30 (removing bootstrappers causing you to not be able to clear framework cache)

v1.0.0-rc2 (2016-11-09)

Console

* Added better guidance to console prompts that require a yes/no answer

HTTP

* Fixed #25 (bug with how `Request::getHost()` is calculated)

v1.0.0-rc1 (2016-10-15)

Deprecated

* Removed all deprecated classes from the framework, including the entire `Bootstrappers` library

Events

* Removed `Opulence\Events\Event` and `Opulence\Events\IEvent` * Renamed `Opulence\Events\Dispatchers\EventDispatcher` to `SynchronousEventDispatcher` * Changed `Opulence\Events\Dispatchers\IEventDispatcher` to have only a single method: `dispatch($eventName, $event)` * `$event` is no longer restricted to only being an `IEvent` - it can be a POPO * Events' propagation can no longer be stopped, which is for the best, architecturally * This will make it much easier to add asynchronous event handling in the future with things like Azure Service Bus

v1.0.0-beta7 (2016-09-22)

General

* Better optimized PSR-4 autoloading (issue #19) * Removed many instances of `call_user_func` and `call_user_func_array` for readability (issue #20)

Deprecated

* The Environment library was slimmed down, and some recently-made-irrelevant classes were marked as deprecated: * `Opulence\Environments\Hosts\HostName` * `Opulence\Environments\Hosts\HostRegex` * `Opulence\Environments\Hosts\IHost` * `Opulence\Environments\Resolvers\EnvironmentResolver` * `Opulence\Environments\Resolvers\IEnvironmentResolver`

Environments

* Made all `Opulence\Environments\Environment` methods static * Removed `Opulence\Environments\Environment::getName()` and `setName()` * Instead, simply read the variable that's holding that data, eg `Environment::getVar("ENV_NAME")`

Sessions

* Improved speed of session garbage collection (issue #21)

v1.0.0-beta6 (2016-08-29)

This release consolidated bootstrappers into the `Ioc` library. This makes them more usable to people only using the `Ioc` library. It also removes some necessary hackiness for application configuration. All of Opulence's bootstrappers have been updated to use the new `Ioc` bootstrappers.

Bootstrappers

* The entire library has been deprecated in favor of `Opulence\Ioc\Bootstrappers`

Framework

* Added `Opulence\Framework\Configuration\Config` as a container to hold config data to be read in your bootstrappers

Ioc

* Added the following: * `Opulence\Ioc\Bootstrappers\Caching\FileCache` * `Opulence\Ioc\Bootstrappers\Caching\ICache` * `Opulence\Ioc\Bootstrappers\Dispatchers\BootstrapperDispatcher` * `Opulence\Ioc\Bootstrappers\Dispatchers\IBootstrapperDispatcher` * `Opulence\Ioc\Bootstrappers\Factories\BootstrapperRegistryFactory` * `Opulence\Ioc\Bootstrappers\Factories\CachedBootstrapperRegistryFactory` * `Opulence\Ioc\Bootstrappers\Factories\IBootstrapperRegistryFactory` * `Opulence\Ioc\Bootstrappers\Bootstrapper` * `Opulence\Ioc\Bootstrappers\BootstrapperRegistry` * `Opulence\Ioc\Bootstrappers\BootstrapperResolver` * `Opulence\Ioc\Bootstrappers\IBootstrapperRegistry` * `Opulence\Ioc\Bootstrappers\IBootstrapperResolver` * `Opulence\Ioc\Bootstrappers\ILazyBootstrapper` * Removed `Bootstrapper::initialize()` functionality because it doesn't serve a purpose anymore

Query Builders

* Added conditions to `where()`, `andWhere()`, `orWhere()`, `having()`, `andHaving()`, and `orHaving()` methods on various queries (issue #9)

v1.0.0-beta5 (2016-07-05)

Deprecated

If Opulence ever moves to a standard HTTP request/response implementation, the `Routing` library shouldn't have any more dependencies on the Opulence `Http` library. However, it still would have one because middleware previously existed in the `Http` library. So, to potentially future-proof Opulence in the case that it adopts standardized request/response objects (not that we plan on doing so yet), the following classes are being deprecated:
  • Deprecated Opulence\Http\Middleware\IMiddleware in favor of Opulence\Routing\Middleware\IMiddleware
  • Deprecated Opulence\Http\Middleware\MiddlewareParameters in favor of Opulence\Routing\Middleware\MiddlewareParameters
  • Deprecated Opulence\Http\Middleware\ParameterizedMiddleware in favor of Opulence\Routing\Middleware\ParameterizedMiddleware

v1.0.0-beta4 (2016-06-30)

Backwards Incompatibilities

* `Opulence\Cryptography\Encryption\Encrypter` no longer accepts a string as the encryption key (issue #13) * An `Opulence\Cryptography\Encryption\Keys\Secret` is now passed in (`Key` and `Password` both extend `Secret`) * Now, a key derivation function is run on it to generate encryption and authentication keys from the secret * Increased encryption key length stored in `ENCRYPTION_KEY` environment variable from 16 bytes to 32 bytes * To fix this, rerun `php apex encryption:generatekey` to create a new, suitably-long encryption key

Deprecated

Deprecated names of various dispatcher classes in favor of more descriptive `{Model}Dispatcher` class names:
  • Deprecated Opulence\Applications\Tasks\Dispatchers\IDispatcher and Dispatcher in favor of ITaskDispatcher and TaskDispatcher
  • Deprecated Opulence\Bootstrappers\Dispatchers\IDispatcher and Dispatcher in favor of IBootstrapperDispatcher and BootstrapperDispatcher
  • Deprecated Opulence\Events\Dispatchers\IDispatcher and Dispatcher in favor of IEventDispatcher and EventDispatcher
  • Deprecated Opulence\Framework\Events\Bootstrappers\DispatcherBootstrapper in favor of EventDispatcherBootstrapper
  • Deprecated Opulence\Routing\Dispatchers\IDispatcher and Dispatcher in favor of IRouteDispatcher and RouteDispatcher

General

* Forced only native PHP functions in the global namespace to be used for security-related classes

Cryptography

* `Opulence\Cryptography\Encryption\Encrypter` no longer accepts a string as the encryption key (issue #13) * An `Opulence\Cryptography\Encryption\Keys\Secret` is now passed in (`Key` and `Password` both extend `Secret`) * Now, a key derivation function is run on it to generate encryption and authentication keys from the secret * Added `Opulence\Cryptography\Encryption\Keys\IKeyDeriver` and `Pbkdf2KeyDeriver` * Added `Opulence\Cryptography\Encryption\Keys\Secret`, `Key`, and `Password` * Changed default cipher from `AES-128-CBC` to `AES-256-CTR` * Locked down cipher selection to `AES` ciphers in `CBC` or `CTR` modes * Updated `Opulence\Cryptography\Encryption\Encrypter` to use `random_bytes()` rather than `openssl_random_pseudo_bytes()` (issue #12) * Increased encryption key length stored in `ENCRYPTION_KEY` from 16 bytes to 32 bytes

Routing

* Added `Opulence\Routing\Dispatchers\IMiddlewarePipeline` and `MiddlewarePipeline` to the `RouteDispatcher` constructor * Removed required dependency on `Pipelines` library

v1.0.0-beta3 (2016-06-22)

Backwards Incompatibilities

* Passing by reference has been removed from all repositories and data mappers because it is not needed anymore. The following methods have been updated to now pass by value: * `Opulence\Authentication\Clients\Orm\IClientRepository::add()`, `IClientRepository::delete()` * `Opulence\Authentication\Credentials\Orm\IJwtRepository::add()`, `IJwtRepository::delete()` * `Opulence\Authentication\Tokens\Orm\IJwtRepository::add()`, `IJwtRepository::delete()` * `Opulence\Authentication\Users\Orm\IUserRepository::add()`, `IUserRepository::delete()` * `Opulence\Authorization\Roles\Orm\IRoleMembershipRepository::add()`, `IRoleMembershipRepository::delete()` * `Opulence\Authorization\Roles\Orm\IRoleRepository::add()`, `IRoleRepository::delete()` * `Opulence\Orm\ChangeTracking\IChangeTracker::startTracking()`, `ChangeTracker::startTracking()` * `Opulence\Orm\DataMappers\IDataMapper::add()`, `IDataMapper::delete()`, `IDataMapper::update()` * `Opulence\Orm\DataMappers\CachedSqlDataMapper::add()`, `CachedSqlDataMapper::delete()`, `CachedSqlDataMapper::update()` * `Opulence\Orm\Repositories\IRepository::add()`, `IRepository::delete()` * `Opulence\Orm\Repositories\Repository::add()`, `Repository::delete()`

Deprecated

* `Opulence\Cryptography\Utilities\Strings`

Authentication

* Check the backwards incompatibilities for methods that no longer pass by reference

Authorization

* Check the backwards incompatibilities for methods that no longer pass by reference

Console

* Fixed bug that escaped all slashes in arguments when we actually wanted them for everything except escaped quotes (issue #4)

Environments

* Made the name optional in `Opulence\Environments\Environment::__construct()`

Framework

* Fixed `Opulence\Composer\Executable` so that it always returns a string, even when `shell_exec()` returns null * Added ability to make changing the directory optional when renaming the application (issue #5) * Added `Opulence\Framework\Views\Caching\GenericCache` for `Opulence\Caching\ICacheBridge` support * Removed `Opulence\Cryptography\Utilities\Strings` dependency from `Opulence\Framework\Console\Commands\UuidGenerationCommand`

ORM

* Check the backwards incompatibilities for methods that no longer pass by reference

v1.0.0-beta2 (2016-06-16)

Applications

* Made the version number be overridable

Redis

* Incremented PHPRedis version from 2.2.7 to 3.0.* for PHP 7 support

Tests

* Incremented PHPUnit version from 5.2 to 5.4

v1.0.0-beta1 (2016-06-15)

General

* First beta

v1.0.0-alpha36

Backwards Incompatibilities

* Rewrote directory structure under `Opulence\Framework` to support eventual splitting of its subdirectories into their own repositories * This will make is possible to, for example, use a library's bootstrapper without having to download all the other bootstrappers * Moved `Opulence\Framework\Bootstrappers\Authentication\AuthenticationBootstrapper` to `Opulence\Framework\Authentication\Bootstrappers\AuthenticationBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Authorization\AuthorizationBootstrapper` to `Opulence\Framework\Authorization\Bootstrappers\AuthorizationBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Console\Commands\CommandsBootstrapper` to `Opulence\Framework\Console\Bootstrappers\CommandsBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Console\Composer\ComposerBootstrapper` to `Opulence\Framework\Composer\Bootstrappers\ComposerBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Console\Requests\RequestsBootstrapper` to `Opulence\Framework\Console\Bootstrappers\RequestBootstrapper` (note the drop in the "s" in "RequestBootstrapper") * Moved `Opulence\Framework\Bootstrappers\Cryptography\CryptographyBootstrapper` to `Opulence\Framework\Cryptography\Bootstrappers\CryptographyBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Events\DispatcherBootstrapper` to `Opulence\Framework\Events\Bootstrappers\DispatcherBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Http\Requests\RequestBootstrapper` to `Opulence\Framework\Http\Bootstrappers\RequestBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Http\Routing\RouterBootstrapper` to `Opulence\Framework\Routing\Bootstrappers\RouterBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Http\Sessions\SessionBootstrapper` to `Opulence\Framework\Sessions\Bootstrappers\SessionBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Http\Views\ViewBootstrapper` to `Opulence\Framework\Views\Bootstrappers\ViewBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Http\Views\ViewFunctionsBootstrapper` to `Opulence\Framework\Views\Bootstrappers\ViewFunctionsBootstrapper` * Moved `Opulence\Framework\Bootstrappers\Validation\ValidatorBootstrapper` to `Opulence\Framework\Validation\Bootstrappers\ValidatorBootstrapper` * Moved `Opulence\Framework\Http\Middleware\Authenticate` to `Opulence\Framework\Authentication\Http\Middleware\Authenticate` * Moved `Opulence\Framework\Http\Middleware\Session` to `Opulence\Framework\Sessions\Http\Middleware\Session` * Moved `Opulence\Framework\Testing\PhpUnit\Console\Assertions\ResponseAssertions` to `Opulence\Framework\Console\Testing\PhpUnit\Assertions\ResponseAssertions` * Moved `Opulence\Framework\Testing\PhpUnit\Console\CommandBuilder` to `Opulence\Framework\Console\Testing\PhpUnit\CommandBuilder` * Moved `Opulence\Framework\Testing\PhpUnit\Console\IntegrationTestCase` to `Opulence\Framework\Console\Testing\PhpUnit\IntegrationTestCase` * Moved `Opulence\Framework\Testing\PhpUnit\Http\Assertions\ResponseAssertions` to `Opulence\Framework\Http\Testing\PhpUnit\Assertions\ResponseAssertions` * Moved `Opulence\Framework\Testing\PhpUnit\Http\Assertions\ViewAssertions` to `Opulence\Framework\Http\Testing\PhpUnit\Assertions\ViewAssertions` * Moved `Opulence\Framework\Testing\PhpUnit\Http\IntegrationTestCase` to `Opulence\Framework\Http\Testing\PhpUnit\IntegrationTestCase` * Moved `Opulence\Framework\Testing\PhpUnit\Http\RequestBuilder` to `Opulence\Framework\Http\Testing\PhpUnit\RequestBuilder`

Framework

* Fixed `Make*` commands to use latest directory structure in skeleton project * Fixed bug that prevented `UuidGenerationCommand` from being included

v1.0.0-alpha35

General

* Fixed Composer PHP versions in individual libraries * Updated to SuperClosure v2.2.0

Backwards Incompatibilities

* Removed ability to "make" classes via an IoC container in `Opulence\Pipelines\Pipeline` * Removed `IContainer` from `Pipeline::__construct()` * A `Router` object is now required in the `Router::group()` callback, eg `$router->group($config, function (Router $router) {...})` * Completely re-architected the IoC container (see below)

Applications

* Changed `Opulence\Applications\Application::start()` and `shutdown()` to accept optional `callable` rather than `Closure`

Authentication

* Removed `Opulence\Authentication\EntityTypes` * Added JWT support * Removed `Opulence\Authentication\Tokens\IToken` and `Token` * Added `Opulence\Authentication\IAuthenticator`

Authorization

* Added `Opulence\Authorization` library

Bootstrappers

* Updated to use the new IoC container (see below)

Cryptography

* Removed `Strings` from `Opulence\Cryptography\Encryption\Encrypter::__construct()` * Removed `Strings` from `Opulence\Cryptography\Hashing\Hasher::__construct()` * Added `Opulence\Cryptography\Utilities\Strings::generateUuidV4()`

Databases

* Renamed `Opulence\Databases\Providers\Types\Factories\TypeMapperFactory::create()` to `createTypeMapper()`

Framework

* Added `Opulence\Framework\Bootstrappers\Authentication\AuthenticationBootstrapper` * Added `Opulence\Framework\Bootstrappers\Authorization\AuthorizationBootstrapper` * Updated `Opulence\Framework\Bootstrappers\Cryptography\CryptographyBootstrapper` to not pass `Strings` to `getEncrypter()` nor `getHasher()` * Added `Opulence\Framework\Console\Commands\UuidGenerationCommand` * Fixed various command templates to include PHP 7 return types * Updated `Opulence\Framework\Bootstrappers\Http\Routing\RouterBootstrapper` to inject an `Opulence\Routing\Dispatchers\ContainerDependencyResolver` into the router dispatcher * Removed `Opulence\Cryptography\Utilities\Strings` dependency from `Opulence\Framework\Console\Commands\EncryptionKeyGenerationCommand` * Removed `Opulence\Cryptography\Utilities\Strings` dependency from `Opulence\Framework\Http\CsrfTokenChecker`

HTTP

* Added parameterized middleware support * Fixed bug that did not attempt to check the current request method's parameter collection when calling `Opulence\Http\Requests\Request::getInput()` * Fixed bug that returned `null` when getting the previous URL and none is set, nor is the referrer header set

IoC

* Completely rewrote IoC container to specify binding scope when you bind to the container rather than when you resolve something from it * For example, before, to get a singleton, you'd call `$container->bind($interface, $singletonClass)`, and then `$container->makeShared($interface)` * Now, you call `$container->bindSingleton($interface, $singletonClass)`, and then `$container->resolve($interface)` to resolve an instance * To bind a factory that will return the instance to bind, use `$container->bindFactory($interface, $factory)` method * To bind an instance of an object, use `$container->bindInstance($interface, $instance)` * To bind a prototype (non-singleton) class, use `$container->bindPrototype($interface, $prototypeClass)` * Useful for interfaces previously resolve using `$container->makeNew($interface)` * To bind a singleton (shared) class, use `$container->bindSingleton($interface, $singletonClass)` * Useful for interfaces previously resolved using `$container->makeShared($interface)` * To specify a targeted binding, use `$container->for($targetClass, $callback)->bindSingleton($interface, $singletonClass)` * The callback should contain all bindings and resolutions that are targeted * The only methods that are targetable are `bindFactory()`, `bindInstance()`, `bindPrototype()`, `bindSingleton()`, `hasBinding()`, `resolve()`, and `unbind()` * To specify primitive values, do so when you bind to the container, eg `$container->bindSingleton($interface, $singletonClass, $arrayOfPrimitives)` * You no longer specify primitives when resolving dependencies - only when you bind them * To call a closure, use `$container->callClosure($closure, $arrayOfPrimitives)` * To call a method, use `$container->callMethod($instance, $methodName, $arrayOfPrimitives)` * To check if an interface has a binding, use `$container->hasBinding($interface)` * To unbind an interface, use `$container->unbind($interface)`

Memcached

* Renamed `Opulence\Memcached\Types\Factories\TypeMapperFactory::create()` to `createTypeMapper()`

ORM

* Added `Opulence\Orm\Ids\Generators\UuidV4Generator`

Redis

* Renamed `Opulence\Redis\Types\Factories\TypeMapperFactory::create()` to `createTypeMapper()`

Routing

* `Router::group()` now requires a `Router` object as a parameter, eg `$router->group($config, function (Router $router) {...})` * Updated to use a new interface `Opulence\Routing\Dispatchers\IDependencyResolver` to resolve interfaces (removed dependency on IoC container) * Added `Opulence\Routing\Dispatchers\ContainerDependencyResolver` that uses Opulence's container library so it is easy to get up and running * Fixed bug that prevented parameterized middleware from being added to a route

Sessions

* Removed `Opulence\Cryptography\Utilities\Strings` dependency in `Opulence\Sessions\Ids\Generators\IdGenerator` * Added `Opulence\Sessions\Handlers\ISessionEncrypter`, `SessionEncrypter`, and `SessionEncryptionException` * Removed required dependency on Cryptography library to encrypt/decrypt session data and changed it to use above classes

Validation

* Renamed `Opulence\Validation\Rules\Errors\ErrorTemplateRegistry::get()` to `getErrorTemplate()` * Renamed `Opulence\Validation\Rules\Errors\ErrorTemplateRegistry::has()` to `hasErrorTemplate()` * Renamed `Opulence\Validation\Rules\RuleExtensionRegistry::get()` to `getRule()` * Renamed `Opulence\Validation\Rules\RuleExtensionRegistry::has()` to `hasRule()`

Views

* Renamed `Opulence\Views\Compilers\ICompilerRegistry::get()` to `getCompiler()` * Renamed `Opulence\Views\Factories\IViewFactory::create()` to `createView()` * Renamed `Opulence\Views\Factories\IViewFactory::has()` to `hasView()`

v1.0.0-alpha34

Routing

* Fixed double-compile bug for controller responses

v1.0.0-alpha33

General

* Dropped support for ALL PHP 5.\* versions * Added scalar type hints and return types * Adopted all other PHP 7 techniques that required hacks in PHP 5

v1.0.0-alpha32

Authentication

* Added `Opulence\Authentication\AuthenticationStatusTypes` * Added user Id to `Opulence\Authentication\Tokens\IToken` and `Token` * Changed `DateTime` instances to `DateTimeImmutable` in `Opulence\Authentication\Tokens\IToken` and `Token`

Build

* Renamed `build/commit.sh` to `build/git.sh` * Added checking out and merging of pull requests

Databases

* Changed time/date related fields in type mappers to accept `DateTimeInterface` rather than `DateTime` to allow for `DateTimeImmutable` arguments

Debug

* Added support for different response formats depending on the request type

HTTP

* Added ability to stream responses via `Opulence\Http\Responses\StreamResponse` * Fixed bug that prevented `Request::getInput()` from searching query parameters on post requests when no post parameter matched the input name * Added support for trusted proxies * Removed all `Request::METHOD_*` constants, moved them to `Opulence\Http\Requests\RequestMethods` class, and dropped `METHOD_` from constants' names * Added `Opulence\Http\Requests\RequestHeaders` * Added `Opulence\Http\Requests::getPort()` * Renamed `Opulence\Http\Requests::getIPAddress()` to `getClientIPAddress()`

Memcached

* Changed time/date related fields in type mappers to accept `DateTimeInterface` rather than `DateTime` to allow for `DateTimeImmutable` arguments

Pipelines

* Rewrote to include a fluent syntax, eg `(new Pipeline($container))->send("foo")->through($stages)->then($callback)->execute()`

Query Builders

* Added ability to create select query without a table (useful for stored procedures)

Redis

* Changed time/date related fields in type mappers to accept `DateTimeInterface` rather than `DateTime` to allow for `DateTimeImmutable` arguments

Users

* Moved `Opulence\Users\*` to `Opulence\Authentication\Users\*` * Made all `DateTime` objects instances of `DateTimeImmutable` * Removed `Opulence\Users\Factories\UserFactory` * Removed `Opulence\Users\GuestUser`

Validation

* Added `Opulence\Validation` library * Added `Opulence\Framework\Bootstrappers\Validation\ValidatorBootstrapper`

v1.0.0-alpha31

Testing

* Renamed `Opulence\Framework\Testing\PhpUnit\ApplicationTestCase` to `IntegrationTestCase` * Renamed `Opulence\Framework\Testing\PhpUnit\Console\ApplicationTestCase` to `IntegrationTestCase` * Renamed `Opulence\Framework\Testing\PhpUnit\Http\ApplicationTestCase` to `IntegrationTestCase`

v1.0.0-alpha30

Testing

* Renamed `Opulence\Framework\Testing\PhpUnit\Console\ApplicationTestCase::call()` to `execute()` * Added `Opulence\Framework\Testing\PhpUnit\Console\CommandBuilder`

v1.0.0-alpha29

Bootstrappers

* Removed `Opulence\Framework\Bootstrappers\Php\PhpBootstrapper`

Console

* Added `app:up` and `app:down` console commands

Debug

* Added special template for 503 exceptions

HTTP

* Added `HTTP_ACCEPT` default server var to `Request` * Changed `Cookie` to accept either a `DateTime` or an int

Testing

* Added `Opulence\Framework\Testing\PhpUnit\Console\Assertions\ResponseAssertions` * Added `Opulence\Framework\Testing\PhpUnit\Http\Assertions\ResponseAssertions` * Added `Opulence\Framework\Testing\PhpUnit\Http\Assertions\ViewAssertions` * Moved all console `assert***()` methods to `Opulence\Framework\Testing\PhpUnit\Console\Assertions\ResponseAssertions` * Moved all HTTP `assertResponse***()` methods to `Opulence\Framework\Testing\PhpUnit\Http\Assertions\ResponseAssertions` * Moved all HTTP `assertView***()` methods to `Opulence\Framework\Testing\PhpUnit\Http\Assertions\ViewAssertions`

v1.0.0-alpha28

Testing

* Renamed `Opulence\Framework\Testing\PhpUnit\Http\RequestBuilder::withEnv()` to `withEnvironmentVars()`

v1.0.0-alpha27

Testing

* Fixed bug that prevented assertions from working if they weren't chained to `RequestBuilder` calls

v1.0.0-alpha26

HTTP

* Added `Opulence\Http\Requests\Request::createFromUrl()`

Testing

* Removed `$method` and `$path` parameters from `Opulence\Framework\Testing\PhpUnit\Http\ApplicationTestCase::route()` * Added `Opulence\Framework\Testing\PhpUnit\Http\RequestBuilder` * Added following methods to `Opulence\Framework\Testing\PhpUnit\Http\ApplicationTestCase`: * `assertResponseJsonEquals()` * `delete()` * `get()` * `head()` * `options()` * `patch()` * `post()` * `put()` * All assertions in `Opulence\Framework\Testing\PhpUnit\Console\ApplicationTestCase` and `Opulence\Framework\Testing\PhpUnit\Http\ApplicationTestCase` now return `$this` for method chaining

v1.0.0-alpha25

HTTP

* Added ability to specify raw body in `Request::createFromGlobals()` and `Request::__construct()` * Added ability to override globals in `Request::createFromGlobals()`c

Views

* Added `catch()` for `Throwable` exceptions in `PhpCompiler::compile()` * Changed `Opulence\Views\Compilers\ICompiler::compile()` to throw `Exception` and `Throwable` rather than just `ViewCompilerException`

v1.0.0-alpha24

ORM

* Fixed critical bug that did prevented entities with no Id generators from being added through the data mapper in `UnitOfWork::commit()`

v1.0.0-alpha23

Bootstrappers

* Fixed `Opulence\Bootstrappers\Dispatchers\Dispatcher` to accept `Opulence\Applications\Tasks\IDispatcher`

ORM

* Changed `Opulence\Orm\IEntityRegistry::runAggregateRootChildFunctions()` to `runAggregateRootCallbacks()`

v1.0.0-alpha22

Bootstrappers

* Fixed bug that prevented lazy bootstrappers from having targeted bindings

IoC

* Added new target parameter to `Opulence\Ioc\IContainer::make()`, `makeNew()`, and `makeShared()`

ORM

* Extracted interface `Opulence\Orm\IUnitOfWork` to `Opulence\Orm\UnitOfWork` * Renamed `Opulence\Orm\Repositories\Repo` to `Repository` and `IRepo` to `IRepository` * Updated `Opulence\Orm\Repositories\Repo` to use `IUnitOfWork` * Moved `Opulence\Orm\Ids\BigIntSequenceIdGenerator`, `IdGenerator`, `IntSequenceIdGenerator` to `Opulence\Orm\Ids\Generators` namespace * Added `Opulence\Orm\Ids\Generators\IIdGenerator` * Added `Opulence\Orm\Ids\Generators\SequenceIdGenerator` * Removed `Opulence\Orm\Ids\Generators\IdGenerator` * Moved `Opulence\Orm\Ids\IdAccessorRegistry` and `IIdAccessorRegistry` to `Opulence\Orm\Ids\Accessors` namespace * Changed `Opulence\Orm\UnitOfWork::getDataMapper()`, `getScheduledEntityDeletions()`, `getScheduledEntityInsertions()`, and `getScheduledEntityUpdates` to protected * Removed `Opulence\Orm\DataMappers\ISqlDataMapper` and moved its constants to `SqlDataMapper` * Removed `Opulence\Orm\DataMappers\SqlDataMapper::getIdGenerator()` and `setIdGenerator()` * Changed `Opulence\Orm\DataMappers\SqlDataMapper` to accept `IConnection $readConnection` and `IConnection $writeConnection` rather than a `ConnectionPool` in its constructor

Sessions

* For consistency, moved `Opulence\Sessions\Ids\IdGenerator` and IIdGenerator` to `Opulence\Sessions\Ids\Generators` namespace

v1.0.0-alpha21

Views

* Fixed bug that did not extract included views' vars * Included view vars are now completely isolated from vars set outside the included view

v1.0.0-alpha20

Debug

* Improved default page template for exceptions in development environment

Framework

* Added `currentRouteIs()` view function

HTTP

* Added `Opulence\Http\Requests\Request::isUrl()`

Routing

* Changed `Opulence\Routing\Url` to `Opulence\Routing\Urls` * Added `Opulence\Routing\Urls\UrlGenerator::createRegexFromName()`

v1.0.0-alpha19

General

* Updated libraries' composer.json dependencies

Debug

* Added `LoggerInterface` and levels to log and throw in `Opulence\Debug\Errors\Handlers\ErrorHandler`

v1.0.0-alpha18

Environments

* Moved `Opulence\Applications\Environments` to its own library `Opulence\Environments`

v1.0.0-alpha17

Applications

* `Opulence\Applications\Application::start()` and `shutDown()` no longer catch all exceptions

Exceptions

* Any re-thrown exceptions now set the original exception in the previous exception property

v1.0.0-alpha16

Framework

* Fixed framework cache flushing after renaming the application

v1.0.0-alpha15

Debug

* Added `Opulence\Debug` library * Added exception handlers and renderers to kernels

Framework

* Added `Opulence\Framework\Debug` classes * Moved `Opulence\Framework\Console\Kernel` and `StatusCodes` to `Opulence\Console` namespace * Removed `Opulence\Framework\Testing\PhpUnit\ApplicationTestCase::setApplicationAndIocContainer()`

Memcached

* Fixed bug that did not set timezone of `DateTime` objects created from Memcached timestamps

Redis

* Fixed bug that did not set timezone of `DateTime` objects created from Redis timestamps

v1.0.0-alpha14

Paths

* Moved `Opulence\Applications\Paths` to `Opulence\Bootstrappers\Paths` because it was no longer being used in `Applications` namespace

v1.0.0-alpha13

General

* Added develop branch * Renamed `/app` directory to `/src` * Renamed `/tests/app` directory to `/tests/src`

Applications

* Removed `Opulence\Applications\Application::setEnvironment()`

Console

* Updated references to `app` directory to `src` in various console commands

Databases

* Moved `Opulence\Databases\Pdo` namespace to `Opulence\Databases\Adapters\Pdo` * Removed `Opulence\Databases\IConnection::getTypeMapper()` * Moved `Opulence\Databases\Providers\TypeMapper` and `Opulence\Databases\Providers\Types` namespace * Removed `Opulence\Databases\Providers\Types\TypeMapper::getProvider()` and `setProvider()` * Added `Opulence\Databases\Providers\Types\Factories\TypeMapperFactory`

Memcached

* Removed type mapper from `Opulence\Memcached\Memcached::__construct()` * Removed `Opulence\Memcached\Memcached::getTypeMapper()` * Moved `Opulence\Memcached\TypeMapper` and `Opulence\Memcached\Types` namespace * Added `Opulence\Memcached\Types\Factories\TypeMapperFactory`

Redis

* Removed type mapper from `Opulence\Redis\Redis::__construct()` * Removed `Opulence\Redis\Redis::getTypeMapper()` * Moved `Opulence\Redis\TypeMapper` and `Opulence\Redis\Types` namespace * Added `Opulence\Redis\Factories\TypeMapperFactory`

v1.0.0-alpha12

Cryptography

* Removed dependency on Symfony for secure string comparisons * Added `Opulence\Cryptography\Utilities\Strings::getRandomBytes()` * Changed `Opulence\Cryptography\Utilities\Strings::getRandomString()` to throw `RuntimeException` on error * Removed `Opulence\Cryptography\CryptographicException` because it wasn't being used by anything

v1.0.0-alpha11

Bootstrappers

* Moved Bootstrappers into their own namespace: `Opulence\Bootstrappers` * Added Bootstrapper library

v1.0.0-alpha10

Applications

* Removed `Paths` and `IContainer` parameters from `Opulence\Applications\Application`

Framework

* Changed `Opulence\Framework\Testing\PhpUnit\ApplicationTestCase::setApplication()` to `setApplicationAndIocContainer()` * Removed `Opulence\Framework\Testing\PhpUnit\ApplicationTestCase::getApplication()`

v1.0.0-alpha9

Build

* Updated build bash script

v1.0.0-alpha8

General

* Fixed more capitalization mismatches between file names and class names

v1.0.0-alpha7

General

* Changed PHPDoc format for all classes/interfaces/traits * Changed capitalization of namespace/class name/variable acronyms to follow pascal case * Changed all directory names to match namespace capitalization

v1.0.0-alpha6

HTTP

* Added support for detection of HTTP methods besides GET/POST for form requests * Made HTTP headers case-insensitive * Renamed `Opulence\HTTP\Parameters` to `Collection`

Testing

* Moved all classes under `Opulence\Framework\Tests` to `Opulence\Framework\Testing\PHPUnit`

Views

* Added `httpMethodInput()` Fortune view function to add support for HTTP methods besides GET/POST

v1.0.0-alpha5

ORM

* Added ability to register an array of class names in `Opulence\ORM\Ids\IIdAccessorRegistry::registerIdAccessors()`

Views

* Moved `Opulence\Views\Factories\Resolvers\IViewNameResolver` and `FileViewNameResolver` to `Opulence\Views\Factories\IO` namespace

v1.0.0-alpha4

ORM

* Fixed data mapper "make:" commands to not include `IEntity` type hint in methods * Re-added `Opulence\ORM\IEntity` and added Id accessors for classes that implement `IEntity` to reduce boilerplate code * Changed all private methods in `Opulence\ORM\ChangeTracking\ChangeTracker` to `protected` to make extending easier * Changed all private methods in `Opulence\ORM\UnitOfWork` to `protected` to make extending easier

v1.0.0-alpha3

ORM

* Made all of ORM accept POPOs rather than IEntity * Added `Opulence\ORM\ChangeTracking\IChangeTracker` and `ChangeTracker` * Added `Opulence\ORM\Ids\IIdAccessorRegistry` and `IdAccessorRegistry` * Added `IIdAccessorRegistry` and `IChangeTracker` parameters to `UnitOfWork` and `EntityRegistry` constructors * Removed `Opulence\ORM\IEntityRegistry::hasChanged()` and `registerComparisonFunction()` * Removed `Opulence\ORM\IEntity` * Removed any `IEntity` type-hints

v1.0.0-alpha2

Views

* Fixed bug that prevented `.fortune.php` files from being resolved by the file name resolver

v1.0.0-alpha1

General

* Created first alpha release * Removed forms library * Updated Composer configs to latest branch

v0.6.17

Bootstrappers

* Renamed `Opulence\Applications\Bootstrappers\Caching\Cache` to `FileCache`

Console

* Removed `Opulence\Console\Responses\Compilers\Compiler::getElements()` * Added `Opulence\Console\Responses\Compilers\ICompiler::registerElement()` * Added `Opulence\Console\Responses\Compilers\ElementRegistrant` to register built-in Apex elements * Moved `Opulence\Console\Responses\Formatters\Elements` namespace to `Opulence\Console\Responses\Compilers\Elements` * Added "Apex" to various commands that show title of console library

Databases

* Moved `ConnectionPool`, `MasterSlaveConnectionPool`, and `SingleServerConnectionPool` to new `Opulence\Databases\ConnectionPools` namespace * Added `Opulence\Databases\ConnectionPools\Strategies\ServerSelection\IServerSelectionStrategy`, `SingleServerSelectionStrategy`, and `RandomServerSelectionStrategy` * Added optional slave server selection strategy parameter to `MasterSlaveConnectionPool` constructor

ORM

* Renamed `Opulence\ORM\IEntityRegistry::register()` to `registerEntity()` and `deregister()` to `deregisterEntity()` * Changed `Opulence\ORM\DataMappers\SQLDataMapper::read()` to accept the value-type parameter before the `$expectingSingleResult` parameter * Fixed `Opulence\ORM\DataMappers\ICachedSQLDataMapper` to extend `IDataMapper`, not `ISQLDataMapper` * Removed `Opulence\ORM\Repositories\ActionTypes` because it wasn't being used anywhere

Routing

* Changed "variables" group parameter to "vars" * Renamed `Opulence\Routing\Routes\Caching\Cache` to `FileCache`

Sessions

* Renamed `Opulence\Sessions\Ids\IIdGenerator::isIdValid()` to `idIsValid()`

Views

* Removed `$fileSystem` parameter from `Opulence\Views\Caching\FileCache` * Removed reliance on `Opulence\Files` in `composer.json` * Renamed `Opulence\Views\Caching\Cache` to `FileCache`

v0.6.16

Console

* Officially titled the console library "Apex"

v0.6.15

Cache

* Refactored `Opulence\Cache\MemcachedBridge` to use `Opulence\Memcached\Memcached` and accept name of default client * Refactored `Opulence\Cache\RedisBridge` to use `Opulence\Redis\Redis` and accept name of default client

Memcached

* Added `Opulence\Memcached\Memcached` * Removed `Opulence\Memcached\OpulenceMemcached` * Removed `Opulence\Memcached\Server`

Redis

* Added `Opulence\Redis\Redis` * Removed `Opulence\Redis\IRedis` * Removed `Opulence\Redis\PHPRedis` * Removed `Opulence\Redis\Predis` * Removed `Opulence\Redis\Server` * Removed `Opulence\Redis\TRedis`

v0.6.14

Environments

* Changed `IEnvironmentDetector::detect()` to `resolve()`, which now accepts a host name parameter * Moved `Opulence\Applications\Environments\IEnvironmentDetector` and `EnvironmentDetector` to namespace `Opulence\Applications\Environments\Resolvers`

Framework

* Updated `Opulence\Framework\Bootstrappers\HTTP\Views\ViewBootstrapper` to inject an `IViewReader` rather than a `FileSystem` into the `ViewFactory`

Views

* Moved `Opulence\Views\Factories\IViewNameResolver` and `FileViewNameResolver` to namespace `Opulence\Views\Factories\Resolvers` * Added `Opulence\Views\Factories\IO\IViewReader` and `FileViewReader` * Refactored `ViewFactory` to accept an `IViewReader` rather than `FileSystem` to make the factory more flexible when it comes to view storage

v0.6.13

Bootstrappers

* Added `Opulence\Applications\Bootstrappers\Bootstrapper::initialize()` to run before absolutely anything else in the bootstrapper

Framework

* Added `Opulence\Framework\Bootstrappers\PHP\PHPBootstrapper` * Removed `Opulence\Framework\setupcheck.php` because it's not necessary with the new bootstrapper

General

* Fixed various PSR-2 formatting issues

Views

* Added ability to use `<% show %>` directive to both end the current part and show it * Changed `Opulence\Views\Factories\ViewFactory::registerBuilder()` to accept a closure that accepts an `Opulence\Views\IVew` parameter and returns the built view * This differs from before when the closure would simply return an instance of `Opulence\Views\Factories\IViewBuilder`

v0.6.12

General

* Switched to PSR-2 code style

Routing

* Fixed bug when generating URLs with brackets * Removed `Opulence\Routing\Routes\Compilers\Parsers\IParser::getVariableMatchingRegex()` * Changed `Opulence\Routing\URL\URLGenerator::createFromName()` and Fortune view function `route()` to accept a variable-length number of parameters as arguments rather than bundling them all in an array

v0.6.11

Routing

* Changed path variables from being in `/{foo}` format to `/:foo` format * Added ability to make path variables optional using brackets, eg `/foo[/bar]`

v0.6.10

Bootstrappers

* Added `Bootstrapper` suffix to all bootstrapper class names

v0.6.9

General

* Switched to PSR-2 spacing between `namespace` and `use` statements

v0.6.8

ORM

* To provide better abstraction `Opulence\ORM\Repositories\IRepo::getDataMapper()`, `getUnitOfWork()`, and `setDataMapper()` have been removed

v0.6.7

HTTP

* Renamed `Opulence\HTTP\Requests\UploadedFile::getActualMimeType()` to `getMimeType()` * Renamed `Opulence\HTTP\Requests\UploadedFile::getTempName()` to `getTempFilename()`

v0.6.6

HTTP

* Added `Opulence\HTTP\Requests\UploadedFile` and `Files` * Uploaded files now instantiate `UploadedFile` objects rather than simple arrays

v0.6.5

Environment

* `Opulence\Applications\Environments\Environment::getVariable()` renamed to `getVar()` * `Opulence\Applications\Environments\Environment::setVariable()` renamed to `setVar()`

Routing

* `Opulence\Routing\Routes\Compilers\Parsers\Parser::getVariableMatchingRegex()` renamed to `getVarMatchingRegex()` * `Opulence\Routing\Routes\Route::getVariableRegex()` renamed to `getVarRegex()` * `Opulence\Routing\Routes\Route::getVariableRegexes()` renamed to `getVarRegexes()` * `Opulence\Routing\Routes\Route::setVariableRegex()` renamed to `setVarRegex()` * `Opulence\Routing\Routes\Route::setVariableRegexes()` renamed to `setVarRegexes()` * `Opulence\Routing\Routes\CompiledRoute::getPathVariable()` renamed to `getPathVar()` * `Opulence\Routing\Routes\CompiledRoute::getPathVariables()` renamed to `getPathVars()`

v0.6.4

Routing

* Added setter methods for view factory and view compiler in base controller class

v0.6.3

Routing

* Renamed `Controller::compiler` to `viewCompiler` to avoid naming conflicts

v0.6.2

General

* Re-split Git subtrees

v0.6.1

General

* Re-split Git subtrees

Events

* Manually re-added this library after some issues with Git

v0.6.0

General

* Renamed RDev to Opulence, renamed all namespaces to `Opulence\...` * Renamed `app/rdev` directory to `app/opulence` * Renamed `tests/app/rdev` directory to `tests/app/opulence`

Memcached

* Renamed `RDevMemcached` to `OpulenceMemcached`

Redis

* Renamed `RDevPHPRedis` to `OpulenceRedis` * Renamed `RDevPredis` to `OpulencePredis`

Views

* Renamed `Opulence\Views\Templates` to `Opulence\Views\View` and `ITemplate` to `IView` * Renamed `Opulence\Views\Factories\ITemplateFactory` to `IViewFactory` and `TemplateFactory` to `ViewFactory` * Renamed `Opulence\Views\IBuilder` to `Opulence\Views\Factories\IViewBuilder` * Added `Opulence\Views\Compilers\Fortune` namespace * Changed default statement delimiter from `{% %}` to `<% %>`

v0.5.7

Applications

* Renamed `RDev\Applications\Environments\Host` to `RDev\Applications\Environments\Hosts\HostName` * Added `RDev\Applications\Environments\Hosts\IHost` and `HostRegex`

v0.5.6

Applications

* Renamed `RDev\Applications\Bootstrappers\IBootstrapperRegistry::registerBootstrapperClasses()` to `registerBootstrappers()` * Renamed `RDev\Applications\Bootstrappers\IBootstrapperRegistry::getBindingsToLazyBootstrapperClasses()` to `getLazyBootstrapperBindings()` * Renamed `RDev\Applications\Bootstrappers\IBootstrapperRegistry::getEagerBootstrapperClasses()` to `getEagerBootstrappers()` * Added `RDev\Applications\Environments\Host` * Added `RDev\Applications\Environments\EnvironmentDetector::registerHost()` * Updated `EnvironmentDetector::detect()` not accept parameters

Cryptography

* Renamed `RDev\Cryptography\Hashing\IHasher::generate()` to `hash()`

View

* Removed `RDev\Views\Caching\ICache::getLifetime()` and `setLifetime()`

v0.5.5

Applications

* Renamed `RDev\Applications\Bootstrappers\IO` namespace to `Caching` * Renamed `RDev\Applications\Bootstrappers\IO\IBootstrapperIO` to `ICache` and `BootstrapperIO` to `Cache` * Renamed `IBootstrapperIO::read()` to `get()` and `write()` to `set()`

Framework

* Added `RDev\Framework\Bootstrappers\Routing\Router::getRouteMatchers()` * Added ability to flush router and view cache with `php rdev framework:flushcache`

Routing

* Moved `RDev\Routing\Compilers` namespace to `RDev\Routing\Routes\Compilers` * Added `RDev\Routing\Routes\Compilers\Matchers` namespace and classes in it * Added `IRouteMatcher[]` parameter to `RDev\Routing\Routes\Compilers\Compiler::__construct()` * Added `IParser` to `RDev\Routing\Router::__construct()` * Removed `IParser` from `RDev\Routing\Routes\Compilers\Compiler::__construct()`

v0.5.4

Events

* Made `RDev\Events\Event` a concrete class

v0.5.3

Events

* Renamed `RDev\Events\Dispatchers\IDispatcher::addListener()` to `registerListener()`

v0.5.2

Events

* Fixed missing library

v0.5.1

Events

* Added all classes under `RDev\Events` namespace * Added `RDev\Framework\Bootstrappers\Events\Dispatcher`

v0.5.0

General

* Now uses fully-qualified class names in `use` statements and PHPDoc * Changed class names to make them readable without having to be fully-qualified

Applications

* Added `Bootstrapper::shutdown()` to handle any cleaning up that needs to be done on application shutdown * Removed logger from `Application` constructor * Removed `getLogger()`, `setIoCContainer()`, and `setLogger()` * Removed `RDev\Applications\Application::registerPreStartTask()`, `registerPostStartTask()`, `registerPreShutdownTask()`, and `registerPostShutdownTask()` * Added `RDev\Tasks\Dispatchers\Dispatcher` * This now handles pre/post-start and -shutdown tasks * Added ability to lazy-load bootstrappers by implementing `RDev\Applications\Bootstrappers\ILazyBootstrapper` * Removed `Application::registerBootstrapper()` and `Application::registerBootstrappersTask()` * Added `RDev\Applications\Bootstrappers\IBootstrapperRegistry` and `BootstrapperRegistry` to act as the bootstrapper registry * Added `RDev\Applications\Bootstrappers\Dispatcher\IDispatcher` and `Dispatcher` to actually dispatch bootstrappers * Added `RDev\Applications\Bootstrappers\IO\BootstrapperIO` to read bootstrappers from storage

Authentication

* `RDev\Authentication\Credentials\Credentials` renamed to `RDev\Authentication\Credentials\CredentialCollection` * `RDev\Authentication\Credentials\ICredentials` renamed to `RDev\Authentication\Credentials\ICredentialCollection`

Console

* Moved `RDev\Console\Kernels\Kernel` to `RDev\Framework\Console\Kernel` * Moved `RDev\Console\Kernels\StatusCodes` to `RDev\Framework\Console\StatusCodes` * `RDev\Console\Commands\About` renamed to `RDev\Console\Commands\AboutCommand` * `RDev\Console\Commands\Command::setCommands()` renamed to `setCommandCollection()` * `RDev\Console\Commands\Command::commands` renamed to `commandCollection` * `RDev\Console\Commands\Commands` renamed to `RDev\Console\Commands\CommandCollection` * `RDev\Console\Commands\Help` renamed to `RDev\Console\Commands\HelpCommand` * `RDev\Console\Commands\Version` renamed to `RDev\Console\Commands\VersionCommand` * `RDev\Console\Requests\Parsers\Argv` renamed to `RDev\Console\Requests\Parsers\ArgvParser` * `RDev\Console\Requests\Parsers\ArrayList` renamed to `RDev\Console\Requests\Parsers\ArrayListParser` * `RDev\Console\Requests\Parsers\String` renamed to `RDev\Console\Requests\Parsers\StringParser` * `RDev\Console\Requests\Tokenizers\Argv` renamed to `RDev\Console\Requests\Tokenizers\ArgvTokenizer` * `RDev\Console\Requests\Tokenizers\ArrayList` renamed to `RDev\Console\Requests\Tokenizers\ArrayListTokenizer` * `RDev\Console\Requests\Tokenizers\String` renamed to `RDev\Console\Requests\Tokenizers\StringTokenizer` * `RDev\Console\Responses\Console` renamed to `RDev\Console\Responses\ConsoleResponse` * `RDev\Console\Responses\Formatters\Command` renamed to `RDev\Console\Responses\Formatters\CommandFormatter` * `RDev\Console\Responses\Formatters\Elements\Elements` renamed to `RDev\Console\Responses\Formatters\Elements\ElementCollection` * `RDev\Console\Responses\Formatters\Padding` renamed to `RDev\Console\Responses\Formatters\PaddingFormatter` * `RDev\Console\Responses\Formatters\Table` renamed to `RDev\Console\Responses\Formatters\TableFormatter` * `RDev\Console\Responses\Silent` renamed to `RDev\Console\Responses\SilentResponse` * `RDev\Console\Responses\Stream` renamed to `RDev\Console\Responses\StreamResponse` * Added `RDev\Console\Responses\Compilers\MockCompiler` for use in the `SilentResponse` response

Cryptography

* `RDev\Cryptography\IToken` and `Token` now under `RDev\Authentication\Tokens` namespace * Switched from `mcrypt` to `openssl` in `Encrypter` * Removed dependency on `mcrypt` library

Databases

* `RDev\Databases\NoSQL\Memcached` now under `RDev\Memcached` namespace * `RDev\Databases\NoSQL\Redis` now under `RDev\Redis` namespace * `RDev\Databases\SQL\QueryBuilders` now under `RDev\QueryBuilders` namespace * `RDev\Databases\SQL` now under `RDev\Databases` namespace * `RDev\Databases\SQL\Providers\MySQL` renamed to `RDev\Databases\Providers\MySQLProvider` * `RDev\Databases\SQL\Providers\PostgreSQL` renamed to `RDev\Databases\Providers\PostgreSQLProvider`

Framework

* Added CSRF token checking * Added `RDev\Framework\HTTP\CSRFTokenChecker` * Added `RDev\Framework\HTTP\Middleware\CheckCSRFToken` * All commands in `RDev\Framework\Console\Commands` appended with "Command" * `RDev\Framework\Tests\Console\ApplicationTestCase::getCommands()` renamed to `getCommandCollection()` * Added `RDev\Framework\Bootstrappers\HTTP\Sessions\Session` * Added `RDev\Framework\HTTP\Middleware\Session`

HTTP

* Moved `RDev\HTTP\Routing` namespace to new namespace `RDev\Routing` * Moved `RDev\HTTP\Kernels\Kernel` to `RDev\Framework\HTTP\Kernel` * Added `Request::getFullURL()` * Added `Request::getHost()` * Added `Request::getUser()` and `Request::getPassword()` * Added `Request::getPreviousURL()` and `Request::setPreviousURL()`

IoC

* Changed `RDev\IoC\IContainer::call()` and `RDev\IoC\Container::call()` to accept a `callable` rather than an instance and method name * Added support for callbacks in bindings

Routing

* Moved `RDev\HTTP\Routing` namespace to new namespace `RDev\Routing` * `RDev\HTTP\Routing\Routes\Routes` renamed to `RDev\Routing\Routes\RouteCollection` * `RDev\HTTP\Routing\Router::routes` renamed to `routeCollection` * `RDev\HTTP\Routing\Router::getRoutes()` renamed to `getRouteCollection()` * Added `CompiledRoute::getPathVariable()` * Fixed type-hint for `Router::getMatchedRoute()` to return type `CompiledRoute` * Controller/method names are now passed into the `Route` constructor directly rather than through the options array * The following methods in `RDev\Routing\Router` have been changed to accept `$path`, `$controller`, and `$options`: * `any()` * `delete()` * `get()` * `head()` * `options()` * `patch()` * `post()` * `put()` * `Router::multiple()` now accepts `$methods`, `$path`, `$controller`, and `$options` * Opened up routing to also accept non-RDev controllers

Sessions

* Removed session from the application and bootstrapper constructors * Removed `Application::getSession()` and `Application::setSession()` * Added the following methods to `ISession` and `Session`: * `ageFlashData()` * `delete()` * `flash()` * `flush()` * `get()` * `getAll()` * `getId()` * `getName()` * `has()` * `hasStarted()` * `reflash()` * `regenerateId()` * `set()` * `setId()` * `setMany()` * `setName()` * `start()` * Added `FileSessionHandler` * Added `ISession::getId()` and `ISession::setId()` * Removed `User` and `Credentials` from `ISession` and `Session`

Users

* Made `$roles` optional in `RDev\Users\User::__construct()`

Views

* added `csrfToken()` and `csrfInput()` template functions * `RDev\Views\Cache` namespace renamed to `RDev\Views\Caching` * `RDev\Views\Filters\XSS` renamed to `RDev\Views\Filters\XSSFilter` * `RDev\Views\Caching\ICache::DEFAULT_GC_TOTAL` renamed to `DEFAULT_GC_DIVISOR`

v0.4.0

* Added `RDev\Framework\Tests\HTTP\ApplicationTestCase` * Added `RDev\Framework\Tests\Console\ApplicationTestCase` * Added `$controller` parameter to `IDispatcher::dispatch()` to be able to test the matched controller * Added `Router::getMatchedController()` to get the matched controller * Made `Router::getRoutes()` return by reference so that its return value can be passed by reference to the bootstrapper * Added `composer:dump-autoload` console command * Updated Composer dependencies

v0.3.6

* Fixed bug with `NO_VALUE` console option * Fixed formatting in About command * Added `encryption:generatekey` command * Added `RDev\Framework\Bootstrappers\Cryptography\Bootstrapper`

v0.3.5

* Moved `Hasher` classes to `RDev\Cryptography\Hashing` namespace * Added `RDev\Cryptography\Encryption\Encrypter` * Added `RDev\Cryptography\Utilities\Strings`