SlideShare a Scribd company logo
1 of 14
Download to read offline
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

1. Projekt einrichten
a) SkeletonApplication installieren
$
$
$
$
$
$

cd /home/devhost/
git clone https://github.com/zendframework/ZendSkeletonApplication wdc-zf2
cd wdc-zf2/
ls -al
php composer.phar selfupdate
php composer.phar install

b) ZFTool installieren
$
$
$
$

php composer.phar require zendframework/zftool:dev-master
./vendor/bin/zf.php
./vendor/bin/zf.php modules
./vendor/bin/zf.php config list

c) Virtual Host einrichten
$ sudo nano /etc/apache2/sites-available/wdc-zf2.conf
<VirtualHost 127.0.0.1>
ServerName wdc-zf2
DocumentRoot /home/devhost/wdc-zf2/public/
AccessFileName .htaccess
SetEnv APPLICATION_ENV development
<Directory "/home/devhost/wdc-zf2/public/">
Options All
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
$ sudo a2ensite wdc-zf2.conf
$ sudo nano /etc/hosts
[...]
127.0.0.1
[...]

wdc-zf2

$ sudo service apache2 restart

✔ Im Browser öffnen: http://wdc-zf2/
d) SQLite Datenbank einrichten
$ mkdir data/db
$ sqlite3 data/db/wdc-zf2.db

e) PhpStorm Projekt einrichten (oder andere IDE der Wahl)
f) ZendDeveloperTools installieren
$ php composer.phar require zendframework/zend-developer-tools:dev-master
$ cp vendor/zendframework/zend-developer-tools/config/zenddevelopertools.local.php.dist
config/autoload/zdt.local.php

✔ In PhpStorm bearbeiten: /config/application.config.php
'modules' => array(
'Application',
'ZendDeveloperTools',
),

✔ Im Browser öffnen: http://wdc-zf2/
Web Developer Conference 2013

Seite 1 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

g) Doctrine 2 installieren
$ php composer.phar require doctrine/doctrine-orm-module

✔ In PhpStorm bearbeiten: /config/application.config.php
'modules' => array(
[...]
'DoctrineModule',
'DoctrineORMModule',
),
$ mkdir data/DoctrineORMModule
$ mkdir data/DoctrineORMModule/Proxy
$ chmod -R 777 data

✔ In PhpStorm erstellen: /config/autoload/database.local.php
<?php
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' => 'DoctrineDBALDriverPDOSqliteDriver',
'params'
=> array(
'path' => __DIR__ . '/../../data/db/wdc-zf2.db',
),
),
),
),
);

✔ Im Browser öffnen: http://wdc-zf2/
✔ ZendDeveloperToolbar checken

Web Developer Conference 2013

Seite 2 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

2. Gallery Modul einrichten
a) ZF2 Modul anlegen
$
$
$
$
$
$
$
$
$

php vendor/bin/zf.php create module Gallery
php vendor/bin/zf.php create controller gallery Gallery
php vendor/bin/zf.php create action index gallery Gallery
php vendor/bin/zf.php create action create gallery Gallery
php vendor/bin/zf.php create action update gallery Gallery
php vendor/bin/zf.php create action delete gallery Gallery
php vendor/bin/zf.php create action show gallery Gallery
mkdir public/img/gallery
chmod 777 public/img/gallery/

✔ In PhpStorm bearbeiten: /module/Gallery/config/module.config.php
<?php
return array(
'router'
=> array(
'routes' => array(
'gallery' => array(
'type'
=> 'Literal',
'options' => array(
'route'
=> '/gallery',
'defaults' => array(
'controller' => 'GalleryControllerGallery',
'action'
=> 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'action' => array(
'type'
=> 'Segment',
'options' => array(
'route'
=> '/:action[/:id]',
'constraints' => array(
'action'
=> '[a-zA-Z][a-zA-Z0-9_-]*',
'id'
=> '[0-9]*',
),
'defaults' => array(
),
),
),
),
),
),
),
'controllers' => array(
'invokables' => array(
'GalleryControllerGallery' => 'GalleryControllerGalleryController',
),
),
'view_manager' => array(
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
);

✔ Im Browser öffnen: http://wdc-zf2/gallery/

Web Developer Conference 2013

Seite 3 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

b) Gallery Entity anlegen
✔ In PhpStorm erstellen: /module/Gallery/src/Gallery/Entity/Gallery.php
<?php
namespace GalleryEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity
* @ORMTable(name="gallery")
*/
class Gallery{
/**
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
* @ORMColumn(type="integer")
*/
protected $id;
/** @ORMColumn(type="string") */
protected $title;
/** @ORMColumn(type="string") */
protected $thumburl;
/** @ORMColumn(type="string") */
protected $bigurl;
public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}
public function getTitle()
{
return $this->title;
}
public function setTitle($title)
{
$this->title = $title;
}
public function getThumburl()
{
return $this->thumburl;
}
public function setThumburl($thumburl)
{
$this->thumburl = $thumburl;
}
public function getBigurl()
{
return $this->bigurl;
}
public function setBigurl($bigurl)
{
$this->bigurl = $bigurl;
}
}

Web Developer Conference 2013

Seite 4 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

✔ In PhpStorm bearbeiten: /module/Gallery/config/module.config.php
<?php
return array(
[...]
'doctrine'
=> array(
'driver' => array(
'gallery_entities' => array(
'class' => 'DoctrineORMMappingDriverAnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/Gallery/Entity')
),
'orm_default'
=> array(
'drivers' => array(
'GalleryEntity' => 'gallery_entities'
)
)
)
),
);

✔ Im Browser öffnen: http://wdc-zf2/gallery/
✔ ZendDeveloperToolbar checken
$ ./vendor/bin/doctrine-module orm:validate-schema
$ ./vendor/bin/doctrine-module orm:schema-tool:create

✔ Im Browser öffnen: http://devhost/phpliteadmin/
c) Testdatensatz anlegen
✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php
<?php
namespace GalleryController;
use
use
use
use

GalleryEntityGallery;
ZendMathRand;
ZendMvcControllerAbstractActionController;
ZendViewModelViewModel;

