Recommend this page to a friend! |
Download |
Info | Documentation | Files | Install with Composer | Download | Reputation | Support forum | Blog | Links |
Ratings | Unique User Downloads | Download Rankings | ||||
Not enough user ratings | Total: 71 | All time: 10,269 This week: 560 |
Version | License | PHP version | Categories | |||
presento 1.0 | MIT/X Consortium ... | 7 | Tools, Data types, PHP 7 |
A data preparing and presenting package for PHP.
Presento is a simple but powerful tools for preparing and presenting data. When we build an API based application, we need to _transform_ the data before _present_ it through the response. This package will make this task easier for you.
Not clear enough?
Don't worry, you'll get better idea from the Usage examples.
PHP >= 7.0
ext-json
Install the package using composer:
composer require nahid/presento
Presento serves two important purposes. one is Presentation and another is Transformation of the data.
Let's see some examples to understand how to use it.
We'll use the following data set to show the examples. Let's say we've this data set fetched from some data source and need to do some transformation or modifications before sending it to the response.
$response = [
"id" => 123456,
"name" => "Nahid Bin Azhar",
"email" => "talk@nahid.im",
"type" => 1,
"is_active" => 1,
"created_at" => "2018-01-02 02:03:04",
"updated_at" => "2018-01-02 02:03:04",
"deleted_at" => "2018-01-02 02:03:04",
"projects" => [
[
"id" => 1,
"name" => "Laravel Talk",
"url" => "https://github.com/nahid/talk",
"license" => "CC0",
"created_at" => "2016-02-02 02:03:04"
],
[
"id" => 2,
"name" => "JsonQ",
"url" => "https://github.com/nahid/jsonq",
"license" => "MIT",
"created_at" => "2018-01-02 02:03:04"
]
]
];
When sending this data to the API response, we only want to send the id
, name
, email
, type
, is_active
and projects
.
We can simply do that by preparing a Presenter for this like following.
// UserPresenter.php
class UserPresenter extends \Nahid\Presento\Presenter
{
public function present() : array
{
return [
'id',
'name',
'email',
'type',
'is_active',
'projects',
];
}
}
And you might already guessed how to use it, right?
$user = new UserPresenter($response);
dump($user->get());
It'd show something like this:
[
"id" => 123456,
"name" => "Nahid Bin Azhar",
"email" => "talk@nahid.im",
"type" => 1,
"is_active" => 1,
"projects" => [
[
"id" => 1,
"name" => "Laravel Talk",
"url" => "https://github.com/nahid/talk",
"license" => "CC0",
"created_at" => "2016-02-02 02:03:04"
],
[
"id" => 2,
"name" => "JsonQ",
"url" => "https://github.com/nahid/jsonq",
"license" => "MIT",
"created_at" => "2018-01-02 02:03:04"
]
]
]
Pretty simple, right?
Let's say you want to change some of the 'key' to something different, like the id
key to user_id
.
How can you do that?
Just do the following.
// UserPresenter.php
class UserPresenter extends \Nahid\Presento\Presenter
{
public function present() : array
{
return [
'user_id' => 'id',
'name',
'email',
'type',
'is_active',
];
}
}
This will format the data like following:
[
"user_id" => 123456,
"name" => "Nahid Bin Azhar",
"email" => "talk@nahid.im",
"type" => 1,
"is_active" => 1,
]
You can easily dive deep and get data from a nested level by using .
(dot) notation.
Let's say you want to show the name
of the first package as the top_package
in your data.
This is how you do it.
// UserPresenter.php
class UserPresenter extends \Nahid\Presento\Presenter
{
public function present() : array
{
return [
'id',
'name',
'email',
'type',
'is_active',
'top_package' => 'projects.0.name',
'projects',
];
}
}
This will format the data like this:
[
"id" => 123456,
"name" => "Nahid Bin Azhar",
"email" => "talk@nahid.im",
"type" => 1,
"is_active" => 1,
"top_package" => "Laravel Talk",
"projects" => [
[
"id" => 1,
"name" => "Laravel Talk",
"url" => "https://github.com/nahid/talk",
"license" => "CC0",
"created_at" => "2016-02-02 02:03:04"
],
[
"id" => 2,
"name" => "JsonQ",
"url" => "https://github.com/nahid/jsonq",
"license" => "MIT",
"created_at" => "2018-01-02 02:03:04"
]
]
]
Notice the top_package
key in the data.
Let's say our UserPresenter is like this:
// UserPresenter.php
class UserPresenter extends \Nahid\Presento\Presenter
{
public function present() : array
{
return [
'user_id' => 'id',
'name',
'email',
'type',
'is_active',
];
}
}
And we want to show the user_id
as _hashed_ value instead of an incremental integer value as it is in our database. That means we want to transform the user_id
.
To do that we need to create a Transformer Class like this:
// UserTransformer.php
class UserTransformer extends \Nahid\Presento\Transformer
{
public function getUserIdProperty($value)
{
return md5($value);
}
}
Notice that, as we will transform the user_id
property, we named our transformer method as getUserIdProperty
. So, if you want to transform the name
property too, you need to just create another method in this class named getNameProperty
and add the transformation logic inside it.
Now, we need to let know the _Presenter_ how to _Transform_ the data before presenting it.
To do that, we need to add the following method in the UserPresenter
class.
// UserPresenter.php
public function transformer()
{
return UserTransformer::class;
}
So, our final output would be:
[
"user_id" => "e10adc3949ba59abbe56e057f20f883e",
"name" => "Nahid Bin Azhar",
"email" => "talk@nahid.im",
"type" => 1,
"is_active" => 1,
]
Ain't it easy, mate?
You might notice that there is a collection of projects
in our data set. If each project
is a separate resource, you might have a separate Presenter for that. Like this:
// ProjectPresenter.php
class ProjectPresenter extends \Nahid\Presento\Presenter
{
public function present() : array
{
return [
'id',
'name',
'url',
'license',
'created_at',
];
}
public function transformer()
{
return ProjectTransformer::class;
}
}
Can you use this Presenter for each of the projects
in the _Users_ data?
Hell Yeah! Just do this:
// UserPresenter.php
public function present() : array
{
return [
'user_id' => 'id',
'name',
'email',
'type',
'is_active',
'projects' => [ProjectPresenter::class => ['projects']],
];
}
Now, each of the project
in the list of projects
in _Users_ will be presented as defined in the ProjectPresenter
.
As you have seen that, the data set we have used till now is a plain _Array_. But some times it might not be the case. You might need to work with something different, like Eloquent Model of Laravel framework.
In that case, you can simply add a method called convert
in your _Presenter_ to convert the Base data to an Array format.
Let's see an Example:
// UserPresenter.php
public function convert($data)
{
if ($data instanceof Model) {
return $data->toArray();
}
return $data;
}
That's it.
Files (9) |
File | Role | Description | ||
---|---|---|---|---|
helpers (1 file) | ||||
src (2 files, 1 directory) | ||||
tests (2 files) | ||||
composer.json | Data | Auxiliary data | ||
phpunit.xml | Data | Auxiliary data | ||
README.md | Doc. | Documentation |
Files (9) | / | src |
File | Role | Description | ||
---|---|---|---|---|
Exceptions (1 file) | ||||
Presenter.php | Class | Class source | ||
Transformer.php | Class | Class source |
Files (9) | / | src | / | Exceptions |
File | Role | Description |
---|---|---|
BadPropertyTransfo...MethodException.php | Class | Class source |
Files (9) | / | tests |
File | Role | Description |
---|---|---|
HelpersTest.php | Class | Class source |
PresenterTest.php | Class | Class source |
The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page. |
Install with Composer |
Version Control | Unique User Downloads | Download Rankings | |||||||||||||||
100% |
|
|
Applications that use this package |
If you know an application of this package, send a message to the author to add a link here.