eonx-com / easy-utils
EonX packages utils
Installs: 826 092
Dependents: 18
Suggesters: 0
Security: 0
Stars: 1
Watchers: 4
Forks: 0
Open Issues: 0
Requires
- php: ^8.2
- ext-bcmath: *
- ext-ctype: *
- ext-filter: *
- symfony/config: ^7.1
- symfony/dependency-injection: ^7.1
- symfony/http-kernel: ^7.1
- symfony/string: ^7.1
Requires (Dev)
- eonx-com/easy-test: ^6.4
- laravel/lumen-framework: ^11.0
- mockery/mockery: ^1.6
- phpunit/phpunit: ^10.2
- symfony/serializer: ^7.1
- symfony/validator: ^7.1.5
Suggests
- ext-iconv: To support CSV parsing
- ext-mbstring: To support sensitive data sanitization
- symfony/framework-bundle: To use Symfony Framework integration
- symfony/serializer: To use custom normalizers
- symfony/translation: To use Symfony Translator integration
- symfony/validator: To support custom constraints
- 6.x-dev
- dev-master / 6.5.x-dev
- 6.4.0
- 6.3.2
- 6.3.1
- 6.3.0
- 6.2.0
- 6.1.0
- 6.0.3
- 6.0.2
- 6.0.1
- 6.0.0
- 6.0.0-rc.1
- 6.0.0-alpha.5
- 6.0.0-alpha.4
- 6.0.0-alpha.3
- 6.0.0-alpha.2
- 6.0.0-alpha
- 5.13.2
- 5.13.1
- 5.13.0
- 5.12.1
- 5.12.0
- 5.11.3
- 5.11.2
- 5.11.1
- 5.11.0
- 5.10.5
- 5.10.4
- 5.10.3
- 5.10.2
- 5.10.1
- 5.10.0
- 5.9.3
- 5.9.2
- 5.9.1
- 5.9.0
- 5.8.0
- 5.7.5
- 5.7.4
- 5.7.3
- 5.7.2
- 5.7.1
- 5.7.0
- 5.6.16
- 5.6.15
- 5.6.14
- 5.6.13
- 5.6.12
- 5.6.11
- 5.6.10
- 5.6.9
- 5.6.8
- 5.6.7
- 5.6.6
- 5.6.5
- 5.6.4
- 5.6.3
- 5.6.2
- 5.6.1
- 5.6.0
- 5.5.0
- 5.4.0
- 5.3.2
- 5.3.1
- 5.3.0
- 5.2.2
- 5.2.1
- 5.2.0
- 5.1.7
- 5.1.6
- 5.1.5
- 5.1.4
- 5.1.3
- 5.1.2
- 5.1.1
- 5.1.0
- 5.0.3
- 5.0.2
- 5.0.1
- 5.0.0
- 4.x-dev
- 4.5.6
- 4.5.5
- 4.5.4
- 4.5.3
- 4.5.1
- 4.5.0
- 4.4.5
- 4.4.4
- 4.4.3
- 4.4.2
- 4.4.1
- 4.4.0
- 4.3.38
- 4.3.37
- 4.3.36
- 4.3.35
- 4.3.34
- 4.3.33
- 4.3.32
- 4.3.31
- 4.3.30
- 4.3.29
- 4.3.28
- 4.3.27
- 4.3.26
- 4.3.25
- 4.3.24
- 4.3.23
- 4.3.22
- 4.3.21
- 4.3.20
- 4.3.19
- 4.3.18
- 4.3.17
- 4.3.16
- 4.3.15
- 4.3.14
- 4.3.13
- 4.3.12
- 4.3.11
- 4.3.10
- 4.3.9
- 4.3.8
- 4.3.7
- 4.3.6
- 4.3.5
- 4.3.4
- 4.3.3
- 4.3.2
- 4.3.1
- 4.3.0
- 4.2.7
- 4.2.6
- 4.2.5
- 4.2.4
- 4.2.3
- 4.2.2
- 4.2.1
- 4.2.0
- 4.1.42
- 4.1.41
- 4.1.40
- 4.1.39
- 4.1.38
- 4.1.37
- 4.1.36
- 4.1.35
- 4.1.34
- 4.1.33
- 4.1.32
- 4.1.31
- 4.1.30
- 4.1.29
- 4.1.28
- 4.1.27
- 4.1.26
- 4.1.25
- 4.1.24
- 4.1.23
- 4.1.22
- 4.1.21
- 4.1.20
- 4.1.19
- 4.1.18
- 4.1.17
- 4.1.16
- 4.1.15
- 4.1.14
- 4.1.13
- 4.1.12
- 4.1.11
- 4.1.10
- 4.1.9
- 4.1.8
- 4.1.7
- 4.1.6
- 4.1.5
- 4.1.4
- 4.1.3
- 4.1.2
- 4.1.1
- 4.1.0
- 4.1.0-rc1
- 4.0.15
- 4.0.14
- 4.0.13
- 4.0.12
- 4.0.11
- 4.0.10
- 4.0.9
- 4.0.8
- 4.0.7
- 4.0.6
- 4.0.5
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 3.x-dev
- 3.4.29
- 3.4.28
- 3.4.27
- 3.4.26
- 3.4.25
- 3.4.24
- 3.4.24-beta1
- 3.4.23
- 3.4.22
- 3.4.21
- 3.4.20
- 3.4.19
- 3.4.18
- 3.4.17
- 3.4.16
- 3.4.15
- 3.4.14
- 3.4.13
- 3.4.12
- 3.4.11
- 3.4.10
- 3.4.9
- 3.4.8
- 3.4.7
- 3.4.6
- 3.4.5
- 3.4.4
- 3.4.3
- 3.4.2
- 3.4.1
- 3.4.0
- 3.3.15
- 3.3.14
- 3.3.13
- 3.3.12
- 3.3.11
- 3.3.10
- 3.3.9
- 3.3.8
- 3.3.7
- 3.3.6
- 3.3.5
- 3.3.4
- 3.3.3
- 3.3.2
- 3.3.1
- 3.3.0
- 3.2.14
- 3.2.13
- 3.2.12
- 3.2.11
- 3.2.10
- 3.2.9
- 3.2.8
- 3.2.7
- 3.2.6
- 3.2.5
- 3.2.4
- 3.2.3
- 3.2.2
- 3.2.1
- 3.2.0
- 3.2.0-alpha4
- 3.2.0-alpha3
- 3.2.0-alpha2
- 3.2.0-alpha1
- 3.1.9
- 3.1.8
- 3.1.7
- 3.1.6
- 3.1.5
- 3.1.5-alpha8
- 3.1.5-alpha7
- 3.1.5-alpha6
- 3.1.5-alpha5
- 3.1.5-alpha4
- 3.1.5-alpha3
- 3.1.5-alpha2
- 3.1.5-alpha1
- 3.1.4
- 3.1.3
- 3.1.2
- 3.1.2-alpha4
- 3.1.2-alpha3
- 3.1.2-alpha2
- 3.1.2-alpha1
- 3.1.1
- 3.1.1-alpha2
- 3.1.1-alpha1
- 3.1.0
- 3.1.0-rc2
- 3.1.0-rc1
- 3.0.30
- 3.0.29
- 3.0.28
- 3.0.27
- 3.0.26
- 3.0.25
- 3.0.24
- 3.0.23
- 3.0.22
- 3.0.21
- 3.0.20
- 3.0.19
- 3.0.18
- 3.0.17
- 3.0.16
- 3.0.15
- 3.0.14
- 3.0.14-alpha3
- 3.0.14-alpha2
- 3.0.14-alpha1
- 3.0.13
- 3.0.12
- 3.0.11
- 3.0.10
- 3.0.9
- 3.0.8
- 3.0.7
- 3.0.6
- 3.0.5
- 3.0.5-alpha4
- 3.0.5-alpha3
- 3.0.5-alpha2
- 3.0.5-alpha1
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 3.0.0-alpha2
- 3.0.0-alpha1
- 2.5.33
- 2.5.32
- 2.5.31
- 2.5.30
- 2.5.29
- 2.5.28
- 2.5.27
- v2.5.26
- dev-feature/swoole-error-response
- dev-hotfix/swoole-pdo-client-pool-own-implementation
- dev-np/investigate-swoole-errors-in-aws
- dev-feature/git-subtree-for-split-1
- dev-feature/git-subtree-for-split
- dev-feature/easy-async-refactor
- dev-3.x-split-test
This package is auto-updated.
Last update: 2024-11-20 14:38:13 UTC
README
---eonx_docs--- title: Introduction weight: 0 ---eonx_docs---
EasyUtils
This package provides helper classes.
Require package (Composer)
The recommended way to install this package is to use Composer:
$ composer require eonx-com/easy-utils
Helper list
CollectorHelper
: provides methods to facilitate implementation of the Collector Design PatternMath
: provides methods to facilitate numbers manipulation
CollectorHelper
The Collector Design Pattern is a great method for keeping your code SOLID. However, using it in multiple parts of
your project can lead to significant repetition. The main purpose of the CollectorHelper
is to prevent duplicated code
and facilitate implementation of the Collector Design Pattern in your project.
Most popular PHP frameworks provide features to tag services, and then define all services for a specific tag as dependencies to other services. See the following resources for examples:
Those features help you implement the Collector Design Pattern in your project because they allow you to easily inject a collection of services sharing the same tag into other services.
However, there are some things you need to consider:
- There is no guarantee that all given services are instances of a specific class/interface
- You have no control on the order the services are organised within the given collection
Let's elaborate on the above points.
No guarantee on the content of tagged services
The service tagging features do not allow you to ensure all services sharing the same tag meet common criteria. Symfony has a feature to automatically tag services based on their class, but nothing stops you from manually tagging a service with the same tag or even one of your dependencies.
This is why we strongly recommend you always filter the given iterable
of services by a given class/interface of your
choice by using the filterByClass()
or filterByClassAsArray()
methods of the CollectorHelper
.
No control on the order the services are organised
When using service tagging features, you can control the order that the services are organised by simply changing the
order in which you define the services. However, as above, there is nothing stopping you or one of your dependencies
from tagging a service with the same tag. Therefore, you cannot guarantee the order as you cannot modify the
dependencies' service definitions. But the CollectorHelper
can help us!
In some cases, the order of the given services does not matter, so there is no need to do anything. But if your logic
requires the services be used in a specific order, then use the orderHigherPriorityFirst()
and/or
orderLowerPriorityFirst()
methods!
These methods will sort the objects within the given iterable
based on their priority. In order to define an object's
priority, it must implement the EonX\EasyUtils\Common\Helper\HasPriorityInterface
provided by this package. If an object
doesn't implement this interface then its priority will default to 0
automatically.
CollectorHelper::convertToArray()
The convertToArray()
method will convert any iterable to a simple PHP array. It is useful when you want to use array
methods on an iterable
.
For a simple example of when to use the convertToArray()
method, imagine you have a class which accepts an iterable
of "workers" in its constructor. To safely use these "workers", you want to ensure each of them implements the right
interface, so you filter them to keep only the "good workers" by using the array_filter()
function. If the "workers"
were already an array
, then there would be no problem. However, because they are defined as iterable
, you cannot
guarantee you will receive an array
. So use the convertToArray()
method!
use App\Domain\WorkerInterface; use EonX\EasyUtils\Common\Helper\CollectorHelper; final class MyClass { /** * @var \App\Domain\WorkerInterface[] */ private array $workers; public function __construct(iterable $workers) { // $workers could be any type of iterable, convert it to array $workers = CollectorHelper::convertToArray($workers); // Now we are sure $workers is an array, we can use array_filter() $workers = \array_filter($workers, static function ($worker): bool { return $worker instanceof WorkerInterface; }); // $workers is now an array of WorkerInterface for sure $this->workers = $workers; } }
CollectorHelper::filterByClass()
The use case of filtering by class (used above to explain the convertToArray()
method) is very common (at least in our
projects 😃 ), which is why CollectorHelper
provides the filterByClass()
method to do it for you.
The following example is the same as for the convertToArray()
method above. If you have an iterable
and you want to
ensure each item is an instance of a specific class/interface, use the filterByClass()
method!
use App\Domain\WorkerInterface; use EonX\EasyUtils\Common\Helper\CollectorHelper; final class MyClass { /** * @var iterable<\App\Domain\WorkerInterface> */ private array $workers; public function __construct(iterable $workers) { // $workers now contains only WorkerInterface instances $workers = CollectorHelper::filterByClass($workers, WorkerInterface::class); // The filterByClass() method still returns an iterable, a generator more precisely // If you need an array, you can use the filterByClassAsArray() method $this->workers = $workers; } }
::: tip
The filterByClass()
method still returns an iterable (or, more precisely, a generator). If you need an array
, you
can use the filterByClassAsArray()
method instead.
:::
CollectorHelper::filterByClassAsArray()
This method is similar to the filterByClass()
method, but with a little tweak. If you have an iterable
and you want
to make sure each item is an instance of a specific class/interface, but you need the output to be an array
, use the
filterByClassAsArray()
method!
use App\Domain\WorkerInterface; use EonX\EasyUtils\Common\Helper\CollectorHelper; final class MyClass { /** * @var \App\Domain\WorkerInterface[] */ private array $workers; public function __construct(iterable $workers) { // $workers now contains only WorkerInterface instances $workers = CollectorHelper::filterByClassAsArray($workers, WorkerInterface::class); // $workers is now an array containing only WorkerInterface instances $this->workers = $workers; } }
CollectorHelper::ensureClass() and CollectorHelper::ensureClassAsArray()
Those methods are similar to the filterByClass()
and filterByClassAsArray()
methods, however they will throw an
exception if at least of the items is not an instance of the given class.
use App\Domain\WorkerInterface; use EonX\EasyUtils\Common\Helper\CollectorHelper; final class MyClass { /** * @var \App\Domain\WorkerInterface[] */ private array $workers; public function __construct(iterable $workers) { // $workers now contains only WorkerInterface instances $workers = CollectorHelper::ensureClass(WorkerInterface::class, $workers); foreach ($workers as $worker) { // This code will be executed only if all items are instances of WorkerInterface } } }
::: warning
Please note that with the ensureClass()
method, the exception will be thrown only when iterating through the generator.
:::
CollectorHelper::orderHigherPriorityFirst()
The orderHigherPriorityFirst()
method will ensure the object with the highest priority is placed first, and the object
with the lowest priority is placed last.
In order to define an object's priority, it must implement the EonX\EasyUtils\Common\Helper\HasPriorityInterface
provided
by this package. If an object doesn't implement this interface then its priority will default to 0
automatically.
// Foo and Bar both implement EonX\EasyUtils\Common\Helper\HasPriorityInterface $foo = new Foo(); // Has a priority of 10 $bar = new Bar(); // Has a priority of 100 // $foo is added to the array first, and $bar second $objects = [$foo, $bar]; // $bar is now first as it has a higher priority than $foo $objects = CollectorHelper::orderHigherPriorityFirst($objects); // [$bar, $foo]
::: tip
The orderHigherPriorityFirst()
method still returns an iterable (or, more precisely, a generator). If you need an array
, you
can use the orderHigherPriorityFirstAsArray()
method instead.
:::
CollectorHelper::orderLowerPriorityFirst()
The orderLowerPriorityFirst()
method is the opposite of orderHigherPriorityFirst()
. It will ensure the object with
the lowest priority is placed first, and the object with the highest priority is placed last.
In order to define an object's priority, it must implement the EonX\EasyUtils\Common\Helper\HasPriorityInterface
provided
by this package. If an object doesn't implement this interface then its priority will default to 0
automatically.
// Foo and Bar both implement EonX\EasyUtils\Common\Helper\HasPriorityInterface $foo = new Foo(); // Has a priority of 10 $bar = new Bar(); // Has a priority of 100 // $foo is added to the array first, and $bar second $objects = [$foo, $bar]; // $foo is still first as it has a lower priority than $bar $objects = CollectorHelper::orderLowerPriorityFirst($objects); // [$foo, $bar]
::: tip
The orderLowerPriorityFirst()
method still returns an iterable (or, more precisely, a generator). If you need an array
, you
can use the orderLowerPriorityFirstAsArray()
method instead.
:::
Math
The Math helper provides the following methods:
abs:
returns the absolute value for the given numberadd:
adds two numbers and returns the resultcomp:
compares two numbersdivide:
divides one number by the other and returns the resultmultiply:
multiplies one number by the other and returns the resultround:
rounds the given number and returns the resultsub:
subs tow numbers and returns the result