class GalleryController extends AbstractActionController
{
public function createAction()
{
$serviceManager = $this->getServiceLocator();
$objectManager = $serviceManager->get('DoctrineORMEntityManager');
$randomKey = Rand::getInteger(10000, 99999);
$gallery = new Gallery();
$gallery->setTitle('Testbild ' . $randomKey);
$gallery->setThumburl('thumb-' . $randomKey . '.png');
$gallery->setBigurl('image-' . $randomKey . '.png');
$objectManager->persist($gallery);
$objectManager->flush();
return new ViewModel(array(
'gallery' => $gallery,
));
}
}

Web Developer Conference 2013

Seite 5 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/create.phtml
<?php ZendDebugDebug::dump($this->gallery); ?>
<hr>
<a href="<?php echo $this->url('gallery') ?>">Gallery</a>

✔ Im Browser öffnen: http://wdc-zf2/gallery/create/

Web Developer Conference 2013

Seite 6 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

3. Gallery Modul implementieren
a) Alle Datensätze ausgeben
✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php
namespace GalleryController;
[...]
class GalleryController extends AbstractActionController
{
public function indexAction()
{
$serviceManager = $this->getServiceLocator();
$objectManager = $serviceManager->get('DoctrineORMEntityManager');
$repository
= $objectManager->getRepository('GalleryEntityGallery');
$galleryList = $repository->findAll();
return new ViewModel(
array(
'galleryList' => $galleryList,
)
);
}
[...]
}

✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/index.phtml
<?php
use GalleryEntityGallery;
$create = array('action' => 'create');
?>
<h1>Gallery</h1>
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Title</th>
<th>Thumburl</th>
<th>Bigurl</th>
<th><a href="<?php echo $this->url('gallery/action', $create) ?>">
anlegen
</a></th>
</tr>
</thead>
<tbody>
<?php foreach ($this->galleryList as $gallery) : /* @var $gallery Gallery */ ?>
<?php $show = array('action' => 'show', 'id' => $gallery->getId()); ?>
<tr>
<td><?php echo $gallery->getId(); ?></td>
<td><?php echo $gallery->getTitle(); ?></td>
<td><?php echo $gallery->getThumburl(); ?></td>
<td><?php echo $gallery->getBigurl(); ?></td>
<td><a href="<?php echo $this->url('gallery/action', $show) ?>">
anzeigen
</a></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>

✔ Im Browser öffnen: http://wdc-zf2/gallery/
Web Developer Conference 2013

Seite 7 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

b) Einen Datensatz ausgeben
✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php
namespace GalleryController;
[...]
class GalleryController extends AbstractActionController
{
[...]
public function showAction()
{
$id = $this->params()->fromRoute('id');
$serviceManager = $this->getServiceLocator();
$objectManager = $serviceManager->get('DoctrineORMEntityManager');
$gallery = $objectManager->find('GalleryEntityGallery', $id);
return new ViewModel(
array(
'gallery' => $gallery,
)
);
}
}

✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/show.phtml
<?php
use GalleryEntityGallery;
$gallery = $this->gallery; /* @var $gallery Gallery */
?>
<h1>Bild anzeigen</h1>
<table class="table">
<tbody>
<tr>
<td>ID</td>
<td><?php echo $gallery->getId(); ?></td>
</tr>
<tr>
<td>Title</td>
<td><?php echo $gallery->getTitle(); ?></td>
</tr>
<tr>
<td>ThumbUrl</td>
<td><?php echo $gallery->getThumburl(); ?></td>
</tr>
<tr>
<td>BigUrl</td>
<td><?php echo $gallery->getBigurl(); ?></td>
</tr>
</tbody>
</table>
<hr>
<a href="<?php echo $this->url('gallery') ?>">Gallery</a>

✔ Im Browser öffnen: http://wdc-zf2/gallery/

Web Developer Conference 2013

Seite 8 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

c) Einen Datensatz löschen
✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/index.phtml
<?php foreach ($this->galleryList as $gallery) : /* @var $gallery Gallery */ ?>
[...]
<?php $update = array('action' => 'update', 'id' => $gallery->getId()); ?>
<?php $delete = array('action' => 'delete', 'id' => $gallery->getId()); ?>
<tr>
[...]
<td><a href="<?php echo $this->url('gallery/action', $update) ?>">
ändern
</a></td>
<td><a href="<?php echo $this->url('gallery/action', $delete) ?>">
löschen
</a></td>
</tr>
<?php endforeach; ?>

✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php
namespace GalleryController;
[...]
class GalleryController extends AbstractActionController
{
[...]
public function deleteAction()
{
$id = $this->params()->fromRoute('id');
$serviceManager = $this->getServiceLocator();
$objectManager = $serviceManager->get('DoctrineORMEntityManager');
$gallery = $objectManager->find('GalleryEntityGallery', $id);
$objectManager->remove($gallery);
$objectManager->flush();
return $this->redirect()->toRoute('gallery');
}
[...]
}

✔ Im Browser öffnen: http://wdc-zf2/gallery/

Web Developer Conference 2013

Seite 9 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

d) Einen Datensatz mit Formular anlegen
✔ In PhpStorm erstellen: /module/Gallery/src/Gallery/Form/GalleryForm.php
<?php
namespace GalleryForm;
use ZendFormForm;
class GalleryForm extends Form
{
public function init()
{
$this->add(
array(
'name' => 'id',
'type' => 'hidden',
)
);
$this->add(
array(
'name'
'type'
'options'
'attributes'
)
);

=>
=>
=>
=>

'title',
'text',
array('label' => 'Titel'),
array('class' => 'span5'),

$this->add(
array(
'name'
'type'
'options'
'attributes'
)
);

=>
=>
=>
=>

'thumburl',
'file',
array('label' => 'Thumb'),
array('class' => 'span5'),

$this->add(
array(
'name'
'type'
'options'
'attributes'
)
);

=>
=>
=>
=>

'bigurl',
'file',
array('label' => 'Bild'),
array('class' => 'span5'),

$this->add(
array(
'type'
=> 'Submit',
'name'
=> 'save',
'attributes' => array(
'value' => 'Speichern',
'id'
=> 'save',
'class' => 'btn btn-primary',
),
)
);
}
}

Web Developer Conference 2013

Seite 10 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

✔ In PhpStorm bearbeiten: /module/Gallery/config/module.config.php
<?php
return array(
[...]
'form_elements' => array(
'invokables' => array(
'Gallery' => 'GalleryFormGalleryForm',
),
),
[...]
);

✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/create.phtml
<?php
use GalleryFormGalleryForm;
$form = $this->form; /* @var $form GalleryForm */
$form->prepare();
$form->setAttribute(
'action',
$this->url('gallery/action', array('action', 'create'), true)
);
?>
<h1>Bild anlegen</h1>
<?php
echo $this->form()->openTag($form);
foreach ($form as $element) {
echo '<div>' . $this->formRow($element) . '</div>';
}
echo $this->form()->closeTag();
?>
<hr>
<a href="<?php echo $this->url('gallery') ?>">Gallery</a>

✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php
<?php
namespace GalleryController;
class GalleryController extends AbstractActionController
{
[...]
public function createAction()
{
$serviceManager = $this->getServiceLocator();
$objectManager = $serviceManager->get('DoctrineORMEntityManager');
$formManager
= $serviceManager->get('FormElementManager');
$request
= $this->getRequest();
if ($request->isPost()) {
$postData = $request->getPost()->toArray();
$fileData = $request->getFiles()->toArray();
$imageDir = realpath(__DIR__ . '/../../../../../public');
$gallery = new Gallery();
if ($fileData['thumburl']['error'] == 0) {
$thumburl = '/img/gallery/' . $fileData['thumburl']['name'];
move_uploaded_file(

Web Developer Conference 2013

Seite 11 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

$fileData['thumburl']['tmp_name'],
$imageDir . $thumburl
);
$gallery->setThumburl($thumburl);
}
if ($fileData['bigurl']['error'] == 0) {
$bigurl
= '/img/gallery/' . $fileData['bigurl'

]['name'];

move_uploaded_file(
$fileData['bigurl' ]['tmp_name'],
$imageDir . $bigurl
);
$gallery->setBigurl($bigurl);
}
$title = $postData['title'];
$gallery->setTitle($title);
$objectManager->persist($gallery);
$objectManager->flush();
return $this->redirect()->toRoute('gallery');
}
$galleryForm = $formManager->get('Gallery');
return new ViewModel(
array(
'form' => $galleryForm,
)
);
}
[...]
}

✔ Im Browser öffnen: http://wdc-zf2/gallery/create/

Web Developer Conference 2013

Seite 12 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

e) Einen Datensatz ändern
✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/update.phtml
<?php
use GalleryFormGalleryForm;
use GalleryEntityGallery;
$gallery = $this->gallery; /* @var $gallery Gallery */
$form = $this->form; /* @var $form GalleryForm */
$form->prepare();
$form->setAttribute(
'action',
$this->url(
'gallery/action',
array('action' => 'update', 'id' => $gallery->getId()),
true
)
);
?>
<h1>Bild ändern</h1>
<?php
echo $this->form()->openTag($form);
foreach ($form as $element) {
echo '<div>' . $this->formRow($element) . '</div>';
}
echo $this->form()->closeTag();
?>
<hr>
<a href="<?php echo $this->url('gallery') ?>">Gallery</a>

✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php
<?php
namespace GalleryController;
class GalleryController extends AbstractActionController
{
[...]
public function updateAction()
{
$id = $this->params()->fromRoute('id');
$serviceManager
$objectManager
$formManager
$request

=
=
=
=

$this->getServiceLocator();
$serviceManager->get('DoctrineORMEntityManager');
$serviceManager->get('FormElementManager');
$this->getRequest();

$gallery = $objectManager->find('GalleryEntityGallery', $id);
if ($request->isPost()) {
$postData = $request->getPost()->toArray();
$fileData = $request->getFiles()->toArray();
$imageDir = realpath(__DIR__ . '/../../../../../public');
if ($fileData['thumburl']['error'] == 0) {
$thumburl = '/img/gallery/' . $fileData['thumburl']['name'];
move_uploaded_file(
$fileData['thumburl']['tmp_name'],
$imageDir . $thumburl
);
$gallery->setThumburl($thumburl);

Web Developer Conference 2013

Seite 13 von 14
Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks«

Ralf Eggert

}
if ($fileData['bigurl']['error'] == 0) {
$bigurl
= '/img/gallery/' . $fileData['bigurl'

]['name'];

move_uploaded_file(
$fileData['bigurl' ]['tmp_name'],
$imageDir . $bigurl
);
$gallery->setBigurl($bigurl);
}
$title = $postData['title'];
$gallery->setTitle($title);
$objectManager->flush();
return $this->redirect()->toRoute('gallery');
}
$galleryForm = $formManager->get('Gallery');
$galleryForm->get('id')->setValue($gallery->getId());
$galleryForm->get('title')->setValue($gallery->getTitle());
return new ViewModel(
array(
'form' => $galleryForm,
'gallery' => $gallery,
)
);
}
[...]
}

✔ Im Browser öffnen: http://wdc-zf2/gallery/

Web Developer Conference 2013

Seite 14 von 14

More Related Content

What's hot

Drush. Secrets come out.
Drush. Secrets come out.Drush. Secrets come out.
Drush. Secrets come out.Alex S
 
前端MVC 豆瓣说
前端MVC 豆瓣说前端MVC 豆瓣说
前端MVC 豆瓣说Ting Lv
 
10 Catalyst Tips
10 Catalyst Tips10 Catalyst Tips
10 Catalyst TipsJay Shirley
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Remy Sharp
 
Unit and Functional Testing with Symfony2
Unit and Functional Testing with Symfony2Unit and Functional Testing with Symfony2
Unit and Functional Testing with Symfony2Fabien Potencier
 
Yearning jQuery
Yearning jQueryYearning jQuery
Yearning jQueryRemy Sharp
 
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQUA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQMichelangelo van Dam
 
Dependency injection - phpday 2010
Dependency injection - phpday 2010Dependency injection - phpday 2010
Dependency injection - phpday 2010Fabien Potencier
 
Zen: Building Maintainable Catalyst Applications
Zen: Building Maintainable Catalyst ApplicationsZen: Building Maintainable Catalyst Applications
Zen: Building Maintainable Catalyst ApplicationsJay Shirley
 
Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4Fabien Potencier
 
How I Built a Power Debugger Out of the Standard Library and Things I Found o...
How I Built a Power Debugger Out of the Standard Library and Things I Found o...How I Built a Power Debugger Out of the Standard Library and Things I Found o...
How I Built a Power Debugger Out of the Standard Library and Things I Found o...doughellmann
 
Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8PrinceGuru MS
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Bongwon Lee
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframeworkRadek Benkel
 
Puppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the ForgePuppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the ForgePuppet
 
Php tips-and-tricks4128
Php tips-and-tricks4128Php tips-and-tricks4128
Php tips-and-tricks4128PrinceGuru MS
 

What's hot (20)

Drush. Secrets come out.
Drush. Secrets come out.Drush. Secrets come out.
Drush. Secrets come out.
 
前端MVC 豆瓣说
前端MVC 豆瓣说前端MVC 豆瓣说
前端MVC 豆瓣说
 
10 Catalyst Tips
10 Catalyst Tips10 Catalyst Tips
10 Catalyst Tips
 
QA for PHP projects
QA for PHP projectsQA for PHP projects
QA for PHP projects
 
C99.php
C99.phpC99.php
C99.php
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
 
Unittests für Dummies
Unittests für DummiesUnittests für Dummies
Unittests für Dummies
 
Unit and Functional Testing with Symfony2
Unit and Functional Testing with Symfony2Unit and Functional Testing with Symfony2
Unit and Functional Testing with Symfony2
 
Yearning jQuery
Yearning jQueryYearning jQuery
Yearning jQuery
 
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQUA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
 
Dependency injection - phpday 2010
Dependency injection - phpday 2010Dependency injection - phpday 2010
Dependency injection - phpday 2010
 
Zen: Building Maintainable Catalyst Applications
Zen: Building Maintainable Catalyst ApplicationsZen: Building Maintainable Catalyst Applications
Zen: Building Maintainable Catalyst Applications
 
Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4
 
How I Built a Power Debugger Out of the Standard Library and Things I Found o...
How I Built a Power Debugger Out of the Standard Library and Things I Found o...How I Built a Power Debugger Out of the Standard Library and Things I Found o...
How I Built a Power Debugger Out of the Standard Library and Things I Found o...
 
Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8
 
Fatc
FatcFatc
Fatc
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframework
 
Puppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the ForgePuppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the Forge
 
Php tips-and-tricks4128
Php tips-and-tricks4128Php tips-and-tricks4128
Php tips-and-tricks4128
 

Viewers also liked

Viewers also liked (15)

NEHA K NASAR CV
NEHA K NASAR CVNEHA K NASAR CV
NEHA K NASAR CV
 
NewResume2015
NewResume2015NewResume2015
NewResume2015
 
Richard Hunt July 2016
Richard Hunt July 2016Richard Hunt July 2016
Richard Hunt July 2016
 
Mostafa C.V
Mostafa C.VMostafa C.V
Mostafa C.V
 
Seyed Salehi
Seyed SalehiSeyed Salehi
Seyed Salehi
 
Sanjay_Resume_exp_AEM
Sanjay_Resume_exp_AEMSanjay_Resume_exp_AEM
Sanjay_Resume_exp_AEM
 
Hareesh Resume 3.2 Expe
Hareesh Resume 3.2 ExpeHareesh Resume 3.2 Expe
Hareesh Resume 3.2 Expe
 
Tyler Jones Resume new
Tyler Jones Resume newTyler Jones Resume new
Tyler Jones Resume new
 
Juan Petersen 6-18-2015
Juan Petersen 6-18-2015Juan Petersen 6-18-2015
Juan Petersen 6-18-2015
 
Amilkar_Curriculum
Amilkar_CurriculumAmilkar_Curriculum
Amilkar_Curriculum
 
SATHISH SELVARAJ
SATHISH SELVARAJSATHISH SELVARAJ
SATHISH SELVARAJ
 
PHP Development Company-Amar InfoTech
PHP Development Company-Amar InfoTechPHP Development Company-Amar InfoTech
PHP Development Company-Amar InfoTech
 
Lehi en el desierto y el mundo de los jareditas
Lehi en el desierto y el mundo de los jareditasLehi en el desierto y el mundo de los jareditas
Lehi en el desierto y el mundo de los jareditas
 
Johnson
JohnsonJohnson
Johnson
 
Test file
Test fileTest file
Test file
 

Similar to Drehbuch zum Talk "Rapid Prototyping mit PHP Frameworks"

関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐいHisateru Tanaka
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkJeremy Kendall
 
ZF2 for the ZF1 Developer
ZF2 for the ZF1 DeveloperZF2 for the ZF1 Developer
ZF2 for the ZF1 DeveloperGary Hockin
 
Zend Framework 2 - Basic Components
Zend Framework 2  - Basic ComponentsZend Framework 2  - Basic Components
Zend Framework 2 - Basic ComponentsMateusz Tymek
 
Keeping It Small with Slim
Keeping It Small with SlimKeeping It Small with Slim
Keeping It Small with SlimRaven Tools
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkJeremy Kendall
 
What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012D
 
Virtual Madness @ Etsy
Virtual Madness @ EtsyVirtual Madness @ Etsy
Virtual Madness @ EtsyNishan Subedi
 
Introduction to Zend framework
Introduction to Zend framework Introduction to Zend framework
Introduction to Zend framework Matteo Magni
 
Symfony2 Building on Alpha / Beta technology
Symfony2 Building on Alpha / Beta technologySymfony2 Building on Alpha / Beta technology
Symfony2 Building on Alpha / Beta technologyDaniel Knell
 
Debugging in drupal 8
Debugging in drupal 8Debugging in drupal 8
Debugging in drupal 8Allie Jones
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the FinishYehuda Katz
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony TechniquesKris Wallsmith
 
Apostrophe (improved Paris edition)
Apostrophe (improved Paris edition)Apostrophe (improved Paris edition)
Apostrophe (improved Paris edition)tompunk
 
Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014
Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014
Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014Puppet
 
Magento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowMagento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowVrann Tulika
 
Apostrophe
ApostropheApostrophe
Apostrophetompunk
 

Similar to Drehbuch zum Talk "Rapid Prototyping mit PHP Frameworks" (20)

関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro Framework
 
ZF2 for the ZF1 Developer
ZF2 for the ZF1 DeveloperZF2 for the ZF1 Developer
ZF2 for the ZF1 Developer
 
Zend Framework 2 - Basic Components
Zend Framework 2  - Basic ComponentsZend Framework 2  - Basic Components
Zend Framework 2 - Basic Components
 
Keeping It Small with Slim
Keeping It Small with SlimKeeping It Small with Slim
Keeping It Small with Slim
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro framework
 
