-
keulu
Amazing Member
-
Posts: 82
Threads: 8
Joined: Feb 2015
Reputation:
4
02-20-2019, 02:45 AM
(This post was last modified: 02-20-2019, 02:48 AM by keulu.)
Hi guys,
on alpha5, I don't think that the entities object is correctly populated.
If my model return an entity or an object and fill the entity.
No fields are casted
No fileds are datamaped
dates aren't muted to TimeObject
Maybe i don't understand something.
2 cases :
I request my model with an object and fill my entity :
$_options in my entity is ignored.
response from my controller :
Code: {
"success": true,
"message": "",
"data": {
"firstname": "Darth",
"lastname": "Vader",
"username": null,
"email": "[email protected]",
"created_at": "2019-02-08 12:27:42",
"deleted": "0"
}
}
If i add setter and getter like that in my entity
PHP Code: public function setCreatedAt(string $dateString) { $this->created_at = new Time($dateString, 'UTC');
return $this; }
public function getCreatedAt(string $format = 'Y-m-d H:i:s') { // Convert to CodeIgniter\I18n\Time object $this->created_at = $this->mutateDate($this->created_at);
$timezone = $this->timezone ?? app_timezone();
$this->created_at->setTimezone($timezone);
return $this->created_at->format($format); }
my controller return :
Code: {
"success": true,
"message": "",
"data": {
"firstname": "Darth",
"lastname": "Vader",
"username": null,
"email": "[email protected]",
"created_at": {
"date": "2019-02-08 12:27:42.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"deleted": "0"
}
}
OK : created_at is now muted to TimeObject
I request my model with entity in $returnType :
Only fileds are populated setter and getter are not interpreted and $_options is just ignored.
My files :
Models/UserModel.php
PHP Code: <?php namespace App\Models;
use CodeIgniter\Model;
class UserModel extends Model {
/** * Model Configuration */ protected $table = 'users'; protected $primaryKey = 'id'; protected $returnType = '\App\Entities\User'; protected $allowedFields = ['firstname', 'lastname', 'username', 'email', 'password'];
protected $useSoftDeletes = true; protected $dateFormat = 'datetime'; protected $useTimestamps = true;
protected $skipValidation = false; protected $validationRules = [ 'firstname' => 'required|min_length[3]', 'lastname' => 'required|min_length[3]', 'username' => 'required|alpha_numeric_space|min_length[3]', 'email' => 'required|valid_email|is_unique[users.email,id,{id}]', 'password' => 'required|min_length[8]', // 'password_confirm' => 'required_with[password]|matches[password]' // 'password_confirm' => 'matches[password]' ];
protected $validationMessages = [ 'email' => [ 'is_unique' => 'Sorry. That email has already been taken. Please choose another.' ] ];
protected $afterDelete = ['updateDeletedAt'];
/** * Protected & internals methods */
protected function updateDeletedAt(array $data) { if (! isset($data['id']) ) return $data;
$this->builder() ->whereIn('id', $data['id']) ->set(['deleted_at' => date('Y-m-d H:i:s')]) ->update();
return $data; } }
Entities/User.php
PHP Code: <?php namespace App\Entities;
use CodeIgniter\Entity;
class User extends Entity { protected $id; public $firstname; public $lastname; public $username; public $email; protected $password; public $created_at; protected $updated_at; public $deleted; protected $deleted_at;
protected $_options = [ 'datamap' => [ 'full_name' => 'username' ], 'dates' => ['created_at', 'updated_at', 'deleted_at'], 'casts' => [ 'deleted' => 'boolean' ], ];
public function setPassword(string $pass) { $this->password = password_hash($pass, PASSWORD_BCRYPT); return $this; }
}
Controller/Users.php
PHP Code: <?php namespace App\Controllers;
use CodeIgniter\Controller; use CodeIgniter\API\ResponseTrait;
use Restserver\Libraries\Format;
use App\Models\UserModel; use App\Entities\User;
class Users extends Controller {
/** * Entry point for users listing */ public function index() { $userModel = new UserModel(); $users = $userModel->findAll();
$data = [ 'success' => true, 'message' => '', 'data' => $users, ];
return $this->response->setStatusCode(Format::HTTP_OK)->setJSON($data); }
/** * Entry point for specific user */ public function show($id) { $userModel = new UserModel(); $user = $userModel->find($id); // $user->myDate = $user->created_at->humanize();
if ($user){ $data = [ 'success' => true, 'message' => '', 'data' => $user, ];
return $this->response->setStatusCode(Format::HTTP_OK)->setJSON($data); }else{ $data = [ 'success' => false, 'message' => 'user_not_found', 'data' => [] ];
return $this->response->setStatusCode(Format::HTTP_NOT_FOUND)->setJSON($data); }
}
/** * Entry point for user creation */ public function create() { $data = $this->request->getPost();
// var_dump($data);die;
$userModel = new UserModel(); $userEntity = new User();
if ($userEntity->fill($data)){ if ($userModel->save($userEntity) !== false){
$data = [ 'success' => true, 'message' => 'resources_created', 'data' => [], ];
return $this->response->setStatusCode(Format::HTTP_CREATED)->setJSON($data); }else{ $data = [ 'success' => false, 'message' => 'resources_not_created', 'data' => $userModel->errors(), ];
return $this->response->setStatusCode(Format::HTTP_NOT_ACCEPTABLE)->setJSON($data); } }else{ $data = [ 'success' => false, 'message' => 'resource_dont_match', 'data' => [], ];
return $this->response->setStatusCode(Format::HTTP_BAD_REQUEST)->setJSON($data); }
}
/** * Entry point for user update */ public function update($id) { $data = $this->request->getRawInput();
$userModel = new UserModel(); $userEntity = new User();
if ($userEntity->fill($data)){
if ($userModel->save($userEntity) !== false){ $data = [ 'success' => true, 'message' => 'resources_updated', 'data' => ['id' => $id], ];
return $this->response->setStatusCode(Format::HTTP_OK)->setJSON($data); }else{ $data = [ 'success' => false, 'message' => 'resource_not_updated', 'data' => $userModel->errors(), ];
return $this->response->setStatusCode(Format::HTTP_NOT_ACCEPTABLE)->setJSON($data); } }else{ $data = [ 'success' => false, 'message' => 'resource_dont_match', 'data' => [], ];
return $this->response->setStatusCode(Format::HTTP_BAD_REQUEST)->setJSON($data); } }
/** * Entry point for user delete */ public function delete($id) { $userModel = new UserModel();
if ($userModel->delete($id) !== false){ $data = [ 'success' => true, 'message' => 'resources_deleted', 'data' => ['id' => $id], ];
return $this->response->setStatusCode(Format::HTTP_OK)->setJSON($data); }else{ $data = [ 'success' => false, 'message' => 'resource_not_deleted', 'data' => [], ];
return $this->response->setStatusCode(Format::HTTP_NOT_ACCEPTABLE)->setJSON($data); } }
//-------------------------------------------------------------------- // End of file Users.php //-------------------------------------------------------------------- }
|