The State of Lithium

3,193 views
3,065 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,193
On SlideShare
0
From Embeds
0
Number of Embeds
54
Actions
Shares
0
Downloads
18
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!

×