hyperf/CHANGELOG-2.0.md
2020-06-19 16:05:03 +08:00

7.4 KiB

v2.0 - TBD

Major Changes

  1. Refactor hyperf/di component, in particular, AOP and Annotation Scanner are optimized, in v2.0, the component use a brand new loading mechanism to provided an incredible AOP function.
    1. The most significant functional differences compared to v1.x is that you can cut into any classes in any ways with Aspect. For example, in v1.x, you can only use AOP in the class instance that created by Hyperf DI container, you cannot cut into the class instance that created by new identifier. But now, in v2.0, it is available. But there is still has an exception, the classes that used in bootstrap stage still cannot works.
    2. In v1.x, the AOP ONLY available for the normal classes, not for Final class that cannot be inherited by a subclass. But now, in v2.0. it is available.
    3. In v1.x, you cannot use the property value that marked by @Inject or @Value annotation in the constructor of current class. But now, in v2.0, it is available.
    4. In v1.x, you can only use @Inject and @Value annotation in the class instance that created by Hyperf DI container. But now, in v2.0, it is available in any ways, such as the class instance that created by new identifier.
    5. In v1.x, you have to define the full namespace of Annotation class when you use the Annotation. But now, in v2.0, the component provide a global import mechanism, you cloud define an alias for Annotation to use the Annotation directly without using the namespace. For example, you cloud define @Inject annotation in any class without define use Hyperf\Di\Annotation\Inject;.
    6. In v1.x, the proxy class that created by the DI container is a subclass of the target class, this mechanism will cause the magic constant will return the value of proxy class but not original class, such as __CLASS__. But now, in v2.0, the proxy class will keep the same structure with the original class, will not change the class name or the class structure.
    7. In v1.x, the proxy class will not re-generate when the proxy file exists even the code of the proxy class changed, this strategy will improve the time-consuming of scan, but at the same time, this will lead to a certain degree of development inconvenience. And now, in v2.0, the file cache of proxy class will generated according to the code content of the proxy class, this changes will reduces the mental burden of development.
    8. Add priority parameter for Aspect, now you could define priority in Aspect class by class property or annotation property, to manage the order of the aspects.
    9. In v1.x, you can only define an Aspect class by @Aspect annotation, you cannot define the Aspect class by configuration file. But now, in v2.0, it is available to define the Aspect class by configuration file or ConfigProvider.
    10. In v1.x, you have to add Hyperf\Di\Listener\LazyLoaderBootApplicationListener to enable lazy loading. In 2.0, lazy loading can be used directly. This listener is therefore removed.
    11. Added annotations.scan.class_map configuration, now you could replace any content of class dynamically above the autoload rules.

Dependencies Upgrade

  • Upgraded ext-swoole to >=4.5;
  • Upgraded psr/event-dispatcher to ^1.0;
  • Upgraded monolog/monolog to ^2.0;
  • Upgraded phpstan/phpstan to ^0.12.18;
  • Upgraded vlucas/phpdotenv to ^4.0;
  • Upgraded symfony/finder to ^5.0;
  • Upgraded symfony/event-dispatcher to ^5.0;
  • Upgraded symfony/console to ^5.0;
  • Upgraded symfony/property-access to ^5.0;
  • Upgraded symfony/serializer to ^5.0;
  • Upgraded elasticsearch/elasticsearch to ^7.0;

Removed

  • Removed Hyperf\Di\Aop\AstCollector;
  • Removed Hyperf\Di\Aop\ProxyClassNameVisitor;
  • Removed Hyperf\Di\Listener\LazyLoaderBootApplicationListener
  • Removed method dispatch(...$params) from Hyperf\Dispatcher\AbstractDispatcher
  • Removed mapping for Hyperf\Contract\NormalizerInterface => Hyperf\Utils\Serializer\SymfonyNormalizer from ConfigProvider in utils.

Added

  • #992 Added ReactiveX component.

  • #1245 Added Annotation ExceptionHandler.

  • #1245 Exception handler's config and annotation support priority.

  • #1819 Added hyperf/signal component.

  • #1844 Support type \DateInterval for ttl in model-cache.

  • #1855 Added ConstantFrequency to flush one connection, when it is idle connection for the interval of time.

  • #1871 Added sink for guzzle.

  • #1805 Added Coroutine Server.

    • Changed method bind(Server $server) to bind($server) in Hyperf\Contract\ProcessInterface.
    • Changed method isEnable() to isEnable($server) in Hyperf\Contract\ProcessInterface
    • Process of config-center, crontab, metric must not run in co-server.
    • Hyperf\AsyncQueue\Environment only applies to the current coroutine, not process.
    • Coroutine Server not support task.
  • #1877 Annotation Inject support typed properties. You can Inject below:

class Example {
    /**
    * @Inject
    */
    private ExampleService $exampleService;
}
  • #1890 Added Hyperf\HttpServer\ResponseEmitter class to emit any PSR-7 response object with Swoole server, and extracted Hyperf\Contract\ResponseEmitterInterface.
  • #1890 Added getTrailers() and getTrailer(string $key) and withTrailer(string $key, $value) methods for Hyperf\HttpMessage\Server\Response.
  • #1920 Added method Hyperf\WebSocketServer\Sender::close(int $fd, bool $reset = null).

Fixed

  • #1825 Fixed TypeError for StartServer::execute.
  • #1854 Fixed is_resource does not works when use Runtime::enableCoroutine() privately in filesystem.
  • #1900 Fixed caster decimal does not work.

Optimized

  • #705 Optimized Http Exception.
  • #1848 Auto generate rpc client code when server start and the interface is changed.
  • #1863 Support async-queue stop safely.
  • #1896 Keys will be merged when different constants use the same code.

Changed

  • #1846 Don't auto change the impl for Hyperf\Contract\NormalizerInterface when you require symfony/serialize. You can added dependiencies below to use symfony serializer.
use Hyperf\Utils\Serializer\SerializerFactory;
use Hyperf\Utils\Serializer\Serializer;

return [
    Hyperf\Contract\NormalizerInterface::class => new SerializerFactory(Serializer::class),
];

Removed

  • #1890 Removed Hyperf\Contract\Sendable interface and all implementations of it.
  • #1905 Removed config config/server.php, you can merge it into config/config.php.