What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012
 
Vagrant for real
Vagrant for realVagrant for real
Vagrant for real
 
Virtual Madness @ Etsy
Virtual Madness @ EtsyVirtual Madness @ Etsy
Virtual Madness @ Etsy
 
Introduction to Zend framework
Introduction to Zend framework Introduction to Zend framework
Introduction to Zend framework
 
Symfony2 Building on Alpha / Beta technology
Symfony2 Building on Alpha / Beta technologySymfony2 Building on Alpha / Beta technology
Symfony2 Building on Alpha / Beta technology
 
Debugging in drupal 8
Debugging in drupal 8Debugging in drupal 8
Debugging in drupal 8
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
 
Apostrophe (improved Paris edition)
Apostrophe (improved Paris edition)Apostrophe (improved Paris edition)
Apostrophe (improved Paris edition)
 
Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014
Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014
Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014
 
Lithium Best
Lithium Best Lithium Best
Lithium Best
 
Magento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowMagento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request Flow
 
Apostrophe
ApostropheApostrophe
Apostrophe
 

More from Ralf Eggert

ChatGPT: unser täglich' Bot gib uns heute
ChatGPT: unser täglich' Bot gib uns heuteChatGPT: unser täglich' Bot gib uns heute
ChatGPT: unser täglich' Bot gib uns heuteRalf Eggert
 
Der ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 EditionDer ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 EditionRalf Eggert
 
PHP Module als Rundum-Sorglos-Pakete entwickeln
PHP Module als Rundum-Sorglos-Pakete entwickelnPHP Module als Rundum-Sorglos-Pakete entwickeln
PHP Module als Rundum-Sorglos-Pakete entwickelnRalf Eggert
 
Alexa, what's next?
Alexa, what's next?Alexa, what's next?
Alexa, what's next?Ralf Eggert
 
Alexa, wohin geht die Reise
Alexa, wohin geht die ReiseAlexa, wohin geht die Reise
Alexa, wohin geht die ReiseRalf Eggert
 
8. Hamburg Voice Interface Meetup
8. Hamburg Voice Interface Meetup8. Hamburg Voice Interface Meetup
8. Hamburg Voice Interface MeetupRalf Eggert
 
Alexa Skill Maintenance
Alexa Skill MaintenanceAlexa Skill Maintenance
Alexa Skill MaintenanceRalf Eggert
 
Vom Zend Framework zu Laminas
Vom Zend Framework zu LaminasVom Zend Framework zu Laminas
Vom Zend Framework zu LaminasRalf Eggert
 
Alexa Skills und PHP? Passt das zusammen?
Alexa Skills und PHP? Passt das zusammen?Alexa Skills und PHP? Passt das zusammen?
Alexa Skills und PHP? Passt das zusammen?Ralf Eggert
 
Mit Jovo von 0 auf 100
Mit Jovo von 0 auf 100Mit Jovo von 0 auf 100
Mit Jovo von 0 auf 100Ralf Eggert
 
Vom Zend Framework zu Laminas
Vom Zend Framework zu LaminasVom Zend Framework zu Laminas
Vom Zend Framework zu LaminasRalf Eggert
 
Alexa for Hospitality
Alexa for HospitalityAlexa for Hospitality
Alexa for HospitalityRalf Eggert
 
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...Ralf Eggert
 
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche SprachanwendungenFortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche SprachanwendungenRalf Eggert
 
Die sieben Projektphasen für Voice Projekte
Die sieben Projektphasen für Voice ProjekteDie sieben Projektphasen für Voice Projekte
Die sieben Projektphasen für Voice ProjekteRalf Eggert
 
Künstliche Intelligenz – Traum und Wirklichkeit
Künstliche Intelligenz – Traum und WirklichkeitKünstliche Intelligenz – Traum und Wirklichkeit
Künstliche Intelligenz – Traum und WirklichkeitRalf Eggert
 
Multi-Modal Voice Development with Amazon Alexa
Multi-Modal Voice Development with Amazon AlexaMulti-Modal Voice Development with Amazon Alexa
Multi-Modal Voice Development with Amazon AlexaRalf Eggert
 
Mein Haus, mein Auto, mein Backend
Mein Haus, mein Auto, mein BackendMein Haus, mein Auto, mein Backend
Mein Haus, mein Auto, mein BackendRalf Eggert
 
Zend/Expressive 3 – The Next Generation
Zend/Expressive 3 – The Next GenerationZend/Expressive 3 – The Next Generation
Zend/Expressive 3 – The Next GenerationRalf Eggert
 

More from Ralf Eggert (20)

ChatGPT: unser täglich' Bot gib uns heute
ChatGPT: unser täglich' Bot gib uns heuteChatGPT: unser täglich' Bot gib uns heute
ChatGPT: unser täglich' Bot gib uns heute
 
Der ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 EditionDer ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 Edition
 
PHP Module als Rundum-Sorglos-Pakete entwickeln
PHP Module als Rundum-Sorglos-Pakete entwickelnPHP Module als Rundum-Sorglos-Pakete entwickeln
PHP Module als Rundum-Sorglos-Pakete entwickeln
 
Alexa, what's next?
Alexa, what's next?Alexa, what's next?
Alexa, what's next?
 
Alexa, wohin geht die Reise
Alexa, wohin geht die ReiseAlexa, wohin geht die Reise
Alexa, wohin geht die Reise
 
8. Hamburg Voice Interface Meetup
8. Hamburg Voice Interface Meetup8. Hamburg Voice Interface Meetup
8. Hamburg Voice Interface Meetup
 
Welcome Bixby
Welcome BixbyWelcome Bixby
Welcome Bixby
 
Alexa Skill Maintenance
Alexa Skill MaintenanceAlexa Skill Maintenance
Alexa Skill Maintenance
 
Vom Zend Framework zu Laminas
Vom Zend Framework zu LaminasVom Zend Framework zu Laminas
Vom Zend Framework zu Laminas
 
Alexa Skills und PHP? Passt das zusammen?
Alexa Skills und PHP? Passt das zusammen?Alexa Skills und PHP? Passt das zusammen?
Alexa Skills und PHP? Passt das zusammen?
 
Mit Jovo von 0 auf 100
Mit Jovo von 0 auf 100Mit Jovo von 0 auf 100
Mit Jovo von 0 auf 100
 
