new in cakephp3
Post on 26-Jan-2017
1.238 Views
Preview:
TRANSCRIPT
// 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
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
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
use Cake\I18n\Time; use Cake\I18n\Number;
$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
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
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
// 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
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
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
$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
$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
class JoseFinder { public function __invoke($person) { return strtolower($person->first_name) === ‘jose’; } }
$joses = $people->filter(new JoseFinder()); $notBlond = $people->reject(new NotBlondFilter());
Pipeline ++
// 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
// 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
// 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
// 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+
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Article extends Entity { protected $_accessible = [‘title’, ‘body’, ‘author_id’]; }
Article Entity
namespace App\Model\Entity;
use Cake\ORM\Entity;
class User extends Entity { protected function _getFullName() { return $this->_properties['first_name'] . ' ' . $this->_properties['last_name']; }
}
echo $user->full_name;
Virtual Fields
What’s Next
• New DateTime library, replacing Carbon
• Polymorphic Associations
• PSR7 Support
• Value Objects
top related