YOU ARE DOWNLOADING DOCUMENT

Please tick the box to continue:

Transcript
Page 1: PHP Annotations: They exist! - JetBrains Webinar

Rafael����������� ������������������  Dohms

Annotations����������� ������������������  in����������� ������������������  PHP

@rdohmson����������� ������������������  twitter

They����������� ������������������  Exist!

Page 2: PHP Annotations: They exist! - JetBrains Webinar

phot

o cr

edit:

Eli W

hite

Evangelist, Speaker and Contributor.

!Enabler at AmsterdamPHP.

Rafael Dohms@rdohms

drop����������� ������������������  by����������� ������������������  if����������� ������������������  you����������� ������������������  are����������� ������������������  in����������� ������������������  Amsterdam!

Page 3: PHP Annotations: They exist! - JetBrains Webinar

What? Why? Where?

How?

a����������� ������������������  little����������� ������������������  history

show����������� ������������������  me����������� ������������������  the����������� ������������������  code!

existing����������� ������������������  uses

Implementing����������� ������������������  custom����������� ������������������  annotations

based����������� ������������������  on����������� ������������������  DMS\Filter

Page 4: PHP Annotations: They exist! - JetBrains Webinar

what?What����������� ������������������  ar

e����������� ������������������  annotation

s?

http://ecdesignrebels.blogspot.com

Page 5: PHP Annotations: They exist! - JetBrains Webinar

-- In English -- "An annotation is a note that is made while

reading any form of text."

Page 6: PHP Annotations: They exist! - JetBrains Webinar

-- In English -- "An annotation is a note that is made while

reading any form of text."

something����������� ������������������  that����������� ������������������  describes����������� ������������������  an����������� ������������������  aspect����������� ������������������  of����������� ������������������  the����������� ������������������  subject

Page 7: PHP Annotations: They exist! - JetBrains Webinar

“Annotations do not directly affect program semantics”

-- In Code Speak --

“An annotation is metadata attached to your code, that can be read at runtime.”

Page 8: PHP Annotations: They exist! - JetBrains Webinar

“Annotations do not directly affect program semantics”

-- In Code Speak --

“An annotation is metadata attached to your code, that can be read at runtime.”

effects����������� ������������������  are����������� ������������������  only����������� ������������������  observed����������� ������������������  at

Page 9: PHP Annotations: They exist! - JetBrains Webinar

“Annotations do not directly affect program semantics”

-- In Code Speak --

just����������� ������������������  like����������� ������������������  your����������� ������������������  notes

“An annotation is metadata attached to your code, that can be read at runtime.”

effects����������� ������������������  are����������� ������������������  only����������� ������������������  observed����������� ������������������  at

Page 10: PHP Annotations: They exist! - JetBrains Webinar

Annotations in the wild

C#

Page 11: PHP Annotations: They exist! - JetBrains Webinar

Annotations in the wild

annotations

C#attributes

Page 12: PHP Annotations: They exist! - JetBrains Webinar

Annotations in the wild

annotations

C#attributes

