Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
New in CakePHP 3
March 22, 2015
3.0.0 is released
Frequent Releases
Bugfixes every 2-4 weeks
PHP 5.4 +
Soon to be PHP 5.5+
All the PSRs
Zero through Four
Clean up
Rabid conventions removed.
Standalone
Components
We have a few.
I18n
// Message formatting
echo __("Hello, my name is {0}, I'm {1} years old",
['Sara', 12]);
>>> Hello, my name is Sara, I’m 1...
echo __('{0,plural,
=0{No records found}
=1{Found 1 record}
other{Found # records}}',
[1]);
>>> Found 1 record
// Simpler ...
msgid "One file removed"
msgid_plural "{0} files removed"
msgstr[0] "jednom datotekom je uklonjen"
msgstr[1] "{0} datoteke...
use CakeI18nTime;
use CakeI18nNumber;
$date = new Time('2015-04-05 23:00:00');
echo $date;
>>> 05/04/2015 23:00
echo Numbe...
Locale::setDefault(‘fr-FR’);
$date = new Time('2015-04-05 23:00:00');
echo $date;
>>> 5 avril 2015 23:00:00 UTC
echo Numbe...
Use Alone
Use the i18n libs anywhere with composer.
Routing
Router::scope(‘/u‘, function ($routes) {
$routes->connect(‘/name/:username’, [‘controller’ => ‘Users’, ’action’ => ‘show’]...
// Classic array format.
echo $this->Url->build([
‘controller’ => ‘Users’,
‘action’ => ‘show’,
‘username’ => ‘thewoz’
]);
...
Router::scope(‘/u‘, function ($routes) {
// Explicit name
$routes->connect(‘/friends’, [‘controller’ => ‘Friends’], [‘_nam...
Router::scope('/', function ($routes) {
$routes->extensions(['json']);
$routes->resources('Articles');
});
>>> /articles a...
Collections
Jose Lorenzo
Rodriguez
Iterator Master
Immutable
Mutator methods make new collections.
$items = ['a' => 1, 'b' => 2, 'c' => 3];
$collection = new Collection($items);
// Create a new collection containing eleme...
$people = new Collection($peopleData);
// Find all the non-blondes
$notBlond = $people->reject(function ($p) {
return $p->...
class JoseFinder {
public function __invoke($person) {
return strtolower($person->first_name) === ‘jose’;
}
}
$joses = $pe...
Use Alone
Collections can be used in any project.
ORM
It is not 2005
anymore
ActiveRecord Datamapper
// Get a table gateway/mapper.
$connection = ConnectionManager::get(‘default’);
$articles = new ArticlesTable([‘connection...
// Find articles and eager load relations (1 query)
$query = $articles->find()
->contain([‘Authors’, ‘Categories’]);
// Lo...
// Find all the articles tagged with ‘Cat’
$query = $articles->find()->matching(‘Tags’, function ($q) {
return $q->where([...
// Do extraction and transformations
$result = $articles->find()
->all()
->extract(‘title’)
->map(function ($item) { retur...
Entities
Just vanilla PHP objects for the most part.
namespace AppModelEntity;
use CakeORMEntity;
class Article extends Entity
{
protected $_accessible = [‘title’, ‘body’, ‘au...
namespace AppModelEntity;
use CakeORMEntity;
class User extends Entity
{
protected function _getFullName()
{
return $this-...
Inspired By
SQLAlchemy
The best ORM I’ve ever used.
No Proxies,
No Annotations,
No Identity Map,
No Runtime Reflection
No Lazy Loading
Use alone
Use the ORM anywhere with composer.
What’s Next?
What’s Next
• New DateTime library, replacing Carbon
• Polymorphic Associations
• PSR7 Support
• Value Objects
Thank You.
https://joind.in/14774
Twitter - mark_story
Github - markstory
New in cakephp3
Upcoming SlideShare
Loading in …5
×

New in cakephp3

1,503 views

Published on

A talk given at php[world] 2015 on what's new in CakePHP 3.0

Published in: Software
  • Be the first to comment

New in cakephp3

  1. 1. New in CakePHP 3
  2. 2. March 22, 2015 3.0.0 is released
  3. 3. Frequent Releases Bugfixes every 2-4 weeks
  4. 4. PHP 5.4 + Soon to be PHP 5.5+
  5. 5. All the PSRs Zero through Four
  6. 6. Clean up Rabid conventions removed.
  7. 7. Standalone Components We have a few.
  8. 8. I18n
  9. 9. // Message formatting echo __("Hello, my name is {0}, I'm {1} years old", ['Sara', 12]); >>> Hello, my name is Sara, I’m 12 years old // Decimals and integers echo __('You have traveled {0,number,decimal} kilometers in {1,number,integer} weeks', [5423.344, 5.1]); >>> You have traveled 5,423.34 kilometers in 5 weeks Messages
  10. 10. echo __('{0,plural, =0{No records found} =1{Found 1 record} other{Found # records}}', [1]); >>> Found 1 record // Simpler message ids. echo __('records.found', [1]); >>> Found 1 record Plurals
  11. 11. msgid "One file removed" msgid_plural "{0} files removed" msgstr[0] "jednom datotekom je uklonjen" msgstr[1] "{0} datoteke uklonjenih" msgstr[2] "{0} slika uklonjenih" Catalog Files
  12. 12. use CakeI18nTime; use CakeI18nNumber; $date = new Time('2015-04-05 23:00:00'); echo $date; >>> 05/04/2015 23:00 echo Number::format(524.23); >>> 524.23 Numbers & Dates
  13. 13. Locale::setDefault(‘fr-FR’); $date = new Time('2015-04-05 23:00:00'); echo $date; >>> 5 avril 2015 23:00:00 UTC echo Number::format(524.23); >>> 524,23 Numbers & Dates
  14. 14. Use Alone Use the i18n libs anywhere with composer.
  15. 15. Routing
  16. 16. Router::scope(‘/u‘, function ($routes) { $routes->connect(‘/name/:username’, [‘controller’ => ‘Users’, ’action’ => ‘show’]); }); // Use namespace prefixed controllers. Router::prefix(‘admin’, function ($routes) { $routes->connect(‘/articles/:action’, [‘controller’ => ‘Articles’]); }); Routing Scopes
  17. 17. // Classic array format. echo $this->Url->build([ ‘controller’ => ‘Users’, ‘action’ => ‘show’, ‘username’ => ‘thewoz’ ]); >>> /u/name/thewoz echo $this->Url->build([ ‘prefix’ => ‘Admin’, ‘controller’ => ‘Articles’, ‘action’ => ‘index’ ]); >>> /admin/articles/index Reverse Routing
  18. 18. Router::scope(‘/u‘, function ($routes) { // Explicit name $routes->connect(‘/friends’, [‘controller’ => ‘Friends’], [‘_name’ => ‘u:friends’]); }); echo $this->Url->build([‘_name’ => ‘u:friends’]); >>> /u/friends Named Routes
  19. 19. Router::scope('/', function ($routes) { $routes->extensions(['json']); $routes->resources('Articles'); }); >>> /articles and /articles/:id are now connected. // Generate nested resources Router::scope('/', function ($routes) { $routes->extensions([‘json’]); $routes->resources('Articles', function ($routes) { $routes->resources('Comments'); }); }); >>> /articles/:article_id/comments is now connected. Resource Routing
  20. 20. Collections
  21. 21. Jose Lorenzo Rodriguez Iterator Master
  22. 22. Immutable Mutator methods make new collections.
  23. 23. $items = ['a' => 1, 'b' => 2, 'c' => 3]; $collection = new Collection($items); // Create a new collection containing elements // with a value greater than one. $big = $collection->filter(function ($value, $key, $iterator) { return $value > 1; }); // Search data in memory. match() makes a new iterator $collection = new Collection($comments); $commentsFromMark = $collection->match(['user.name' => 'Mark']); Improved Arrays
  24. 24. $people = new Collection($peopleData); // Find all the non-blondes $notBlond = $people->reject(function ($p) { return $p->hair_colour === ‘blond’; }); // Get all the people named jose $joses = $notBlond->filter(function ($p) { return strtolower($p->first_name) === ‘jose’; }); // Count by their hair colour $counts = $joses->countBy(function ($p) { return $p->hair_colour; }); Pipeline Example
  25. 25. class JoseFinder { public function __invoke($person) { return strtolower($person->first_name) === ‘jose’; } } $joses = $people->filter(new JoseFinder()); $notBlond = $people->reject(new NotBlondFilter()); Pipeline ++
  26. 26. Use Alone Collections can be used in any project.
  27. 27. ORM
  28. 28. It is not 2005 anymore
  29. 29. ActiveRecord Datamapper
  30. 30. // Get a table gateway/mapper. $connection = ConnectionManager::get(‘default’); $articles = new ArticlesTable([‘connection’ => $connection]); // Basic query building $query = $articles->find() ->where([‘Articles.author_id’ => $userid]) ->order([‘Articles.created’ => ‘DESC’]); // Find some published, promoted articles $query = $articles->find(‘promoted’) ->find(‘published’); Finding Records
  31. 31. // Find articles and eager load relations (1 query) $query = $articles->find() ->contain([‘Authors’, ‘Categories’]); // Load deeply nested relations (2 queries) $query = $articles->find() ->contain([‘Authors.RecentActivities’]); Eager Loading
  32. 32. // Find all the articles tagged with ‘Cat’ $query = $articles->find()->matching(‘Tags’, function ($q) { return $q->where([‘Tags.name’ => ‘Cat’]); }); // Find all the articles without the tag ‘Cat’ $query = $articles->find()->notMatching(‘Tags’, function ($q) { return $q->where([‘Tags.name’ => ‘Cat’]); }); Matching
  33. 33. // Do extraction and transformations $result = $articles->find() ->all() ->extract(‘title’) ->map(function ($item) { return strtoupper($item); }); // Extract and reduce $query = $articles->find()->contain([‘Tags’]); $uniqueTags = $articles->all() ->extract(‘tags.{*}.name’) ->reduce(function ($out, $tag) { if (!in_array($tag, $out) { $out[] = $tag; } return $out; }, []); Collections+
  34. 34. Entities Just vanilla PHP objects for the most part.
  35. 35. namespace AppModelEntity; use CakeORMEntity; class Article extends Entity { protected $_accessible = [‘title’, ‘body’, ‘author_id’]; } Article Entity
  36. 36. namespace AppModelEntity; use CakeORMEntity; class User extends Entity { protected function _getFullName() { return $this->_properties['first_name'] . ' ' . $this->_properties['last_name']; } } echo $user->full_name; Virtual Fields
  37. 37. Inspired By SQLAlchemy The best ORM I’ve ever used.
  38. 38. No Proxies, No Annotations, No Identity Map, No Runtime Reflection
  39. 39. No Lazy Loading
  40. 40. Use alone Use the ORM anywhere with composer.
  41. 41. What’s Next?
  42. 42. What’s Next • New DateTime library, replacing Carbon • Polymorphic Associations • PSR7 Support • Value Objects
  43. 43. Thank You. https://joind.in/14774 Twitter - mark_story Github - markstory

×