ch ch-changes cake php2

Post on 28-May-2015

5.940 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Talk given at Cake

TRANSCRIPT

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.

Email

Email

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('mark.story@gmail.com', 'Mark Story')5 ->to('steve@apple.com', '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('mark.story@gmail.com', 'Mark Story') 5 ->to('steve@apple.com', '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?

top related