@Entity! @Table(name = "people")! class Person implements Serializable {! @Id ! @GeneratedValue(strategy = GenerationType.AUTO) ! private Integer id;

Page 13: PHP Annotations: They exist! - JetBrains Webinar

Annotations in the wild

annotations

C#attributes

@Entity! @Table(name = "people")! class Person implements Serializable {! @Id ! @GeneratedValue(strategy = GenerationType.AUTO) ! private Integer id;

public class Customer!{! [Required]! [StringLength(50)]! public string Prename { get; set; }! ! [Column(TypeName = "image")]! public byte[] Image { get; set; }

Page 14: PHP Annotations: They exist! - JetBrains Webinar

Annotations in the wild

annotations

C#attributes

after����������� ������������������  v1.5

@Entity! @Table(name = "people")! class Person implements Serializable {! @Id ! @GeneratedValue(strategy = GenerationType.AUTO) ! private Integer id;

public class Customer!{! [Required]! [StringLength(50)]! public string Prename { get; set; }! ! [Column(TypeName = "image")]! public byte[] Image { get; set; }

Page 15: PHP Annotations: They exist! - JetBrains Webinar

Annotations in the wild

annotations

C#attributes

after����������� ������������������  v1.5

since����������� ������������������  first����������� ������������������  release

@Entity! @Table(name = "people")! class Person implements Serializable {! @Id ! @GeneratedValue(strategy = GenerationType.AUTO) ! private Integer id;

public class Customer!{! [Required]! [StringLength(50)]! public string Prename { get; set; }! ! [Column(TypeName = "image")]! public byte[] Image { get; set; }

Page 16: PHP Annotations: They exist! - JetBrains Webinar
Page 17: PHP Annotations: They exist! - JetBrains Webinar

No����������� ������������������  core����������� ������������������  ����������� ������������������  annotation����������� ������������������  support

Page 18: PHP Annotations: They exist! - JetBrains Webinar

Questions?

Page 19: PHP Annotations: They exist! - JetBrains Webinar

Questions?

I’m����������� ������������������  kidding!

Page 20: PHP Annotations: They exist! - JetBrains Webinar
Page 21: PHP Annotations: They exist! - JetBrains Webinar
Page 22: PHP Annotations: They exist! - JetBrains Webinar

phpDoc

~2000

Page 23: PHP Annotations: They exist! - JetBrains Webinar

phpDoc

PHP����������� ������������������  5.1Reflection����������� ������������������  supports����������� ������������������  getDocComments()

~2000 2005

Page 24: PHP Annotations: They exist! - JetBrains Webinar

First����������� ������������������  Annotation����������� ������������������  

����������� ������������������  Engines����������� ������������������  in����������� ������������������  PHP

phpDoc

PHP����������� ������������������  5.1Reflection����������� ������������������  supports����������� ������������������  getDocComments()

~2000 2005

Page 25: PHP Annotations: They exist! - JetBrains Webinar

First����������� ������������������  Annotation����������� ������������������  

����������� ������������������  Engines����������� ������������������  in����������� ������������������  PHP

phpDoc

PHP����������� ������������������  5.1Reflection����������� ������������������  supports����������� ������������������  getDocComments()

~2000 2005 2008

Page 26: PHP Annotations: They exist! - JetBrains Webinar

First����������� ������������������  Annotation����������� ������������������  

����������� ������������������  Engines����������� ������������������  in����������� ������������������  PHP

phpDoc

PHP����������� ������������������  5.1Reflection����������� ������������������  supports����������� ������������������  getDocComments()

~2000 2005 2008

Doctrine����������� ������������������  2����������� ������������������  Annotation����������� ������������������  Engine

Page 27: PHP Annotations: They exist! - JetBrains Webinar

First����������� ������������������  Annotation����������� ������������������  

����������� ������������������  Engines����������� ������������������  in����������� ������������������  PHP

phpDoc

PHP����������� ������������������  5.1Reflection����������� ������������������  supports����������� ������������������  getDocComments()

~2000 2005 2008

Doctrine����������� ������������������  2����������� ������������������  Annotation����������� ������������������  Engine

2010

RFC:����������� ������������������  Annotations����������� ������������������  in����������� ������������������  core����������� ������������������  w/����������� ������������������  custom����������� ������������������  

syntax

Page 28: PHP Annotations: They exist! - JetBrains Webinar

First����������� ������������������  Annotation����������� ������������������  

����������� ������������������  Engines����������� ������������������  in����������� ������������������  PHP

phpDoc

PHP����������� ������������������  5.1Reflection����������� ������������������  supports����������� ������������������  getDocComments()

~2000 2005 2008

Doctrine����������� ������������������  2����������� ������������������  Annotation����������� ������������������  Engine

2010

RFC:����������� ������������������  Annotations����������� ������������������  in����������� ������������������  core����������� ������������������  w/����������� ������������������  custom����������� ������������������  

syntaxREJECTED

Page 29: PHP Annotations: They exist! - JetBrains Webinar

First����������� ������������������  Annotation����������� ������������������  

����������� ������������������  Engines����������� ������������������  in����������� ������������������  PHP

phpDoc

PHP����������� ������������������  5.1Reflection����������� ������������������  supports����������� ������������������  getDocComments()

~2000 2005 2008

Doctrine����������� ������������������  2����������� ������������������  Annotation����������� ������������������  Engine

2010

RFC:����������� ������������������  Annotations����������� ������������������  in����������� ������������������  core����������� ������������������  w/����������� ������������������  custom����������� ������������������  

syntax

2011

RFC:����������� ������������������  DocBlock����������� ������������������  Annotations����������� ������������������  

“in����������� ������������������  discussion”

REJECTED

Page 30: PHP Annotations: They exist! - JetBrains Webinar

First����������� ������������������  Annotation����������� ������������������  

����������� ������������������  Engines����������� ������������������  in����������� ������������������  PHP

phpDoc

PHP����������� ������������������  5.1Reflection����������� ������������������  supports����������� ������������������  getDocComments()

~2000 2005 2008

Doctrine����������� ������������������  2����������� ������������������  Annotation����������� ������������������  Engine

2010

RFC:����������� ������������������  Annotations����������� ������������������  in����������� ������������������  core����������� ������������������  w/����������� ������������������  custom����������� ������������������  

syntax

2011

RFC:����������� ������������������  DocBlock����������� ������������������  Annotations����������� ������������������  

“in����������� ������������������  discussion”

REJECTED

2013

discussion����������� ������������������  sparks����������� ������������������  up����������� ������������������  again

Page 31: PHP Annotations: They exist! - JetBrains Webinar

First����������� ������������������  Annotation����������� ������������������  

����������� ������������������  Engines����������� ������������������  in����������� ������������������  PHP

phpDoc

PHP����������� ������������������  5.1Reflection����������� ������������������  supports����������� ������������������  getDocComments()

~2000 2005 2008

Doctrine����������� ������������������  2����������� ������������������  Annotation����������� ������������������  Engine

2010

RFC:����������� ������������������  Annotations����������� ������������������  in����������� ������������������  core����������� ������������������  w/����������� ������������������  custom����������� ������������������  

syntax

2011

RFC:����������� ������������������  DocBlock����������� ������������������  Annotations����������� ������������������  

“in����������� ������������������  discussion”

REJECTED

?2013

discussion����������� ������������������  sparks����������� ������������������  up����������� ������������������  again

Page 32: PHP Annotations: They exist! - JetBrains Webinar

Current situation in php-internals

Page 33: PHP Annotations: They exist! - JetBrains Webinar

Current situation in php-internals

Page 34: PHP Annotations: They exist! - JetBrains Webinar
Page 35: PHP Annotations: They exist! - JetBrains Webinar

annotations

Page 36: PHP Annotations: They exist! - JetBrains Webinar

annotations

/** ! * Entity\Reward ! * ! * @ORM\Table("reward") ! * @ORM\Entity(repositoryClass="RewardRepository") ! */ !class Reward !{ ! /** ! * @var integer $id ! * ! * @ORM\Column(name="id", type="integer") ! * @ORM\Id ! * @ORM\GeneratedValue(strategy="AUTO") ! */ ! protected $id; ! ! /** ! * @var string $title ! * ! * @ORM\Column(name="title", type="string", length=150, nullable=true) ! * ! * @Assert\MaxLength(150) ! */ ! protected $title;

Page 37: PHP Annotations: They exist! - JetBrains Webinar

annotations

/** ! * Entity\Reward ! * ! * @ORM\Table("reward") ! * @ORM\Entity(repositoryClass="RewardRepository") ! */ !class Reward !{ ! /** ! * @var integer $id ! * ! * @ORM\Column(name="id", type="integer") ! * @ORM\Id ! * @ORM\GeneratedValue(strategy="AUTO") ! */ ! protected $id; ! ! /** ! * @var string $title ! * ! * @ORM\Column(name="title", type="string", length=150, nullable=true) ! * ! * @Assert\MaxLength(150) ! */ ! protected $title;

re-use����������� ������������������  of����������� ������������������  docblocks

Page 38: PHP Annotations: They exist! - JetBrains Webinar

On docblocks vs. comments

Page 39: PHP Annotations: They exist! - JetBrains Webinar

On docblocks vs. comments

T_COMMENT

// this is a comment /* This is a multiline comment */

Page 40: PHP Annotations: They exist! - JetBrains Webinar

On docblocks vs. comments

T_COMMENT

T_DOC_COMMENT

// this is a comment /* This is a multiline comment */

/** ! * this is a docblock! */

Page 41: PHP Annotations: They exist! - JetBrains Webinar

On docblocks vs. comments

T_COMMENT

T_DOC_COMMENT

// this is a comment /* This is a multiline comment */

/** ! * this is a docblock! */

ignored����������� ������������������  by����������� ������������������  opcode����������� ������������������  cache

Page 42: PHP Annotations: They exist! - JetBrains Webinar

On docblocks vs. comments

T_COMMENT

T_DOC_COMMENT

// this is a comment /* This is a multiline comment */

/** ! * this is a docblock! */

ignored����������� ������������������  by����������� ������������������  opcode����������� ������������������  cache

cached����������� ������������������  by����������� ������������������  opcode����������� ������������������  cache

Page 43: PHP Annotations: They exist! - JetBrains Webinar
Page 44: PHP Annotations: They exist! - JetBrains Webinar

public class Customer!{! [Required]! [StringLength(50)]! public string Prename { get; set; }! ! [Column(TypeName = "image")]! public byte[] Image { get; set; }

@Entity! @Table(name = "people")! class Person implements Serializable {! @Id ! @GeneratedValue(strategy = GenerationType.AUTO) ! private Integer id;

class Reward !{ ! /** ! * @var integer $id ! * @deprecated! * @ORM\Column(name="id", type="integer") ! * @ORM\Id ! */ ! protected $id;

Page 45: PHP Annotations: They exist! - JetBrains Webinar

public class Customer!{! [Required]! [StringLength(50)]! public string Prename { get; set; }! ! [Column(TypeName = "image")]! public byte[] Image { get; set; }

@Entity! @Table(name = "people")! class Person implements Serializable {! @Id ! @GeneratedValue(strategy = GenerationType.AUTO) ! private Integer id;

class Reward !{ ! /** ! * @var integer $id ! * @deprecated! * @ORM\Column(name="id", type="integer") ! * @ORM\Id ! */ ! protected $id;

marker

Page 46: PHP Annotations: They exist! - JetBrains Webinar

public class Customer!{! [Required]! [StringLength(50)]! public string Prename { get; set; }! ! [Column(TypeName = "image")]! public byte[] Image { get; set; }

@Entity! @Table(name = "people")! class Person implements Serializable {! @Id ! @GeneratedValue(strategy = GenerationType.AUTO) ! private Integer id;

class Reward !{ ! /** ! * @var integer $id ! * @deprecated! * @ORM\Column(name="id", type="integer") ! * @ORM\Id ! */ ! protected $id;

marker

parameterized

Page 47: PHP Annotations: They exist! - JetBrains Webinar

Why?Why����������� ������������������  sho

uld����������� ������������������  I����������� ������������������  use����������� ������������������  ann

otations?

http://ecdesignrebels.blogspot.com

Are����������� ������������������  annotations����������� ������������������  for����������� ������������������  you?

Page 48: PHP Annotations: They exist! - JetBrains Webinar

I don’t know.

Page 49: PHP Annotations: They exist! - JetBrains Webinar
Page 50: PHP Annotations: They exist! - JetBrains Webinar

hate����������� ������������������  annotations

Page 51: PHP Annotations: They exist! - JetBrains Webinar

hate����������� ������������������  annotations

love����������� ������������������  annotations

Page 52: PHP Annotations: They exist! - JetBrains Webinar

hate����������� ������������������  annotations

love����������� ������������������  annotations

never����������� ������������������  used����������� ������������������  annotations

Page 53: PHP Annotations: They exist! - JetBrains Webinar

but����������� ������������������  its����������� ������������������  code,����������� ������������������  in����������� ������������������  comments!docblocks

harder

The downside or why not

Page 54: PHP Annotations: They exist! - JetBrains Webinar

but����������� ������������������  its����������� ������������������  code,����������� ������������������  in����������� ������������������  comments!docblocks

harder

The downside or why not

docblocks����������� ������������������  are����������� ������������������  first����������� ������������������  class����������� ������������������  citizens.

Page 55: PHP Annotations: They exist! - JetBrains Webinar

Its����������� ������������������  impossible����������� ������������������  to����������� ������������������  debug/test!

harder

The downside or why not

Page 56: PHP Annotations: They exist! - JetBrains Webinar

Its����������� ������������������  impossible����������� ������������������  to����������� ������������������  debug/test!

harder

The downside or why not

Test/debug����������� ������������������  annotation����������� ������������������  “executor”

Page 57: PHP Annotations: They exist! - JetBrains Webinar

The downside or why not

It����������� ������������������  does����������� ������������������  not����������� ������������������  perform!

Page 58: PHP Annotations: They exist! - JetBrains Webinar

The downside or why not

It����������� ������������������  does����������� ������������������  not����������� ������������������  perform!

Caching����������� ������������������  FTW!

Page 59: PHP Annotations: They exist! - JetBrains Webinar

Why I love Annotations

Page 60: PHP Annotations: They exist! - JetBrains Webinar

Easier����������� ������������������  to����������� ������������������  inject����������� ������������������  behavior����������� ������������������  without����������� ������������������  extending

Why I love Annotations

Page 61: PHP Annotations: They exist! - JetBrains Webinar

Easier����������� ������������������  to����������� ������������������  inject����������� ������������������  behavior����������� ������������������  without����������� ������������������  extendingDoctrine����������� ������������������  1����������� ������������������  vs����������� ������������������  Doctrine����������� ������������������  2

Why I love Annotations

Page 62: PHP Annotations: They exist! - JetBrains Webinar

Easier����������� ������������������  to����������� ������������������  inject����������� ������������������  behavior����������� ������������������  without����������� ������������������  extending

Contextualizes����������� ������������������  behavior/config����������� ������������������  in����������� ������������������  the����������� ������������������  object

Doctrine����������� ������������������  1����������� ������������������  vs����������� ������������������  Doctrine����������� ������������������  2

Why I love Annotations

Page 63: PHP Annotations: They exist! - JetBrains Webinar

Easier����������� ������������������  to����������� ������������������  inject����������� ������������������  behavior����������� ������������������  without����������� ������������������  extending

Contextualizes����������� ������������������  behavior/config����������� ������������������  in����������� ������������������  the����������� ������������������  object

Doctrine����������� ������������������  1����������� ������������������  vs����������� ������������������  Doctrine����������� ������������������  2

In����������� ������������������  object����������� ������������������  vs.����������� ������������������  external����������� ������������������  configuration����������� ������������������  file

Why I love Annotations

Page 64: PHP Annotations: They exist! - JetBrains Webinar

Easier����������� ������������������  to����������� ������������������  inject����������� ������������������  behavior����������� ������������������  without����������� ������������������  extending

Contextualizes����������� ������������������  behavior/config����������� ������������������  in����������� ������������������  the����������� ������������������  object

Doctrine����������� ������������������  1����������� ������������������  vs����������� ������������������  Doctrine����������� ������������������  2

In����������� ������������������  object����������� ������������������  vs.����������� ������������������  external����������� ������������������  configuration����������� ������������������  file

Its����������� ������������������  documented/stored����������� ������������������  by����������� ������������������  phpDocumentor

Why I love Annotations

Page 65: PHP Annotations: They exist! - JetBrains Webinar

Easier����������� ������������������  to����������� ������������������  inject����������� ������������������  behavior����������� ������������������  without����������� ������������������  extending

Contextualizes����������� ������������������  behavior/config����������� ������������������  in����������� ������������������  the����������� ������������������  object

Doctrine����������� ������������������  1����������� ������������������  vs����������� ������������������  Doctrine����������� ������������������  2

In����������� ������������������  object����������� ������������������  vs.����������� ������������������  external����������� ������������������  configuration����������� ������������������  file

Its����������� ������������������  documented/stored����������� ������������������  by����������� ������������������  phpDocumentorIts����������� ������������������  in����������� ������������������  docblocks,����������� ������������������  so����������� ������������������  its����������� ������������������  parsed

Why I love Annotations

Page 66: PHP Annotations: They exist! - JetBrains Webinar
Page 67: PHP Annotations: They exist! - JetBrains Webinar
Page 68: PHP Annotations: They exist! - JetBrains Webinar

<?php

class User!{!!!!!!!!protected $name!!!...!!!!!!!

}

Page 69: PHP Annotations: They exist! - JetBrains Webinar

<?php

class User!{!!!!!!!!protected $name!!!...!!!!!!!

}

-����������� ������������������  persist����������� ������������������  as����������� ������������������  varchar����������� ������������������  

-����������� ������������������  length����������� ������������������  should����������� ������������������  not����������� ������������������  be����������� ������������������  ����������� ������������������  

more����������� ������������������  then����������� ������������������  255����������� ������������������  

-����������� ������������������  should����������� ������������������  not����������� ������������������  be����������� ������������������  blank����������� ������������������  

-����������� ������������������  only����������� ������������������  letters

Page 70: PHP Annotations: They exist! - JetBrains Webinar

<?php

class User!{!!!!!!!!protected $name!!!...!!!!!!!

}

-����������� ������������������  persist����������� ������������������  as����������� ������������������  varchar����������� ������������������  

-����������� ������������������  length����������� ������������������  should����������� ������������������  not����������� ������������������  be����������� ������������������  ����������� ������������������  

more����������� ������������������  then����������� ������������������  255����������� ������������������  

-����������� ������������������  should����������� ������������������  not����������� ������������������  be����������� ������������������  blank����������� ������������������  

-����������� ������������������  only����������� ������������������  letters

MyProject\User:! properties:! name:! - NotBlank: ~! - MaxLength: 255

Validation

MyProject\User:! filters:! name:! - alpha

filter

MyProject\User:! type: entity! table: users! fields:! name:! type: string! length: 255

persistence

Page 71: PHP Annotations: They exist! - JetBrains Webinar

<?php

class User!{!!!!!!!!protected $name!!!...!!!!!!!

}

MyProject\User:! properties:! name:! - NotBlank: ~! - MaxLength: 255

Validation

MyProject\User:! filters:! name:! - alpha

filter

MyProject\User:! type: entity! table: users! fields:! name:! type: string! length: 255

persistence

/**! * @ORM\Column(‘string’, length=255)! * @Assert\NotBlank()! * @Assert\MaxLength(255)! * @Filter\Alpha()! */

Page 72: PHP Annotations: They exist! - JetBrains Webinar

<?php

class User!{!!!!!!!!protected $name!!!...!!!!!!!

}

/**! * @ORM\Column(‘string’, length=255)! * @Assert\NotBlank()! * @Assert\MaxLength(255)! * @Filter\Alpha()! */

Page 73: PHP Annotations: They exist! - JetBrains Webinar

Where?Where����������� ������������������  a

re����������� ������������������  annotatio

ns����������� ������������������  used?

http://ecdesignrebels.blogspot.com

Page 74: PHP Annotations: They exist! - JetBrains Webinar

Where?Where����������� ������������������  a

re����������� ������������������  annotatio

ns����������� ������������������  used?

http://ecdesignrebels.blogspot.com

Page 75: PHP Annotations: They exist! - JetBrains Webinar

class DataTest extends PHPUnit_Framework_TestCase !{ ! /** ! * @dataProvider provider ! * ! * @expectedException InvalidArgumentException ! * @expectedExceptionMessage Right Message ! */ ! public function testAdd($a, $b, $c) ! { ! /* Test code */ ! } ! ! public function provider() ! { ! return array( ! array(0, 0, 0), ! ); ! } !} !

expectations

repetition

Page 76: PHP Annotations: They exist! - JetBrains Webinar

/** ! * @ORM\Table("myentity") ! * @ORM\Entity(repositoryClass="MyEntityRepository") ! */ !class MyEntity !{ ! /** ! * @var integer $id ! * ! * @ORM\Column(name="id", type="integer") ! * @ORM\Id ! * @ORM\GeneratedValue(strategy="AUTO") ! */ ! protected $id; ! ! /** ! * @var string $title ! * ! * @ORM\Column(name="title", type="string", length=255) ! * @Assert\MaxLength(255) ! * @Assert\NotBlank() ! */ ! protected $title; ! ! /** ! * @var \Doctrine\Common\Collections\ArrayCollection $users ! * ! * @ORM\OneToMany(targetEntity="OtherEntity", mappedBy="myEntity", cascade={"persist","remove"}) ! */ ! protected $otherEntities; ! !}

persistance

association

Page 77: PHP Annotations: They exist! - JetBrains Webinar

/** ! * @Route("/myaction/{id}", name="myaction") ! * @Method("POST") ! * ! * @Template("MyBundle:MyController:my.html.twig") ! * ! * @param int $id ! * @return array ! */ !public function myAction($id) !{ ! ! /* Controller Logic */ ! ! return array('data' => $data); ! !} ! !!!class MyEntity !{ ! ! /** ! * @var string $title ! * ! * @ORM\Column(name="title", type="string", length=255) ! * @Assert\MaxLength(255) ! * @Assert\NotBlank() ! */ ! protected $title; ! !}!

routing

Validation

templating

Page 78: PHP Annotations: They exist! - JetBrains Webinar

/** ! * @FLOW3\Aspect ! */ !class LoggingAspect { ! ! /** ! * @FLOW3\Inject ! * @var \Examples\Forum\Logger\ApplicationLoggerInterface ! */ ! protected $applicationLogger; ! ! /** ! * Log a message if a post is deleted ! * ! * @param \TYPO3\FLOW3\AOP\JoinPointInterface $joinPoint ! * @FLOW3\Before("method(Examples\Forum\Domain\Model\Forum->deletePost())") ! * @return void ! */ ! public function logDeletePost(\TYPO3\FLOW3\AOP\JoinPointInterface $joinPoint) { ! $post = $joinPoint->getMethodArgument('post'); ! $this->applicationLogger->log('Removing post ' . $post->getTitle(), LOG_INFO); ! } ! !}!

Dependency����������� ������������������  Injection

AOP

Page 79: PHP Annotations: They exist! - JetBrains Webinar

How?How����������� ������������������  can����������� ������������������  i����������� ������������������  

write����������� ������������������  my����������� ������������������  own����������� ������������������  

annotations?

http://ecdesignrebels.blogspot.com

Page 80: PHP Annotations: They exist! - JetBrains Webinar

Annotations

My����������� ������������������  Project

Page 81: PHP Annotations: They exist! - JetBrains Webinar

Annotations

My����������� ������������������  ProjectAnnotation����������� ������������������  ����������� ������������������  

Engine

Page 82: PHP Annotations: They exist! - JetBrains Webinar
Page 83: PHP Annotations: They exist! - JetBrains Webinar

/**! * @tag(parameters)! */!public function method()

Code

Page 84: PHP Annotations: They exist! - JetBrains Webinar

/**! * @tag(parameters)! */!public function method()

Code

ReflectionClass->getDocComment()

Page 85: PHP Annotations: They exist! - JetBrains Webinar

DOCBlock

/**! * @tag(parameters)! */

/**! * @tag(parameters)! */!public function method()

Code

ReflectionClass->getDocComment()

Page 86: PHP Annotations: They exist! - JetBrains Webinar

DOCBlock

/**! * @tag(parameters)! */

Tag() + parameters

Annotation����������� ������������������  Instances

/**! * @tag(parameters)! */!public function method()

Code

ReflectionClass->getDocComment()

Page 87: PHP Annotations: They exist! - JetBrains Webinar

Doctrine����������� ������������������  Annotations

phpDocumentor����������� ������������������  2

Notoj

Annotation Engines

php-annotations

https://github.com/doctrine/annotations

https://github.com/phpDocumentor/phpDocumentor2

https://github.com/mindplay-dk/php-annotations

https://github.com/crodas/Notoj

Page 88: PHP Annotations: They exist! - JetBrains Webinar

Doctrine����������� ������������������  Annotations

phpDocumentor����������� ������������������  2

Notoj

Annotation Engines

php-annotations

Page 89: PHP Annotations: They exist! - JetBrains Webinar

Doctrine����������� ������������������  Annotations

phpDocumentor����������� ������������������  2

Notoj

Annotation Engines

php-annotations

1.1.2

2.0.2

1.1

0.16.1

Page 90: PHP Annotations: They exist! - JetBrains Webinar

Doctrine����������� ������������������  Annotations

phpDocumentor����������� ������������������  2

Notoj

Annotation Engines

php-annotations

1.1.2

2.0.2

1.1

0.16.1

Page 91: PHP Annotations: They exist! - JetBrains Webinar

Doctrine����������� ������������������  Annotations

phpDocumentor����������� ������������������  2

Notoj

Annotation Engines

php-annotations

1.1.2

2.0.2

1.1

0.16.1

doctrine/annotations

phpdocumentor/reflection-docblock

mindplay/annotations

crodas/notoj

Page 92: PHP Annotations: They exist! - JetBrains Webinar

Doctrine����������� ������������������  Annotations

phpDocumentor����������� ������������������  2

Notoj

Annotation Engines

php-annotations

1.1.2

2.0.2

1.1

0.16.1

doctrine/annotations

phpdocumentor/reflection-docblock

mindplay/annotations

crodas/notoj

Page 93: PHP Annotations: They exist! - JetBrains Webinar

Doctrine����������� ������������������  Annotations

phpDocumentor����������� ������������������  2

Notoj

Annotation Engines

php-annotations

1.1.2

2.0.2

1.1

0.16.1

full����������� ������������������  support

only����������� ������������������  string����������� ������������������  

full����������� ������������������  support

full����������� ������������������  support

doctrine/annotations

phpdocumentor/reflection-docblock

mindplay/annotations

crodas/notoj

Page 94: PHP Annotations: They exist! - JetBrains Webinar

Doctrine����������� ������������������  Annotations

phpDocumentor����������� ������������������  2

Notoj

Annotation Engines

php-annotations

1.1.2

2.0.2

1.1

0.16.1

full����������� ������������������  support

only����������� ������������������  string����������� ������������������  

full����������� ������������������  support

full����������� ������������������  support

doctrine/annotations

phpdocumentor/reflection-docblock

mindplay/annotations

crodas/notoj

Page 95: PHP Annotations: They exist! - JetBrains Webinar

Doctrine����������� ������������������  Annotations

phpDocumentor����������� ������������������  2

Notoj

Annotation Engines

php-annotations

1.1.2

2.0.2

1.1

0.16.1

full����������� ������������������  support

only����������� ������������������  string����������� ������������������  

full����������� ������������������  support

full����������� ������������������  support

doctrine/annotations

phpdocumentor/reflection-docblock

mindplay/annotations

crodas/notoj

Page 96: PHP Annotations: They exist! - JetBrains Webinar

How����������� ������������������  it����������� ������������������  Works

<?php

/**! * @ORM\Column(‘string’)! * @Assert\NotBlank()! */

use Doctrine\ORM\Mapping as ORM;!use Symfony\Component\Validator\! Constraints as Assert;

Page 97: PHP Annotations: They exist! - JetBrains Webinar

How����������� ������������������  it����������� ������������������  Works

<?php

/**! * @ORM\Column(‘string’)! * @Assert\NotBlank()! */

use Doctrine\ORM\Mapping as ORM;!use Symfony\Component\Validator\! Constraints as Assert;

Declare����������� ������������������  which����������� ������������������  Annotations����������� ������������������  you����������� ������������������  will����������� ������������������  use

Page 98: PHP Annotations: They exist! - JetBrains Webinar

How����������� ������������������  it����������� ������������������  Works

AnnotationReader<?php

/**! * @ORM\Column(‘string’)! * @Assert\NotBlank()! */

use Doctrine\ORM\Mapping as ORM;!use Symfony\Component\Validator\! Constraints as Assert;

Declare����������� ������������������  which����������� ������������������  Annotations����������� ������������������  you����������� ������������������  will����������� ������������������  use

Page 99: PHP Annotations: They exist! - JetBrains Webinar

How����������� ������������������  it����������� ������������������  Works

AnnotationReader<?php

/**! * @ORM\Column(‘string’)! * @Assert\NotBlank()! */

new ORM\Column(‘string’)!new Assert\NotBlank()

“metadata”

use Doctrine\ORM\Mapping as ORM;!use Symfony\Component\Validator\! Constraints as Assert;

Declare����������� ������������������  which����������� ������������������  Annotations����������� ������������������  you����������� ������������������  will����������� ������������������  use

Page 100: PHP Annotations: They exist! - JetBrains Webinar

How����������� ������������������  it����������� ������������������  Works

AnnotationReader<?php

/**! * @ORM\Column(‘string’)! * @Assert\NotBlank()! */

new ORM\Column(‘string’)!new Assert\NotBlank()

Cache

“metadata”

Walker����������� ������������������  /����������� ������������������  code

use Doctrine\ORM\Mapping as ORM;!use Symfony\Component\Validator\! Constraints as Assert;

Declare����������� ������������������  which����������� ������������������  Annotations����������� ������������������  you����������� ������������������  will����������� ������������������  use

Page 101: PHP Annotations: They exist! - JetBrains Webinar

Input Filtering

DMS\Filter: https://github.com/rdohms/DMS

Page 102: PHP Annotations: They exist! - JetBrains Webinar

Input Filtering

DMS\Filter: https://github.com/rdohms/DMS

With����������� ������������������  Annotation����������� ������������������  Support!

Page 103: PHP Annotations: They exist! - JetBrains Webinar

Ingredients:

-����������� ������������������  Filter����������� ������������������  Rules-����������� ������������������  Filter����������� ������������������  Executioners����������� ������������������  -����������� ������������������  Filter����������� ������������������  Service����������� ������������������  -����������� ������������������  Annotation����������� ������������������  Engine����������� ������������������  -����������� ������������������  Annotated����������� ������������������  Objects

the����������� ������������������  annotation����������� ������������������  /����������� ������������������  metadata,����������� ������������������  configuration

applies����������� ������������������  the����������� ������������������  rules

the����������� ������������������  middle-man

gets����������� ������������������  the����������� ������������������  rules����������� ������������������  out����������� ������������������  of����������� ������������������  the����������� ������������������  docblocks

defines����������� ������������������  the����������� ������������������  rules

Page 104: PHP Annotations: They exist! - JetBrains Webinar

Filter����������� ������������������  Service

Filter����������� ������������������  EnforcerFiltered����������� ������������������  values

annotated����������� ������������������  object@Filter\StripTags(‘<b><i>’)

$executioner = new Filter\StripTags();!$executioner->filter($metadata, $value);

<p>Hello����������� ������������������  <b>World</b></p>

Hello����������� ������������������  <b>World</b>

“Configured”����������� ������������������  Rulesnew Rules\StripTags(‘<b><i>’);

Annotation����������� ������������������  Engine

Page 105: PHP Annotations: They exist! - JetBrains Webinar

The “rule”

Page 106: PHP Annotations: They exist! - JetBrains Webinar

<?php ! !namespace DMS\Filter\Rules; ! !/** ! * StripTags Rule ! * ! * @Annotation ! */ !class StripTags extends Rule !{ ! /** ! * String of allowed tags. Ex: <b><i><a> ! * ! * @var string ! */ ! public $allowed = null; ! ! /** ! * {@inheritDoc} ! */ ! public function getDefaultOption() ! { ! return 'allowed'; ! } !}

Usage:����������� ������������������  ����������� ������������������  use DMS\Filter\Rules as Filter;!!@Filter\StripTags(‘<b><i>’)

Page 107: PHP Annotations: They exist! - JetBrains Webinar

<?php ! !namespace DMS\Filter\Rules; ! !/** ! * StripTags Rule ! * ! * @Annotation ! */ !class StripTags extends Rule !{ ! /** ! * String of allowed tags. Ex: <b><i><a> ! * ! * @var string ! */ ! public $allowed = null; ! ! /** ! * {@inheritDoc} ! */ ! public function getDefaultOption() ! { ! return 'allowed'; ! } !}

tell����������� ������������������  doctrine����������� ������������������  this����������� ������������������  ����������� ������������������  is����������� ������������������  an����������� ������������������  annotation

Usage:����������� ������������������  ����������� ������������������  use DMS\Filter\Rules as Filter;!!@Filter\StripTags(‘<b><i>’)

Page 108: PHP Annotations: They exist! - JetBrains Webinar

<?php ! !namespace DMS\Filter\Rules; ! !/** ! * StripTags Rule ! * ! * @Annotation ! */ !class StripTags extends Rule !{ ! /** ! * String of allowed tags. Ex: <b><i><a> ! * ! * @var string ! */ ! public $allowed = null; ! ! /** ! * {@inheritDoc} ! */ ! public function getDefaultOption() ! { ! return 'allowed'; ! } !}

tell����������� ������������������  doctrine����������� ������������������  this����������� ������������������  ����������� ������������������  is����������� ������������������  an����������� ������������������  annotation

Usage:����������� ������������������  ����������� ������������������  use DMS\Filter\Rules as Filter;!!@Filter\StripTags(‘<b><i>’)

DMS\Filter\Rules\Rule: !public function __construct($options = null)

Page 109: PHP Annotations: They exist! - JetBrains Webinar

/**! * @My\Annotation(“name”, nullable=true)! */

Page 110: PHP Annotations: They exist! - JetBrains Webinar

/**! * @My\Annotation(“name”, nullable=true)! */

defaultProperty

Page 111: PHP Annotations: They exist! - JetBrains Webinar

/**! * @My\Annotation(“name”, nullable=true)! */

new My\Annotation($options);

defaultProperty

Page 112: PHP Annotations: They exist! - JetBrains Webinar

/**! * @My\Annotation(“name”, nullable=true)! */

new My\Annotation($options);

array:����������� ������������������  key����������� ������������������  =>����������� ������������������  value����������� ������������������  or����������� ������������������  

string:����������� ������������������  value

defaultProperty

Page 113: PHP Annotations: They exist! - JetBrains Webinar

/**! * @My\Annotation(“name”, nullable=true)! */

new My\Annotation($options);

array:����������� ������������������  key����������� ������������������  =>����������� ������������������  value����������� ������������������  or����������� ������������������  

string:����������� ������������������  value

defaultProperty

or

Page 114: PHP Annotations: They exist! - JetBrains Webinar

/**! * @My\Annotation(“name”, nullable=true)! */

new My\Annotation($options);

$a = new My\Annotation();!$a->nullable = true;!$a->{$a->getDefaultProperty()} = “name”;

array:����������� ������������������  key����������� ������������������  =>����������� ������������������  value����������� ������������������  or����������� ������������������  

string:����������� ������������������  value

defaultProperty

or

Page 115: PHP Annotations: They exist! - JetBrains Webinar

The “enforcer”

Page 116: PHP Annotations: They exist! - JetBrains Webinar

<?php ! !namespace DMS\Filter\Filters; ! !use DMS\Filter\Rules\Rule; ! !/** ! * StripTags Rule ! * ! * @package DMS ! * @subpackage Filter ! * ! * @Annotation ! */ !class StripTags extends BaseFilter !{ ! ! /** ! * {@inheritDoc} ! * ! * @param \DMS\Filter\Rules\StripTags $filter ! * @param mixed $filter ! */ ! public function apply( Rule $filter, $value) ! { ! return strip_tags($value, $filter->allowed); ! } !} !

Page 117: PHP Annotations: They exist! - JetBrains Webinar

<?php ! !namespace DMS\Filter\Filters; ! !use DMS\Filter\Rules\Rule; ! !/** ! * StripTags Rule ! * ! * @package DMS ! * @subpackage Filter ! * ! * @Annotation ! */ !class StripTags extends BaseFilter !{ ! ! /** ! * {@inheritDoc} ! * ! * @param \DMS\Filter\Rules\StripTags $filter ! * @param mixed $filter ! */ ! public function apply( Rule $filter, $value) ! { ! return strip_tags($value, $filter->allowed); ! } !} !

Does����������� ������������������  the����������� ������������������  filtering

Page 118: PHP Annotations: They exist! - JetBrains Webinar

<?php ! !namespace DMS\Filter\Filters; ! !use DMS\Filter\Rules\Rule; ! !/** ! * StripTags Rule ! * ! * @package DMS ! * @subpackage Filter ! * ! * @Annotation ! */ !class StripTags extends BaseFilter !{ ! ! /** ! * {@inheritDoc} ! * ! * @param \DMS\Filter\Rules\StripTags $filter ! * @param mixed $filter ! */ ! public function apply( Rule $filter, $value) ! { ! return strip_tags($value, $filter->allowed); ! } !} !

Does����������� ������������������  the����������� ������������������  filtering

Rule����������� ������������������  has����������� ������������������  the����������� ������������������  configuration.Ex:����������� ������������������  allowed����������� ������������������  tags

Page 119: PHP Annotations: They exist! - JetBrains Webinar

The Filter Service

Page 120: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

Page 121: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

09:00 - DIC wake-up call new FilterService($reader);

Page 122: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

09:00 - DIC wake-up call

09:05 - Reply to emergency filter call

new FilterService($reader);

$service->filter($object);

Page 123: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

09:00 - DIC wake-up call

09:05 - Reply to emergency filter call

09:06 - Get Annotations for properties

new FilterService($reader);

$service->filter($object);

$reader->getPropertyAnnotations($p); $a = array(StripTags(), Alpha());

Page 124: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

09:00 - DIC wake-up call

09:05 - Reply to emergency filter call

09:06 - Get Annotations for properties

09:07 - Track down the Filters

new FilterService($reader);

$service->filter($object);

$reader->getPropertyAnnotations($p); $a = array(StripTags(), Alpha());

new Filters\StripTags();

Page 125: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

09:00 - DIC wake-up call

09:05 - Reply to emergency filter call

09:06 - Get Annotations for properties

09:07 - Track down the Filters

09:08 - Get values filtered

new FilterService($reader);

$service->filter($object);

$reader->getPropertyAnnotations($p); $a = array(StripTags(), Alpha());

new Filters\StripTags();

$filter->apply($rule, $value);

Page 126: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

09:00 - DIC wake-up call

09:05 - Reply to emergency filter call

09:06 - Get Annotations for properties

09:07 - Track down the Filters

09:08 - Get values filtered

09:10 - Update the object with new data

new FilterService($reader);

$service->filter($object);

$reader->getPropertyAnnotations($p); $a = array(StripTags(), Alpha());

new Filters\StripTags();

$filter->apply($rule, $value);

$object->prop = $newValue;

Page 127: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

09:00 - DIC wake-up call

09:05 - Reply to emergency filter call

09:06 - Get Annotations for properties

09:07 - Track down the Filters

09:08 - Get values filtered

09:10 - Update the object with new data

09:11 - send the object on its way

new FilterService($reader);

$service->filter($object);

$reader->getPropertyAnnotations($p); $a = array(StripTags(), Alpha());

new Filters\StripTags();

$filter->apply($rule, $value);

$object->prop = $newValue;

return $object;

Page 128: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

09:00 - DIC wake-up call

09:05 - Reply to emergency filter call

09:06 - Get Annotations for properties

09:07 - Track down the Filters

09:08 - Get values filtered

09:10 - Update the object with new data

09:11 - send the object on its way

new FilterService($reader);

$service->filter($object);

$reader->getPropertyAnnotations($p); $a = array(StripTags(), Alpha());

new Filters\StripTags();

$filter->apply($rule, $value);

$object->prop = $newValue;

return $object;

09:12 - DO IT ALL AGAIN!

Page 129: PHP Annotations: They exist! - JetBrains Webinar

The����������� ������������������  Life����������� ������������������  of����������� ������������������  a����������� ������������������  Filter����������� ������������������  Service

09:00 - DIC wake-up call

09:05 - Reply to emergency filter call

09:06 - Get Annotations for properties

09:07 - Track down the Filters

09:08 - Get values filtered

09:10 - Update the object with new data

09:11 - send the object on its way

new FilterService($reader);

$service->filter($object);

$reader->getPropertyAnnotations($p); $a = array(StripTags(), Alpha());

new Filters\StripTags();

$filter->apply($rule, $value);

$object->prop = $newValue;

return $object;

09:12 - DO IT ALL AGAIN!

Page 130: PHP Annotations: They exist! - JetBrains Webinar

//Iterate over all annotations !foreach($this->reader->getPropertyAnnotations($property) as $rule) { ! ! //Skip is its not a rule ! if ( ! $rule instanceof Rules\Rule ) continue; ! ! //Add Rule ! $metadata->addPropertyRule($property->getName(), $rule); ! !}

Page 131: PHP Annotations: They exist! - JetBrains Webinar

//Iterate over all annotations !foreach($this->reader->getPropertyAnnotations($property) as $rule) { ! ! //Skip is its not a rule ! if ( ! $rule instanceof Rules\Rule ) continue; ! ! //Add Rule ! $metadata->addPropertyRule($property->getName(), $rule); ! !}

get����������� ������������������  all����������� ������������������  annotation����������� ������������������  objects

Page 132: PHP Annotations: They exist! - JetBrains Webinar

//Iterate over all annotations !foreach($this->reader->getPropertyAnnotations($property) as $rule) { ! ! //Skip is its not a rule ! if ( ! $rule instanceof Rules\Rule ) continue; ! ! //Add Rule ! $metadata->addPropertyRule($property->getName(), $rule); ! !}

get����������� ������������������  all����������� ������������������  annotation����������� ������������������  objects

filter����������� ������������������  out����������� ������������������  “our”����������� ������������������  annotations

Page 133: PHP Annotations: They exist! - JetBrains Webinar

//Iterate over all annotations !foreach($this->reader->getPropertyAnnotations($property) as $rule) { ! ! //Skip is its not a rule ! if ( ! $rule instanceof Rules\Rule ) continue; ! ! //Add Rule ! $metadata->addPropertyRule($property->getName(), $rule); ! !}

glorified����������� ������������������  array

get����������� ������������������  all����������� ������������������  annotation����������� ������������������  objects

filter����������� ������������������  out����������� ������������������  “our”����������� ������������������  annotations

Page 134: PHP Annotations: They exist! - JetBrains Webinar

Necessary Object Calisthenics Disclaimer

FilterService

MetadataFactory ObjectWalker

Loader Cache

Reader ReflectionPropertyCache

Page 135: PHP Annotations: They exist! - JetBrains Webinar

//Get Doctrine Reader ! $reader = new Annotations\AnnotationReader(); ! $reader->setEnableParsePhpImports(true); ! ! //Load AnnotationLoader ! $loader = new Mapping\Loader\AnnotationLoader($reader); ! $this->loader = $loader; ! ! //Get a MetadataFactory ! $metadataFactory = new Mapping\ClassMetadataFactory($loader); ! ! //Get a Filter ! $filter = new DMS\Filter\Filter($metadataFactory); ! ! //Get your Entity ! $user = new App\Entity\User(); ! $user->name = "My <b>name</b>"; ! $user->email = " [email protected]"; ! ! //Filter you entity ! $filter->filter($user); ! ! echo $user->name; //"My name" ! echo $user->email; //"[email protected]" !

Page 136: PHP Annotations: They exist! - JetBrains Webinar

//Get Doctrine Reader ! $reader = new Annotations\AnnotationReader(); ! $reader->setEnableParsePhpImports(true); ! ! //Load AnnotationLoader ! $loader = new Mapping\Loader\AnnotationLoader($reader); ! $this->loader = $loader; ! ! //Get a MetadataFactory ! $metadataFactory = new Mapping\ClassMetadataFactory($loader); ! ! //Get a Filter ! $filter = new DMS\Filter\Filter($metadataFactory); ! ! //Get your Entity ! $user = new App\Entity\User(); ! $user->name = "My <b>name</b>"; ! $user->email = " [email protected]"; ! ! //Filter you entity ! $filter->filter($user); ! ! echo $user->name; //"My name" ! echo $user->email; //"[email protected]" !

put����������� ������������������  this����������� ������������������  in����������� ������������������  your����������� ������������������  DIC

Page 137: PHP Annotations: They exist! - JetBrains Webinar

//Get Doctrine Reader ! $reader = new Annotations\AnnotationReader(); ! $reader->setEnableParsePhpImports(true); ! ! //Load AnnotationLoader ! $loader = new Mapping\Loader\AnnotationLoader($reader); ! $this->loader = $loader; ! ! //Get a MetadataFactory ! $metadataFactory = new Mapping\ClassMetadataFactory($loader); ! ! //Get a Filter ! $filter = new DMS\Filter\Filter($metadataFactory); ! ! //Get your Entity ! $user = new App\Entity\User(); ! $user->name = "My <b>name</b>"; ! $user->email = " [email protected]"; ! ! //Filter you entity ! $filter->filter($user); ! ! echo $user->name; //"My name" ! echo $user->email; //"[email protected]" !

Calling����������� ������������������  the����������� ������������������  Service

put����������� ������������������  this����������� ������������������  in����������� ������������������  your����������� ������������������  DIC

Page 138: PHP Annotations: They exist! - JetBrains Webinar

What? Why? Where?

How?

Page 139: PHP Annotations: They exist! - JetBrains Webinar

http://plugins.jetbrains.com/plugin/7320?pr=phpStorm

PHP Annotations Pluginby Daniel Espendiller

Page 140: PHP Annotations: They exist! - JetBrains Webinar

Questions?

on����������� ������������������  twitterthese����������� ������������������  slides����������� ������������������  ����������� ������������������  will����������� ������������������  be����������� ������������������  here

http://slides.doh.ms

http://doh.ms

@rdohms


Related Documents