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

Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 

Recently uploaded (20)

Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 

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