Muszę to napisać – to niezwykłe być dzisiaj deweloperem języka PHP. Dlaczego? Każdego dnia na światło dzienne wychodzi bardzo dużo użytecznych bibliotek i narzędzi, które usprawniają oraz przyspieszają naszą pracę. W dobie Composera oraz Githuba ich odkrycie nie jest już trudnym zadaniem.
Dzisiejszy wpis będzie właśnie o takich bibliotekach. Poniżej przedstawiam listę 24 narzędzi, które powinniście poznać. Jeżeli uważacie, że powinienem dodać do tej listy coś jeszcze, to dajcie oczywiście znać w komentarzach pod wpisem.
Dispatch – Micro Framework
Dispatch jest mini frameworkiem. Nie udostępnia on pełnej struktury MVC, ale daje możliwość tworzenia reguł URL oraz lepszą organizację naszej aplikacji. Nadaje się świetnie do prostych projektów oraz API.
// include the library
include 'dispatch.php';
// define your routes
get('/greet', function () {
// render a view
render('greet-form');
});
// post handler
post('/greet', function () {
$name = from($_POST, 'name');
// render a view while passing some locals
render('greet-show', array('name' => $name));
});
// serve your site
dispatch();
Klein – Lightning fast router for PHP
Klein (PHP 5.3+) jest kolejną biblioteką, która pozwala tworzyć routing URL w prosty i przyjemny sposób. Ma ona bardziej specyficzną składnię niżeli Dispatch, ale jest też bardzo szybka.
respond('GET', '/posts', $callback);
respond('POST', '/posts/create', $callback);
respond('PUT', '/posts/[i:id]', $callback);
respond('DELETE', '/posts/[i:id]', $callback);
// To match multiple request methods:
respond(array('POST','GET'), $route, $callback);
// Or you might want to handle the requests in the same place
respond('/posts/[create|edit:action]?/[i:id]?', function ($request, $response) {
switch ($request->action) {
// do something
}
});
Ham – Routing Library with Caching
Ham, to kolejny lekki sposób na definicję naszych URL, ale daje nam coś jeszcze. Wykorzystuje on mechanizm XCache oraz APC do cachowania, co pozwala na znacznie szybsze działanie całości.
require '../ham/ham.php';
$app = new Ham('example');
$app->config_from_file('settings.php');
$app->route('/pork', function($app) {
return "Delicious pork.";
});
$hello = function($app, $name='world') {
return $app->render('hello.html', array(
'name' => $name
));
};
$app->route('/hello/<string>', $hello);
$app->route('/', $hello);
$app->run();
Assetic – Asset Management
Assetic jest biblioteką do zarządzania dodatkowymi komponentami. Pozwala na łączenie oraz minimalizację skryptów JavaScript oraz arkuszy CSS. Zmniejsza tym samym ilość zapytań generowanych do serwera oraz redukuje ilość przesyłanych danych do klienta.
use Assetic\\Asset\\AssetCollection;
use Assetic\\Asset\\FileAsset;
use Assetic\\Asset\\GlobAsset;
$js = new AssetCollection(array(
new GlobAsset('/path/to/js/*'),
new FileAsset('/path/to/another.js'),
));
// the code is merged when the asset is dumped
echo $js->dump();
ImageWorkshop – Image Manipulation with Layers
ImageWorkshop – biblioteka Open Source do manipulacji obrazkami na warstwach. Pozwala zmieniać rozmiar obrazków, przycinać, tworzyć miniatury, dodawać znaki wodne i wiele wiele więcej. Jest to nieco lżejsza wersja biblioteki Imagine.
// We initialize the norway layer from the picture norway.jpg
$norwayLayer = ImageWorkshop::initFromPath('/path/to/images/norway.jpg');
// We initialize the watermark layer from the picture watermark.png
$watermarkLayer = ImageWorkshop::initFromPath('/path/to/images/watermark.png');
$image = $norwayLayer->getResult(); // This is the generated image !
header('Content-type: image/jpeg');
imagejpeg($image, null, 95); // We choose to show a JPG with a quality of 95%
exit;
Snappy – Snapshot/PDF Library
Snappy pozwoli nam na stworzenie snapshotów z dokumentów PDF, HTML, czy nawet bezpośrednio z adresu URL. Biblioteka wykorzystuje wkhtmltopdf, które dostępne jest na Linuxa, Windowsa oraz OSX.
require_once '/path/to/snappy/src/autoload.php';
use Knp\\Snappy\\Pdf;
// Initialize the library with the
// path to the wkhtmltopdf binary:
$snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
// Display the resulting pdf in the browser
// by setting the Content-type header to pdf:
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="file.pdf"');
echo $snappy->getOutput('http://www.github.com');
Idiorm – Lightweight ORM Library
Idiorm to lekka biblioteka ORM. W sposób obiektowy pozwala ona tworzyć zapytania języka SQL bazując na PDO.
$user = ORM::for_table('user')
->where_equal('username', 'j4mie')
->find_one();
$user->first_name = 'Jamie';
$user->save();
$tweets = ORM::for_table('tweet')
->select('tweet.*')
->join('user', array(
'user.id', '=', 'tweet.user_id'
))
->where_equal('user.username', 'j4mie')
->find_many();
foreach ($tweets as $tweet) {
echo $tweet->text;
}
Underscore – PHP’s Utility Belt
Underscore to odpowiednik Underscore.js dla jezyka PHP. Biblioteka w zasadzie w 100% pokrywa się z oryginałem z języka JavaScript. Jest to rozwinięcie składni języka o nowe funkcje, które pozwalają manipulować danymi. Są to funkcje znane i zaczerpnięte z języków funkcyjnych, takich jak na przykład Scala, czy Python.
__::each(array(1, 2, 3), function($num) { echo $num . ','; }); // 1,2,3,
$multiplier = 2;
__::each(array(1, 2, 3), function($num, $index) use ($multiplier) {
echo $index . '=' . ($num * $multiplier) . ',';
});
// prints: 0=2,1=4,2=6,
__::reduce(array(1, 2, 3), function($memo, $num) { return $memo + $num; }, 0); // 6
__::find(array(1, 2, 3, 4), function($num) { return $num % 2 === 0; }); // 2
__::filter(array(1, 2, 3, 4), function($num) { return $num % 2 === 0; }); // array(2, 4)
Requests – Easy HTTP Requests
Requests to tak naprawdę nakładka na cURL pozwalająca wykonywać zapytania HTTP bezpośrednio w języku PHP.
$headers = array('Accept' => 'application/json');
$options = array('auth' => array('user', 'pass'));
$request = Requests::get('https://api.github.com/gists', $headers, $options);
var_dump($request->status_code);
// int(200)
var_dump($request->headers['content-type']);
// string(31) "application/json; charset=utf-8"
var_dump($request->body);
// string(26891) "[…]"
Buzz – Simple HTTP Request Library
Buzz – kolejna biblioteka PHP do wykonywania zapytań HTTP, będąca tym samym nakładką na cURL. Korzystam z niej często w różnych projektach, ale ostatnio coraz częściej wykorzystuję Guzzle.
$request = new Buzz\\Message\\Request('HEAD', '/', 'http://google.com');
$response = new Buzz\\Message\\Response();
$client = new Buzz\\Client\\FileGetContents();
$client->send($request, $response);
echo $request;
echo $response;
Goutte – Web Scraping Library
Goutte – biblioteka, która pozwala pobierać konkretne elementy z innych stron. Posiada API, które daje nam metody do pobierania konkretnych danych. Spójrzcie na przykład poniżej.
require_once '/path/to/goutte.phar';
use Goutte\\Client;
$client = new Client();
$crawler = $client->request('GET', 'http://www.symfony-project.org/');
// Click on links:
$link = $crawler->selectLink('Plugins')->link();
$crawler = $client->click($link);
// Extract data with a CSS-like syntax:
$t = $crawler->filter('#data')->text();
echo "Here is the text: $t";
Carbon – DateTime Library
Carbon jest API, a zarazem rozszerzeniem dla DateTime. Biblioteka udostępnia szereg nowych metod do operowania na obiektach daty i czasu. Istnieje jeszcze ‚fork’ projektu na Githubie, który wydaje się być bardziej i częściej rozwijany niż sam pierwowzór – Datum.
printf("Right now is %s", Carbon::now()->toDateTimeString());
printf("Right now in Vancouver is %s", Carbon::now('America/Vancouver'));
$tomorrow = Carbon::now()->addDay();
$lastWeek = Carbon::now()->subWeek();
$nextSummerOlympics = Carbon::createFromDate(2012)->addYears(4);
$officialDate = Carbon::now()->toRFC2822String();
$howOldAmI = Carbon::createFromDate(1975, 5, 21)->age;
$noonTodayLondonTime = Carbon::createFromTime(12, 0, 0, 'Europe/London');
$endOfWorld = Carbon::createFromDate(2012, 12, 21, 'GMT');
// comparisons are always done in UTC
if (Carbon::now()->gte($endOfWorld)) {
die();
}
if (Carbon::now()->isWeekend()) {
echo 'Party!';
}
echo Carbon::now()->subMinutes(2)->diffForHumans(); // '2 minutes ago'
Ubench – Micro Benchmarking Library
Ubench to mikro framework do przeprowadzania testów wydajnościowych w naszym kodzie PHP. Pozwala monitorować zużycie pamięci oraz czas wykonania.
use Ubench\\Ubench;
$bench = new Ubench;
$bench->start();
// Execute some code
$bench->end();
// Get elapsed time and memory
echo $bench->getTime(); // 156ms or 1.123s
echo $bench->getTime(true); // elapsed microtime in float
echo $bench->getTime(false, '%d%s'); // 156ms or 1s
echo $bench->getMemoryPeak(); // 152B or 90.00Kb or 15.23Mb
echo $bench->getMemoryPeak(true); // memory peak in bytes
echo $bench->getMemoryPeak(false, '%.3f%s'); // 152B or 90.152Kb or 15.234Mb
// Returns the memory usage at the end mark
echo $bench->getMemoryUsage(); // 152B or 90.00Kb or 15.23Mb
Validation – Input Validation Engine
Validation – chyba najlepsza i najbardziej kompleksowa biblioteka do walidacji danych w języku PHP. Zresztą spójrzcie sami na przykład:
use Respect\\Validation\\Validator as v;
// Simple Validation
$number = 123;
v::numeric()->validate($number); //true
// Chained Validation
$usernameValidator = v::alnum()->noWhitespace()->length(1,15);
$usernameValidator->validate('alganet'); //true
// Validating Object Attributes
$user = new stdClass;
$user->name = 'Alexandre';
$user->birthdate = '1987-07-01';
// Validate its attributes in a single chain:
$userValidator = v::attribute('name', v::string()->length(1,32))
->attribute('birthdate', v::date()->minimumAge(18));
$userValidator->validate($user); //true
Filterus – Filtering Library
Filterus jest kolejną biblioteką do walidacji danych, ale pozwala wyłącznie na.. walidację danych i ich filtrację.
$f = Filter::factory('string,max:5');
$str = 'This is a test string';
$f->validate($str); // false
$f->filter($str); // 'This '
Faker – Fake Data Generator
Faker pozwala na generowanie przykładowych danych na potrzeby naszych projektów. Wykorzystany może być na przykład do wypełnienia naszej bazy danych przykładowymi danymi.
// require the Faker autoloader
require_once '/path/to/Faker/src/autoload.php';
// use the factory to create a Faker\Generator instance
$faker = Faker\\Factory::create();
// generate data by accessing properties
echo $faker->name; // 'Lucy Cechtelar';
echo $faker->address;
// "426 Jordy Lodge
// Cartwrightshire, SC 88120-6700"
echo $faker->text;
// Sint velit eveniet. Rerum atque repellat voluptatem quia ...
Mustache.php – Elegant Templating Library
Mustache, to popularny silnik do tworzenia szablonów. Wyobraźcie sobie Smarty lub Twig, ale w nieco lżejszej formie.
$m = new Mustache_Engine;
echo $m->render('Hello {{planet}}', array('planet' => 'World!')); // "Hello World!"
Gaufrette – File System Abstraction Layer
Gaufrette, to pewien sposób abstrakcyjna warstwa do operowania naszym systemem plików. Pozwala na pracę z lokalnymi plikami, serwerami FTP, a nawet chmurą Amazon S3. Uwalnia pisanie projektów od niskopoziomowego myślenia w tym obszarze. Udostępnia także mechanizmy cachowania z wykorzystaniem pamięci.
use Gaufrette\\Filesystem;
use Gaufrette\\Adapter\\Ftp as FtpAdapter;
use Gaufrette\\Adapter\\Local as LocalAdapter;
// Local files:
$adapter = new LocalAdapter('/var/media');
// Optionally use an FTP adapter:
// $ftp = new FtpAdapter($path, $host, $username, $password, $port);
// Initialize the filesystem:
$filesystem = new Filesystem($adapter);
// Use it:
$content = $filesystem->read('myFile');
$content = 'Hello I am the new content';
$filesystem->write('myFile', $content);
Omnipay – Payment Processing Library
Omnipay jest biblioteką, która jest w zasadzie klientem dla wielu systemów płatności. Wykorzystuje ona API udostępniane przez dostawców usług płatności by dać nam jednolity interfejs.
use Omnipay\\CreditCard;
use Omnipay\\GatewayFactory;
$gateway = GatewayFactory::create('Stripe');
$gateway->setApiKey('abc123');
$formData = ['number' => '4111111111111111', 'expiryMonth' => 6, 'expiryYear' => 2016];
$response = $gateway->purchase(['amount' => 1000, 'card' => $formData]);
if ($response->isSuccessful()) {
// payment was successful: update database
print_r($response);
} elseif ($response->isRedirect()) {
// redirect to offsite payment gateway
$response->redirect();
} else {
// payment failed: display message to customer
exit($response->getMessage());
}
Upload – For Handling File Uploads
Upload, to biblioteka, która – jak nie trudno się domyślić po nazwie – upraszcza ‚upload’ plików na serwer wraz z walidacją przesyłanych danych.
$storage = new \\Upload\\Storage\\FileSystem('/path/to/directory');
$file = new \\Upload\\File('foo', $storage);
// Validate file upload
$file->addValidations(array(
// Ensure file is of type "image/png"
new \\Upload\\Validation\\Mimetype('image/png'),
// Ensure file is no larger than 5M (use "B", "K", M", or "G")
new \\Upload\\Validation\\Size('5M')
));
// Try to upload file
try {
// Success!
$file->upload();
} catch (\Exception $e) {
// Fail!
$errors = $file->getErrors();
}
HTMLPurifier – HTML XSS Protection
HTMLPurifier, to biblioteka, która ochronić ma nas przed atakami typu XSS. Zapewnia ochronę poprzez filtrację przesyłanych danych z użyciem parserów oraz zdefiniowanych list szkodliwych wywołań.
require_once '/path/to/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
ColorJizz-PHP – Color Manipulation Library
ColorJizz pozwala nam na przechodzenie pomiędzy różnymi formatami reprezentacji poszczególnych kolorów. Hex -> CMYK przestaje być już problemem i vice versa.
use MischiefCollective\\ColorJizz\\Formats\\Hex;
$red_hex = new Hex(0xFF0000);
$red_cmyk = $hex->toCMYK();
echo $red_cmyk; // 0,1,1,0
echo Hex::fromString('red')->hue(-20)->greyscale(); // 555555
PHP Geo – Geo Location Library
PHP Geo, to biblioteka pozwalająca na obliczanie odległości pomiędzy dwoma punktami na mapie z bardzo dużą precyzją.
use Location\\Coordinate;
use Location\\Distance\\Vincenty;
$coordinate1 = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit
$coordinate2 = new Coordinate(20.709722, -156.253333); // Haleakala Summit
$calculator = new Vincenty();
$distance = $calculator->getDistance($coordinate1, $coordinate2);
// returns 128130.850 (meters; ≈128 kilometers)
ShellWrap – Beautiful Shell Wrapper
ShellWrap, to biblioteka będąca nakładką na komendy w systemie Linux / Unix. Pozwala ona na ich bezpośrednie wykonanie oraz pobranie rezultatu w kodzie PHP.
require 'ShellWrap.php';
use \\MrRio\\ShellWrap as sh;
// List all files in current dir
echo sh::ls();
// Checkout a branch in git
sh::git('checkout', 'master');
// You can also pipe the output of one command, into another
// This downloads example.com through cURL, follows location, then pipes through grep to
// filter for 'html'
echo sh::grep('html', sh::curl('http://example.com', array(
'location' => true
)));
// Touch a file to create it
sh::touch('file.html');
// Remove file
sh::rm('file.html');
// Remove file again (this fails, and throws an exception because the file doesn't exist)
try {
sh::rm('file.html');
} catch (Exception $e) {
echo 'Caught failing sh::rm() call';
}