Тут така справа, зароджується ще один фреймверк, і думаю багатьох він зацікавить, бо легковагих фреймверков під PHP 5.4 не так вже й багато 🙂

Чому народжується новий «велосипед» — так старий вже ж не в пору і скрипить

Щоб не гортати весь пост, ось вам посилання на GitHub — https://github.com/bluzphp

У чому його зручність

По-перше, слідування заповітам usability коду, за чим я намагався стежити.
По-друге, це відмова від будь-яких сумісності зі старими версіями PHP (застарів, давай, до побачення).
По-третє, цей фреймверк створюється як і годиться — виходячи з вимог проекту, тобто він вирощений не штучно під гаслами «шоб було», а під реальні завдання, які з’являлися в проекті

Особливості

Оскільки фреймверк створювався під потреби проекту, то саме цим фактором зумовлена більшість прийнятих рішень. Зокрема досить специфічний ACL, так і прикручений twitter bootstrap з коробки теж оттель.

Так само нагадую, що даний фреймверк почав прокльовується ще рік тому в одному высокогонагруженном проекті, і про нього я ще розповім на ThinkPHP 😉

Так що ж всередині? А всередині все танцює від Application, який відповідає трохи менше, ніж за все і з десяток пакетів, які забезпечують комфортну і швидку розробку додатків

MVC

Куди вже без нього, але в нашій реалізації є військова хитрість, от наприклад контролер:

user = $app->getDb()->fetchObject(
“SELECT * FROM users WHERE id = ?”,
array($id),
‘Users\Row’);
};

Без паніки, так action не передбачено, лише модулі та контролери-замикання, і так — це спрощує розробку. Уважний читач вже помітить як контролер «ловить» вхідні параметри, і що у нього виявляється вже є кешування, і описана якась привілей — так, все це працює, як і замислювалося 😉

Йдемо далі, можливо ви вже знаєте, що я прихильник нативних шаблонизаторов, тому і в даному фремверке використовується такий же:

return
/**
* @var Bluz\View $view
* @return closure
*/
function() use ($view) {
$view->title = “Hello world”
};

Власне код шаблону:

title?>

Всякі дрібні фішки по роботі з шаблонизатором описані у відповідному розділі wiki

База даних

Для роботи з базою даних передбачений пакет Db (оригінально то як), він включає в себе Db\Db Db\Table і Db\Row. Клас Db представляє з себе лише обгортку над PDO, і злегка спрощує нам життя:

setConnect(array(
‘type’ => ‘mysql’,
‘host’ => ‘localhost’,
‘name’ => ‘db name’,
‘user’ => ‘root’,
‘pass’ =>”
));
// quote variable
$db->quote($id)
// query
$db->query(“SET NAMES ‘utf8′”);
// get one
$db->fetchOne(“SELECT COUNT(*) FROM users”);
// get row
$db->fetchRow(“SELECT * FROM users WHERE id = :id”, array(‘:id’=>$id));
// get array
$db->fetchAll(“SELECT * FROM users WHERE ip = ?”, array($ip));
// get pairs
$pairs = $db->fetchPairs(“SELECT ip, COUNT(id) FROM users GROUP BY ip”, array());
// get object
// .. to stdClass
$stdClass = $db->fetchObject(‘SELECT * FROM some_table WHERE id = ?’, array($id));
// .. to Some new object
$someClass = $db->fetchObject(‘SELECT * FROM some_table WHERE id = ?’, array($id), ‘Some’);
// .. to exists instance of Some object
$someClass = $db->fetchObject(‘SELECT * FROM some_table WHERE id = ?’, array($id, $someClass);
// plain insert/update/delete
$db->insert(‘some_table’, array(‘col1’=>’foo’, ‘col2’=>’bar’));
$db->update(‘some_table’, array(‘col1’=>’bar’, ‘col2’=>’foo’), array(‘id’=>1));
$db->delete(‘some_table’, array(‘id’=>1));

Про транзакції теж не забув, ось приклад контролера:

if ($this->getDb()->transaction(function() {
/**
* @var \Bluz\Application $this
*/
$this->getDb()->delete(‘acl_privileges’);
})) {
$this->getMessages()->addSuccess(‘All data was saved’);
} else {
$this->getMessages()->addError(‘Internal server error’);
}

Класи Table Row це якась подоба active record:

created = gmdate(‘Y-m-d H:i:s’);
}
public function preUpdate()
{
$this->updated = gmdate(‘Y-m-d H:i:s’);
}
}
$userRow = new \Application\Users\Row();
$userRow -> login = ‘username’;
$userRow -> save();

Роутери

Прості до неподобства, вказуються безпосередньо в коментарях контролера:

/**
* @route /users/{$id}
* @param integer $id
*/

При використання не вимагають явного вказівки імені (привіт ZF):

url(‘users’, ‘login’);
$this->url(‘users’, ‘profile’, array(‘id’ => $id));
$this->url(‘pages’, ‘show’, array(‘name’ => $name));
?>

Звичайно, подібна реалізація не без недоліків, але таки цілком юзабельно, і під стати фремверку.

Ще

Є ще пачка пакетів, мабуть варто привести їх список:

  • Acl — дозволяє швидко і гнучко організувати роздачу прав
  • Cache — дуже проста обгортка над memcached
  • EventManager — події та їх обробники
  • Registry — тут без коментарів
  • Request — об’єкт запиту, сам по собі використовується рідко
  • Session — лише обгортка

Висновки

Я звичайно не сподіваюся, що ви приєднаєтеся до розробки, але я щиро вірю, що вам знадобиться сам фреймверк, можливо його код або ідеї з нього 🙂

Якщо цікаво — приєднуйтесь до Skype чату 😉