Upload
markstory
View
5.941
Download
1
Tags:
Embed Size (px)
DESCRIPTION
Talk given at Cake
Citation preview
Ch-ch-angesC a k e P H P 2 . 0
CakePHP 2.0
No more PHP4, PHP 5.2.6+
Many re-factored/re-built internal & external API’s
New features!
Faster!
Updated conventions.
PHP5
Use native features:
Exceptions.
Filter ext.
PDO.
SPL.
json_encode()
Conventions
Updated conventions
ClassName = FileName.php
View/Helper/HtmlHelper.php => HtmlHelper.
CamelCased directories.
Preparing for PHP5.3 and PSR-0
New loader
App::import() - Old and busted.
App::uses() - New hawtness.
Examples
ExamplesApp::uses(‘AuthComponent’, ‘Controller/Component’);
ExamplesApp::uses(‘AuthComponent’, ‘Controller/Component’);
Classname
ExamplesApp::uses(‘AuthComponent’, ‘Controller/Component’);
Classname Package
ExamplesApp::uses(‘AuthComponent’, ‘Controller/Component’);
Classname Package
App::uses(‘CakeEmail’, ‘Network/Email’);
ExamplesApp::uses(‘AuthComponent’, ‘Controller/Component’);
Classname Package
App::uses(‘CakeEmail’, ‘Network/Email’);
Classname
ExamplesApp::uses(‘AuthComponent’, ‘Controller/Component’);
Classname Package
App::uses(‘CakeEmail’, ‘Network/Email’);
Classname Package
Packages
Use App::build() to define paths where any package lives.
Sensible defaults come built in.
Undefined packages default to checking app/Lib
paths
Use App::build() to define paths where packages can be found.
Can use App::PREPEND and App::APPEND to control insertion order.
Bad things happen
Exceptions
Object::cakeError() is dead.
New Exceptions & Exception handling replace it.
More extensible and configurable handling.
Example 1 <?php 2 // Customize the renderer. 3 Configure::write('Exception', array( 4 'handler' => 'ErrorHandler::handleException', 5 'renderer' => 'MyCustomExceptionRenderer', 6 'log' => true 7 )); 8 9 // Replace everything.10 Configure::write('Exception', array(11 'handler' => function ($e) {12 echo 'Oh noes';13 }14 ));
Built-in exceptions
All previous Object::cakeError() are exceptions.
Improved testing.
Suite of HTTP exceptions. Great for error pages.
CakeException for development errors. Treated as 500 errors in production.
HTTP Exceptions
Most common HTTP exceptions are built in.
The names are what you would expect.
Configured Exception handler will get the exceptions and render an error page.
HttpExceptions
1 <?php2 public function view($id = null) {3 $this->Tag->id = $id;4 if (!$this->Tag->exists()) {5 throw new NotFoundException(__('Invalid tag'));6 }7 $this->set('tag', $this->Tag->read(null, $id));8 }
Error Configuration
Configure used for error/exception settings.
Sensible defaults.
Uses Debugger in development
Logs errors in production.
You can change out the whole thing.
i18n
i18n
No more true.
Automatic sprintf()
Examples
__(‘Some string’) Always returns.
__(‘Some %s’, $value); Does what you want it to.
Unify disparate apis
Unify & syngergize
Helper, Components, Behaviors & Tasks.
Similar, but interacting with each was slightly different.
Collection objects unify all of them.
HelperCollection, ComponentCollection, TaskCollection, BehaviorCollection
Collections
Load objects at runtime.
Unload objects.
Alias objects.
Trigger callbacks.
Loading
$Html = $this->Helpers->load(‘Html’, $settings);
$this->Html works from that point forward.
The same API exists for components, tasks, behaviors.
Aliasing
1 <?php2 public $helpers = array(3 'Html' => array(4 'className' => 'MyHtmlHelper'5 )6 );
Aliasing
Once an alias is created, that alias is used everywhere.
With the above controller code, all other Helpers would use MyHtmlHelper for $this->Html.
Unload and disable
$this->Components->disable(‘Auth’);
$this->Components->enable(‘Auth’);
$this->Components->unload(‘Auth’);
Callbacks
$this->Helpers->trigger(‘beforeRender’, array(&$this));
Fires method on all enabled objects.
Implement custom hooks in base classes.
Console
Console improvements
Coloured output & output levels.
Less coupled & easier to test.
Better input handling.
Generated help.
XML help. Good for integration with other tools.
COLORZ
Simple formatting to add styles to output.
$this->out(‘<warning>Uh oh</warning>’);
$this->out(‘<error>Kaboom</error>’);
$this->out(‘<info>Hi</info>’, 1, Shell::VERBOSE);
Input handling
More unix-y input handling.
Long and short options.
Validated options.
Boolean options.
Required arguments.
Generated help
Defining command structure with ConsoleOptionParser means you get help for free.
--help and -h supported by all shells.
--help xml generates xml help.
Request & Response
CakeRequest
Consolidates request interrogation logic.
$this->request everywhere.
Lower memory use by not copying arrays everywhere.
Backwards compatible read only interface still around.
CakeResponse
Consolidates response generation.
$this->response everywhere.
Deprecated methods still around.
Controllers can return response objects.
example
1 <?php2 class PostsController extends AppController {3 public function simple() {4 return new CakeResponse(array(5 'body' => 'Simple response'6 ));7 }8 }
Sessions
Sessions
Sessions were tough in the past.
Custom session handlers weren’t on the same field as core ones.
Sessions
Core, App, and Plugin session handlers all work the same.
CakeSessionInterface interface has to be implemented.
Same built-in options exist.
Using built-ins 1 <?php 2 Configure::write('Session', array( 3 'defaults' => 'php' 4 )); 5 Configure::write('Session', array( 6 'defaults' => 'database' 7 )); 8 Configure::write('Session', array( 9 'defaults' => 'cache',10 'handler' => array(11 'config' => 'session'12 )13 ));
Using an app/plugin 1 <?php 2 Configure::write('Session', array( 3 'defaults' => 'database', 4 'handler' => array( 5 'engine' => 'Custom' 6 ) 7 )); 8 Configure::write('Session', array( 9 'defaults' => 'php',10 'handler' => array(11 'engine' => 'Plugin.SessionHandler'12 ),13 'ini' => array(14 'session.cookie_httponly' => true15 )16 ));
Authorization
AuthComponent
Split into authorization and authentication adapters.
Easier to modify and extend.
No magic logins.
No magic hashing of passwords.
Built-insAuthentication
Form.
HTTP Basic.
HTTP Digest.
custom
Authorization
Controller.
Actions (Acl)
CRUD (Acl)
custom
Logging in
1 <?php 2 class UsersController extends AppController { 3 public function login() { 4 if ($this->request->is('post')) { 5 if ($this->Auth->login()) { 6 $this->Session->setFlash('Welcome back!'); 7 $this->redirect($this->Auth->redirect()); 8 } else { 9 $this->Session->setFlash('Login credentials were invalid.');10 }11 }12 }13 }
Auth Configuration
Way less, because there is less magic.
Easier for beginners to grok.
Easier for veterans to customize.
Decomposed into several classes.
Email is easily accessible from models & shells.
EmailComponent is deprecated, because it doesn’t really add anything at this point.
Simple Example
1 <?php2 App::uses('CakeEmail', 'Network/Email');3 $mail = new CakeEmail();4 $mail->from('[email protected]', 'Mark Story')5 ->to('[email protected]', 'Steve Jobs')6 ->subject('Love the new imacs')7 ->send('I <3 you so much.');
Templates
1 <?php 2 App::uses('CakeEmail', 'Network/Email'); 3 $mail = new CakeEmail(); 4 $mail->from('[email protected]', 'Mark Story') 5 ->to('[email protected]', 'Steve Jobs') 6 ->subject('Love the new imacs') 7 ->template('love_you', 'simple') 8 ->emailFormat('html') 9 ->viewVars($vars)10 ->send();
Mail Transports
Extracted out as separate classes.
3 built-in transports, and you can make your own.
Testing
Testing
PHPUnit is the de-facto standard.
SimpleTest is less feature rich, and didn’t have a PHP5 compatible version when we started.
Tune in for my talk on PHPUnit.
Performance
All win
Lazy loading everywhere it made sense.
Components, helpers, associated models.
Removed most getInstance() methods.
New conventions mean less Inflector calls.
Streamlined dispatch cycle.
Persistent dbo cache.
Hello World (rps)
0
87.5
175.0
262.5
350.0
Hello world
CakePHP 1.3.11CakePHP 2.0-beta
siege -b -c 20 -r 100 http://localhost/hello/world
Basic blog (rps)
0
12.5
25.0
37.5
50.0
Basic blog
CakePHP 1.3.11CakePHP 2.0-beta
siege -b -c 20 -r 100 http://localhost/posts
Functions called
0
125
250
375
500
CakePHP 1.3.11 CakePHP 2.0-beta
Hello World Basic Blog
Collected using webgrind and xdebug
Questions?