php annotations: they exist! - jetbrains webinar

140
Rafael Dohms Annotations in PHP @rdohms on twitter They Exist!

Upload: rafael-dohms

Post on 08-Sep-2014

36.134 views

Category:

Technology


0 download

DESCRIPTION

Annotations are more than PHPDoc comments, they’re a fully-featured way of including additional information alongside your code. We might have rejected an RFC to add support into the PHP core, but the community has embraced this tool anyway! This session shows you who is doing what with annotations, and will give you some ideas on how to use the existing tools in your own projects to keep life simple. Developers, architects and anyone responsible for the technical direction of an application should attend this session.

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