Vom Zend Framework zu Laminas
Vom Zend Framework zu LaminasVom Zend Framework zu Laminas
Vom Zend Framework zu Laminas
 
Alexa for Hospitality
Alexa for HospitalityAlexa for Hospitality
Alexa for Hospitality
 
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
 
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche SprachanwendungenFortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
 
Die sieben Projektphasen für Voice Projekte
Die sieben Projektphasen für Voice ProjekteDie sieben Projektphasen für Voice Projekte
Die sieben Projektphasen für Voice Projekte
 
Künstliche Intelligenz – Traum und Wirklichkeit
Künstliche Intelligenz – Traum und WirklichkeitKünstliche Intelligenz – Traum und Wirklichkeit
Künstliche Intelligenz – Traum und Wirklichkeit
 
Multi-Modal Voice Development with Amazon Alexa
Multi-Modal Voice Development with Amazon AlexaMulti-Modal Voice Development with Amazon Alexa
Multi-Modal Voice Development with Amazon Alexa
 
Mein Haus, mein Auto, mein Backend
Mein Haus, mein Auto, mein BackendMein Haus, mein Auto, mein Backend
Mein Haus, mein Auto, mein Backend
 
Zend/Expressive 3 – The Next Generation
Zend/Expressive 3 – The Next GenerationZend/Expressive 3 – The Next Generation
Zend/Expressive 3 – The Next Generation
 

Recently uploaded

Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxRemote DBA Services
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelDeepika Singh
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 

Recently uploaded (20)

Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 

