<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ajaxman</title>
	<atom:link href="http://www.ajaxman.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ajaxman.net</link>
	<description>Servicios Web, Desarrollo de aplicaciones, tutoriales sobre software</description>
	<lastBuildDate>Sun, 01 Apr 2012 06:18:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[Musikli.com] El portal de letras de canciones, información musical, grupos de musica y más</title>
		<link>http://www.ajaxman.net/musikli-com-el-portal-de-letras-de-canciones-informacion-musical-grupos-de-musica-y-mas.html</link>
		<comments>http://www.ajaxman.net/musikli-com-el-portal-de-letras-de-canciones-informacion-musical-grupos-de-musica-y-mas.html#comments</comments>
		<pubDate>Mon, 26 Mar 2012 06:29:03 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Musikli]]></category>
		<category><![CDATA[Musica]]></category>
		<category><![CDATA[Portal]]></category>
		<category><![CDATA[proyecto]]></category>
		<category><![CDATA[Red Social]]></category>
		<category><![CDATA[StartUp]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2173</guid>
		<description><![CDATA[<p>Hola tanto tiempo sin postear, esto ya pasa más seguido, pero ahora si tengo una muy buena excusa. Durante tiempo estuve trabajando en un proyecto, el cual originalmente fue liberado hace unos dias pero hoy es cuando lo presento oficialmente: Musikli.com Musikli, el cual ahora esta en fase beta(casi alpha), en este proyecto tenemos muchos [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Hola tanto tiempo sin postear, esto ya pasa más seguido, pero ahora si tengo una muy buena excusa.</p>
<p>Durante tiempo estuve trabajando en un proyecto, el cual originalmente fue liberado hace unos dias pero hoy es cuando lo presento oficialmente:</p>
<p><strong><a href="http://musikli.com">Musikli.com</a></strong></p>
<p style="text-align: center;"><a href="http://musikli.com"><img class="aligncenter size-full wp-image-2175" title="musikli.com" src="http://www.ajaxman.net/wp-content/uploads/2012/03/musikli.com-2012-03-26-00h-23m-00s.png" alt="" width="603" height="328" /></a></p>
<p>Musikli, el cual ahora esta en fase beta(casi alpha), en este proyecto tenemos muchos objetivos, y metas a realizar, entonces musikli se reume en:</p>
<p><strong>Un sencillo portal donde encontras, letras de canciones, albumnes, información general sobre artistas en la primera parte, posteriormente se tienen contempladas muchas interesantes y utiles mejoras, las cuales estaran siendo liberadas paulatinamente.</strong></p>
<p>Actualmente ya es posible crear tu cuenta &#8220;Volverte FAN&#8221;, y agregar canciones de el artista que desees, ovbiamente hay pasa por un proceso de revisión antes de ser publicado. En un futuro como FAN podras hacer muchas mas cosas.</p>
<p>Tambien agregamos una cuenta de twitter <a href="http://twitter.com/musikli" target="_blank"> @musikli.</a> la de Facebook, estamos en proceso, aunque ya existe facebook.com/musikli, digamos que la cuenta de Facebook esta en fase pre-alpha.</p>
<p><a href="https://twitter.com/Musikli" class="twitter-follow-button" data-show-count="false" data-lang="es" data-size="large">Seguir a @Musikli</a><br />
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>
<p>Les pido que la visiten la prueben, se registren y nos den un feedback sobre este interesante proyecto, aceptamos sugerencias de todo tipo, criticas, etc, inclusive si deseas participar apoyando de alguna otra forma(financiamento, formar parte del equipo), sera un placer contar con tus comentarios, para ello disponemos de la siguiente dirección de e-mail: contact@musikli.com</p>
<p>Espero que el proyecto sea interesante para todos, apoyanos y participa.</p>
<p>Javier<br />
Fundador de Musikli.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/musikli-com-el-portal-de-letras-de-canciones-informacion-musical-grupos-de-musica-y-mas.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Taller-PHP] Desarrollo de Aplicaciones Web con Kohana Framework</title>
		<link>http://www.ajaxman.net/taller-php-desarrollo-de-aplicaciones-web-con-kohana-framework.html</link>
		<comments>http://www.ajaxman.net/taller-php-desarrollo-de-aplicaciones-web-con-kohana-framework.html#comments</comments>
		<pubDate>Sat, 07 Jan 2012 22:57:54 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2161</guid>
		<description><![CDATA[<p>Pues otra vez aca posteando mucho trabajo y poco tiempo para postear jaja como siempre. Solo que esta vez con buenas noticias, dare un Taller completamente gratis con el apoyo de la red Novatecas y las instalaciones de Telmexhub, el taller es sobre como empezar a programar y conocer las ventajas el Framework Kohana PHP [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Pues otra vez aca posteando mucho trabajo y poco tiempo para postear jaja como siempre.</p>
<p>Solo que esta vez con buenas noticias, dare un <strong>Taller completamente gratis</strong> con el apoyo de la red <strong>Novatecas</strong> y las instalaciones de <strong>Telmexhub</strong>, el taller es sobre como empezar a programar y conocer las ventajas el Framework Kohana PHP Version 3.x.</p>
<p>Taller:</p>
<h3><strong><span style="color: #888888;">&#8220;Desarrollo de Aplicaciones Web con Kohana Framework&#8221;</span></strong></h3>
<ol>
<li>Introducción
<ol>
<li>Conociendo el Framework y por que usarlo</li>
<li>Ventajas</li>
<li>Usando un IDE (Netbeans, Eclipse, Zend Studio)</li>
</ol>
</li>
<li>Getting started con Kohana
<ol>
<li>Instalación</li>
<li>Nuestro Primer programa</li>
<li>La arquitectura de diseño MVC
<ol>
<li>Modelo</li>
<li>Modulos Database y ORM</li>
<li>Vista</li>
<li>Controlador</li>
</ol>
</li>
</ol>
</li>
<li>Creando un Blog con Kohana
<ol>
<li>Creando nuestros controladores modelos y vistas</li>
<li>Conociendo el paradigma HMVC</li>
<li>Agregando el Panel de control</li>
<li>Conociendo el modulo A1 para autenticacion</li>
<li>Entornos de programación con Kohana</li>
</ol>
</li>
<li>Retroalimentación
<ol>
<li>Que tanto puedo hacer con Kohana</li>
<li>Quienes usan kohana</li>
<li>Como puedo ampliar sus funcionalidades</li>
</ol>
</li>
</ol>
<p>Requisitos:</p>
<p><span id="more-2161"></span></p>
<p>Los requisitos que pido para que podamos aprovechar al maximo este tiempo son:</p>
<ul>
<li><strong>[Indispensable]Registrarse en novatecas he inscribirse en el evento (menu eventos)en este link: <a href="http://novatecas.org/miperfil">http://novatecas.org/miperfil</a></strong></li>
<li>Conocimiento de PHP</li>
<li>Conocimiento de Programación Orientada a Objetos (Mejor si es tambien en PHP)</li>
<li>Tener un entorno AMP instalado (Apache/MySQL/PHP)</li>
<li>Kohana trabaja bien con Linux y Windows</li>
<li>Idealmente estaria mucho mejor ya traer instalado el modulo Mod-Rewrite de Apache, nos servira de mucho.</li>
<li>Y si bien para aditar PHP sirve hasta el NotePad, recomiendo traer un IDE como Zend Studio, Aptana, Netbeans, Eclipse nos sera de gran ayuda y todos son gratis excepto el primero.</li>
</ul>
<p>Lugar y Fecha:</p>
<p>El taller se realizara en las instalaciones de telmexhub, ubicado en: Isabel la Católica No. 51 Colonia Centro, Delegación Cuauhtémoc, D.F.(México)</p>
<p>El dia 28 de Enero del 2012 en un Horario de: 11:00 AM a 4:00 Pm</p>
<p><strong>Nota Importante: El temario esta diseñado para conocer las caracteristicas del framework, y dependera unicamente del avance general para qeu podamos ver todos estos temas, es decir tanto podran cubrirse todos los items aqui descritos, como no:</strong></p>
<p>Entonces los esperamos ese dia, aun hay lugares, habra streaming, pero tambien hay que registrarse en novatecas, para participar, hasta el proximo post <img src='http://www.ajaxman.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/taller-php-desarrollo-de-aplicaciones-web-con-kohana-framework.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[PHP] Usando el modulo de autenticación Kohana A1</title>
		<link>http://www.ajaxman.net/php-usando-el-modulo-de-autenticacion-kohana-a1.html</link>
		<comments>http://www.ajaxman.net/php-usando-el-modulo-de-autenticacion-kohana-a1.html#comments</comments>
		<pubDate>Tue, 15 Nov 2011 05:40:11 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Autenticación]]></category>
		<category><![CDATA[Kohana A1]]></category>
		<category><![CDATA[Recursos]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2155</guid>
		<description><![CDATA[<p>Kohana A1, es un modulo de kohana el cual nos permite implementar de una forma efectiva, potente y clara, un sistema de autenticación, de una forma fácil y sencilla. Antes de empezar a usarlo es importante considerar que el modulo usa la el constructor crypt de PHP pero usando como hash CRYPT_BLOWFISH, esto no afecta [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Kohana A1, es un modulo de kohana el cual nos permite implementar de una forma efectiva, potente y clara, un sistema de autenticación, de una forma fácil y sencilla.</p>
<blockquote><p><strong>Antes de empezar a usarlo es importante considerar que el modulo usa la el constructor crypt de PHP pero usando como hash CRYPT_BLOWFISH, esto no afecta si estas usando PHP 5.3, pero si tienes este inconveniente al final del post pondré como solucionarlo(o cambiarte de hosting a uno mas actualizado).</strong></p></blockquote>
<p>Vamos a ver como usarlo para hacer un login.</p>
<p>Requisitos:</p>
<ul>
<li>Kohana 3.2</li>
<li>Kohana A1 module</li>
<li>
Kohana ORM</li>
<li>Kohana Database</li>
</ul>
<p>Como dicen los requisitos para usar A1 debemos de estar conectados a una base de datos, también debemos de tener un modulo que abstraiga dicha base de datos, para esto podemos usar Kohana ORM, Automodeler, Jelly, Sprig o entre otros, si estamos haciendo pruebas yo recomiendo usar Kohana ORM, y ya en base a sus requerimientos y necesidades usar el que mas les agrade.</p>
<p>Instalamos kohana de modo que quede en http://localhost/kohana1/ ,creamos una base de datos yo la llamare, &#8220;<strong>system</strong>&#8221; y le pondré  como datos de conexión ultra-seguros user:<strong>root</strong> password:<strong>root</strong>, recuerden activar el modulo database y ORM.</p>
<p>Y posteriormente nos toca, agregar el siguiente código SQL a nuestra base de datos, obviamente lo pueden modificar a su gusto, aunque de momento dejémoslo así.</p>
<div id="gist-1353924" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'>&nbsp;<span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">IF</span> <span class="k">NOT</span> <span class="k">EXISTS</span> <span class="o">`</span><span class="n">users</span><span class="o">`</span> <span class="p">(</span></div><div class='line' id='LC2'>	  <span class="o">`</span><span class="n">id</span><span class="o">`</span> <span class="nb">int</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span> <span class="n">UNSIGNED</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="n">AUTO_INCREMENT</span><span class="p">,</span></div><div class='line' id='LC3'>	  <span class="o">`</span><span class="n">email</span><span class="o">`</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">127</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span></div><div class='line' id='LC4'>	  <span class="o">`</span><span class="n">username</span><span class="o">`</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">&#39;&#39;</span><span class="p">,</span></div><div class='line' id='LC5'>	  <span class="o">`</span><span class="n">password</span><span class="o">`</span> <span class="nb">char</span><span class="p">(</span><span class="mi">80</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">`</span><span class="n">token</span><span class="o">`</span> <span class="nb">char</span><span class="p">(</span><span class="mi">80</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">&#39;&#39;</span><span class="p">,</span></div><div class='line' id='LC7'>	  <span class="o">`</span><span class="n">logins</span><span class="o">`</span> <span class="nb">int</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="n">UNSIGNED</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">&#39;0&#39;</span><span class="p">,</span></div><div class='line' id='LC8'>	  <span class="o">`</span><span class="n">last_login</span><span class="o">`</span> <span class="nb">int</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="n">UNSIGNED</span><span class="p">,</span></div><div class='line' id='LC9'>	  <span class="k">PRIMARY</span> <span class="k">KEY</span>  <span class="p">(</span><span class="o">`</span><span class="n">id</span><span class="o">`</span><span class="p">)</span></div><div class='line' id='LC10'><span class="p">)</span> <span class="n">ENGINE</span><span class="o">=</span><span class="n">InnoDB</span>  <span class="k">DEFAULT</span> <span class="n">CHARSET</span><span class="o">=</span><span class="n">utf8</span><span class="p">;</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1353924/42d633389d83c04aba081e70fd61226708ce97a4/users.sql" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1353924#file_users.sql" style="float:right;margin-right:10px;color:#666">users.sql</a>
            <a href="https://gist.github.com/1353924">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Ahora procedemos a bajar el modulo A1, que esta aquí: <a href="https://github.com/Wouterrr/A1/ " title="Kohana A1">https://github.com/Wouterrr/A1/ </a></p>
<p>Y lo ponemos en nuestro carpeta modules nombrando a la carpeta A1 de modo que quedara asi &#8220;modules/A1&#8243;.Dentro de dicha &#8220;modules/A1&#8243; hay una carpeta config y dentro de ella un archivo llamado a1.php, bien este archivo es el archivo de configuración del modulo Kohana A1, de igual forma que se hace con todos los módulos hay que copiar este archivo a &#8220;application/config/&#8221; para poder editarlo y que no afecte directamente al modulo.</p>
<p>El archivo se ve de la siguiente forma:</p>
<div id="gist-1353957" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'><span class="k">return</span> <span class="k">array</span><span class="p">(</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'>	<span class="s1">&#39;driver&#39;</span>     <span class="o">=&gt;</span> <span class="s1">&#39;ORM&#39;</span><span class="p">,</span> <span class="c1">// orm/jelly/mango/sprig</span></div><div class='line' id='LC6'>	<span class="s1">&#39;user_model&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;user&#39;</span><span class="p">,</span></div><div class='line' id='LC7'>	<span class="s1">&#39;cost&#39;</span>       <span class="o">=&gt;</span> <span class="mi">12</span><span class="p">,</span>    <span class="c1">// Bcrypt Cost - any number between 4 and 31 -&gt; higher = stronger hash</span></div><div class='line' id='LC8'><br/></div><div class='line' id='LC9'>	<span class="s1">&#39;cookie&#39;</span>     <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span></div><div class='line' id='LC10'>		<span class="s1">&#39;key&#39;</span>         <span class="o">=&gt;</span> <span class="s1">&#39;a1_{name}_autologin&#39;</span><span class="p">,</span></div><div class='line' id='LC11'>		<span class="s1">&#39;lifetime&#39;</span>    <span class="o">=&gt;</span> <span class="mi">1209600</span><span class="p">,</span> <span class="c1">// two weeks</span></div><div class='line' id='LC12'>	<span class="p">),</span></div><div class='line' id='LC13'><br/></div><div class='line' id='LC14'>	<span class="s1">&#39;columns&#39;</span>   <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span></div><div class='line' id='LC15'>		<span class="s1">&#39;username&#39;</span>    <span class="o">=&gt;</span> <span class="s1">&#39;username&#39;</span><span class="p">,</span></div><div class='line' id='LC16'>		<span class="s1">&#39;password&#39;</span>    <span class="o">=&gt;</span> <span class="s1">&#39;password&#39;</span><span class="p">,</span></div><div class='line' id='LC17'>		<span class="s1">&#39;token&#39;</span>       <span class="o">=&gt;</span> <span class="s1">&#39;token&#39;</span><span class="p">,</span></div><div class='line' id='LC18'>		<span class="c1">//&#39;last_login&#39;=&gt; &#39;last_login&#39;, // (optional)</span></div><div class='line' id='LC19'>		<span class="c1">//&#39;logins&#39;    =&gt; &#39;logins&#39;      // (optional)</span></div><div class='line' id='LC20'>	<span class="p">),</span></div><div class='line' id='LC21'><br/></div><div class='line' id='LC22'>	<span class="s1">&#39;session&#39;</span>  <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span></div><div class='line' id='LC23'>		<span class="s1">&#39;type&#39;</span>        <span class="o">=&gt;</span> <span class="s1">&#39;native&#39;</span> <span class="c1">// native or database</span></div><div class='line' id='LC24'>	<span class="p">)</span></div><div class='line' id='LC25'><span class="p">);</span></div><div class='line' id='LC26'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1353957/033cdfc081efa08539b97d548b8e91a72e347a6c/a1.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1353957#file_a1.php" style="float:right;margin-right:10px;color:#666">a1.php</a>
            <a href="https://gist.github.com/1353957">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Aquí pongo la descripción de cada elemento:</p>
<ul>
<li><strong>driver</strong>: EL ORM que usara (ORM,jelly,mango,sprig[se pueden agregar mas pero hay que modificar el modulo o extenderlo])</li>
<li><strong>user_model</strong>: tabla(modelo) que se usara &#8216;user&#8217;</li>
<li><strong>cost</strong>: fuerza (tamaño de la clave) entre 4 y 31, lo ideal es  12, si ponen un numero muy grande tomar en cuenta que consumirá mas recursos.</li>
<li><strong>cookie</strong>: los datos de la cookie que generara a1, para hacer el login(nombre y duración)</li>
<li><strong>columns</strong>: aquí le estamos asignando a los items de A1, las columnas de la base de datos, es decir si en su base de datos el nombre de usuarios están en el campo nombre, tendrán que poner &#8216;username&#8217; => &#8216;nombre&#8217;, modificando lo que esta en el array, los campos opcionales de momento no los usaremos, aunque cabe señalar que solo guardan información extra.</li>
<li><strong>session</strong>: Aquí es donde definimos el tipo de sesión, de momento y regularmente bastara con dejarlo como esta, si su aplicación correrá en varios servidores conviene ponerlo en modo database(aunque en este caso hay que hacer un par de cosas mas, espero postear pronto sobre esto)</li>
<p>.</ul>
<p>No se les olvide activar le modulo en el bootstrap, el cual en la sección módulos debería verse así:<br />
<span id="more-2155"></span><br />
<div id="gist-1354170" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span></div><div class='line' id='LC2'><span class="c1">//more code</span></div><div class='line' id='LC3'><span class="sd">/**</span></div><div class='line' id='LC4'><span class="sd"> * Enable modules. Modules are referenced by a relative or absolute path.</span></div><div class='line' id='LC5'><span class="sd"> */</span></div><div class='line' id='LC6'><span class="nx">Kohana</span><span class="o">::</span><span class="na">modules</span><span class="p">(</span><span class="k">array</span><span class="p">(</span></div><div class='line' id='LC7'>	<span class="c1">// &#39;auth&#39;       =&gt; MODPATH.&#39;auth&#39;,       // Basic authentication</span></div><div class='line' id='LC8'>	<span class="c1">// &#39;cache&#39;      =&gt; MODPATH.&#39;cache&#39;,      // Caching with multiple backends</span></div><div class='line' id='LC9'>	<span class="c1">// &#39;codebench&#39;  =&gt; MODPATH.&#39;codebench&#39;,  // Benchmarking tool</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="s1">&#39;A1&#39;</span>         <span class="o">=&gt;</span> <span class="nx">MODPATH</span><span class="o">.</span><span class="s1">&#39;A1&#39;</span><span class="p">,</span>           <span class="c1">//A1 authentication</span></div><div class='line' id='LC11'>	 <span class="s1">&#39;database&#39;</span>   <span class="o">=&gt;</span> <span class="nx">MODPATH</span><span class="o">.</span><span class="s1">&#39;database&#39;</span><span class="p">,</span>   <span class="c1">// Database access</span></div><div class='line' id='LC12'>	<span class="c1">// &#39;image&#39;      =&gt; MODPATH.&#39;image&#39;,      // Image manipulation</span></div><div class='line' id='LC13'>	 <span class="s1">&#39;orm&#39;</span>        <span class="o">=&gt;</span> <span class="nx">MODPATH</span><span class="o">.</span><span class="s1">&#39;orm&#39;</span><span class="p">,</span>        <span class="c1">// Object Relationship Mapping</span></div><div class='line' id='LC14'>	<span class="c1">// &#39;unittest&#39;   =&gt; MODPATH.&#39;unittest&#39;,   // Unit testing</span></div><div class='line' id='LC15'>	<span class="c1">// &#39;userguide&#39;  =&gt; MODPATH.&#39;userguide&#39;,  // User guide and API documentation</span></div><div class='line' id='LC16'>	<span class="p">));</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1354170/10f6dc8ae106e3bdeb34c471c9ca49e17c73f33f/bootstrap.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1354170#file_bootstrap.php" style="float:right;margin-right:10px;color:#666">bootstrap.php</a>
            <a href="https://gist.github.com/1354170">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</p>
<p>Ahora vamos a crear un controlador que sera en este caso el backend, el cual verificara que si estas logueado te deja entrar a ejecutar cualquier acción, si no te re-direccionara a un controlador &#8220;account&#8221; y al action &#8220;login&#8221; que tendra la vista del formulario de login, y también tendrá un link a registrarse usando este modulo A1.</p>
<p>En este controlador &#8220;backend&#8221; tenemos una action, llamada index que cargara un vista, en donde mostraremos un mensaje que dirá &#8220;bienvenido Nombre_de_usuario&#8221;</p>
<div id="gist-1354210" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span> <span class="nb">defined</span><span class="p">(</span><span class="s1">&#39;SYSPATH&#39;</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s1">&#39;No direct script access.&#39;</span><span class="p">);</span></div><div class='line' id='LC2'><span class="sd">/**</span></div><div class='line' id='LC3'><span class="sd"> * Controller_Backend </span></div><div class='line' id='LC4'><span class="sd"> * </span></div><div class='line' id='LC5'><span class="sd"> * Este es el backend de una aplicacion que esta usando A1 como metodo de autenticación</span></div><div class='line' id='LC6'><span class="sd"> * </span></div><div class='line' id='LC7'><span class="sd"> * @author Javier</span></div><div class='line' id='LC8'><span class="sd"> * @package Backend</span></div><div class='line' id='LC9'><span class="sd"> * </span></div><div class='line' id='LC10'><span class="sd"> */</span></div><div class='line' id='LC11'><span class="k">class</span> <span class="nc">Controller_Backend</span> <span class="k">extends</span> <span class="nx">Controller</span> <span class="p">{</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC14'><span class="sd">     *</span></div><div class='line' id='LC15'><span class="sd">     * @var User $auth contains object a1 user </span></div><div class='line' id='LC16'><span class="sd">     */</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$auth</span><span class="p">;</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC20'><span class="sd">     * (non-PHPdoc)</span></div><div class='line' id='LC21'><span class="sd">     * @see system/classes/kohana/Kohana_Controller::before()</span></div><div class='line' id='LC22'><span class="sd">     */</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">before</span><span class="p">()</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">parent</span><span class="o">::</span><span class="na">before</span><span class="p">();</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span> <span class="o">=</span> <span class="nx">A1</span><span class="o">::</span><span class="na">instance</span><span class="p">();</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_prevent_back</span><span class="p">();</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">logged_in</span><span class="p">()</span><span class="o">===</span> <span class="k">FALSE</span><span class="p">)</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">redirect</span><span class="p">(</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;login&#39;</span><span class="p">)));</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span><span class="p">;</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nx">view</span><span class="o">::</span><span class="na">set_global</span><span class="p">(</span><span class="s1">&#39;logout&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;logout&#39;</span><span class="p">)));</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">()</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$view</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="s2">&quot;backend/home&quot;</span><span class="p">)</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s2">&quot;auth&quot;</span><span class="p">,</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="p">);</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">response</span><span class="o">-&gt;</span><span class="na">body</span><span class="p">(</span><span class="nv">$view</span><span class="p">);</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC43'><br/></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">private</span> <span class="k">function</span> <span class="nf">_prevent_back</span><span class="p">()</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">response</span><span class="o">-&gt;</span><span class="na">headers</span><span class="p">(</span><span class="s2">&quot;Cache-Control&quot;</span><span class="p">,</span><span class="s2">&quot;no-store, no-cache, must-revalidate&quot;</span><span class="p">);</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC48'><span class="p">}</span> <span class="c1">// End Welcome</span></div><div class='line' id='LC49'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1354210/d4ae1cbf4b119cdc79325599c075335d0910eb70/backend.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1354210#file_backend.php" style="float:right;margin-right:10px;color:#666">backend.php</a>
            <a href="https://gist.github.com/1354210">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Las partes importantes a destacar son:</p>
<ul>
<li>En el método before asignamos a $this->auth (variable publica) una instancia de A1, que es el modulo que hará el login.</li>
<li>Luego preguntamos mediante el método $this->auth->logged_in() que seria lo mismo que usar A1::instance()->logged_in(), que si es FALSE, significa que no esta logeado entonces lo redirecciona a la siguiente url:</li>
<li>Route::url(&#8216;default&#8217;,array(&#8216;controller&#8217; => &#8216;account&#8217;, &#8216;action&#8217; => &#8216;login&#8217;) la cual dice: que usando el route llamado default construya un url basada en cierto controlador, cierta acción y cierto id.</li>
<li>Tenemos un action (metodo) index que mostrara una vista que estará en la carpeta backend, la vista se llama home y le digo que envié los datos de autenticación usando la variable auth.</li>
</ul>
<div id="gist-1359633" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="x">&lt;!DOCTYPE html&gt;</span></div><div class='line' id='LC2'><span class="x">&lt;html&gt;</span></div><div class='line' id='LC3'><span class="x">    &lt;head&gt;</span></div><div class='line' id='LC4'><span class="x">        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;</span></div><div class='line' id='LC5'><span class="x">        &lt;title&gt;&lt;/title&gt;</span></div><div class='line' id='LC6'><span class="x">    &lt;/head&gt;</span></div><div class='line' id='LC7'><span class="x">    &lt;body&gt;</span></div><div class='line' id='LC8'><span class="x">        &lt;div&gt;</span></div><div class='line' id='LC9'><span class="x">            &lt;p&gt;Bienvenido al sistema &lt;strong&gt;</span><span class="cp">&lt;?php</span> <span class="k">echo</span> <span class="nv">$auth</span><span class="o">-&gt;</span><span class="na">get_user</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">email</span><span class="p">;</span> <span class="cp">?&gt;</span><span class="x">&lt;/strong&gt;&lt;/p&gt;</span></div><div class='line' id='LC10'><span class="x">            &lt;p style=&quot;float:right;&quot;&gt;</span></div><div class='line' id='LC11'><span class="x">            	&lt;a href=&quot;</span><span class="cp">&lt;?php</span> <span class="k">echo</span> <span class="nv">$logout</span> <span class="cp">?&gt;</span><span class="x">&quot; &gt;Salir&lt;/a&gt;</span></div><div class='line' id='LC12'><span class="x">            &lt;/p&gt;</span></div><div class='line' id='LC13'><span class="x">        &lt;/div&gt;</span></div><div class='line' id='LC14'><span class="x">    &lt;/body&gt;</span></div><div class='line' id='LC15'><span class="x">&lt;/html&gt;</span></div><div class='line' id='LC16'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1359633/fbb995d48ef6bf0186137317ee2b952dacf0637d/home.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1359633#file_home.php" style="float:right;margin-right:10px;color:#666">home.php</a>
            <a href="https://gist.github.com/1359633">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Este es el código del controlador account, con sus metodos/acciones de registro y login.</p>
<div id="gist-1354245" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span> <span class="nb">defined</span><span class="p">(</span><span class="s1">&#39;SYSPATH&#39;</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s1">&#39;No direct script access.&#39;</span><span class="p">);</span></div><div class='line' id='LC2'><span class="sd">/**</span></div><div class='line' id='LC3'><span class="sd"> * Controller_Account</span></div><div class='line' id='LC4'><span class="sd"> * </span></div><div class='line' id='LC5'><span class="sd"> * Aqui estaran las funcionalidades de login y registro</span></div><div class='line' id='LC6'><span class="sd"> * </span></div><div class='line' id='LC7'><span class="sd"> * @author Javier</span></div><div class='line' id='LC8'><span class="sd"> * @package Backend</span></div><div class='line' id='LC9'><span class="sd"> * </span></div><div class='line' id='LC10'><span class="sd"> */</span></div><div class='line' id='LC11'><span class="k">class</span> <span class="nc">Controller_Account</span> <span class="k">extends</span> <span class="nx">Controller</span> <span class="p">{</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC14'><span class="sd">     *</span></div><div class='line' id='LC15'><span class="sd">     * @var User $auth contains object a1 user </span></div><div class='line' id='LC16'><span class="sd">     */</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$auth</span><span class="p">;</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC20'><span class="sd">     * </span></div><div class='line' id='LC21'><span class="sd">     * Variable que guardara la sesión</span></div><div class='line' id='LC22'><span class="sd">     * @var Session $session</span></div><div class='line' id='LC23'><span class="sd">     */</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$session</span><span class="p">;</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC27'><span class="sd">     * </span></div><div class='line' id='LC28'><span class="sd">     * Vista que usara el sistema</span></div><div class='line' id='LC29'><span class="sd">     * @var View|String $view</span></div><div class='line' id='LC30'><span class="sd">     */</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$view</span><span class="p">;</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC34'><span class="sd">     * </span></div><div class='line' id='LC35'><span class="sd">     * Aqui se cargara el modelo users</span></div><div class='line' id='LC36'><span class="sd">     * @var Model_Users $users</span></div><div class='line' id='LC37'><span class="sd">     */</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nv">$users</span><span class="p">;</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="sd">/**</span></div><div class='line' id='LC41'><span class="sd">     * (non-PHPdoc)</span></div><div class='line' id='LC42'><span class="sd">     * @see system/classes/kohana/Kohana_Controller::before()</span></div><div class='line' id='LC43'><span class="sd">     */</span></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">before</span><span class="p">()</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">parent</span><span class="o">::</span><span class="na">before</span><span class="p">();</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span> <span class="o">=</span> <span class="nx">A1</span><span class="o">::</span><span class="na">instance</span><span class="p">();</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">session</span> <span class="o">=</span>  <span class="nx">Session</span><span class="o">::</span><span class="na">instance</span><span class="p">();</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">users</span>   <span class="o">=</span> <span class="k">new</span> <span class="nx">Model_Users</span><span class="p">();</span></div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_index</span><span class="p">()</span></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">action_login</span><span class="p">();</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC56'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC57'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_login</span><span class="p">()</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$errors</span> <span class="o">=</span>  <span class="k">array</span><span class="p">();</span></div><div class='line' id='LC60'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">method</span><span class="p">()</span><span class="o">==</span><span class="s2">&quot;POST&quot;</span><span class="p">)</span></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span> </div><div class='line' id='LC62'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$username</span> <span class="o">=</span> <span class="nx">Arr</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">,</span> <span class="s1">&#39;username&#39;</span><span class="p">);</span></div><div class='line' id='LC64'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$password</span> <span class="o">=</span> <span class="nx">Arr</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">,</span> <span class="s1">&#39;password&#39;</span><span class="p">);</span></div><div class='line' id='LC65'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$remember</span> <span class="o">=</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;remember&#39;</span><span class="p">]))</span><span class="o">?</span><span class="k">TRUE</span><span class="o">:</span><span class="k">FALSE</span><span class="p">;</span></div><div class='line' id='LC66'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC67'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">login</span><span class="p">(</span><span class="nv">$username</span><span class="p">,</span><span class="nv">$password</span><span class="p">,</span><span class="nv">$remember</span><span class="p">))</span></div><div class='line' id='LC68'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span>      </div><div class='line' id='LC69'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$session</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">session</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">as_array</span><span class="p">();</span></div><div class='line' id='LC70'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$session</span><span class="p">[</span><span class="s2">&quot;user&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">get_user</span><span class="p">();</span></div><div class='line' id='LC71'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">session</span> <span class="o">=</span> <span class="nv">$session</span><span class="p">;</span></div><div class='line' id='LC72'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">redirect</span><span class="p">(</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;backend&#39;</span><span class="p">,</span><span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="k">FALSE</span><span class="p">)));</span> </div><div class='line' id='LC73'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC74'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span></div><div class='line' id='LC75'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC76'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;login&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Datos no validos&quot;</span><span class="p">;</span></div><div class='line' id='LC77'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC78'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC79'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">view</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="s1">&#39;backend/login&#39;</span><span class="p">)</span></div><div class='line' id='LC80'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;					<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;posturl&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;login&#39;</span><span class="p">)))</span></div><div class='line' id='LC81'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;					<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;registerurl&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;register&#39;</span><span class="p">)))</span></div><div class='line' id='LC82'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s2">&quot;errors&quot;</span><span class="p">,</span><span class="nv">$errors</span><span class="p">);</span></div><div class='line' id='LC83'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC84'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC85'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_register</span><span class="p">()</span></div><div class='line' id='LC86'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC87'>&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$errors</span> <span class="o">=</span>  <span class="k">array</span><span class="p">();</span></div><div class='line' id='LC88'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">method</span><span class="p">()</span><span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">)</span></div><div class='line' id='LC89'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC90'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$username</span> <span class="o">=</span> <span class="nx">Arr</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">,</span> <span class="s1">&#39;username&#39;</span><span class="p">);</span></div><div class='line' id='LC91'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$password</span> <span class="o">=</span> <span class="nx">Arr</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">,</span> <span class="s1">&#39;password&#39;</span><span class="p">);</span></div><div class='line' id='LC92'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;register&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Error al intentar registrarse&quot;</span><span class="p">;</span></div><div class='line' id='LC93'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">users</span><span class="o">-&gt;</span><span class="na">unique_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">)</span><span class="o">===</span> <span class="k">FALSE</span><span class="p">)</span></div><div class='line' id='LC94'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC95'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="nv">$new_user</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">users</span><span class="o">-&gt;</span><span class="na">save_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">,</span><span class="nv">$password</span><span class="p">,</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="p">);</span></div><div class='line' id='LC96'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="k">if</span><span class="p">(</span><span class="nv">$new_user</span><span class="o">-&gt;</span><span class="na">saved</span><span class="p">())</span></div><div class='line' id='LC97'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="p">{</span></div><div class='line' id='LC98'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   		<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">complete_login</span><span class="p">(</span><span class="nv">$new_user</span><span class="p">);</span></div><div class='line' id='LC99'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   		<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">redirect</span><span class="p">(</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;login&#39;</span><span class="p">))</span><span class="o">.</span><span class="s1">&#39;?saved&#39;</span><span class="p">);</span></div><div class='line' id='LC100'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="p">}</span></div><div class='line' id='LC101'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		   	<span class="nv">$errors</span><span class="p">[</span><span class="s2">&quot;register&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;No se pudo guardar el nuevo registro&quot;</span><span class="p">;</span></div><div class='line' id='LC102'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC103'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;register&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;El usuario </span><span class="si">{</span><span class="nv">$username</span><span class="si">}</span><span class="s2"> ya existe en la base de datos&quot;</span><span class="p">;</span></div><div class='line' id='LC104'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC105'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">view</span> <span class="o">=</span> <span class="nx">View</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="s1">&#39;backend/register&#39;</span><span class="p">)</span></div><div class='line' id='LC106'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;						<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;errors&#39;</span><span class="p">,</span><span class="nv">$errors</span><span class="p">)</span></div><div class='line' id='LC107'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;					<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;posturl&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;login&#39;</span><span class="p">)))</span></div><div class='line' id='LC108'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;						<span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;registerurl&#39;</span><span class="p">,</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;register&#39;</span><span class="p">)));</span>    </div><div class='line' id='LC109'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC110'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC111'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">action_logout</span><span class="p">()</span></div><div class='line' id='LC112'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC113'>&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">auth</span><span class="o">-&gt;</span><span class="na">logout</span><span class="p">();</span></div><div class='line' id='LC114'>&nbsp;&nbsp;&nbsp;&nbsp;	<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">redirect</span><span class="p">(</span><span class="nx">Route</span><span class="o">::</span><span class="na">url</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;controller&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;backend&#39;</span><span class="p">,</span><span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="k">FALSE</span><span class="p">)));</span></div><div class='line' id='LC115'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC116'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC117'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">function</span> <span class="nf">after</span><span class="p">()</span></div><div class='line' id='LC118'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC119'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">response</span><span class="o">-&gt;</span><span class="na">body</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">view</span><span class="p">);</span></div><div class='line' id='LC120'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">parent</span><span class="o">::</span><span class="na">after</span><span class="p">();</span></div><div class='line' id='LC121'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC122'><br/></div><div class='line' id='LC123'><span class="p">}</span> <span class="c1">// End Account</span></div><div class='line' id='LC124'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1354245/dba5e427ce1e019cc23e6b64e9d3b643cae56b75/account.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1354245#file_account.php" style="float:right;margin-right:10px;color:#666">account.php</a>
            <a href="https://gist.github.com/1354245">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Como vemos este controlador, tenemos el método before que se ejecuta antes de cualquier &#8220;action&#8221; en donde establecemos el valor de algunas propiedades de la clase como la autenticación, la sesión y el modelo (entidad).</p>
<p>También le indico que si recibo el método action_index, en realidad ejecute el método action_login, que es el que hará el trabajo.</p>
<p>El método action_login, lo que hace es mostrar la vista login, la cual tiene esta estructura.</p>
<div id="gist-1359634" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="x">&lt;!DOCTYPE html&gt;</span></div><div class='line' id='LC2'><span class="x">&lt;html&gt;</span></div><div class='line' id='LC3'><span class="x">    &lt;head&gt;</span></div><div class='line' id='LC4'><span class="x">        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;</span></div><div class='line' id='LC5'><span class="x">        &lt;title&gt;&lt;/title&gt;</span></div><div class='line' id='LC6'><span class="x">    &lt;/head&gt;</span></div><div class='line' id='LC7'><span class="x">    &lt;body&gt;</span></div><div class='line' id='LC8'><span class="x">        &lt;div&gt;</span></div><div class='line' id='LC9'><span class="x">        &lt;h2&gt;Iniciar sesión&lt;/h2&gt;</span></div><div class='line' id='LC10'><span class="x">        </span><span class="cp">&lt;?php</span> <span class="k">if</span><span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;login&#39;</span><span class="p">]))</span><span class="o">:?&gt;</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="o">&lt;</span><span class="nx">p</span> <span class="nx">style</span><span class="o">=</span><span class="s2">&quot;border:#F00 1px solid;background:#dd0000;color:#fff;width:auto;&quot;</span><span class="o">&gt;</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;	<span class="o">&lt;?</span><span class="nx">php</span> <span class="k">echo</span> <span class="nv">$errors</span><span class="p">[</span><span class="s1">&#39;login&#39;</span><span class="p">]</span> <span class="cp">?&gt;</span><span class="x"></span></div><div class='line' id='LC13'><span class="x">        &lt;/p&gt;</span></div><div class='line' id='LC14'><span class="x">        </span><span class="cp">&lt;?php</span> <span class="k">endif</span><span class="p">;</span> <span class="cp">?&gt;</span><span class="x"></span></div><div class='line' id='LC15'><span class="x">        &lt;form action=&quot;</span><span class="cp">&lt;?php</span> <span class="k">echo</span> <span class="nv">$posturl</span> <span class="cp">?&gt;</span><span class="x">&quot; method=&quot;POST&quot;&gt;</span></div><div class='line' id='LC16'><span class="x">            &lt;p&gt;</span></div><div class='line' id='LC17'><span class="x">                &lt;label&gt;Usuario&lt;/label&gt;</span></div><div class='line' id='LC18'><span class="x">                &lt;input type=&quot;text&quot; value=&quot;&quot; name=&quot;username&quot; /&gt;</span></div><div class='line' id='LC19'><span class="x">            &lt;/p&gt;</span></div><div class='line' id='LC20'><span class="x">            &lt;p&gt;</span></div><div class='line' id='LC21'><span class="x">                &lt;label&gt;Password&lt;/label&gt;</span></div><div class='line' id='LC22'><span class="x">                &lt;input type=&quot;password&quot; value=&quot;&quot; name=&quot;password&quot; /&gt;</span></div><div class='line' id='LC23'><span class="x">            &lt;/p&gt;</span></div><div class='line' id='LC24'><span class="x">            &lt;p&gt;</span></div><div class='line' id='LC25'><span class="x">                &lt;input type=&quot;checkbox&quot; name=&quot;remember&quot; /&gt;</span></div><div class='line' id='LC26'><span class="x">                &lt;label&gt;Recordar password&lt;/label&gt;</span></div><div class='line' id='LC27'><span class="x">            &lt;p&gt;</span></div><div class='line' id='LC28'><span class="x">                &lt;input type=&quot;submit&quot; value=&quot;Iniciar sesión&quot; name=&quot;login&quot; &gt;            </span></div><div class='line' id='LC29'><span class="x">            &lt;/p&gt;            </span></div><div class='line' id='LC30'><span class="x">        &lt;/form&gt;</span></div><div class='line' id='LC31'><span class="x">        &lt;p&gt;</span></div><div class='line' id='LC32'><span class="x">            &lt;a href=&quot;</span><span class="cp">&lt;?php</span> <span class="k">echo</span> <span class="nv">$registerurl</span> <span class="cp">?&gt;</span><span class="x">&quot;&gt;Registrarse&lt;/a&gt;</span></div><div class='line' id='LC33'><span class="x">        &lt;/p&gt;</span></div><div class='line' id='LC34'><span class="x">        &lt;/div&gt;</span></div><div class='line' id='LC35'><span class="x">    &lt;/body&gt;</span></div><div class='line' id='LC36'><span class="x">&lt;/html&gt;</span></div><div class='line' id='LC37'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1359634/bbb935e5e538abacee0014247829f98b7ce23eb9/login.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1359634#file_login.php" style="float:right;margin-right:10px;color:#666">login.php</a>
            <a href="https://gist.github.com/1359634">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Que como vemos, es un simple formulario.</p>
<p>En el mismo método action_index, tiene un if que comprueba si recibe una petición POST, si es así extraemos las variables usando Arr::get de kohana, también verificamos si existe la variable remember, la cual actúa como una FLAG, que en caso de ser verdadero lo usaremos para recordar los datos del usuario.</p>
<p>Aquí es donde ocurre, toda la &#8220;magia&#8221;, y haremos hincapié en esto.</p>
<p><strong> if($this->auth->login($username,$password,$remember)) </strong>:</p>
<p>Este código lo que hace es hacer el login, y el ultimo parámetro remember tiene la capacidad de generar el recordatorio del password.</p>
<p>Si el login es correcto, se creara un sesión y hará la lógica de asignación de variables del usuario a la sesión, posteriormente se redirecciona a el backend del sistema.</p>
<p>En caso de no hacer el login, tenemos anteriormente un array, que en este caso asignara a una clave llamada login, un mensaje de error., el cual se mostrara en la vista login.</p>
<p>También tenemos un método action_register, que posee, un formulario similar al de login, y que en este caso hace el registro de un usuario, usando el modelo users, el cual también hace validación de que no exista un usuario con el mismo nombre(obviamente la validación puede ser diferente).</p>
<p>Y también tenemos el método save_user que es encargado de hacer el insert del nuevo usuario, aquí vemos que usamos para el password, $auth->hash(), que es un método de A1, que lo estamos inyectando como dependencia (DI), y es importante usar este método ya que con esto generamos el password usando el algoritmo de cifrado que incluye A1, aunque lo podremos modificar, pero es indispensable convertir el password al guardarlo, al hacer el login no es necesario convertirlo A1 lo hace en automático.</p>
<div id="gist-1365997" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="cp">&lt;?php</span> <span class="nb">defined</span><span class="p">(</span><span class="s1">&#39;SYSPATH&#39;</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s1">&#39;No direct script access.&#39;</span><span class="p">);</span></div><div class='line' id='LC2'><span class="sd">/**</span></div><div class='line' id='LC3'><span class="sd"> * </span></div><div class='line' id='LC4'><span class="sd"> * Model_Users </span></div><div class='line' id='LC5'><span class="sd"> * </span></div><div class='line' id='LC6'><span class="sd"> * Modelo/entidad de la tabla users</span></div><div class='line' id='LC7'><span class="sd"> * </span></div><div class='line' id='LC8'><span class="sd"> * @author Javier</span></div><div class='line' id='LC9'><span class="sd"> * @package backend</span></div><div class='line' id='LC10'><span class="sd"> */</span></div><div class='line' id='LC11'><span class="k">class</span> <span class="nc">Model_Users</span> <span class="k">extends</span> <span class="nx">ORM</span> <span class="p">{</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'>	<span class="sd">/**</span></div><div class='line' id='LC14'><span class="sd">	 * </span></div><div class='line' id='LC15'><span class="sd">	 * Evitamos que convierta mi tabla a plural</span></div><div class='line' id='LC16'><span class="sd">	 * @var boolean $_table_names_plural</span></div><div class='line' id='LC17'><span class="sd">	 */</span></div><div class='line' id='LC18'>	<span class="k">protected</span> <span class="nv">$_table_names_plural</span> <span class="o">=</span> <span class="k">FALSE</span><span class="p">;</span></div><div class='line' id='LC19'><br/></div><div class='line' id='LC20'><br/></div><div class='line' id='LC21'>	<span class="sd">/**</span></div><div class='line' id='LC22'><span class="sd">	 * </span></div><div class='line' id='LC23'><span class="sd">	 * Comprueba que no exista en la base de datos(evita duplicados)</span></div><div class='line' id='LC24'><span class="sd">	 * @param String $username</span></div><div class='line' id='LC25'><span class="sd">	 * @return boolean </span></div><div class='line' id='LC26'><span class="sd">	 * </span></div><div class='line' id='LC27'><span class="sd">	 */</span></div><div class='line' id='LC28'>	<span class="k">public</span> <span class="k">function</span> <span class="nf">unique_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">)</span></div><div class='line' id='LC29'>	<span class="p">{</span></div><div class='line' id='LC30'>		<span class="nv">$user</span> <span class="o">=</span> <span class="nx">ORM</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_table_name</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">where</span><span class="p">(</span><span class="s1">&#39;email&#39;</span><span class="p">,</span><span class="s1">&#39;=&#39;</span><span class="p">,</span><span class="nv">$username</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">find</span><span class="p">();</span></div><div class='line' id='LC31'>		<span class="k">return</span> <span class="p">(</span><span class="nx">bool</span><span class="p">)</span> <span class="nv">$user</span><span class="o">-&gt;</span><span class="na">loaded</span><span class="p">();</span></div><div class='line' id='LC32'>	<span class="p">}</span></div><div class='line' id='LC33'><br/></div><div class='line' id='LC34'>	<span class="sd">/**</span></div><div class='line' id='LC35'><span class="sd">	 * </span></div><div class='line' id='LC36'><span class="sd">	 * Inserta un nuevo usuario</span></div><div class='line' id='LC37'><span class="sd">	 * @param String $username</span></div><div class='line' id='LC38'><span class="sd">	 * @param String $password</span></div><div class='line' id='LC39'><span class="sd">	 * @param A1 $auth</span></div><div class='line' id='LC40'><span class="sd">	 * @return Model_Users $user</span></div><div class='line' id='LC41'><span class="sd">	 * </span></div><div class='line' id='LC42'><span class="sd">	 */</span></div><div class='line' id='LC43'>	<span class="k">public</span> <span class="k">function</span> <span class="nf">save_user</span><span class="p">(</span><span class="nv">$username</span><span class="p">,</span> <span class="nv">$password</span><span class="p">,</span> <span class="nx">A1</span> <span class="nv">$auth</span><span class="p">)</span></div><div class='line' id='LC44'>	<span class="p">{</span></div><div class='line' id='LC45'>		<span class="nv">$user</span> <span class="o">=</span> <span class="nx">ORM</span><span class="o">::</span><span class="na">factory</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_table_name</span><span class="p">);</span></div><div class='line' id='LC46'>		<span class="nv">$user</span><span class="o">-&gt;</span><span class="na">email</span> <span class="o">=</span> <span class="nv">$username</span><span class="p">;</span></div><div class='line' id='LC47'>		<span class="nv">$user</span><span class="o">-&gt;</span><span class="na">password</span> <span class="o">=</span> <span class="nv">$auth</span><span class="o">-&gt;</span><span class="na">hash</span><span class="p">(</span><span class="nv">$password</span><span class="p">);</span></div><div class='line' id='LC48'>		<span class="nv">$user</span><span class="o">-&gt;</span><span class="na">save</span><span class="p">();</span></div><div class='line' id='LC49'>		<span class="k">return</span> <span class="nv">$user</span><span class="p">;</span></div><div class='line' id='LC50'>	<span class="p">}</span></div><div class='line' id='LC51'><br/></div><div class='line' id='LC52'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1365997/d2e9efff9ec24a7d04995956081ceceedeab69c5/users.php" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1365997#file_users.php" style="float:right;margin-right:10px;color:#666">users.php</a>
            <a href="https://gist.github.com/1365997">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Regresando al controlador, después de que el nuevo usuario se haya registrado, se redirecciona al login, si no simplemente avisa del error, mandando esta información, a la vista.</p>
<p>En el mismo controlador tenemos un método action_logout, que lo que hace es cerrar la sesión, y redireccionar, aquí creo que no hace falta mas explicación.</p>
<p>En el método after lo que hago es lanzar la vista a la pantalla usando $this->response->body</p>
<p>Quizá un poco larga la explicación pero es mejor que quede claro.</p>
<p>En resumen, creamos nuestro controlador que haga el login, y otro que cree las cuentas, usamos A1, para manejar el password, para registrar el usuario y para hacer el login, evitando volver a reescribir este proceso cada vez que necesitemos hacer un login.<br />
<strong><br />
Como nota adicional, verán en el controlador backend un método privado que se llama: _prevent_back(), este método evita que cuando hagamos logout, al dar clic en el botón atrás, no regrese a la sesión como si nunca hubiéramos salido por que esta cacheado, aunque realmente hayamos finalizado la sesión y no permita hacer nada. Estoy en contacto con el creador del modulo y mande la propuesta de agregar este control de cache al core del modulo, y la parecer en breve ya vendrá por default y ya no tendrán que agregar este método(sera configurable desde el archivo de configuración del modulo).</strong></p>
<p>Tambien me falto agregar que el campo de la base de datos para el password, debe de ser de al menos 70-80 caracteres, o más, por que las cadenas que genera A1, para los passwords son muy grandes, y si aumentan el cost en el config, aun seran mas grandes.</p>
<p>Aparte de los gists, dejo el proyecto en github, para que quien guste lo puede tomarlo y bajarlo:</p>
<p>Hasta el próximo post.</p>
<p>Github: <strong><a href="https://github.com/Ajaxman/kohana1" title="Implementación Kohana A1">kohana A1 implementación</a></strong>.<br />
Parche para usar A1 pero con <strong>sha1</strong> si necesidad de usar bcrypt: <a href="https://gist.github.com/1352205" title="Hack Kohana A1">https://gist.github.com/1352205</a><br />
Colocar el archivo del parche (a1.php) en application/classes/ y ahora sus password que generen o usen usaran sha1 y no brcypt con CRYPT_BLOWFISH</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/php-usando-el-modulo-de-autenticacion-kohana-a1.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[PHP] El patrón de diseño (o antipatrón) singleton vs Inyección de dependencias ¿Que debo usar?</title>
		<link>http://www.ajaxman.net/php-el-patron-de-diseno-o-antipatron-singleton-vs-inyeccion-de-dependencias-que-debo-usar.html</link>
		<comments>http://www.ajaxman.net/php-el-patron-de-diseno-o-antipatron-singleton-vs-inyeccion-de-dependencias-que-debo-usar.html#comments</comments>
		<pubDate>Fri, 04 Nov 2011 20:58:17 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Best Practiques]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[Inyección de dependencias]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2134</guid>
		<description><![CDATA[<p>PHP es un lenguaje con el cual podemos usar herramientas avanzadas de desarrollo, algunas de estas herramientas son los patrones de diseño (Design Patterns),regularmente cuando empezamos a adentrarnos a esto de los patrones de diseño, uno de los primeros patrones que empezamos a usar es el patrón singleton, el cual garantiza un único acceso a [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>PHP es un lenguaje con el cual podemos usar herramientas avanzadas de desarrollo, algunas de estas herramientas son los patrones de diseño (Design Patterns),regularmente cuando empezamos a adentrarnos a esto de los patrones de diseño, uno de los primeros patrones que empezamos a usar es el patrón singleton, el cual garantiza un único acceso a cierto clase como una base de datos la implementación que yo uso/usaba es la siguiente:</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
/**
 *
 * Clase abstracta que define los metodos que implementaran los databaseManagers
 * @author Javier Lopez Lopez
 * @abstract
 *
 */
abstract class DatabaseManager{
	abstract public function findAll();
}


/**
 *
 * Clase Mysql Database manager (el singleton)
 * @author Javier Lopez Lopez
 *
 */
class Mysql extends DatabaseManager {

	private static $instance;

	private function __construct(){	}

	private function __clone(){ }

	public static function getInstance()
	{
		if(!(self::$instance instanceof self))
		{
			self::$instance = new self;
		}
		return self::$instance;
	}
	//...MORE CODE

	public function findAll()
	{
		//return all results
	}
}

/**
 * Usando el singleton
 */
class Controller {

	protected $database;

	public function __construct()
	{
		//Como se que debo de incluirlo si nunca lo solicito en la ejecuci&oacute;n de la clase
		//Ademas me limita a usar solo databasemanager de tipo MySQL
		//Evita que crezca el servicio no puedo agregar mas databases;
		$this-&gt;database = Mysql::getInstance();
	}

	public function getAll()
	{
		return 	$this-&gt;database-&gt;findAll();
	}
}

//Uso

$controller = new Controller();
$controler-&gt;getAll();
//nunca sabemos que adentro lleva un clase que se llama Mysql,
//entonces puede fallar, tambien no sabemos que se necesita Databasemanager</pre><p></p>
<p>En la primera clase tenemos la implementación del singleton, y en la segunda clase en el constructor estamos llamando al singleton, sin embargo, caemos en una mala practica, la cual si vemos Mysql::getInstance() es como si fuera una llamada a una clase estática global, la cual es como si estuviéramos usando variables globales, lo cual es totalmente desaconsejado de usar, como comentan en mundogeek por las siguientes cosas:</p>
<ul>
<li>El código es más difícil de entender</li>
<li>El código es más difícil de depurar</li>
<li>El código es más difícil de testear</li>
<li>El código es más difícil de mantener</li>
<li>El código es más difícil de reutilizar</li>
<li><strong>Las variables globales matan gatitos</strong></li>
</ul>
<p>Extraído de: <a href="http://mundogeek.net/archivos/2011/07/12/variables-globales/">http://mundogeek.net/archivos/2011/07/12/variables-globales/<br />
</a></p>
<p>Entonces vemos que a pesar que de es posible usar Singleton no deberíamos de usarlo, solo en casos muy excepcionales, aunque es mejor buscar algún otro patrón de diseño.<br />
<span id="more-2134"></span></p>
<p>Lo que deberíamos usar el la inyección de dependencias, que si bien es fácil de usar puede ser un poco complejo de entender:</p>
<p>La inyección de dependencias soluciona todos los items anteriores, y nos da una accesibilidad concreta a cada clase que necesitemos, si pasamos el código anterior a inyección de dependencia seria de la siguiente forma:</p>
<p></p><pre class="crayon-plain-tag">&amp;lt;?php
/**
 *
 * Clase abstracta que define los metodos que implementaran los databaseManagers
 * @author Javier Lopez Lopez
 * @abstract
 *
 */
abstract class DatabaseManager{
	abstract public function findAll();
}


/**
 * Clase Dependencia llamada Mysql
 * @author Javier Lopez Lopez
 */

class Mysql extends DatabaseManager {

	public function __construct()
	{
		//code of mysql
	}

	public function findAll()
	{
		//return all results
	}
}


/**
 * Usando el Inyecci&oacute;n de dependencias
 */
class Controller {

	protected $database;

	public function __construct(DatabaseManager $database)
	{
		$this-&gt;database = $database;
	}

	public function getAll()
	{
	 	return $this-&gt;database-&gt;findAll();
	}
}

//Uso
//opci&oacute;n 1
$databaseManager = new Mysql();
$controller = new Controller($databaseManager);

//Opci&oacute;n 2
$controller = new Controller(new Mysql);

//Opcion 3 cambiando de database manager sin problemas
$controller = new Controller(new SqlServer);
//suponiendo que tenemos un clase SqlServer

//resultado
$controller-&gt;getAll();</pre><p></p>
<p>Como vemos es simple de implementar pero debemos estudiar bien el código, para que con esto no solo evitemos el uso de Singletons (&#8220;globales glorificadas&#8221;), si no que además podamos usar TDD(Desarrollo Guiado por Pruebas) sin ninguna complicación, además de tener un código claro y fácil de reutilizar componentes.</p>
<p>Como en este caso, podemos tener varios manejadores de base de datos como Mysql, SqlServer, etc, y podemos definir claramente cual necesitamos.</p>
<p>Como nota aclaratoria, yo no condeno el uso de singletons pero su uso debe de ser muy excepcional, de hecho <a href="http://www.kohanaframework.org">Kohana Framework</a> los usa pero para casos muy concretos de hecho casi todo su código usa inyección de dependencias. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/php-el-patron-de-diseno-o-antipatron-singleton-vs-inyeccion-de-dependencias-que-debo-usar.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Taller-Kohana] Taller relampago de Kohana PHP en streaming</title>
		<link>http://www.ajaxman.net/taller-kohana-taller-relampago-de-kohana-php-en-streaming.html</link>
		<comments>http://www.ajaxman.net/taller-kohana-taller-relampago-de-kohana-php-en-streaming.html#comments</comments>
		<pubDate>Fri, 21 Oct 2011 02:29:19 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Taller]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2130</guid>
		<description><![CDATA[<p>Kohana PHP, es el framework que como bien saben me gusta mucho por muchas cosas, y en esta ocasión el conocer sobre kohana me ha dado una nueva experiencia, en este caso se trató de dar una platica &#8220;rápida&#8221; vía streaming a programadores  PHP, principalmente de Colombia aunque claro estaba dirigida para todo el que [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p><strong>Kohana PHP</strong>, es el framework que como bien saben me gusta mucho por muchas cosas, y en esta ocasión el conocer sobre kohana me ha dado una nueva experiencia, en este caso se trató de dar<strong> una platica &#8220;rápida&#8221; vía streaming a programadores  PHP, principalmente de Colombia aunque claro estaba dirigida para todo el que quisiera</strong>.</p>
<p>La verdad me gustó mucho aunque creo que me extendí demasiado, total que terminamos en 1 hora y media, pero aun así mi temario que tenía preparado no se terminó, llegue como a la mitad, aunque trate de sentar las bases del framework y estoy en espera de que si lo solicitan puede haber una parte dos.</p>
<p>Iniciamos con una breve introducción de unos cuantos slides, en donde aborde conceptos básicos del framework, como<strong> POO, MVC, HMVC, Cascading Files</strong>, entre otros, posteriormente pasamos a bajar el framework he instalarlo, de ahí nos pusimos a revisar el bootstrap, y crear nuestro<strong> !Hello World!</strong>, también comentamos sobre los <strong>módulos</strong>, y activamos los módulos de <strong>Database y ORM</strong>, he hicimos un modelo y una vista para hacer consultas desde nuestro controlador.</p>
<p><span id="more-2130"></span><br />
Estuvo muy interesante sin embargo quedaron muchas cosas en el tintero como, hablar sobre<strong> modrewrite, crear, actualizar y borrar registros en la base de datos, crear más controladores, más vistas, conocer Controller_Template y hacer un feedback sobre todo esto</strong>, la verdad hay bastante para una segunda parte que puede durar casi lo mismo, además de que parte de este material me servirá para crear el temario de un taller completo de <strong>Kohana en México</strong> en <strong>Telmexhub</strong> cortesía de <strong>ComunidadPHP</strong>.</p>
<p>De momento solo me resta decir que fue una agradable experiencia, donde trate de mostrar las ventajas de utilizar este framework, y trate de mostrar que hay mejores formas de hacer las cosas con PHP, para ser cada vez mejores en este lenguaje.</p>
<p>Como prometí, la practica la subí a github y los slides a slideshare, abajo pongo los links, bueno hasta el próximo post que espero sea muy pronto.</p>
<p>Código en github: <a href="https://github.com/Ajaxman/Kohana3/">https://github.com/Ajaxman/Kohana3/</a><br />
Slides en Slideshare:<a href="http://www.slideshare.net/Ajaxman/desarrollo-web-con-kohana-framework-php"> http://www.slideshare.net/Ajaxman/desarrollo-web-con-kohana-framework-php</a><br />
Manual de kohana: <a href="http://kohanaframework.org/3.2/guide/">http://kohanaframework.org/3.2/guide/</a><br />
Api de kohana: <a href="http://kohanaframework.org/3.2/guide/api">http://kohanaframework.org/3.2/guide/api</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/taller-kohana-taller-relampago-de-kohana-php-en-streaming.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Ajaxman] Nuevos rumbos, más programacion y proyectos</title>
		<link>http://www.ajaxman.net/ajaxman-nuevos-rumbos-mas-programacion-y-proyectos.html</link>
		<comments>http://www.ajaxman.net/ajaxman-nuevos-rumbos-mas-programacion-y-proyectos.html#comments</comments>
		<pubDate>Fri, 14 Oct 2011 19:14:47 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2124</guid>
		<description><![CDATA[<p>Hola los saludo a todos de nuevo, como dije alguna vez el blog siempre seguirá arriba. Les  platico un poco de que ha sido de mi durante este paro de labores(blog). Primero lo mas importante hace 2 meses fui papa por segunda vez, en esta ocasión de una niña hermosa llamada Avril. Mi hijo angel [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Hola los saludo a todos de nuevo, como dije alguna vez el blog siempre seguirá arriba.</p>
<p>Les  platico un poco de que ha sido de mi durante este paro de labores(blog).</p>
<p>Primero lo mas importante hace 2 meses fui papa por segunda vez, en esta ocasión de una niña hermosa llamada Avril.</p>
<p>Mi hijo angel ya sabe usar paint(windows) y tuxpaint(Debian linux) y al parecer le gusta la informática, los números, las letras,los colores.</p>
<p>También hace dias cumpli  3 años de casado y feliz.</p>
<p>También, pasaron otras cosas como cambio de trabajo, y en lo profesional empecé a interesarme aun mas en PHP y las best practiques  como refactorización, más OOP, namespaces, TDD, DRY, KISS, SOLID, DI, y hasta integración continua, si bien aun me falta mucho por aprender(y no conozco todo eso pero me gustaría) estoy esforzándome en llevar esto a la practica.</p>
<p>Conoci git y github(Control de versiones) y me gusta mucho usarlo, y recomendarlo.</p>
<p>Entonces que es lo que viene, bueno de momento, el miércoles tengo una sesión relámpago de kohana via streaming para México y Colombia, también en breve anunciare la fecha del taller de Kohana en telmexhub(esta en proceso), también vienen más proyectos en mente pero el más próximo es que es probable que en el siguiente año forme mi empresa (Desarrollo web con alta calidad (Q&amp;A)), y quizas hasta lance un libro sobre kohana en español, en fin muchos proyectos, poco a poco informare de cada uno de ellos, de momento mi primer pendiente es retomar el blog, eso si no prometo postear mucho pero eso si contenido de calidad e interesante buen eso tratare.</p>
<p>En fin, muchas cosas se vienen ojala les gusten, y de paso si quieren saber más sobre todo esto o desean algún servicio (freelance), no duden en contactarme, ya sea en el contacto o por mi twitter  <a href="http://twitter.com/ajaxman">@ajaxman</a></p>
<p>Ha y gracias por seguir visitando el blog</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/ajaxman-nuevos-rumbos-mas-programacion-y-proyectos.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[PHP] Una forma forma simple de usar Urls amigables</title>
		<link>http://www.ajaxman.net/php-una-forma-forma-simple-de-usar-urls-amigables.html</link>
		<comments>http://www.ajaxman.net/php-una-forma-forma-simple-de-usar-urls-amigables.html#comments</comments>
		<pubDate>Sat, 28 May 2011 01:44:26 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Ajaxman]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Apache]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2113</guid>
		<description><![CDATA[<p>Las urls amigables son indispensables en el desarrollo de aplicaciones web, y con PHP no supone mayor inconveniente el implementarlas salvo configurar bien el servidor (Apache + ModRewrite, Ngix, Lighttp, IIS). Sin embargo hay una tecnica bastante usada que a veces muchos desconocemos y esta usar la url, pero usando el nombre del archivo o [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } -->Las urls amigables son indispensables en el desarrollo de aplicaciones web, y con PHP no supone mayor inconveniente el implementarlas salvo configurar bien el servidor (Apache + ModRewrite, Ngix, Lighttp, IIS).</p>
<p>Sin embargo hay una tecnica bastante usada que a veces muchos desconocemos y esta usar la url, pero usando el nombre del archivo o script que estamos procesando esto es.</p>
<p>Si nuestra url es asi:</p>
<p><strong>www.ajaxman.net/index.php?post=15&amp;name=PHP-en-la-web </strong></p>
<p>Podremos tener urls amigables sin necesidad de usar Modrewrite en Apache o sin necesidad de configurar nada de la siguiente forma.</p>
<p><strong>www.ajaxman.net/index.php/PHP-en-la-web/15.html</strong></p>
<p>Como vemos esta url si la indexaria Google y los demas buscadores, pero no hubo necesidad de configurar nada, entonces ello nos daria un buen posicionamiento, por ejemplo si buscamos automoviles en mexico o <a title="computadoras en Monterrey" href="http://www.mundoanuncio.com.mx/zona/monterrey_61998/cat_21/computadora_informatica.html">computadoras en Monterrey</a>, podriamos usar este texto como parte de la url sin meternos en problemas con el servidor.</p>
<p>Ahora bien para tomar esta variable es muy facil, solo basta con usar la siguiente variable del servidor.</p>
<p></p><pre class="crayon-plain-tag">var_dump($_SERVER['PATH_INFO']);</pre><p></p>
<p>Si ejecutamos el codigo anterior veremos que nos arrojara lo siguiente (usando la url de ejemplo de arriba)</p>
<p><strong>string(22) &#8220;/PHP-en-la-web/15.html&#8221;</strong></p>
<p>Como vemos usando simplemente esta variable del servidor podemos obtener la url que le enviamos y posteriormente procesarla para lanzar nuestro controlador o clase que deseemos.</p>
<p>Como recomendacion nunca reciban el parametro para incluir ese mismo archivo  algo asi</p>
<p>Podremos tener urls amigables sin necesidad de usar Modrewrite en Apache o sin necesidad de configurar nada de la siguiente forma.</p>
<p><strong>www.ajaxman.net/index.php/productos_15.php // Que invocaria al archivo productos_15.php</strong></p>
<p>Pero el cual puede ser un grave fallo de seguridad y puede dar lugar a que nos inyecten codigo en nuestra aplicación.</p>
<p>Bueno este solo fue un tip y ya me extendi como siempre, pronto mas posts sobre kohana php, y sobre como enlazarlo con el sistema de plantillas twig, el ORM Doctrine y tambien intentare mejorar un modulo de kohana para usar Zend Search Lucene, pero luego les platico más.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/php-una-forma-forma-simple-de-usar-urls-amigables.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Kohana PHP] EL QueryBuilder de Kohana PHP Parte I, Uso de DB::Query()</title>
		<link>http://www.ajaxman.net/kohana-php-el-querybuilder-de-kohana-php-parte-i-uso-de-dbquery.html</link>
		<comments>http://www.ajaxman.net/kohana-php-el-querybuilder-de-kohana-php-parte-i-uso-de-dbquery.html#comments</comments>
		<pubDate>Sat, 21 May 2011 01:22:48 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Kohana Framework]]></category>
		<category><![CDATA[QueryBuilder Kohana]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2109</guid>
		<description><![CDATA[<p>El framework Kohana PHP, aparte de poseer un interesante y muy completo ORM, tiene otra opción que nos permite mejorar nuestras consultas a la base de datos. Este se llama QueryBuilder, el cual como su nombre lo indica es un constructor de consultas. En el post anterior, comente como usar el ORM de kohana, el [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p>El framework Kohana PHP, aparte de poseer un interesante y muy completo ORM, tiene otra opción que nos permite mejorar nuestras consultas a la base de datos.</p>
<p>Este se llama QueryBuilder, el cual como su nombre lo indica es un constructor de consultas.</p>
<p>En el post anterior, comente como usar el ORM de kohana, el cual como vemos nos ahorra mucho trabajo y nos permite hacer consultas complejas mediante el uso de la orientación a objetos, sin embargo no todo es tan maravilloso como suena, una de las cosas mas contraproducentes que tiene este y la mayoría de ORM&#8217;s es la siguiente.</p>
<p>Ejemplo de lo que sucede al hacer una consulta usando el ORM</p>
<p></p><pre class="crayon-plain-tag">//Consulta ORM
$result = ORM::factory('users')-&gt;find_all();

//Consulta generada
$sql = 'select * from users';</pre><p></p>
<p>Como vemos por default, nos esta haciendo un select *, esta consulta puede afectar seriamente nuestro rendimiento cuando nuestra tabla contiene muchos registro o muchos campos, además de que cuando tenemos tablas con un campo ambiguo, hacer funcionar bien el ORM puede darnos varios dolores de cabeza.</p>
<p>Los desarrolladores de kohana, antes de lanzar el ORM, crearon un constructor de consultas, el cual nos da toda la potencia de el lenguaje SQL, pero usando técnicas de orientación a objetos usando PHP.</p>
<p>Para usarla lo haremos configurando todo lo necesario como lo hicimos en el post anterior, y crearemos los querys de la siguiente forma.</p>
<p>* Uso de método estático DB::query()</p>
<p></p><pre class="crayon-plain-tag">//Sintaxis
$query = DB::query(integer $type,String $sql);</pre><p></p>
<p>Esta es una de las herramientas mas completas que tenemos dentro del QueryBuilder, básicamente es un método estático en donde recibe dos parámetros, el primero de tipo integer que en realidad es una constante de la clase Database, en donde le indicamos que tipo de consulta haremos( select, delete, insert, update), veamos su equivalencia.</p>
<p></p><pre class="crayon-plain-tag">Database::SELECT;&nbsp; // corresponde a 1
Database::INSERT;&nbsp; // corresponde a 2
Database::UPDATE;&nbsp; // corresponde a 3
Database::DELETE;&nbsp; // corresponde a 4</pre><p></p>
<p>El segundo parámetro es string donde indicamos la consulta que necesitemos hacer la cual puede incluir algunas variables las cuales estarán indicadas mediante dos puntos y el nombre de variable, el cual no tiene nada que ver con las variables de PHP, y posteriormente se le puede indicar el valor de dicha variable mediante el método param, parameters o bind.</p>
<p>Veamos como quedarí­a una consulta normal</p>
<p></p><pre class="crayon-plain-tag">$user = 'ajaxman';

//N&oacute;tese la variable :user

$query = DB::query(Database::SELECT, 'SELECT id,username FROM users WHERE username = :user');

//Asignaci&oacute;n de la variable :user a variable PHP $user.

$query-&gt;param(':user',$user);

/***&nbsp; Ejemplo de como seria en modo normal de PHP y MySQL ***/

$query = 'SELECT id,username FROM users WHERE username = '.$user;</pre><p></p>
<p>Pero aun no tenemos terminada nuestra consulta, para que se ejecute debemos especificarlo explícitamente mediante el método execute.<br />
Veamos algunos ejemplos de como usar lo que hemos visto en un query complejo y algunas variantes de como hacer esto.</p>
<p><span id="more-2109"></span></p>
<p></p><pre class="crayon-plain-tag">//Declaraci&oacute;n de variables en hardcode, esto debe de ser de otra forma,
// dentro de una clase (Modelo) y un m&eacute;todo correspondiente
// Solo esta as&iacute; por que es ejemplo
$user = 'ajaxman';
$password = 'passworddificil001';

//Forma 1

$query = DB::query(Database::SELECT, 'SELECT id,username FROM users WHERE username = :user and password = :pass');
$query-&gt;param(':user',$user);
$query-&gt;param(':pass',$password);
$query-&gt;execute();

//Forma 2
//Tambi&eacute;n podemos hacer el query de esta forma, y podemos usar la que mas nos guste

$query = DB::query(Database::SELECT, 'SELECT id,username FROM users WHERE username = :user and password = :pass')
             -&gt;param(':user',$user);
             -&gt;param(':pass',$password);
             -&gt;execute();
//N&oacute;tese que son m&eacute;todos que se adhieren al mismo m&eacute;todo est&aacute;tico (luego veremos como usar esta t&eacute;cnica)
//ya que nos permite un c&oacute;digo mas claro

//Forma 3
//Los par&aacute;metros podemos pasarlos como un array,veamos el tercer ejemplo

$query = DB::query(Database::SELECT, 'SELECT id,username FROM users WHERE username = :user and password = :pass')
$query-&gt;parameters(array(
               ':user' =&gt; $user,
               ':pass' =&gt; $pass,
));
$query-&gt;execute();

//Forma 4
//Esta forma es mediante el uso de el m&eacute;todo bind y es &uacute;til para hacer muchos inserts ya que se apoya de
//El uso de arrays, y foreach para hacer los inserts

$users =&nbsp; array(
    'ajaxman' =&gt; 'passworddificil002',
    'javier' =&gt; 'passworddificil003'
 );

$query = DB::query(Database::INSERT, 'INSERT INTO users (username, password) VALUES (:user, :pass)')
             -&gt;bind(':user', $username)
             -&gt;bind(':pass', $password);
foreach ($users as $username =&gt; $password)
{
     $query-&gt;execute();
}

//El ejemplo anterior vemos que con el foreach se esta ejecutando el query pero adem&aacute;s antes de ejecutarse reemplaza :user y :pass
//por cada uno de los elementos del array que definimos arriba</pre><p></p>
<p>Como vemos hay muchas formas de usar DB::query(), y podemos hacer la mayoría de consultas con este método estático.</p>
<p>Cuando empecé este post, pensaba abarcar otros métodos del QueryBuilder como DB::select, DB::expr, entre otros, sin embargo creo que se extendió demasiado este método, asi que esta sera la parte I, en la próxima parte veremos si acabo el post, si no de todas formas, ahí les aviso, de momento esperen la parte 2.</p>
<p>Toda esta información fue basada en mi experiencia con kohana y documentación de las siguientes API&#8217;s</p>
<p>API:<a title="Database" href="http://kohanaframework.org/3.1/guide/api/Database">Database</a><br />
API: <a title="Database_Query" href="http://kohanaframework.org/3.1/guide/api/Database_Query">Database_Query </a></p>
<p>Y la documentación de kohana framework (Version 3.1.x): <a title="Prepared Statements" href="http://kohanaframework.org/3.1/guide/database/query/prepared">Prepared Statements</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/kohana-php-el-querybuilder-de-kohana-php-parte-i-uso-de-dbquery.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Kohana - PHP] Explotando el potencial del ORM kohana</title>
		<link>http://www.ajaxman.net/kohana-php-explotando-el-potencial-del-orm-kohana.html</link>
		<comments>http://www.ajaxman.net/kohana-php-explotando-el-potencial-del-orm-kohana.html#comments</comments>
		<pubDate>Thu, 19 May 2011 19:20:08 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Arquitectura de 3 capas]]></category>
		<category><![CDATA[Kohana Framework]]></category>
		<category><![CDATA[Kohana PHP]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2101</guid>
		<description><![CDATA[<p>Kohana PHP Framework, trae un ORM (ver más sobre ORM&#8217;s), sencillo pero poderoso, sencillo por que es muy fácil de usar y poderoso por que podemos hacer casi cualquier cosa con dicho ORM. El único punto en contra es que solo tiene soporte para MySQL, pero como la mayoría usamos la combinación LAMP o mejor  [...]</p>
 ]]></description>
			<content:encoded><![CDATA[<p><strong>Kohana PHP Framework</strong>, trae un <strong>ORM</strong> (<a title="ver más sobre ORM's" href="http://www.ajaxman.net/php-%C2%BFque-es-un-orm.html">ver más sobre ORM&#8217;s</a>), sencillo pero poderoso, sencillo por que es muy fácil de usar y poderoso por que podemos hacer casi cualquier cosa con dicho ORM.</p>
<p>El único punto en contra es que solo tiene soporte para MySQL, pero como la mayoría usamos la combinación LAMP o mejor  MySQL+ PHP, creo que vale la pena estudiarlo a fondo.</p>
<p>Para usarlo recordemos que solo basta con descomentar el modulo en el bootstrap y mover el archivo de configuración database.php a nuestra configuración de la aplicación.</p>
<p>Ahora bien vamos a describir como usar el ORM y como usar la mayoría de sus características.</p>
<p>Haciendo una simple consulta.</p>
<p>Es importante recordar que hay que agregar una clase para manejar cada tabla, aunque esto a veces se puede omitir ayuda mucho tener todo refactorizado ya que mejora la organización del código ya la vez su mantenimiento.</p>
<p><strong>PROBLEMA: Como hacer una consulta de todos los datos de una tabla(&#8216;users&#8217;);</strong></p>
<p></p><pre class="crayon-plain-tag">//Consulta normal
$sql = 'select * from users';
$results = mysql_query($sql,$conection);
if($results) {
//Resultados
}

//Consulta ORM

$results = ORM::factory('users')-&gt;find_all();
if($results-&gt;loaded())
{
// Resultados
}</pre><p></p>
<p>Como vemos es muy fácil de usar el orm, ahora veamos otros ejemplos mas avanzados</p>
<p><strong>PROBLEMA: Consultar la tabla mediante un id único</strong></p>
<p></p><pre class="crayon-plain-tag">$id = 5; //id unico

//Consulta normal
$sql = 'select * from users where id = '.$id;
$results = mysql_query($sql,$conection);
if($results)
{
// Resultados
}

//ORM Forma:1
$results = ORM::factory('users',$id)-&gt;find();
if($results-&gt;loaded())
{
// Resultados
}

//ORM Forma:2
$results = ORM::factory('users')
-&gt;where('id','=',$id)
-&gt;find();
if($results-&gt;loaded())
{
// Resultados
}</pre><p></p>
<p>Como vemos podemos hay dos formas de hacer la consulta con el ORM, ya se indicándole el id al factory o mediante where, al final es lo mismo, solo que la primero forma sirve para el id únicamente(el nombre del campo debe de ser id por default aunque también se puede modificar).</p>
<p>Algunos de los métodos que podemos usar son los siguientes(no son todos pero tratare de poner los mas importantes)</p>
<ul>
<li><strong>where</strong></li>
<li><strong>where_open</strong></li>
<li><strong>where_close</strong></li>
<li><strong>join</strong></li>
<li><strong>on</strong></li>
<li><strong>order_by</strong></li>
<li><strong>offset</strong></li>
<li><strong>limit</strong></li>
<li><strong>group_by</strong></li>
<li><strong>or_where</strong></li>
<li><strong>and_where</strong></li>
</ul>
<p>Obviamente combinando todos podemos crear consultas complejas, por ejemplo la siguiente.<span id="more-2101"></span></p>
<p></p><pre class="crayon-plain-tag">//Consulta normal
$sql = 'select articulos.* from articulos ';
$sql .= 'where (articulos.activo = 1) or (articulos.activo = 2) ';
$sql .= 'inner join subcategorias ';
$sql .= 'on subcategorias.id = articulos.idsubcategoria ';
$sql .= 'limit 20 order by id DESC ';
$results = mysql_query($sql,$conection);
if($results) {
//Resultados
}

//Consulta ORM
$results = ORM::factory(&quot;articulos&quot;)
-&gt;join('subcategorias', 'INNER')
-&gt;on(&quot;subcategorias.id&quot;,&quot;=&quot;,&quot;articulos.idsubcategoria&quot;)
-&gt;where(&quot;articulos.activo&quot;, &quot;=&quot;,1)
-&gt;or_where(&quot;articulos.activo&quot;, &quot;=&quot;,2)
-&gt;limit(20);
-&gt;order_by('id','DESC')
-&gt;find_all();

if($results-&gt;loaded())
{
//Resultados
}</pre><p></p>
<p>Como vemos el ORM nos permite hacerlo todo desde un punto de vista orientado a objetos.</p>
<p>Para ver más capacidades recomiendo leer<a title="Kohana ORM Guide" href="http://kohanaframework.org/3.1/guide/orm"> la guía de la documentación de kohana</a> y también darle un vistazo a al <a title="Api ORM kohana" href="http://kohanaframework.org/3.1/guide/api/ORM">API del ORM</a> donde viene ejemplos de todo.</p>
<p>Algunas recomendaciones útiles son</p>
<ul>
<li><strong>Usar una clase(un modelo) por cada tabla(a veces hay excepciones)</strong></li>
<li><strong> Las consultas deberán de ir dentro de métodos de tu clase modelo algo así</strong></li>
</ul>
<p></p><pre class="crayon-plain-tag">class Model_Articulos&nbsp; extends ORM {

public function getArticlesBySubcategory()
{
$results = ORM::factory(&quot;articulos&quot;)
-&gt;join('subcategorias', 'INNER')
-&gt;on(&quot;subcategorias.id&quot;,&quot;=&quot;,&quot;articulos.idsubcategoria&quot;)
-&gt;where(&quot;articulos.activo&quot;, &quot;=&quot;,1)
-&gt;or_where(&quot;articulos.activo&quot;, &quot;=&quot;,2)
-&gt;limit(20);
-&gt;order_by('id','DESC')
-&gt;find_all();
return $results;
}

//more methods

}</pre><p></p>
<p>Así toda la capa de persistencia la tenemos aparte sin mezclarla con la capa de lógica(controlador).</p>
<ul>
<li><strong>Usar nombres de tablas en plural</strong></li>
<li><strong>Usar nombre de campo en singular</strong></li>
<li><strong>Para evitar tener problemas con la pluralización de kohana yo le indico que use el nombre como se lo puse mediante esto.</strong></li>
</ul>
<p></p><pre class="crayon-plain-tag">class Model_Users extends ORM {

protected $_table_names_plural = FALSE;
//....
}</pre><p></p>
<p>De esta forma evito que me cambie el nombre de la tabla a useres (kohana le agrega el &#8220;es&#8221;) por la pluralidad, así que mejor yo le dijo que no la cambie.</p>
<ul>
<li><strong>También se le puede especificar otro nombre de tabla a usar que no sea necesariamente el nombre de nuestra clase modelo </strong></li>
</ul>
<p></p><pre class="crayon-plain-tag">class Model_Posts extends ORM {

protected $_table_name = 'wp_posts';
//...
}</pre><p></p>
<p>Como vemos kohana tiene un completo ORM, al cual si bien le faltan algunas cosas va por buen camino y es bueno ir aprendiendo todas sus capacidades, para trabajar con el.</p>
<p>En el próximo post veremos como mejorar el performance de nuestros querys, eliminado pequeños detalles que genera dicho ORM, ya que no alcance a terminarlo hoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/kohana-php-explotando-el-potencial-del-orm-kohana.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Kohana - PHP] 12 consejos útiles para desarrollar con kohana PHP</title>
		<link>http://www.ajaxman.net/kohana-php-12-consejos-utiles-para-desarrollar-con-kohana-php.html</link>
		<comments>http://www.ajaxman.net/kohana-php-12-consejos-utiles-para-desarrollar-con-kohana-php.html#comments</comments>
		<pubDate>Tue, 10 May 2011 21:47:06 +0000</pubDate>
		<dc:creator>ajaxman</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Kohana 3]]></category>
		<category><![CDATA[Kohana Framework]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.ajaxman.net/?p=2094</guid>
		<description><![CDATA[<p>Pues hoy les voy a mostrar, algunos consejos sobre el Framework kohana PHP, que les servirán mucho al momento de iniciarse en con este software, quizá algunos lo usen de otro modo y sea mejor, pero yo voy a poner como lo he usado y como me ha resultado de utilidad, así que si hay algo que no les funcione con kohana quizá deberían a darle un vistazo a este POST, aquí vienen:</p>
 ]]></description>
			<content:encoded><![CDATA[<p>Pues hoy les voy a mostrar, algunos consejos sobre el Framework kohana PHP, que les servirán mucho al momento de iniciarse en con este software, quizá algunos lo usen de otro modo y sea mejor, pero yo voy a poner como lo he usado y como me ha resultado de utilidad, así que si hay algo que no les funcione con kohana quizá deberían a darle un vistazo a este POST, aquí vienen:</p>
<h2><strong>1.- Kohana PHP</strong></h2>
<p>Es un framework escrito en PHP para acelerar el desarrollo de aplicaciones web, originalmente basado en CodeIgniter pero reescrito desde cero.</p>
<h2><strong>2.- Las ventajas de kohana PHP</strong></h2>
<p>Bueno son muchas, aquí pondré algunas</p>
<ul>
<li>Extremadamente ligero</li>
<li> PHP 5 Estricto</li>
<li> OOP</li>
<li> Arquitectura HMVC</li>
<li> Curva de aprendizaje fácil, pero extensa</li>
<li> Se puede usar con Doctrine ORM, Smarty, Twig y hasta con tus propias clases sin problemas.</li>
<li> IDE &#8211; Trabaja muy bien con Netbeans.</li>
</ul>
<h2><strong>3.- Las versiones de Kohana PHP</strong></h2>
<p>Kohana surgió como un fork de Codeigniter(CI) tratando de mejorarlo, y la versión 2.x es basado en CI y actualmente hay soporte para la misma y es manejada por Jeremy Bush( aka zombor).</p>
<p>Sin embargo la versión que uso y recomiendo en las 3.x, mas específicamente la 3.1.3.1, la cual también es estable, la recomiendo por que esta reescrita desde cero pensando en puro PHP5 Y OOP, , es mas fácil de usar, y con muchas mejoras a nivel código, de la versión 3.0 y 3.1.1, hubo cambios algo fuertes y puede que tu código no funcione bien.</p>
<p>En resumen usa la versión 3.1.3.1 y evitate problemas.</p>
<h2><strong>4.-Instalando Kohana PHP</strong></h2>
<p>Tengo aquí un post que menciona como instalar Kohana PHP, que no es mas que descomprimir, ver si tenemos todos los requisitos y ya.</p>
<p>Además de eso recomiendo que su servidor tenga soporte para .htaccess y el modulo ModRewrite instalado y en ese archivo comenta esta linea, ya que puede generarte problemas con la ubicación de tu kohana</p>
<p></p><pre class="crayon-plain-tag"># Installation directory
#RewriteBase /</pre><p></p>
<h2><strong>5.-  Configura tus rutas dentro del bootstrap</strong></h2>
<p>Configura tus rutas dentro del archivo Bootstrap, por default viene configurada una ruta que se llama default la cual apunta al controlador welcome, elimina ese archivo y configura tus rutas o ponlo para que apunte al controlador por default de tu proyecto<br />
<span id="more-2094"></span></p>
<p></p><pre class="crayon-plain-tag">//reescribir estas lineas de acuerdo a tu proyecto
Route::set('default', '(&amp;lt;controller&amp;gt;(/&amp;lt;action&amp;gt;(/&amp;lt;id&amp;gt;)))')
-&gt;defaults(array(
 'controller' =&gt; 'welcome',
 'action'&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 'index',
));</pre><p></p>
<h2><strong>6.- Elimina tu archivo de instalación</strong></h2>
<p>Cuando se instala kohana siempre trae un archivo que se llama install.php, el cual se encarga de verificar y mostrar que tengas todos los requisitos para usar kohana, después de que verifiques que todo esta ok, debes borrarlo ya que contiene información sensible que puede ser accesible muy fácilmente.</p>
<h2><strong>7.- Cada cosa en su lugar</strong></h2>
<p>Si bien cuando uno empieza a probar kohana sin leer mucho, hay cosas que podemos hacer pero que no están bien como poner consultas en los controladores, o en las vistas, hay que organizar todo, es mucho mejor.</p>
<p>Estas son las reglas</p>
<ul>
<li>Ruteos en el Bootstrap</li>
<li>Capa de lógica en el Controlador</li>
<li>Capa de persistencia de datos en los modelos</li>
<li>Capa de presentación en las vistas</li>
</ul>
<h2><strong>8.- Configura tu init del bootstrap</strong></h2>
<p>Configura en tu bootstrap tu url_base que es donde esta la dirección de tu sitio, es decir si tu sitio es http://www.ajaxman.net y ahí estas usando kohana en tu bootstrap debe de estar así</p>
<p>Y de preferencia usa urls amigables solo indicando, index_file como FALSE.</p>
<p></p><pre class="crayon-plain-tag">Kohana::init(array(
 'base_url'&nbsp;&nbsp; =&gt; 'http://www.ajaxman.net/',
 'index_file' =&gt; FALSE
));</pre><p></p>
<h2><strong>9.- Usa un IDE</strong></h2>
<p>Para desarrollar con kohana, sirve hasta el bloc de notas (o el vi), pero a veces no es lo mejor, yo recomiendo que usen un IDE (Entorno de Desarrollo Integrado) como Eclipse, Zend Studio, Netbeans, Aptana,etc.</p>
<p>Yo uso Netbeans y trabaja de maravilla, reconoce todos los métodos y clases de kohana, además de que Netbeans te sirve para programar en Java, C, C++, Python entre otros y es Open Source</p>
<h2><strong>10.- La configuración de tu aplicaciones</strong></h2>
<p>Todos los módulos y algunas clases de kohana viene con una carpeta config y dentro de estas aparece un archivo con el nombre de la clase, estos archivos, contienen la configuración de cada clase que necesita configuración.</p>
<p>Para tenerlos mas claros estos se encuentran dentro de:</p>
<ul>
<li>*configuraciones del sistema
<ul>
<li> System
<ul>
<li>config</li>
</ul>
</li>
</ul>
</li>
<li>*configuraciones de los módulos
<ul>
<li>Modules
<ul>
<li>nombre_del_modulo
<ul>
<li> config</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Y si bien se puede configurar desde ahí, no es recomendable, entonces lo que hay que hacer es que cada vez que necesites usar algo lo debes de configurar, para hacerlo solo debes de copiar estos archivos dentro de la ruta de aplicación esto es.</p>
<ul>
<li>*configuraciones de tu aplicación
<ul>
<li>application
<ul>
<li>config</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Y ahí configurarlos así tienes todo dentro de tu aplicación.</p>
<h2><strong>11.- Cambia tus permisos en tus archivos de logs</strong></h2>
<p>Cuando uno empieza a programar en kohana a veces veremos errores del tipo:</p>
<p><strong>ErrorException [ 2 ]: file_put_contents(/home/tuwebsite/public_html/application/logs/2011/05/10.php) function.file-put-contents]: failed to open stream: Permission denied ~ SYSPATH/classes/kohana/log/file.php [ 82 ]</strong></p>
<p>Esto sucede por que que no tienes permisos para escribir en el archivo 10.php lo que hay que hacer aparte de cambiar los permisos de application/logs y todos sus directorios también hay que crear un archivo en blanco con el nombre del día que nos este mostrando en este caso es el 10.php, y darle permisos 777, para que escriba los logs, en este caso el error es por que no existe mi controlador.</p>
<p>Entonces mas que nada hay que tener dicho archivo y permisos de escritura para que guarde ahí el error.</p>
<p>Si no quieren usar este archivo hay que comentar la siguiente linea en el bootstrap</p>
<p></p><pre class="crayon-plain-tag">/**
 * Attach the file write to logging. Multiple writers are supported.
 */
Kohana::$log-&gt;attach(new Log_File(APPPATH.'logs')); //Comentar esta linea</pre><p></p>
<h2><strong>12.- Quita el user_guide</strong></h2>
<p>Por último otra recomendación útil es quitar el modulo user_guide ya que no sirve de mucho mostrar esta información al usuario y puede ser un agujero de seguridad.</p>
<p>Solo hay que borrarlo dentro de la carpeta modules.</p>
<p>Con estos 12 tips espero que les sea más fácil de usar kohana además de que ojala y sirva de base para que migren de otros frameworks, si tienen algún duda pues me avisan en lo comentarios, ha también se viene el congreso de PHP, pronto mas detalles.</p>
<p>Kohana FrameWork:<a href="http://kohanaframework.org/"> Kohana: The Swift PHP Framework</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxman.net/kohana-php-12-consejos-utiles-para-desarrollar-con-kohana-php.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.ajaxman.net @ 2012-05-17 16:48:37 -->
