6. TYPO3BlogDomainModel Post
• Namespace
namespace TYPO3BlogDomainModel;
• Annotations
use DoctrineORMMapping as ORM;
use TYPO3FLOW3Annotations as FLOW3;
• Class Post
• Dieses Model nach den Konzepten von DDD eine Entitiy
• Instanzen dieser Klasse können gespeichert werden
/**
* A blog
*
* @FLOW3Entity
*/
class Post {
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
6
7. TYPO3BlogDomainModel Post
• Properties
• Variablen Deklaration als String
• Validierung auf Datentyp und Länge
• Validierung des Datentyps innerhalb des Models und Repositories
/**
* The post‘s title.
*
* @var string
* @FLOW3Validate(type="Text")
* @FLOW3Validate(type="StringLength", options={ "minimum"=1,
"maximum"=80 })
* @ORMColumn(length=80)
*/
protected $title = '';
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
7
8. TYPO3BlogDomainModel Post
• Property $date
• Deklaration als Date Objekt
• Identity
/**
* @FLOW3Identity
* @var DateTime
*/
protected $date;
• Property $blog
• Deklaration als Blog Objekt
• Association Mapping OneToMany
/**
* @var TYPO3BlogDomainModelBlog
* @ORMManyToOne(inversedBy="posts")
*/
protected $blog;
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
8
9. Association Mapping
• OneToMany <-> ManyToOne
/** The posts contained in this blog
* @var DoctrineCommonCollectionsCollection<TYPO3Blog
DomainModelPost>
* @ORMOneToMany(mappedBy="blog")
* @ORMOrderBy({"date" = "DESC"})
*/
protected $posts;
Model Blog Model Post
$posts $blog
/**The blog
* @var TYPO3BlogDomainModelBlog
* @ORMManyToOne(inversedBy="posts")
*/
protected $blog;
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
9
10. Association Mapping
• ManyToMany <-> ManyToMany
/**
* @var DoctrineCommonCollectionsCollection<TYPO3Blog
DomainModelTag>
* @ORMManyToMany(inversedBy="posts")
*/
protected $tags;
Model Post Model Tag
$tags $posts
/**The posts tagged with this tag
* @var DoctrineCommonCollectionsCollection<TYPO3Blog
DomainModelPost>
* @ORMManyToMany(mappedBy="tags")
*/
protected $posts;
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
10
13. TYPO3BlogDomainModel Blog
• Setter
/**Sets this blog's title
* @param string $title The blog's title
* @return void
*/
public function setTitle($title) {
$this->title = $title;
}
• Getter
/**Returns the blog's title
* @return string The blog's title
*/
public function getTitle() {
return $this->title;
}
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
13
15. Blog Repository
• Standard Blog Repository
<?php
namespace TYPO3BlogDomainRepository;
/*
* This script belongs to the FLOW3 package "TYPO3.Blog".
*/
/**
* A repository for Blogs
*
* @FLOW3Scope("singleton")
*/
class BlogRepository extends TYPO3FLOW3PersistenceRepository
{
// add customized methods here
}
?>
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
15
16. Blog Repository
• Standard Methoden des Repositories
• add
• remove
• findAll
• findBy* (magic methods)
• findOneBy* (magic methods)
findBy* und findOneBy* sind sog. Magic Methods die durch das Repository
zur Verfügung gestellt werden. Diese Methoden erlauben einen Objekte durch
Properties zu finden.
Das BlogRepository zum Beispiel erlaubt einem die Magic Methoden
findByDescription('foo') oder findOneByTitle('bar')auszuführen.
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
16
17. Post Repository
• Post Repository spezifische Methode findByBlog
/**
* Finds posts by the specified blog
* @param TYPO3BlogDomainModelBlog $blog The blog the post
must refer to
* @param integer $limit The number of posts to return at max
* @return TYPO3FLOW3PersistenceQueryResultProxy The posts
*/
public function findByBlog(TYPO3BlogDomainModelBlog $blog)
{
$query = $this->createQuery();
return $query->matching($query->equals('blog', $blog))
->setOrderings(
array('date' => QueryInterface::ORDER_DESCENDING))
->execute();
}
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
17
18. Post Repository
• Post Repository spezifische Methode findByTagAndBlog
/**Finds posts by the specified tag and blog
* @param TYPO3BlogDomainModelTag $tag
* @param TYPO3BlogDomainModelBlog $blog The blog the post
must refer to
* @return TYPO3FLOW3PersistenceQueryResultProxy The posts */
public function findByTagAndBlog(TYPO3BlogDomainModelTag
$tag, TYPO3BlogDomainModelBlog $blog) {
$query = $this->createQuery();
return $query->matching(
$query->logicalAnd(
$query->equals('blog', $blog),
$query->contains('tags', $tag)
)
)
->setOrderings(array('date' =>
QueryInterface::ORDER_DESCENDING))
->execute();
}
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
18
19. Post Repository
• Post Repository spezifische Methode findRecentByBlog
/**
* Finds most recent posts by the specified blog
*
* @param TYPO3BlogDomainModelBlog $blog The blog the post
must refer to
* @param integer $limit The number of posts to return at max
* @return TYPO3FLOW3PersistenceQueryResultProxy The posts
*/
public function findRecentByBlog(TYPO3BlogDomainModelBlog
$blog, $limit = 5) {
$query = $this->createQuery();
return $query->matching($query->equals('blog', $blog))
->setOrderings(array('date' =>
QueryInterface::ORDER_DESCENDING))
->setLimit($limit)
->execute();
}
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
19
20. Post Controller
• Post Controller indexAction()
/**
* List action for this controller. Displays latest posts
* @param TYPO3BlogDomainModelTag $tag The tag to display posts for
* @param TYPO3BlogDomainModelCategory $category The category to display posts
for
* @return void
*/
public function indexAction(TYPO3BlogDomainModelTag $tag = NULL, TYPO3Blog
DomainModelCategory $category = NULL) {
if ($tag === NULL && $category === NULL) {
$posts = $this->postRepository->findByBlog($this->blog);
} elseif ($tag !== NULL) {
$posts = $this->postRepository->findByTagAndBlog($tag, $this->blog);
$this->view->assign('tag', $tag);
} else {
$posts = $this->postRepository->findByCategoryAndBlog($category, $this->blog);
$this->view->assign('category', $category);
}
$this->view->assign('blog', $this->blog);
$this->view->assign('posts', $posts);
$this->view->assign('recentPosts', $this->postRepository->findRecentByBlog($this-
>blog));
}
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
20
21. Post Controller
• Post Controller Dependency Injection
/**
* @FLOW3Inject
* @var TYPO3BlogDomainRepositoryCategoryRepository
*/
protected $categoryRepository;
/**Displays a form for creating a new post
* @return void
*/
public function newAction() {
$account = $this->findCurrentAccount();
$newPost = new TYPO3BlogDomainModelPost();
$newPost->setAuthor($account->getParty()->getName()->getFullName());
$this->view->assign('blog', $this->blog);
$this->view->assign('existingPosts', $this->postRepository->findByBlog($this-
>blog));
$this->view->assign('categories', $this->categoryRepository->findAll());
$this->view->assign('newPost', $newPost);
}
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
21
26. Routing Subroute
• Route auf das TYPO3.Blog Package /Configuration/Routes.yaml
##
# Blog subroutes
-
name: 'Blog'
uriPattern: '<BlogSubroutes>'
defaults:
'@package': 'TYPO3.Blog'
'@format': 'html'
subRoutes:
BlogSubroutes:
package: 'TYPO3.Blog'
• Routet auf das TYPO3.Blog Package /Packages/Application/TYPO3.Blog/
Routes.yaml
• Erste zutreffende Regel in Routes.yaml wird ausgeführt.
• nur Leerzeichen verwenden, keine Tabs.
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
26
27. Routing Package
• /Packages/Application/TYPO3.Blog/Routes.yaml
-
name: 'Post index'
uriPattern: '(posts)'
defaults:
'@package': 'TYPO3.Blog'
'@controller': 'Post'
'@action': 'index'
'@format': 'html'
• passt für http://mfug.demo/ und http://mfug.demo/posts, da durch die
Klammern posts optional ist.
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
27
31. Kontakt
Cross Content Media Twitter: @MarkusGoldbeck
Gesellschaft für Online Business Solutions mbH E-Mail: mgoldbeck@cross-content.com
Landshuter Allee 8
www.cross-content.com
80637 München
Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck
31