Drehbuch zum Talk "Rapid Prototyping mit PHP Frameworks"

  • 1. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert 1. Projekt einrichten a) SkeletonApplication installieren $ $ $ $ $ $ cd /home/devhost/ git clone https://github.com/zendframework/ZendSkeletonApplication wdc-zf2 cd wdc-zf2/ ls -al php composer.phar selfupdate php composer.phar install b) ZFTool installieren $ $ $ $ php composer.phar require zendframework/zftool:dev-master ./vendor/bin/zf.php ./vendor/bin/zf.php modules ./vendor/bin/zf.php config list c) Virtual Host einrichten $ sudo nano /etc/apache2/sites-available/wdc-zf2.conf <VirtualHost 127.0.0.1> ServerName wdc-zf2 DocumentRoot /home/devhost/wdc-zf2/public/ AccessFileName .htaccess SetEnv APPLICATION_ENV development <Directory "/home/devhost/wdc-zf2/public/"> Options All AllowOverride All Require all granted </Directory> </VirtualHost> $ sudo a2ensite wdc-zf2.conf $ sudo nano /etc/hosts [...] 127.0.0.1 [...] wdc-zf2 $ sudo service apache2 restart ✔ Im Browser öffnen: http://wdc-zf2/ d) SQLite Datenbank einrichten $ mkdir data/db $ sqlite3 data/db/wdc-zf2.db e) PhpStorm Projekt einrichten (oder andere IDE der Wahl) f) ZendDeveloperTools installieren $ php composer.phar require zendframework/zend-developer-tools:dev-master $ cp vendor/zendframework/zend-developer-tools/config/zenddevelopertools.local.php.dist config/autoload/zdt.local.php ✔ In PhpStorm bearbeiten: /config/application.config.php 'modules' => array( 'Application', 'ZendDeveloperTools', ), ✔ Im Browser öffnen: http://wdc-zf2/ Web Developer Conference 2013 Seite 1 von 14
  • 2. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert g) Doctrine 2 installieren $ php composer.phar require doctrine/doctrine-orm-module ✔ In PhpStorm bearbeiten: /config/application.config.php 'modules' => array( [...] 'DoctrineModule', 'DoctrineORMModule', ), $ mkdir data/DoctrineORMModule $ mkdir data/DoctrineORMModule/Proxy $ chmod -R 777 data ✔ In PhpStorm erstellen: /config/autoload/database.local.php <?php return array( 'doctrine' => array( 'connection' => array( 'orm_default' => array( 'driverClass' => 'DoctrineDBALDriverPDOSqliteDriver', 'params' => array( 'path' => __DIR__ . '/../../data/db/wdc-zf2.db', ), ), ), ), ); ✔ Im Browser öffnen: http://wdc-zf2/ ✔ ZendDeveloperToolbar checken Web Developer Conference 2013 Seite 2 von 14
  • 3. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert 2. Gallery Modul einrichten a) ZF2 Modul anlegen $ $ $ $ $ $ $ $ $ php vendor/bin/zf.php create module Gallery php vendor/bin/zf.php create controller gallery Gallery php vendor/bin/zf.php create action index gallery Gallery php vendor/bin/zf.php create action create gallery Gallery php vendor/bin/zf.php create action update gallery Gallery php vendor/bin/zf.php create action delete gallery Gallery php vendor/bin/zf.php create action show gallery Gallery mkdir public/img/gallery chmod 777 public/img/gallery/ ✔ In PhpStorm bearbeiten: /module/Gallery/config/module.config.php <?php return array( 'router' => array( 'routes' => array( 'gallery' => array( 'type' => 'Literal', 'options' => array( 'route' => '/gallery', 'defaults' => array( 'controller' => 'GalleryControllerGallery', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( 'action' => array( 'type' => 'Segment', 'options' => array( 'route' => '/:action[/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]*', ), 'defaults' => array( ), ), ), ), ), ), ), 'controllers' => array( 'invokables' => array( 'GalleryControllerGallery' => 'GalleryControllerGalleryController', ), ), 'view_manager' => array( 'template_path_stack' => array( __DIR__ . '/../view', ), ), ); ✔ Im Browser öffnen: http://wdc-zf2/gallery/ Web Developer Conference 2013 Seite 3 von 14
  • 4. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert b) Gallery Entity anlegen ✔ In PhpStorm erstellen: /module/Gallery/src/Gallery/Entity/Gallery.php <?php namespace GalleryEntity; use DoctrineORMMapping as ORM; /** * @ORMEntity * @ORMTable(name="gallery") */ class Gallery{ /** * @ORMId * @ORMGeneratedValue(strategy="AUTO") * @ORMColumn(type="integer") */ protected $id; /** @ORMColumn(type="string") */ protected $title; /** @ORMColumn(type="string") */ protected $thumburl; /** @ORMColumn(type="string") */ protected $bigurl; public function getId() { return $this->id; } public function setId($id) { $this->id = $id; } public function getTitle() { return $this->title; } public function setTitle($title) { $this->title = $title; } public function getThumburl() { return $this->thumburl; } public function setThumburl($thumburl) { $this->thumburl = $thumburl; } public function getBigurl() { return $this->bigurl; } public function setBigurl($bigurl) { $this->bigurl = $bigurl; } } Web Developer Conference 2013 Seite 4 von 14
  • 5. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert ✔ In PhpStorm bearbeiten: /module/Gallery/config/module.config.php <?php return array( [...] 'doctrine' => array( 'driver' => array( 'gallery_entities' => array( 'class' => 'DoctrineORMMappingDriverAnnotationDriver', 'cache' => 'array', 'paths' => array(__DIR__ . '/../src/Gallery/Entity') ), 'orm_default' => array( 'drivers' => array( 'GalleryEntity' => 'gallery_entities' ) ) ) ), ); ✔ Im Browser öffnen: http://wdc-zf2/gallery/ ✔ ZendDeveloperToolbar checken $ ./vendor/bin/doctrine-module orm:validate-schema $ ./vendor/bin/doctrine-module orm:schema-tool:create ✔ Im Browser öffnen: http://devhost/phpliteadmin/ c) Testdatensatz anlegen ✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php <?php namespace GalleryController; use use use use GalleryEntityGallery; ZendMathRand; ZendMvcControllerAbstractActionController; ZendViewModelViewModel; class GalleryController extends AbstractActionController { public function createAction() { $serviceManager = $this->getServiceLocator(); $objectManager = $serviceManager->get('DoctrineORMEntityManager'); $randomKey = Rand::getInteger(10000, 99999); $gallery = new Gallery(); $gallery->setTitle('Testbild ' . $randomKey); $gallery->setThumburl('thumb-' . $randomKey . '.png'); $gallery->setBigurl('image-' . $randomKey . '.png'); $objectManager->persist($gallery); $objectManager->flush(); return new ViewModel(array( 'gallery' => $gallery, )); } } Web Developer Conference 2013 Seite 5 von 14
  • 6. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert ✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/create.phtml <?php ZendDebugDebug::dump($this->gallery); ?> <hr> <a href="<?php echo $this->url('gallery') ?>">Gallery</a> ✔ Im Browser öffnen: http://wdc-zf2/gallery/create/ Web Developer Conference 2013 Seite 6 von 14
  • 7. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert 3. Gallery Modul implementieren a) Alle Datensätze ausgeben ✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php namespace GalleryController; [...] class GalleryController extends AbstractActionController { public function indexAction() { $serviceManager = $this->getServiceLocator(); $objectManager = $serviceManager->get('DoctrineORMEntityManager'); $repository = $objectManager->getRepository('GalleryEntityGallery'); $galleryList = $repository->findAll(); return new ViewModel( array( 'galleryList' => $galleryList, ) ); } [...] } ✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/index.phtml <?php use GalleryEntityGallery; $create = array('action' => 'create'); ?> <h1>Gallery</h1> <table class="table"> <thead> <tr> <th>ID</th> <th>Title</th> <th>Thumburl</th> <th>Bigurl</th> <th><a href="<?php echo $this->url('gallery/action', $create) ?>"> anlegen </a></th> </tr> </thead> <tbody> <?php foreach ($this->galleryList as $gallery) : /* @var $gallery Gallery */ ?> <?php $show = array('action' => 'show', 'id' => $gallery->getId()); ?> <tr> <td><?php echo $gallery->getId(); ?></td> <td><?php echo $gallery->getTitle(); ?></td> <td><?php echo $gallery->getThumburl(); ?></td> <td><?php echo $gallery->getBigurl(); ?></td> <td><a href="<?php echo $this->url('gallery/action', $show) ?>"> anzeigen </a></td> </tr> <?php endforeach; ?> </tbody> </table> ✔ Im Browser öffnen: http://wdc-zf2/gallery/ Web Developer Conference 2013 Seite 7 von 14
  • 8. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert b) Einen Datensatz ausgeben ✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php namespace GalleryController; [...] class GalleryController extends AbstractActionController { [...] public function showAction() { $id = $this->params()->fromRoute('id'); $serviceManager = $this->getServiceLocator(); $objectManager = $serviceManager->get('DoctrineORMEntityManager'); $gallery = $objectManager->find('GalleryEntityGallery', $id); return new ViewModel( array( 'gallery' => $gallery, ) ); } } ✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/show.phtml <?php use GalleryEntityGallery; $gallery = $this->gallery; /* @var $gallery Gallery */ ?> <h1>Bild anzeigen</h1> <table class="table"> <tbody> <tr> <td>ID</td> <td><?php echo $gallery->getId(); ?></td> </tr> <tr> <td>Title</td> <td><?php echo $gallery->getTitle(); ?></td> </tr> <tr> <td>ThumbUrl</td> <td><?php echo $gallery->getThumburl(); ?></td> </tr> <tr> <td>BigUrl</td> <td><?php echo $gallery->getBigurl(); ?></td> </tr> </tbody> </table> <hr> <a href="<?php echo $this->url('gallery') ?>">Gallery</a> ✔ Im Browser öffnen: http://wdc-zf2/gallery/ Web Developer Conference 2013 Seite 8 von 14
  • 9. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert c) Einen Datensatz löschen ✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/index.phtml <?php foreach ($this->galleryList as $gallery) : /* @var $gallery Gallery */ ?> [...] <?php $update = array('action' => 'update', 'id' => $gallery->getId()); ?> <?php $delete = array('action' => 'delete', 'id' => $gallery->getId()); ?> <tr> [...] <td><a href="<?php echo $this->url('gallery/action', $update) ?>"> ändern </a></td> <td><a href="<?php echo $this->url('gallery/action', $delete) ?>"> löschen </a></td> </tr> <?php endforeach; ?> ✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php namespace GalleryController; [...] class GalleryController extends AbstractActionController { [...] public function deleteAction() { $id = $this->params()->fromRoute('id'); $serviceManager = $this->getServiceLocator(); $objectManager = $serviceManager->get('DoctrineORMEntityManager'); $gallery = $objectManager->find('GalleryEntityGallery', $id); $objectManager->remove($gallery); $objectManager->flush(); return $this->redirect()->toRoute('gallery'); } [...] } ✔ Im Browser öffnen: http://wdc-zf2/gallery/ Web Developer Conference 2013 Seite 9 von 14
  • 10. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert d) Einen Datensatz mit Formular anlegen ✔ In PhpStorm erstellen: /module/Gallery/src/Gallery/Form/GalleryForm.php <?php namespace GalleryForm; use ZendFormForm; class GalleryForm extends Form { public function init() { $this->add( array( 'name' => 'id', 'type' => 'hidden', ) ); $this->add( array( 'name' 'type' 'options' 'attributes' ) ); => => => => 'title', 'text', array('label' => 'Titel'), array('class' => 'span5'), $this->add( array( 'name' 'type' 'options' 'attributes' ) ); => => => => 'thumburl', 'file', array('label' => 'Thumb'), array('class' => 'span5'), $this->add( array( 'name' 'type' 'options' 'attributes' ) ); => => => => 'bigurl', 'file', array('label' => 'Bild'), array('class' => 'span5'), $this->add( array( 'type' => 'Submit', 'name' => 'save', 'attributes' => array( 'value' => 'Speichern', 'id' => 'save', 'class' => 'btn btn-primary', ), ) ); } } Web Developer Conference 2013 Seite 10 von 14
  • 11. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert ✔ In PhpStorm bearbeiten: /module/Gallery/config/module.config.php <?php return array( [...] 'form_elements' => array( 'invokables' => array( 'Gallery' => 'GalleryFormGalleryForm', ), ), [...] ); ✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/create.phtml <?php use GalleryFormGalleryForm; $form = $this->form; /* @var $form GalleryForm */ $form->prepare(); $form->setAttribute( 'action', $this->url('gallery/action', array('action', 'create'), true) ); ?> <h1>Bild anlegen</h1> <?php echo $this->form()->openTag($form); foreach ($form as $element) { echo '<div>' . $this->formRow($element) . '</div>'; } echo $this->form()->closeTag(); ?> <hr> <a href="<?php echo $this->url('gallery') ?>">Gallery</a> ✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php <?php namespace GalleryController; class GalleryController extends AbstractActionController { [...] public function createAction() { $serviceManager = $this->getServiceLocator(); $objectManager = $serviceManager->get('DoctrineORMEntityManager'); $formManager = $serviceManager->get('FormElementManager'); $request = $this->getRequest(); if ($request->isPost()) { $postData = $request->getPost()->toArray(); $fileData = $request->getFiles()->toArray(); $imageDir = realpath(__DIR__ . '/../../../../../public'); $gallery = new Gallery(); if ($fileData['thumburl']['error'] == 0) { $thumburl = '/img/gallery/' . $fileData['thumburl']['name']; move_uploaded_file( Web Developer Conference 2013 Seite 11 von 14
  • 12. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert $fileData['thumburl']['tmp_name'], $imageDir . $thumburl ); $gallery->setThumburl($thumburl); } if ($fileData['bigurl']['error'] == 0) { $bigurl = '/img/gallery/' . $fileData['bigurl' ]['name']; move_uploaded_file( $fileData['bigurl' ]['tmp_name'], $imageDir . $bigurl ); $gallery->setBigurl($bigurl); } $title = $postData['title']; $gallery->setTitle($title); $objectManager->persist($gallery); $objectManager->flush(); return $this->redirect()->toRoute('gallery'); } $galleryForm = $formManager->get('Gallery'); return new ViewModel( array( 'form' => $galleryForm, ) ); } [...] } ✔ Im Browser öffnen: http://wdc-zf2/gallery/create/ Web Developer Conference 2013 Seite 12 von 14
  • 13. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert e) Einen Datensatz ändern ✔ In PhpStorm bearbeiten: /module/Gallery/view/gallery/gallery/update.phtml <?php use GalleryFormGalleryForm; use GalleryEntityGallery; $gallery = $this->gallery; /* @var $gallery Gallery */ $form = $this->form; /* @var $form GalleryForm */ $form->prepare(); $form->setAttribute( 'action', $this->url( 'gallery/action', array('action' => 'update', 'id' => $gallery->getId()), true ) ); ?> <h1>Bild ändern</h1> <?php echo $this->form()->openTag($form); foreach ($form as $element) { echo '<div>' . $this->formRow($element) . '</div>'; } echo $this->form()->closeTag(); ?> <hr> <a href="<?php echo $this->url('gallery') ?>">Gallery</a> ✔ In PhpStorm bearbeiten: /module/Gallery/src/Gallery/Controller/GalleryController.php <?php namespace GalleryController; class GalleryController extends AbstractActionController { [...] public function updateAction() { $id = $this->params()->fromRoute('id'); $serviceManager $objectManager $formManager $request = = = = $this->getServiceLocator(); $serviceManager->get('DoctrineORMEntityManager'); $serviceManager->get('FormElementManager'); $this->getRequest(); $gallery = $objectManager->find('GalleryEntityGallery', $id); if ($request->isPost()) { $postData = $request->getPost()->toArray(); $fileData = $request->getFiles()->toArray(); $imageDir = realpath(__DIR__ . '/../../../../../public'); if ($fileData['thumburl']['error'] == 0) { $thumburl = '/img/gallery/' . $fileData['thumburl']['name']; move_uploaded_file( $fileData['thumburl']['tmp_name'], $imageDir . $thumburl ); $gallery->setThumburl($thumburl); Web Developer Conference 2013 Seite 13 von 14
  • 14. Drehbuch zum Talk »Rapid Prototyping mit PHP Frameworks« Ralf Eggert } if ($fileData['bigurl']['error'] == 0) { $bigurl = '/img/gallery/' . $fileData['bigurl' ]['name']; move_uploaded_file( $fileData['bigurl' ]['tmp_name'], $imageDir . $bigurl ); $gallery->setBigurl($bigurl); } $title = $postData['title']; $gallery->setTitle($title); $objectManager->flush(); return $this->redirect()->toRoute('gallery'); } $galleryForm = $formManager->get('Gallery'); $galleryForm->get('id')->setValue($gallery->getId()); $galleryForm->get('title')->setValue($gallery->getTitle()); return new ViewModel( array( 'form' => $galleryForm, 'gallery' => $gallery, ) ); } [...] } ✔ Im Browser öffnen: http://wdc-zf2/gallery/ Web Developer Conference 2013 Seite 14 von 14