Oct 9, 2011

Finck - малка php библиотека за уеб

Проблемът с php

През последните години имам все повече и повече забежки встрани от php. Дали ще е Python или Ruby, или пък ще се заигравам с Objective-C, истината е че лека по лека започвам да чувствам ограниченията на php. Като започнем от зле структурираната стандартна библиотека от функции, та стигнем до минималните възможности за метапрограмиране. Не ме разбирайте погрешно, харесвам и обичам php, просто ми липсва малко елегантност в писането на самия код. 

Има още едно нещо, което винаги ме е карало сам да си пиша нещата, а да не разчитам на готови библиотеки като CakePHP, Symfony, Zend и подобните им. PHP програмистите сякаш страдат от някакв java комплекс, бягат усилено от функционалното програмиране и се опитват да направят библиотеките си jack-of-all-trades. Е да, ама Jack of all trades често е master of none. Symfony е толкова тежка, генерира тонове файлове за нещо супер-елементарно, CakePHP не може да реши на php4 или php5 ще се базира, Zend пък живеят свой собствен модуларен филм. Те са чудесна отправна точка за начинаещия, но реално всеки трябва сам да помисли как да опрости собствените си проблеми. В един момент писането за тези мастодонти се превръща в тежка за поддръжка задача. Кодът е много, абстракциите - също, за много модули зависиш от външен фактор и в един момент за някой голям проект стигаш до заключението че тези неща са тежки, не само като линии код и брой файлове - те са тежки и за изпълнение от сървъра. Да, кеширането помага, но защо трябва да правим нещо, което после трябва да поправяме за да работи? 

Понеже съм голям привърженик на изчистените решения, нямаше как да не се влюбя от пръв поглед в Sinatra за Ruby, или Flask за Python. Чудесни библиотеки, позволяват ти по най-бързия начин да прихванеш заявката на потребителя, да я обработиш и да му пратиш отговор обратно. Не те натоварват с конвенции, директорийни структури, сложни конфигурации. Просто стреляш и то работи по най-бързия начин. Естествено си ограничен в много отношения, доста предположения, които фреймуърка прави вместо теб, тук отсъстват, но пък имаш и свободата да построиш къщата по какъвто начин решиш. Отговорна задача, но пък и забавна. Дали ще бъде барака, или мол - разполагаш с добра основа и от там нататъка градиш според собствените си нужди, предпочитания и умения. Да, умения - тук няма спомагателни колелета, всичко се случва заради теб, тъй че и грешките ти са много по-явни. За начинаещите това е малко стряскащо, не знаеш откъде да подхванеш, но пък с малко помощ от приятел можеш да започнеш да вървиш по пътя, по много практичен и интересен начин. 

Въпреки навлизането на cloud платформите и спада в цените на vps-хостингите, ruby и python си остават малко далечни за обикновенните хора. Лесно можеш да го подкараш у дома, но дойде ли време да хостваш - изборът ти е ограничен. Тук е и силата на php - утвърден е много добре, на споделен хостинг можеш да постигнеш много неща, не е нужно дори да бъркаш с ssh по машината. Поддръжката е добра, цените са ниски, ноу-хауто е налице. Та ми хрумна защо да не напиша нещо много мъничко, с ограничена стартова фунцкионалност, но големи възможности за разширяване по-натам в зависимост от задачата, която ще решава. Така се роди Finck

Кой е Robin Finck?

Robin FInck

Robin Finck е китаристът на Nine Inch Nails и Guns’n’Roses. Жесток пич. От младеж е запален ентусиаст-орнитолог. Крие се по храсти и скали и записва звуци от птици, а после се затваря в студиото и се опитва да ги имитира с китарата и ефектите си. Тотален експериментатор, който вместо по утъпканата рокендрол пътека поема по пътя на експеримента и така създава свои похвати и методи. Стори ми се удачен паралел да кръстя библиотеката точно така. 

Вижте Robin в действие :) http://vimeo.com/6276271



Какво предлага Finck?

  • Бърза настройка, защото няма настройка :) 
  • Лек и лесен за разбиране url dispatcher. Попаденията се отчитат с помоща на стандартни регулярни изрази. 
  • Липса на конвенции.

Независимо дали ще го ползвате за мини-сайт, форма за регистрации, или създаване на елементарен прототип - Finck си остава един-единствен неголям файл. От там нататък сте вие. 

Пример:

require_once 'finck.php';

$app = new \Finck\App();
$app->route('hello/(?P<name>\w+)', function ($request) {
    return "Hello, " . $request->params['name'];
});
$app->route('', function () {
    return "Welcome to our homepage! ";
}, 'homepage');

$app->dispatch();

Ето ви един Gist за по-шарен код: https://gist.github.com/1273548

Как да дефинирам URL ресурси?

Лесно. С вградената функция route($regex, $handler, $route_name). Тя приема три параметъра:

  1. Регулярен израз, който прихваща специфичния адрес.
  2. Handler. Това не знам как да го преведа адекватно на български, но тук се случва магията, за FInck този параметър носи следното значение: “какво да направя, ако хвана даден адрес”. Тук можете да поставите closure, или пък масив от името на класа и метода му, които трябва да бъдат извикани. По подразбиране първият параметър, който се предава, е обекта Request. Той съдържа прихванатите параметри, както и дава достъп до глобалната променлива $_REQUEST. Резултатът който предава нататък е пожелателно да бъде обикновен текстов низ. 

    Hint: можете да връщате резултата от функция, която обработва темплейт. 
  3. Име на пътеката - как ще се обръщате към този адрес по-нататък в кода си, например при сглобяването на адреси на линкове. Незадължителен параметър. 

Това е всичко. Разгледайте кода в Github, приемам всякаква критика и коментари. Нахвърлях това набързо, така че със сигурност има още какво да се желае или пооправи. 

Приятен hacking. Споделете в коментарите какво мислите, за какво бихте пробвали Finck? 

Blog comments powered by Disqus

About