Rob Allen wrote about Integrating ZF2 forms into Slim. I did write how you can use Aura.Input and Aura.Html to create standalone form for PHP. This time I felt I should write about integrating aura input inside Slim.

Let us install a few dependencies aura/input for building the form and aura/html for the html helpers. You of-course can skip not to use aura/html and build your own helper. I also purposefully left not integrating the powerful Aura.Filter , but you are not limited to integrate any validator you love inside Aura.Input .

The full composer.json is as below.

{ "require" : { "slim/slim" : "2.*" , "aura/html" : "2.0.0" , "aura/input" : "1.*" }, "autoload" :{ "psr-0" :{ "" : "src/" } } }

We will keep ContactForm.php under src folder. ie why you see the autoload in composer.json . The form looks as below.

<?php // src/ContactForm.php use Aura\Input\Form ; class ContactForm extends Form { public function init () { $this -> setField ( 'name' ) -> setAttribs ([ 'id' => 'contact[name]' , 'name' => 'contact[name]' , 'size' => 20 , 'maxlength' => 20 , ]); $this -> setField ( 'email' ) -> setAttribs ([ 'id' => 'contact[email]' , 'name' => 'contact[email]' , 'size' => 20 , 'maxlength' => 20 , ]); $this -> setField ( 'url' ) -> setAttribs ([ 'id' => 'contact[url]' , 'name' => 'contact[url]' , 'size' => 20 , 'maxlength' => 20 , ]); $this -> setField ( 'message' , 'textarea' ) -> setAttribs ([ 'id' => 'contact[message]' , 'name' => 'contact[message]' , 'cols' => 40 , 'rows' => 5 , ]); $this -> setField ( 'submit' , 'submit' ) -> setAttribs ([ 'value' => 'send' ]); $filter = $this -> getFilter (); $filter -> setRule ( 'name' , 'Name must be alphabetic only.' , function ($value) { return ctype_alpha ($value); } ); $filter -> setRule ( 'email' , 'Enter a valid email address' , function ($value) { return filter_var ($value, FILTER_VALIDATE_EMAIL ); } ); $filter -> setRule ( 'url' , 'Enter a valid url' , function ($value) { return filter_var ($value, FILTER_VALIDATE_URL ); } ); $filter -> setRule ( 'message' , 'Message should be more than 7 characters' , function ($value) { if ( strlen ($value) > 7 ) { return true ; } return false ; } ); } }

The entry point web/index.php looks as below.

<?php // web/index.php use Aura\Input\Builder ; use Aura\Input\Filter ; require dirname ( __DIR__ ) . '/vendor/autoload.php' ; $app = new \Slim\Slim ( array ( 'templates' => dirname ( __DIR__ ) . '/templates' )); $app -> map ( '/contact' , function () use ($app) { $form = new ContactForm ( new Builder (), new Filter ()); if ($app -> request -> isPost ()) { $form -> fill ($app -> request -> post ( 'contact' )); if ($form -> filter ()) { echo "Yes successfully validated and filtered" ; var_dump ($data); $app -> halt (); } } $app -> render ( 'contact.php' , array ( 'form' => $form)); }) -> via ( 'GET' , 'POST' ) -> name ( 'contact' ); $app -> run ();

The template contact.php resides under templates folder.

<?php // templates/contact.php use Aura\Html\HelperLocatorFactory ; $factory = new HelperLocatorFactory (); $helper = $factory -> newInstance (); function showFieldErrors ($form, $name) { $errors = $form -> getMessages ($name); $str = '' ; if ($errors) { $str .= '<ul>' ; foreach ($errors as $error) { $str .= '<li>' . $error . '</li>' ; } $str .= '</ul>' ; } return $str; } ?> < html > < head > < title >Aura input form, inside slim framework</ title > </ head > < body > < form method = "post" action = " <?php echo $app -> urlFor ( 'contact' ); ?> " enctype = "multipart/form-data" > < table cellpadding = "0" cellspacing = "0" > < tr > < td >Name : </ td > < td > <?php echo $helper -> input ($form -> get ( 'name' )); echo showFieldErrors ($form, 'name' ); ?> </ td > </ tr > < tr > < td >Email : </ td > < td > <?php echo $helper -> input ($form -> get ( 'email' )); echo showFieldErrors ($form, 'email' ); ?> </ td > </ tr > < tr > < td >Url : </ td > < td > <?php echo $helper -> input ($form -> get ( 'url' )); echo showFieldErrors ($form, 'url' ); ?> </ td > </ tr > < tr > < td >Message : </ td > < td > <?php echo $helper -> input ($form -> get ( 'message' )); echo showFieldErrors ($form, 'message' ); ?> </ td > </ tr > < tr > < td colspan = "2" > <?php echo $helper -> input ($form -> get ( 'submit' )); ?> </ td > </ tr > </ table > </ form > </ body > </ html >

NB: If you need to reuse the functionality of showFieldErrors keep it on a separate file and require it.

Thank you Andrew Smith, Christian Schorn for the proof reading and tips provided.

I hope you will find something interesting in the integration!.

Download and play with code from github