So ... I've decided to write my own ORM like library (using my style weirdnesses
It's still an alpha version, so I'll not provide the code (which will happen after I have the first RC ready in "Coding critique"). Instead I'll provide you its usage.
First my example domain object:
Code: Select all
<?php
/**
* @orm-table user
* @orm-storage XML
*
* @orm_storage-file ./data/db.xml
* @orm_storage-encoding UTF-8
*/
class User
{
/**
* @orm-column id
* @orm-type int
* @orm-length 11
* @orm-primary-key
* @orm-autoincrement
*/
public $user_id;
/**
* @orm-column fk_id
* @orm-type int
* @orm-length 11
* @orm-primary-key
* @orm-autoincrement
*/
public $friend_id;
/**
* @orm-column username
* @orm-type char
* @orm-length 32
*/
public $user_username;
/**
* @orm-column userpass
* @orm-type char
* @orm-length 32
*/
public $user_password;
/**
* @orm-column salt
* @orm-type char
* @orm-length 2
*/
public $salt = null;
/**
* @orm-column secret
* @orm-type char
* @orm-length 20
*/
public $secret = '';
/**
* @orm-column usermap
* @orm-type char
* @orm-length 32
* @orm-nullable
*/
public function map()
{
return 'map';
}
/**
* @return string Salt'n'pepper password
* @orm-mutator user_password
* @orm-mutator-mode write
*/
public function saltAndPepper()
{
return $this->user_password.$this->user_username.$this->salt;
}
/**
* @return string Encrypted secret
* @orm-mutator secret
* @orm-mutator-mode write
*/
public function encrypt()
{
return $this->secret.'encrypted';
}
/**
* @return string Decrypted secret
* @orm-mutator secret
* @orm-mutator-mode read
*/
public function decrypt()
{
return substr($this->secret, 0, -strlen('encrypted'));
}
public function __construct()
{
$this->salt = rand(10,99);
}
}Next my index.php:
Code: Select all
require_once 'Doconfigurable.php';
require_once('ORM.php');
require_once 'User.php';
$user1 = new User();
$user1->user_username = 'username1';
$user1->user_password = 'password1';
$user1->secret = 'secret1!';
$user2 = new User();
$user2->user_username = 'username2';
$user2->user_password = 'password2';
$user2->secret = 'secret2!';
// Insert
ORM::save($user1);
ORM::save($user2);
// If the object has a complete PK field set
//ORM::delete($user1);
//
//$user1->user_username = 'username3';
////Update
//ORM::save($user1);
//
//$user3 = new User();
//$user3->id = 2;
//$user3->friend_id = 2;
//$user3 = ORM::load($user3);
$rows = ORM::collection('User')->get();
print_r($rows);Code: Select all
Array
(
[0] => User Object
(
[user_id] => 1
[friend_id] => 1
[user_username] => username1
[user_password] => password1username149
[salt] => 49
[secret] => secret1!
[map] => map
)
[1] => User Object
(
[user_id] => 2
[friend_id] => 2
[user_username] => username2
[user_password] => password2username214
[salt] => 14
[secret] => secret2!
[map] => map
)
)Code: Select all
<?xml version="1.0" encoding="UTF-8"?><db> <users id="3" fk_id="3"> <user id="1" fk_id="1"> <username>username1</username> <userpass>password1username149</userpass> <salt>49</salt> <secret>secret1!encrypted</secret> <usermap>map</usermap> </user> <user id="2" fk_id="2"> <username>username2</username> <userpass>password2username214</userpass> <salt>14</salt> <secret>secret2!encrypted</secret> <usermap>map</usermap> </user> </users></db>Thoughts?
PS:
Some of the features:
- composite primary keys allowed;
- autoincrement columns allowed (should be a PK);
- not nullable fields restrictions;
- type/length validation;
- possible to have an SQL "storage";
TODO:
- foreign keys and constraints;
- collection filters;