1. Go to this page and download the library: Download bit-mx/data-entities library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
namespace App\DataEntities;
use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\Method;
use BitMx\DataEntities\Enums\ResponseType;
use BitMx\DataEntities\Responses\Response;
use Illuminate\Support\Collection;
class GetAllPostsDataEntity extends DataEntity
{
protected ?ResponseType $responseType = ResponseType::SINGLE;
public function __construct(
protected int $authorId,
)
{
}
#[\Override]
public function resolveStoreProcedure(): string
{
return 'spListAllPost';
}
#[\Override]
public function defaultParameters(): array
{
return [
'author_id' => $this->authorId,
];
}
}
use App\DataEntities\GetAllPostsDataEntity;
$dataEntity = new GetAllPostsDataEntity(1);
$dataEntity->parameters()->add('tag', 'laravel');
namespace App\DataEntities;
use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\Method;
use BitMx\DataEntities\Enums\ResponseType;
class GetAllPostsDataEntity extends DataEntity
{
...
#[\Override]
public function resolveDatabaseConnection(): string
{
return 'sqlsrv';
}
}
use App\DataEntities\GetAllPostsDataEntity;
$dataEntity = new GetAllPostsDataEntity(1);
$response = $dataEntity->execute();
$data = $response->data();
namespace App\DataEntities;
use Carbon\Carbon;use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\Method;
use BitMx\DataEntities\Enums\ResponseType;
class GetAllPostsDataEntity extends DataEntity
{
...
#[\Override]
public function defaultParameters(): array
{
return [
'date' => Carbon::now(),
];
}
/**
* @return array<string, string>
*/
#[\Override]
protected function mutators(): array
{
return [
'date' => 'datetime:Y-m-d H:i',
];
}
}
namespace BitMx\DataEntities\Mutators;
use BitMx\DataEntities\Contracts\Mutable;
class CustomMutator implements Mutable
{
/**
* {@inheritDoc}
*/
public function transform(string $key, mixed $value, array $parameters): mixed
{
}
}
namespace App\DataEntities;
use Carbon\Carbon;use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\Method;
use BitMx\DataEntities\Enums\ResponseType;
class GetAllPostsDataEntity extends DataEntity
{
...
#[\Override]
public function defaultParameters(): array
{
return [
'date' => Carbon::now(),
];
}
/**
* @return array<string, string>
*/
#[\Override]
protected function accessors(): array
{
return [
'contact_id' => 'integer',
];
}
}
namespace BitMx\DataEntities\Accessors;
use BitMx\DataEntities\Contracts\Accessable;
class CustomAccessor implements Accessable
{
/**
* {@inheritDoc}
*/
public function get(string $key, mixed $value, array $data): mixed
{
}
}
$data = $response->data();
$data = $response->data('key');
$data = $response
->data('key', 'default value');
$response->addData('key', 'value');
$response->addData(['key' => 'value']);
$response->mergeData(['key' => 'value']);
$data = $response->object();
$data = $response->collect();
if ($response->success()) {
// The stored procedure was executed successfully
} else {
// There was an error executing the stored procedure
}
if ($response->failed()) {
// There was an error executing the stored procedure
} else {
// The stored procedure was executed successfully
}
$response->throw();
namespace App\DataEntities;
use BitMx\DataEntities\PendingQuery;
use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\Method;
use BitMx\DataEntities\Enums\ResponseType;
use BitMx\DataEntities\Responses\Response;
use Illuminate\Support\Collection;
class GetAllPostsDataEntity extends DataEntity
{
protected ?ResponseType $responseType = ResponseType::SINGLE;
...
#[\Override]
public function boot(PendingQuery $pendingQuery): void
{
$pendingQuery->parameters()->all('tag', 'laravel');
}
}
trait Taggable
{
public function bootTaggable(PendingQuery $pendingQuery): void
{
$pendingQuery->parameters()->add('tag', 'laravel');
}
}
namespace App\DataEntities;
use BitMx\DataEntities\PendingQuery;
use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\ResponseType;
use BitMx\DataEntities\Responses\Response;
use Illuminate\Support\Collection;
class GetAllPostsDataEntity extends DataEntity
{
protected ?ResponseType $responseType = ResponseType::SINGLE;
...
#[\Override]
public function boot(PendingQuery $pendingQuery): void
{
$pendingQuery->middleware()->onQuery(function (PendingQuery $pendingQuery) {
$pendingQuery->parameters()->add('tag', 'laravel');
});
$pendingQuery->middleware()->onResponse(function (Response $response) {
$response->addData('tag', 'laravel');
return $response;
});
}
}
use BitMx\DataEntities\Contracts\QueryMiddleware;
class PageMiddleware implements QueryMiddleware
{
public function __invoke(PendingQuery $pendingQuery): PendingQuery
{
$pendingQuery->parameters()->add('page', 1);
return $pendingQuery;
}
}
use BitMx\DataEntities\Contracts\ResponseMiddleware;
use BitMx\DataEntities\Responses\Response;
class TagMiddleware implements ResponseMiddleware
{
public function __invoke(Response $pendingQuery): Response
{
$response->addData('tag', 'laravel');
return $response;
}
}
namespace App\DataEntities;
use BitMx\DataEntities\PendingQuery;
use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\ResponseType;
use BitMx\DataEntities\Responses\Response;
use Illuminate\Support\Collection;
class GetAllPostsDataEntity extends DataEntity
{
protected ?ResponseType $responseType = ResponseType::SINGLE;
...
#[\Override]
public function boot(PendingQuery $pendingQuery): void
{
$pendingQuery->middleware()->onQuery(new PageMiddleware());
$pendingQuery->middleware()->onResponse(new TagMiddleware());
}
}
namespace App\DataEntities;
use BitMx\DataEntities\PendingQuery;
use BitMx\DataEntities\Plugins\AlwaysThrowOnError;
use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\Method;
use BitMx\DataEntities\Enums\ResponseType;
use BitMx\DataEntities\Responses\Response;
use Illuminate\Support\Collection;
class GetAllPostsDataEntity extends DataEntity
{
use AlwaysThrowOnError;
protected ?Method $method = Method::SELECT;
protected ?ResponseType $responseType = ResponseType::SINGLE;
...
}
namespace App\DataEntities;
use BitMx\DataEntities\Contracts\Cacheable;
use BitMx\DataEntities\PendingQuery;
use BitMx\DataEntities\Plugins\AlwaysThrowOnError;
use BitMx\DataEntities\Plugins\HasCache;use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\Method;
use BitMx\DataEntities\Enums\ResponseType;
use BitMx\DataEntities\Responses\Response;
use Illuminate\Support\Collection;
class GetAllPostsDataEntity extends DataEntity implements Cacheable
{
use HasCache;
protected ?ResponseType $responseType = ResponseType::SINGLE;
...
public function cacheExpiresAt(): \DateTimeInterface {
return now()->addMinutes(10);
}
}
use App\DataEntities\GetPostDataEntity;
$dataEntity = new GetPostDataEntity(1);
$post = $response->invalidateCache();
$response = $dataEntity->execute();
use App\DataEntities\GetPostDataEntity;
$dataEntity = new GetPostDataEntity(1);
$post = $response->disableCaching();
$response = $dataEntity->execute();
use App\DataEntities\GetPostDataEntity;
$dataEntity = new GetPostDataEntity(1);
$post = $response->disableCaching();
$response = $dataEntity->execute();
$response->isCached(); //
namespace App\Data;
class PostDat
{
public function __construct(
public int $id,
public string $title,
public string $content,
)
{
}
}
namespace App\DataEntities;
use DataEntities\DataEntity;
use BitMx\DataEntities\Enums\Method;
use BitMx\DataEntities\Enums\ResponseType;
use BitMx\DataEntities\Responses\Response;
use Illuminate\Support\Collection;
use App\Data\PostData;
class GetPostDataEntity extends DataEntity
{
protected ?Method $method = Method::SELECT;
protected ?ResponseType $responseType = ResponseType::SINGLE;
public function __construct(
protected int $postId,
)
{
}
#[\Override]
public function resolveStoreProcedure(): string
{
return 'spListPost';
}
#[\Override]
public function defaultParameters(): array
{
return [
'post_is' => $this->postId,
];
}
public function createDtoFromResponse(Response $response): PostData
{
$data = $response->getData();
return new PostData(
id: $data['id'],
title: $data['title'],
content: $data['content'],
);
}
}
use App\DataEntities\GetPostDataEntity;
$dataEntity = new GetPostDataEntity(1);
$response = $dataEntity->execute();
/** @var PostData $post */
$post = $response->dto();
use App\DataEntities\GetPostDataEntity;
$dataEntity = new GetPostDataEntity(1);
$dataEntity->dd();
$dataEntity->ddRaw();
use App\DataEntities\GetPostDataEntity;
use BitMx\DataEntities\DataEntity;
use BitMx\DataEntities\Responses\MockResponse;
it('should get the post', function () {
DataEntity::fake([
GetPostDataEntity::class => MockResponse::make([
'id' => 1,
'title' => 'Post title',
'content' => 'Post content',
]),
]);
$dataEntity = new GetPostDataEntity(1);
$response = $dataEntity->execute();
$post = $response->dto();
expect($post->id)->toBe(1);
expect($post->title)->toBe('Post title');
expect($post->content)->toBe('Post content');
});
use App\DataEntities\GetPostDataEntity;
use BitMx\DataEntities\DataEntity;
use BitMx\DataEntities\Responses\MockResponse;
it('should get the post', function () {
DataEntity::fake([
GetPostDataEntity::class => MockResponse::make([
'id' => 1,
'title' => 'Post title',
'content' => 'Post content',
]),
]);
$dataEntity = new GetPostDataEntity(1);
$response = $dataEntity->execute();
$post = $response->dto();
DataEntity::assertExecuted(GetPostDataEntity::class);
});
namespace Tests\DataEntityFactories;
use BitMx\DataEntities\Factories\DataEntityFactory;
class PostDataEntityFactory extends DataEntityFactory
{
/**
* {@inheritDoc}
*/
public function definition(): array
{
return [
'id' => $this->faker->unique()->randomNumber(),
'title' => $this->faker->sentence(),
'content' => $this->faker->paragraph(),
];
}
}
use App\DataEntities\GetPostDataEntity;
use Tests\DataEntityFactories\PostDataEntityFactory;
use BitMx\DataEntities\Responses\MockResponse;
it('should get the post', function () {
$dataEntity = MockResponse::make(PostDataEntityFactory::new());
$response = $dataEntity->execute();
$post = $response->dto();
expect($post->id)->toBe(1);
expect($post->title)->toBe('Post title');
expect($post->content)->toBe('Post content');
});
use App\DataEntities\GetPostDataEntity;
use Tests\DataEntityFactories\PostDataEntityFactory;
use BitMx\DataEntities\Responses\MockResponse;
it('should get the post', function () {
$dataEntity = MockResponse::make(PostDataEntityFactory::new()->create());
$response = $dataEntity->execute();
$post = $response->dto();
expect($post->id)->toBe(1);
expect($post->title)->toBe('Post title');
expect($post->content)->toBe('Post content');
});
use App\DataEntities\GetPostDataEntity;
use Tests\DataEntityFactories\PostDataEntityFactory;
use BitMx\DataEntities\Responses\MockResponse;
it('should get the post', function () {
$dataEntity = MockResponse::make(PostDataEntityFactory::new()->count(10));
$response = $dataEntity->execute();
$posts = $response->dto();
expect($posts)->toHaveCount(10);
});
use App\DataEntities\GetPostDataEntity;
use Tests\DataEntityFactories\PostDataEntityFactory;
use BitMx\DataEntities\Responses\MockResponse;
it('should get the post', function () {
$dataEntity = MockResponse::make(PostDataEntityFactory::new()->state([
'title' => 'Custom title',
]));
$response = $dataEntity->execute();
$post = $response->dto();
expect($post->title)->toBe('Custom title');
});
namespace Tests\DataEntityFactories;
use BitMx\DataEntities\Factories\DataEntityFactory;
class PostDataEntityFactory extends DataEntityFactory
{
/**
* {@inheritDoc}
*/
public function definition(): array
{
return [
'id' => $this->faker->unique()->randomNumber(),
'title' => $this->faker->sentence(),
'content' => $this->faker->paragraph(),
];
}
public function withPublishedDate(array $state): DataEntityFactory
{
return $this->state([
'published_date' => now(),
]);
}
}
use App\DataEntities\GetPostDataEntity;
use Tests\DataEntityFactories\PostDataEntityFactory;
use BitMx\DataEntities\Responses\MockResponse;
it('should get the post', function () {
$dataEntity = MockResponse::make(PostDataEntityFactory::new()->withPublishedDate());
$response = $dataEntity->execute();
$post = $response->dto();
expect($post->published_date)->toBe(now());
});
use App\DataEntities\GetPostDataEntity;
use Tests\DataEntityFactories\PostDataEntityFactory;
use BitMx\DataEntities\Responses\MockResponse;
it('should get the post', function () {
$dataEntity = MockResponse::makeWithException(new \Exception('Error'));
$response = $dataEntity->execute();
})
->throws(\Exception::class, 'Error');
namespace Tests\DataEntityFactories;
use BitMx\DataEntities\Enums\ResponseType;use BitMx\DataEntities\Factories\DataEntityFactory;
class PostDataEntityFactory extends DataEntityFactory
{
/**
* {@inheritDoc}
*/
public function definition(): array
{
return [
'id' => $this->faker->unique()->randomNumber(),
'title' => $this->faker->sentence(),
'content' => $this->faker->paragraph(),
];
}
public function responseType() : ResponseType{
return ResponseType::COLLECTION;
}
}
use App\DataEntities\GetPostDataEntity;
use Tests\DataEntityFactories\PostDataEntityFactory;
use BitMx\DataEntities\Responses\MockResponse;
it('should get the post', function () {
$dataEntity = MockResponse::make(PostDataEntityFactory::new()->asCollection());
$response = $dataEntity->execute();
....
});