{"id":950,"date":"2014-02-19T15:10:10","date_gmt":"2014-02-19T21:10:10","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=950"},"modified":"2014-02-19T16:02:35","modified_gmt":"2014-02-19T22:02:35","slug":"instalacion-y-primera-aplicacion-de-phalcon-framework-para-php","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=950","title":{"rendered":"Instalacion y primera aplicacion de Phalcon Framework para PHP"},"content":{"rendered":"<p>En el art\u00edculo anterior PDO <a href=\"https:\/\/www.lastdragon.net\/?p=944\">b\u00e1sico para PHP<\/a> escrib\u00eda sobre mis intenciones de hablar sobre un ORM y que el tener que configurar todo para llevar a cabo el art\u00edculo sobre pasaba mi intenci\u00f3n de redactarlo, por supuesto ese art\u00edculo como la mayor\u00eda los redacto en las madrugadas cuando al fin tengo tiempo de escribir para mi blog.  Hoy encontr\u00e9 un tiempo para investigar sobre ORM disponibles y encontr\u00e9 algo que mejor que un ORM. Un Framework MvC para PHP y como tal incluye un ORM integrado.<\/p>\n<p>Debo aclarar que no soy fan de los frameworks, los considero el opio de los programadores pero no negare que si estas sobre un framework el trabajo se hace muy r\u00e1pidamente, incluso la aplicaci\u00f3n que escrib\u00ed para este art\u00edculo la hice en escasos 2 minutos, no estoy seguro si segu\u00ed todas las convenciones que requiere un MvC.<\/p>\n<p>As\u00ed que me centrare mas en lo que es m\u00e1s natural para m\u00ed, la implementaci\u00f3n del framework en s\u00ed mismo y luego reescribir\u00e9 la aplicaci\u00f3n de mi art\u00edculo anterior.<\/p>\n<p>El framework es Phalcon, este Framework es  muy r\u00e1pido y abstrae todo, incluso pienso que es m\u00e1s veloz y f\u00e1cil compar\u00e1ndolo con la tecnolog\u00eda .NET que estamos usando en desarrollo, todo y digo todo est\u00e1 completamente abstra\u00eddo, muchos de los que usan ORM maldicen el tener que mapear las base de datos con XML, algunos usan otros productos que abstraen dichos XML pero son capaz , sobre capaz por lo que el Framework final termina siendo un s\u00e1ndwich de 5 pisos.<\/p>\n<p>Phalcon abstrae todo eso en un solo nivel por lo que una vez instalado ya est\u00e1 listo para mapear los modelos y entrar a la DB y mostrar vistas.<\/p>\n<p>No solo eso, el Framework deber\u00eda estar montado sobre PHP ,  pero en lugar de eso el Framework est\u00e1 integrado\/incrustado en PHP mediante un modulo de objeto compartido en C o para abreviarlo una librer\u00eda DLL ya sea para MS\/Windows o GNU\/Linux. De este modo todas las funciones vitales del Framework no son c\u00f3digo PHP, son c\u00f3digo C ejecut\u00e1ndose en c\u00f3digo nativo en la maquina, el PHP solo se usa como un m\u00e9todo acceso a las APIS, el resultado final es que la aplicaci\u00f3n final aunque est\u00e1 escrita en PHP puede correr m\u00e1s r\u00e1pido que una aplicaci\u00f3n com\u00fan y corriente de PHP<\/p>\n<p>Siempre hay un punto d\u00e9bil en todo esto , una aplicaci\u00f3n escrita en un framework no siempre ser\u00e1 posible deployarla  en un hosting, por que no todos los hosting tienen instalado el framework, no basta con poner los archivos PHP sobre un servidor WEB que tiene PHP, se requiere convertir ese servidor WEB con PHP a un servidor de aplicaciones con Phalcon, por lo que pocos sitios de hosting te dar\u00e1n ese beneficio es m\u00e1s probable que termines instalando este framework en el site de una compa\u00f1\u00eda donde tendr\u00eda m\u00e1s sentido y para instalarlo requieres tener acceso root al servidor por todas las adecuaciones necesarias.<\/p>\n<p>Requistos.<br \/>\nEn el servidor WEB<br \/>\nSoportar ReWrite en Apache mod_rewrite, Nginx y la mayor\u00eda de los servidores web no tendr\u00e1n  problemas con esto.<\/p>\n<p>Requisitos de PHP  que son opcionales pero dan mucha mayor funcionalidad<br \/>\nSoportar PDO y todos los drivers necesarios de base de datos<br \/>\nmbstring<br \/>\nmcrypt<br \/>\nopenssl<br \/>\ny adicionalmente las que el programador requiera. ( GD , Curls, Etc )<\/p>\n<p>Git<\/p>\n<p>Se requiere Git para bajar el c\u00f3digo fuente de Phalcon<\/p>\n<p>Entorno del sistema<br \/>\nSi la compilaci\u00f3n de PHP ha sido realizada por el administrador de forma personalizada, se  requiere que los binarios de PHP est\u00e9n disponibles en el PATH<\/p>\n<p><strong>Instalaci\u00f3n<\/strong><\/p>\n<p>Descargar el c\u00f3digo fuente en C de Phalcon con Git<\/p>\n<p><code>git clone --depth=1 git:\/\/github.com\/phalcon\/cphalcon.git<\/code><\/p>\n<p>Entrar al directorio cphalcon\/build y ejecutar .\/install<br \/>\nNota: Si los binarios de PHP espec\u00edficamente el phpizer no est\u00e1 en el PATH fallara la compilaci\u00f3n.<\/p>\n<p>En el PHP.INI agregar la nueva extensi\u00f3n de PHP<br \/>\nextension=phalcon.so<\/p>\n<p>En este punto PHP ya soporta Phalcon, ahora se descargan las herramientas del framework<\/p>\n<p><code>curl -s http:\/\/getcomposer.org\/installer | php<\/code><\/p>\n<p>Instalando las herramientas del framework para que funcionen como comandos en la consola de GNU\/Linux<\/p>\n<p><code>php composer.phar  install<\/code><\/p>\n<p>Nota: Si los binarios de PHP no est\u00e1n en el PATH fallara.<\/p>\n<p>En el directorio phalcon\/bin de las herramientas de phalcon est\u00e1 el script PHP phalcon, Este script creara la estructura de directorios de las aplicaciones, creara los modelos y los controladores  del programa o incluso activar una interfaz web de administraci\u00f3n para la aplicaci\u00f3n.<\/p>\n<p>Nota: Ya no es requerido que los binarios de PHP est\u00e9n en el PATH aunque es deseable, sin embargo si no lo est\u00e1n habr\u00e1 que especificar toda la ruta del binario PHP para ejecutar el script phalcon<\/p>\n<p>Prueba de ejecuci\u00f3n SIN los binarios de  PHP en el PATH<\/p>\n<p><code>\/usr\/php\/bin\/php \/usr\/phalcon\/bin\/phalcon.php<\/code><\/p>\n<p>Regresa:<br \/>\nPhalcon DevTools (1.2.6)<\/p>\n<p>Available commands:<br \/>\n  commands (alias of: list, enumerate)<br \/>\n  controller (alias of: create-controller)<br \/>\n  model (alias of: create-model)<br \/>\n  all-models (alias of: create-all-models)<br \/>\n  project (alias of: create-project)<br \/>\n  scaffold<br \/>\n  migration<br \/>\n  webtools<\/p>\n<p>Configuraci\u00f3n de Apache para soportar Re-Write y los archivos .htaccess de Phalcon<\/p>\n<p><code>RewriteEngine on<br \/>\n<directory \"\/home\/paginas\/phalcon\/\"><br \/>\n Order Deny,Allow<br \/>\n Allow from all<br \/>\n Options FollowSymLinks<br \/>\n AllowOverride All<br \/>\n Require all granted<br \/>\n<\/directory><br \/>\n<\/code><\/p>\n<p>Nota: AllowOverride debe estar seteado a All<\/p>\n<p>Reiniciar el servicio WEB para que PHP y las nuevas configuraciones de Apache carguen<\/p>\n<p>Es f\u00e1cil ver que tener un servidor de aplicaciones Phalcon requiere un esfuerzo adicional para estar listo, modificaciones y compilaciones son necesarias. Pero para quien haya tenido la paciencia de llegar a este punto ahora tiene la recompensa de poder escribir aplicaciones Phalcon en minutos si se trata de cosas peque\u00f1as o al menos llevar un desarrollo m\u00e1s r\u00e1pido para aplicaciones grandes como las de un corporativo.<\/p>\n<p>La aplicaci\u00f3n que escrib\u00ed para PDO PHP del art\u00edculo anterior, ser\u00e1 reescrita a Phalcon para mostrar su funcionalidad. He decidido manejar la misma base de datos.<\/p>\n<p>Crear una aplicaci\u00f3n Phalcon con la herramienta plahcon.php desde la consola deGNU\/Linux<\/p>\n<p>Se debe estar dentro de la carpeta que se ha designado para aplicaciones Phalcon en apache y ejecutar phalcon.php project nombredelaapp, para mi art\u00edculo la llamare dragon<\/p>\n<p>phalcon.php project dragon<\/p>\n<p>Se crea un directorio con archivos, la aplicaci\u00f3n ya est\u00e1 lista para ejecutarse * Y NO HACER NADA * , si se ha configurado correctamente Phalcon en el navegador se recibe esto:<br \/>\nhttp:\/\/www.lastdragon.net\/phalcon\/dragon\/<\/p>\n<p>Congratulations!<\/p>\n<p>You&#8217;re now flying with Phalcon. Great things are about to happen!<\/p>\n<p>Los archives y directorios que se crean en autom\u00e1tico son:<br \/>\napp  index.html  public<\/p>\n<p>Dentro de app se ejecuta phalcon y el lugar donde se programa la aplicaci\u00f3n.<\/p>\n<p>Configurando la base de datos en dragon\/app\/config\/config.php<\/p>\n<p><code>< ?php\n\nreturn new \\Phalcon\\Config(array(\n    'database' => array(<br \/>\n        'adapter'     => 'Mysql',<br \/>\n        'host'        => 'localhost',<br \/>\n        'username'    => 'pdo',<br \/>\n        'password'    => 'test',<br \/>\n        'dbname'      => 'pdotest',<br \/>\n    ),<br \/>\n    'application' => array(<br \/>\n        'controllersDir' => __DIR__ . '\/..\/..\/app\/controllers\/',<br \/>\n        'modelsDir'      => __DIR__ . '\/..\/..\/app\/models\/',<br \/>\n        'viewsDir'       => __DIR__ . '\/..\/..\/app\/views\/',<br \/>\n        'pluginsDir'     => __DIR__ . '\/..\/..\/app\/plugins\/',<br \/>\n        'libraryDir'     => __DIR__ . '\/..\/..\/app\/library\/',<br \/>\n        'cacheDir'       => __DIR__ . '\/..\/..\/app\/cache\/',<br \/>\n        'baseUri'        => '\/dragon\/',<br \/>\n    )<br \/>\n));<br \/>\n<\/code><\/p>\n<p>Programando una vista en dragon\/app\/views , se crea un directorio con el nombre de la vista en este caso persona y dentro del directorio un archivo archivo con c\u00f3digo php vacio pero con extensi\u00f3n .volt <\/p>\n<p>direcotorio<br \/>\ndragon\/app\/views\/persona<br \/>\nindex.volt<br \/>\ndragon\/app\/views\/persona\/index.volt<br \/>\nContenido de index.volt<\/p>\n<p><code># cat index.volt<br \/>\n< ?php\n\n?><\/code><\/p>\n<p>Si en este punto se ejecutara la vista persona, la ejecuci\u00f3n fallar\u00eda por qu\u00e9 no tendr\u00eda un controlador <\/p>\n<p>Creando el controlador y el mapeo del modelo de la base de datos con la herramienta phanton en la l\u00ednea de comandos<\/p>\n<p>Controlador<\/p>\n<p><code>phalcon.php controller persona<\/code><\/p>\n<p>Creando el modelo de la base de datos<\/p>\n<p><code>phalcon.php model pdotest<\/code><\/p>\n<p>La herramienta phalcon ha abstra\u00eddo todo, todas las tablas dentro de la base de datos pdotest ahora son objetos.<\/p>\n<p>El c\u00f3digo en el controlador persona<\/p>\n<p><code>< ?php\n\nclass PersonaController extends \\Phalcon\\Mvc\\Controller\n{\n\n    public function indexAction()\n    {\n\n    }\n\n    public function agregarPersonaAction()\n    {\n        $tablapersona = new Persona();\n        $tablapersona->id = null;<br \/>\n        $tablapersona->nombre=\"Soy Batman en un ORM TEST\";<br \/>\n        $tablapersona->edad=2014;<br \/>\n        $tablapersona->save();<\/p>\n<p>    }<\/p>\n<p>    public function recuperaPersonaAction()<br \/>\n    {<br \/>\n        $tablapersona = Persona::find();<br \/>\n        foreach ($tablapersona as $objtabla)<br \/>\n        {<br \/>\n                 echo $objtabla->nombre.\"<br \/>\";<br \/>\n                 echo $objtabla->edad.\"<br \/>\";<br \/>\n        }<\/p>\n<p>    }<\/p>\n<p>}<\/code><\/p>\n<p>Aunque todo esto parece aparatoso, cuando ya lo dominas puedes escribir aplicaciones en minutos libres de inyecci\u00f3n de SQL y sin necesidad de saber SQL<\/p>\n<p>El siguiente video muestra la aplicaci\u00f3n ejecut\u00e1ndose<\/p>\n<p><iframe loading=\"lazy\" width=\"420\" height=\"315\" src=\"\/\/www.youtube.com\/embed\/7h8QlWuMjv0\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En el art\u00edculo anterior PDO b\u00e1sico para PHP escrib\u00eda sobre mis intenciones de hablar sobre un ORM y que el tener que configurar todo para llevar a cabo el art\u00edculo sobre pasaba mi intenci\u00f3n de redactarlo, por supuesto ese art\u00edculo como la mayor\u00eda los redacto en las madrugadas cuando al fin tengo tiempo de escribir&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-950","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/950","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=950"}],"version-history":[{"count":3,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/950\/revisions"}],"predecessor-version":[{"id":953,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/950\/revisions\/953"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=950"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=950"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=950"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}