SlideShare uma empresa Scribd logo
1 de 14
Baixar para ler 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

Mais conteúdo relacionado

Mais procurados

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
 

Mais procurados (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
 

Destaque

Destaque (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
 

Semelhante a 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
 

Semelhante a 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
 

Mais de 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
 

Mais de 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
 

Último

Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemAsko Soukka
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-pyJamie (Taka) Wang
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostMatt Ray
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1DianaGray10
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaborationbruanjhuli
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7DianaGray10
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IES VE
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UbiTrack UK
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationIES VE
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Commit University
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6DianaGray10
 

Último (20)

Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystem
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
20230104 - machine vision
20230104 - machine vision20230104 - machine vision
20230104 - machine vision
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6
 

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