Starting with TYPO3 4.3, a new extension framework called Extbase will be introduced. It is the backport of the MVC concepts of FLOW3. By building extensions using Extbase now, the transition and learning curve to FLOW3 will be a lot easier.
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
MVC for TYPO3 4.3 with extbase
1. T3CON09 Dallas Inspiring people to
share
MVC for TYPO3 4.3 with Extbase
2. MVC workshop for TYPO3 4.3
15.04.2009
Oliver Hader <oliver@typo3.org>
Sebastian Kurfürst <sebastian@typo3.org>
3. Abstract
The current state of the art
Core concepts - MVC and DDD Hello world
Extension building with Blog example
Extbase
Persistence
Outlook and conclusion
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
4. Abstract
The current state of the art
Core concepts - MVC and DDD Hello world
Extension building with Blog example
Extbase
Persistence
Outlook and conclusion
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
5. The current state
of the art
http://commons.wikimedia.org/wiki/File:Z%C3%BCrich_-_Seefeld_-_Heureka_IMG_1757.JPG
6. The current state of the art
The current state of the art
dispatches calls templates
FE
fetches data JavaScript/CSS
Plugin Resources
renders output images
extends tslib_pibase TypoScript
Database tables Frontend
Extension
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
7. The current state of the art
File structure
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
8. The current state of the art
A new extension: Blogging with TYPO3
Overview
define features of the new blogging application
implement the business logic
define the look and feel
take a look at security issues
modify and extend the application
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
9. The current state of the art
Blog features
Blog
administrate blogs, blog posts and blog comments
list all available blogs
Post
list all blog posts of a blog
list all comments of a blog post
Comment Tag
allow users to post new comments
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
10. The current state of the art
Blog business logic
dispatch method calls in tx_blog_pi1->main()
public function main($content, $conf) {
$this->conf = $conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();
if ($this->piVars['postUid']) {
if ($this->piVars['newComment']) {
$this->storeNewComment();
}
$content = $this->renderPost();
} elseif ($this->piVars['blogUid']) {
$content = $this->renderBlog();
} else {
$content = $this->renderListOfBlogs();
}
return $this->pi_wrapInBaseClass($content);
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
11. The current state of the art
Task 1: Output a listing of blogs
fetch available blogs from database
implement a new method „renderListOfBlogs()“
protected function renderListOfBlogs() {
...
$blogs = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
'*',
'tx_blog_blog',
'deleted=0 AND hidden=0 AND sys_language_uid=' .
$GLOBALS['TSFE']->sys_language_uid .
$this->cObj->enableFields('tx_blog_blog'),
'',
'name'
);
...
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
12. The current state of the art
Task 1: Output a listing of blogs
iterate through all blogs and render them
protected function renderListOfBlogs() {
$template = $this->cObj->fileResource($this->conf['template']);
$blogElementSubpart = $this->cObj->getSubpart($template, '###SUBPART_BLOGELEMENT###');
$blogs = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(...);
foreach ($blogs as $blog) {
$linkParameters = array('blogUid' => $blog['uid']);
$markers = array(
'###BLOG_NAME###' => $blog['name'],
'###BLOG_LOGO###' => $this->cImage('uploads/tx_blog/' . $blog['logo']),
'###BLOG_DESCRIPTION###' => $this->pi_RTEcssText($blog['description']),
'###BLOG_MORELINK###' => $this->pi_linkTP('show blog', $linkParameters, true),
);
$blogElements.= $this->cObj->substituteMarkerArray($blogElementSubpart, $markers);
}
return $content;
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
13. The current state of the art
Task 1: Output a listing of blogs
create the template with markers and subparts
<!-- ###SUBPART_BLOGELEMENT### begin -->
<div class=quot;blog elementquot;>
###BLOG_NAME###
###BLOG_LOGO###
###BLOG_DESCRIPTION###
###BLOG_MORELINK###
</div>
<!-- ###SUBPART_BLOGELEMENT### end -->
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
14. The current state of the art
Task 2: Display a single post with its comments
implement a new method „renderListOfBlogs()“
protected function renderPost() {
$post = $this->pi_getRecord('tx_blog_post', $this->piVars['postUid']);
$comments = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
'*',
'tx_blog_comment',
'deleted=0 AND hidden=0 AND sys_language_uid=' .
$GLOBALS['TSFE']->sys_language_uid .
' AND post_uid=' . $this->piVars['postUid'] . ' AND post_table=quot;tx_blog_postquot;' .
$this->cObj->enableFields('tx_blog_comment'),
'',
'date DESC'
);
// fill marker arrays and substitute in template
// return content
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
15. The current state of the art
Task 3: Add a new comment to a blog post
the whole plugin is cached („USER“)
dynamic user input won‘t be handled by the rendering when cached
define uncached behavior in TypoScript
[globalVar = _POST:tx_blog_pi1|newComment = 1]
plugin.tx_blog_pi1 = USER_INT
[global]
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
16. The current state of the art
Task 3: Add a new comment to a blog post
store new comment in database
protected function storeNewComment() {
$fields = array(
'post_uid' => $this->piVars['postUid'],
'post_table' => 'tx_blog_post',
'date' => time(),
'author' => $this->piVars['author'],
'email' => $this->piVars['email'],
'content' => $this->piVars['content'],
);
$GLOBALS['TYPO3_DB']->exec_INSERTquery(
'tx_blog_comment', $fields
);
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
17. The current state of the art
Take a look at security issues
possibility of SQL injections
unvalidated information submitted by a user
is there really a mail address where it was expected?
are integers really integers?
malicious information submitted by a user (XSS)
is there a possibility to inject JavaScript code?
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
18. The current state of the art
Security: SQL injections
unescaped or unchecked values that are transferred to the database directly
$comments = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
'*',
'tx_blog_comment',
'deleted=0 AND hidden=0 AND sys_language_uid=' . $GLOBALS['TSFE']->sys_language_uid .
' AND post_uid=' . $this->piVars['postUid'] . ' AND post_table=quot;tx_blog_postquot;' .
$this->cObj->enableFields('tx_blog_comment')
);
with &postUid=1; INSERT INTO be_users SET ...; SELECT * FROM tx_blog_comment WHERE 1=1
SELECT * FROM tx_blog_comment WHERE post_uid=1;
INSERT INTO be_users SET ...;
SELECT * FROM tx_blog_comment WHERE 1=1 AND post_table=“tx_blog_post“ ...
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
19. The current state of the art
Security: SQL injections
always escape or cast variables from outside
' AND post_uid=' . intval($this->piVars['postUid']) . ' AND post_table=quot;tx_blog_postquot;' .
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
20. The current state of the art
Modify and extend the blog application
store information on different DBMS (e.g. move from MySQL to Oracle)
are there any SQL statements that won‘t work in Oracle?
what about the length of the table names?
integrate spam protection for posting new comments
add validation to the arguments submitted by a user
integrate a PDF and RSS version of all blogs
implement new business logic for each new output format
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
21.
22. Abstract
The current state of the art
Core concepts - MVC and DDD Hello world
Extension building with Blog example
Extbase
Persistence
Outlook and conclusion
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
23. Core concepts
Model Domain
View Driven
Controller Design
http://www.flickr.com/photos/seier/501370105/
27. Core concepts - MVC
Application domain
Example: Car rental application
Application domain contains: Car, Sales Agent, Customer, Sale, Billing
defines properties and behavior of these (real world) objects
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
28. Core concepts - MVC
Model
Object representation of data and behavior
represents the application domain in software
FLOW3: Domain Models
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
29. Core concepts - MVC
Model: Car rental example
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
30. The view
Topictext
renders
View
data.
renders data for different output mediums
it‘s only about displaying data
includes all output logic
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
http://www.sxc.hu/photo/1157763
31. The controller steers
the data flow and
triggers actions
http://www.sxc.hu/browse.phtml?f=view&id=956017
33. Core concepts - MVC
Conclusion MVC
Model: stores data and behavior
View: renders data
Controller: connects model and view, reacts to user input
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
36. Core concepts - Domain Driven Design
Layered architecture
View
Presentation
Controller
Application Logic (Service Layer)
Domain
Domain Model (Domain Layer)
Data Mapper
Data source
Data Source Abstraction
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
37. Core concepts - Domain Driven Design
Layered architecture
View
Presentation
Controller
Application Logic (Service Layer)
Domain
Domain Model (Domain Layer)
Data Mapper
Data source
Data Source Abstraction
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
38. Principles of Domain Driven Design
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
43. Core concepts - Domain Driven Design
Ubiquitous language
common vocabulary is an important prerequisite to work together
you should use the same vocabulary for discussion, modelling, development and
documentation
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
44. Core concepts - Domain Driven Design
Principles of Domain Driven Design
Domain = activity or business of user
focus on the domain
build rules of the domain in software
ubiquitous language
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
45. Core concepts - Domain Driven Design
Example: Phone book
Not in the showEntries()
PhoneBook checkIfUserCanDeleteEntry()
exportPhoneBook()
domain logChanges()
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
46. Why should you use DDD?
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
47. Read lots of TypoScript
Mix PHP and HTML template
and core API docs
to build a template-based
layout
Build frontend forms
with error handling
Implement application logic
Care about security
adapt to the coding style,
Build complex structure and thinking of
SQL queries different developers
50. Flow [flō] is the mental state of operation in
which the person is fully immersed in what he
or she is doing by a feeling of energized focus,
full involvement, and success in the process of
the activity.
http://www.sxc.hu/photo/768249
51.
52.
53. Abstract
The current state of the art
Core concepts - MVC and DDD Hello world
Extension building with Blog example
Extbase
Persistence
Outlook and conclusion
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
55. Extension building with Extbase
File structure
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
56. Extension building with Extbase
Hello World
Task: Output “Hello World”
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
57. Extension building with Extbase
Controller
all controllers inherit from Tx_Extbase_MVC_Controller_ActionController
Controllers contain actions: *Action
Default action: indexAction
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
58. Topictext
Hello World
Demo
DEMO
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
59. Break until 11:00
-> Start screenflow again
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
60. Abstract
The current state of the art
Core concepts - MVC and DDD Hello world
Extension building with Blog example
Extbase
Persistence
Outlook and conclusion
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
61. Blog example
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
62. Extension building with Extbase
Task 1: Output a listing of blog postings
You want to output the postings of a predefined blog.
// inside the BlogController:
public function showAction() {
$blogUid = 1;
// Fetch blog with UID 1
// pass blog to view so it can be rendered
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
64. Extension building with Extbase - Blog Example
Model
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
65. Extension building with Extbase - Blog Example
Aggregates
BlogRepository Aggregate Root
Blog
Post
Comment Tag
Aggregate
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
66. Extension building with Extbase - Blog Example
Aggregates
Idea: Put your objects into a tree / hierarchical structure
Root of the tree: aggregate root
Aggregate roots are accessible through Repositories
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
71. Extension building with Extbase - Blog Example
Repositories
Encapsulate all data access
SQL is allowed only in the Repository
Magic methods: findBy*, findOneBy*
73. Extension building with Extbase - Blog Example
Task 1: Output a listing of blog postings
You want to output the postings of a predefined blog.
// inside the BlogController:
public function showAction() {
$blogUid = 1;
$blog = $this->blogRepository->findOneByUid($blogUid);
// pass blog to view so it can be rendered
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
74. Extension building with Extbase - Blog Example
Task 1: Output a listing of blog postings
You want to output the postings of a predefined blog.
// inside the BlogController:
public function showAction() {
$blogUid = 1;
$blog = $this->blogRepository->findOneByUid($blogUid);
$this->view->assign('blog', $blog);
return $this->view->render(); // can be omitted
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
75. Extension building with Extbase - Blog Example
Task 1: Output a listing of blog postings
Inside the template:
<h1>Welcome to {blog.name}</h1>
<f:for each=quot;{blog.posts}quot; as=quot;postquot;>
<h1>{post.title}</h1>
<f:actionlink controller=quot;Postquot; action=quot;showquot;
arguments=quot;{postUid : post.uid}quot;>read more </f:actionlink>
</f:for>
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
76.
77. Extension building with Extbase - Blog Example
Task 2: Display a single blog post
Display a post with comments
// inside the PostController:
public function showAction() {
// Get the Post UID
// Fetch post with UID X
// Pass post to view so it can be rendered
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
78. Extension building with Extbase - Blog Example
Arguments
/**
* Action that displays one single post
*
* @param int $postUid The uid of a post
* @return string The rendered view
*/
public function showAction($postUid) {
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
79. Extension building with Extbase - Blog Example
Arguments
All arguments must be registered.
Registration of expected arguments happens through defining them as method
parameters.
PHPDoc is mandatory as it is used for data type validation
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
80. Extension building with Extbase - Blog Example
Arguments - more advanced
/**
* Action that displays one single post
*
* @param int $postUid The uid of a post
* @return string The rendered view
*/
public function showAction($postUid = 1) {
}
Default values
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
81. Extension building with Extbase - Blog Example
Arguments - more advanced
/**
* Action that displays one single post
Do
*
* @param string $title Title of the post additional validation
* @param string $content Content of the post
* @validate $title Length(maximum=100)
* @return string The rendered view
*/
public function createAction($title, $content)
{
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
82. Extension building with Extbase - Blog Example
Task 2: Display a single blog post
Display a post with comments
// inside the PostController:
/**
* @param int $postUid The post UID to be displayed
*/
public function showAction($postUid = 0) {
// Fetch post with UID X
// Pass post to view so it can be rendered
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
83. Extension building with Extbase - Blog Example
Aggregates - continued
BlogRepository
Blog Aggregate Root
PostRepository
Post
Comment Tag
Aggregate
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
84. Extension building with Extbase - Blog Example
Task 2: Display a single blog post
Display a post with comments
// inside the PostController:
/**
* @param int $postUid The post UID to be displayed
*/
public function showAction($postUid = 0) {
$post = $this->postRepository->findOneByUid($postUid);
// Pass post to view so it can be rendered
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
85. Extension building with Extbase - Blog Example
Task 2: Display a single blog post
Display a post with comments
// inside the PostController:
/**
* @param int $postUid The post UID to be displayed
*/
public function showAction($postUid = 0) {
$post = $this->postRepository->findOneByUid($postUid);
$this->view->assign('post', $post);
}
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
86. Topictext
Task 2: Display a single blog post - template
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
87. Extension building with Extbase - Blog Example
Task 3: Add a new comment
a new comment needs to be stored for a given post
1. Create the template
2. Add the comment in the controller
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
88. Extension building with Extbase - Blog Example
Task 3: Add a new comment
1. The template
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
89.
90. Abstract
The current state of the art
Core concepts - MVC and DDD Hello world
Extension building with Blog example
Extbase
Persistence
Outlook and conclusion
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
91. Persistence
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
92. Persistence
Aggregates revisited
BlogRepository
Blog Aggregate Root
PostRepository
Post
Comment Tag
Aggregate
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
93. Persistence
adding a blog
the blog is an aggregate root
Persistent objects
BlogRepository
$blogRepository->add(Blog $blog);
Blog
Now, the Blog is a managed object - changes are now automatically persisted!
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
94. Persistence
adding a blog
the blog is an aggregate root
Persistent objects
BlogRepository
$blogRepository->add(Blog $blog);
Blog
Now, the Blog is a managed object - changes are now automatically persisted!
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
95. Persistence
adding a comment
Comment is no aggregate root
Persistent objects
Thus, Comment is automatically persisted PostRepository
Post
Comment
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
96. Persistence
Transparent object persistence
All objects (and their child-objects) managed by a repository are automatically
persisted
changes to these objects are automatically persisted
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
99. Persistence
Summary: Domain objects
we start with the business logic (PHP classes)
Objects represent things in the real world, with their attributes and behavior
we don't care about the database backend / persistence layer
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
100. Persistence
Excursus: ActiveRecord
Introduced with Ruby on Rails
Starts with the data structures in the database
attributes are not explicitly in the objects - taken from the database
class User < ActiveRecord::Base
end
Very intransparent!
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
101.
102. Abstract
The current state of the art
Core concepts - MVC and DDD Hello world
Extension building with Blog example
Extbase
Persistence
Outlook and conclusion
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
103. Outlook
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
104. Outlook
Availability and documentation
Extbase will be included in TYPO3 4.3
full-blown replacement for pibase
new preferred way to write extensions
futureproof, with concepts of FLOW3
Currently no documentation, but will be available with the final release
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
105. Outlook
New kickstarter
currently ongoing project by the core development team
will be released shortly after 4.3
Domain Driven Design - Don't think in databases, think in Objects!
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
106. Resources and links
Project web site: http://forge.typo3.org/projects/show/typo3v4-mvc
SVN: https://svn.typo3.org/TYPO3v4/CoreProjects/MVC/
we will provide documentation until the release of TYPO3 4.3
First release with TYPO3 4.3 alpha3: http://typo3.org/download/packages/
Inspiring people to
MVC for TYPO3 4.3 with Extbase share
107. Conclusion
Inspiring people to
MVC for TYPO3 4.3 with Extbase share