The State of Lithium

3,425 views

Published on

An update on the state of the Lithium PHP framework, given at the inaugural Lithium NYC meetup, Feb. 7th, 2012.

Published in: Technology
1 Comment
3 Likes
Statistics
Notes
No Downloads
Views
Total views
3,425
On SlideShare
0
From Embeds
0
Number of Embeds
47
Actions
Shares
0
Downloads
19
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide

The State of Lithium

  1. 1. THE STATE OF LITHIUMli3_nyc::init() // 2012-02-07
  2. 2. SPONSORS
  3. 3. AGENDA• State of the framework• New features• Upcoming features• Community plugins• Library management & The Lab• Tips & tricks• Q&A / Demos!
  4. 4. STATE OF THE FRAMEWORK
  5. 5. PROJECT & COMMUNITY STATS• ~130 plugin repositories on GitHub• 350+ commits from 40+ contributors since 0.10• 60+ commits to the manual since 0.10• Closed 250+ issues since moving to GitHub• 175 pull requests submitted since moving to GitHub
  6. 6. ROADMAP PROGRESS• Cookie signing / encryption• CSRF protection• Error Handling• Manual / automatic SQL result mapping• Relationship support
  7. 7. NEW FEATURES
  8. 8. ENCRYPT & SIGN COOKIESSession::config(array(default => array( adapter => Cookie, strategies => array( Hmac => array(secret => $f00bar$), Encrypt => array(secret => $f00bar$) ))));
  9. 9. NEST ROUTESRouter::connect("/admin/{:args}", array(admin => true), array( continue => true));Router::connect("/{:locale:en|de|jp}/{:args}", array(), array( continue => true));Router::connect("/{:args}.{:type}", array(), array( continue => true));
  10. 10. HANDLE ERRORS$method = array(Connections::get(default), read);ErrorHandler::apply($method, array(), function($error, $params) { $queryParams = json_encode($params[query]); $msg = "Query error: {$error[message]}"; Logger::warning("{$msg}, data: {$queryParams}"); return new DocumentSet();});
  11. 11. PROTECT FORMS<?=$this->form->create(); ?> <?=$this->security->requestToken(); ?> <?=$this->form->field(title); ?> <?=$this->form->submit(Submit); ?><?=$this->form->end(); ?>public function add() { if ( $this->request->data && !RequestToken::check($this->request) ) { // Badness!! }}
  12. 12. UPCOMING FEATURES
  13. 13. HTTP SERVICE CLASSES$http = new Http(array( ... methods => array( do => array(method => post, path => /do) ))); POST /do HTTP/1.1$response = $http->do(new Query(array( … data => array(title => sup)))); title=sup// var_dump($response->data());
  14. 14. FILTER / SORT COLLECTIONS$users->find(array("type" => "author"))->sort("name");$users->first(array("name" => "Nate"));
  15. 15. MULTIBYTE CLASS• Supports mbstring, intl, iconv & (womp, womp) plain PHP• Only one method right now: strlen()• More would be good… open a pull request
  16. 16. SCHEMA CLASS• Arbitrary data types• Arbitrary handlers• Example: hash modified passwords before writing• Other example: JSON en/decode arbitrary data for MySQL
  17. 17. PLUGINS
  18. 18. LI3_DOCTRINE2 Connections::add(default, array( type => Doctrine,• Works with Lithium stuff: driver => pdo_mysql, host => localhost, user => root, • Connections password => password, dbname => my_db )); • Authentication /** * @Entity * @Table(name="users") • Forms */ class User extends li3_doctrine2modelsBaseEntity { /** * @Id • Sessions * @GeneratedValue * @Column(type="integer") */ private $id; • Validation /** * @Column(type="string",unique=true) */ private $email; ... }
  19. 19. LI3_FILESYSTEMuse li3_filesystemstorageFileSystem;FileSystem::config(array( default => array( adapter => File ), ftp => array( adapter => Stream, wrapper => ftp, path => user:password@example.com/pub/ }));FileSystem::write(default, /path/to/file, $data);
  20. 20. LI3_ACCESSAccess::config(array( asset => array( adapter => Rules, allowAny => true, default => array(isPublic, isOwner, isParticipant), user => function() { return Accounts::current(); }, rules => array( isPublic => function($user, $asset, $options) { ... }, isOwner => function($user, $asset, $options) { ... }, isParticipant => function($user, $asset, $options) { ... } ) ) ...);
  21. 21. LI3_ACCESSAccess::config(array( ... action => array( adapter => Rules, default => array(isPublic, isAuthenticated), allowAny => true, user => function() { return Accounts::current(); }, rules => array( isPublic => function($user, $request, array $options) { ... }, isAuthenticated => function($user, $request, array $options) { ... }, isAdmin => function($user, $asset, $options) { ... } ) ));
  22. 22. LI3_ACCESSDispatcher::applyFilter(_call, function($self, $params, $chain) { $opts = $params[params]; $request = $params[request]; $ctrl = $params[callable]; if ($access = Access::check(action, null, $ctrl, $opts)) { // Reject } if ($access = Access::check(action, null, $ctrl, array(rules => isAdmin) + $opts)) { // Reject } return $chain->next($self, $params, $chain);});class PostsController extends Base { public $publicActions = array(index, view);}
  23. 23. http://bit.ly/li3plugins
  24. 24. THE LAB
  25. 25. TIPS & TRICKS
  26. 26. RETURN ON REDIRECTclass PostsController extends Base { public function view($post) { if (!$post) { $this->redirect("Posts::index"); } // Herp derp }}
  27. 27. FAT FILTERS == BADDispatcher::applyFilter(run, function($self, $params, $chain) { // Herp // Derp // Herp // Derp // Herp // Derp // Herp // Derp // Herp // Derp // Herp (repeat x100)});
  28. 28. DEFINE YOUR SCHEMA!{ count: 5, ...}...{ count: "5", ...}
  29. 29. DON’T FEAR THE SUBCLASSclass Base extends lithiumdataModel { public function save($entity, $data = null, array $options = array()) { if ($data) { $entity->set($data); } if (!$entity->exists()) { $entity->created = new MongoDate(); } $entity->updated = new MongoDate(); return parent::save($entity, null, $options); }}class Posts extends Base { ...}
  30. 30. QUICK & DIRTY ADMINDispatcher::config(array(rules => array( admin => array( action => admin_{:action} )))); class PostsController extends Base {Router::connect( public function admin_index() { /admin/{:args}, ... array(admin => true), } array(continue => true)); public function index() { ... } }
  31. 31. Q&A / DEMOS
  32. 32. THANKS!

×