{"id":9,"date":"2013-01-31T16:54:54","date_gmt":"2013-01-31T16:54:54","guid":{"rendered":"http:\/\/einaweb.es\/dev\/?p=9"},"modified":"2013-02-13T08:30:18","modified_gmt":"2013-02-13T08:30:18","slug":"como-organizar-tu-proyecto-php-de-la-mejor-manera","status":"publish","type":"post","link":"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/","title":{"rendered":"C\u00f3mo organizar tu proyecto PHP de la mejor manera"},"content":{"rendered":"<p>Al comenzar a\u00a0<strong>trabajar<\/strong>\u00a0con el<strong>\u00a0lenguaje\u00a0<\/strong>de programaci\u00f3n\u00a0<strong>PHP<\/strong>, puede resultar algo\u00a0<strong>desorientador descifrar<\/strong>\u00a0c\u00f3mo es\u00a0<strong>la mejor forma<\/strong>\u00a0de<strong>organizar<\/strong>\u00a0nuestro\u00a0<strong>proyecto<\/strong>.<\/p>\n<p>Si alguna vez has estado confundido sobre\u00a0<strong>en d\u00f3nde<\/strong>\u00a0poner\u00a0<strong>tus im\u00e1genes<\/strong>, galer\u00edas externas, o c\u00f3mo\u00a0<strong>mantener tu l\u00f3gica<\/strong>\u00a0separada del<strong>dise\u00f1o<\/strong>, estos<strong>\u00a0consejos<\/strong>\u00a0te resultar\u00e1n muy \u00fatiles y\u00a0<strong>te guiar\u00e1n<\/strong>\u00a0en la direcci\u00f3n correcta.<\/p>\n<h2>Estructura del directorio<\/h2>\n<p>Podr\u00eda decirse que lo m\u00e1s importante para iniciar rapidamente tu proyecto PHP es poseer una estructura de directorio s\u00f3lida que podamos reutilizar en multiples proyectos.<\/p>\n<p><a href=\"http:\/\/www.einaweb.es\/dev\/wp-content\/uploads\/2013\/01\/1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-10\" alt=\"1\" src=\"http:\/\/einaweb.es\/dev\/wp-content\/uploads\/2013\/01\/1.png\" width=\"188\" height=\"197\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>Irrupci\u00f3n<\/h2>\n<ul type=\"disc\">\n<li>Seguramente est\u00e1s muy familiarizado con la estructura\u00a0<strong>public_html<\/strong>. \u00c9sta es la ruta de documento en la que son accedidos\u00a0 todos tus archivos p\u00fablicos. (por ejemplo, a\u00a0 example.com\/page.php se accede a trav\u00e9s de \/public_html\/page.php).\n<ul type=\"circle\">\n<li>img &#8211; Todos tus archivos de im\u00e1genes.<\/li>\n<li>css &#8211; Todos tus archivos CSS.<\/li>\n<li>js &#8211; Todos tus archivos Javascript.<\/li>\n<\/ul>\n<\/li>\n<li>El directorio\u00a0<strong>resources<\/strong>\u00a0deber\u00eda contener todas las librer\u00edas de terceros, configs y todo otro c\u00f3digo que funcione como recurso en tu proyecto.\n<ul type=\"circle\">\n<li>config.php &#8211; Es el archivo principal de configuraci\u00f3n. Deber\u00eda almacenar las programaciones m\u00e1s importantes del sitio.<\/li>\n<li>library &#8211; La locaci\u00f3n central de todas las librer\u00edas personales y de terceros.<\/li>\n<li>templates &#8211; Los componentes reutilizables que forman tu dise\u00f1o.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>El archivo Config<\/h2>\n<p>Como desarrolladores y dise\u00f1adores nuestra meta principal es reducir el trabajo al m\u00ednimo. Una forma de lograrlo es mediante archivos config. Para tener una idea de c\u00f3mo deber\u00eda lucir un archivo de configuraci\u00f3n, mira el ejemplo que sigue:<\/p>\n<p><em>&lt;?php<\/em><\/p>\n<p><em>\/*<\/em><br \/>\n<em>The important thing to realize is that the config file should be included in every<\/em><br \/>\n<em>page of your project, or at least any page you want access to these settings.<\/em><br \/>\n<em>This allows you to confidently use these settings throughout a project because<\/em><br \/>\n<em>if something changes such as your database credentials, or a path to a specific resource,<\/em><br \/>\n<em>you\u2019ll only need to update it here.<\/em><br \/>\n<em>*\/<\/em><\/p>\n<p><em>$config = array(<\/em><br \/>\n<em>\u201cdb\u201d =&gt; array(<\/em><br \/>\n<em>\u201cdb1\u2033 =&gt; array(<\/em><br \/>\n<em>\u201cdbname\u201d =&gt; \u201cdatabase1\u2033,<\/em><br \/>\n<em>\u201cusername\u201d =&gt; \u201cdbUser\u201d,<\/em><br \/>\n<em>\u201cpassword\u201d =&gt; \u201cpa$$\u201d,<\/em><br \/>\n<em>\u201chost\u201d =&gt; \u201clocalhost\u201d<\/em><br \/>\n<em>),<\/em><br \/>\n<em>\u201cdb2\u2033 =&gt; array(<\/em><br \/>\n<em>\u201cdbname\u201d =&gt; \u201cdatabase2\u2033,<\/em><br \/>\n<em>\u201cusername\u201d =&gt; \u201cdbUser\u201d,<\/em><br \/>\n<em>\u201cpassword\u201d =&gt; \u201cpa$$\u201d,<\/em><br \/>\n<em>\u201chost\u201d =&gt; \u201clocalhost\u201d<\/em><br \/>\n<em>)<\/em><br \/>\n<em>),<\/em><br \/>\n<em>\u201curls\u201d =&gt; array(<\/em><br \/>\n<em>\u201cbaseUrl\u201d =&gt; \u201chttp:\/\/example.com\u201d<\/em><br \/>\n<em>),<\/em><br \/>\n<em>\u201cpaths\u201d =&gt; array(<\/em><br \/>\n<em>\u201cresources\u201d =&gt; \u201c\/path\/to\/resources\u201d,<\/em><br \/>\n<em>\u201cimages\u201d =&gt; array(<\/em><br \/>\n<em>\u201ccontent\u201d =&gt; $_SERVER[\u00abDOCUMENT_ROOT\u00bb] . \u201c\/images\/content\u201d,<\/em><br \/>\n<em>\u201clayout\u201d =&gt; $_SERVER[\u00abDOCUMENT_ROOT\u00bb] . \u201c\/images\/layout\u201d<\/em><br \/>\n<em>)<\/em><br \/>\n<em>)<\/em><br \/>\n<em>);<\/em><\/p>\n<p><em>\/*<\/em><br \/>\n<em>I will usually place the following in a bootstrap file or some type of environment<\/em><br \/>\n<em>setup file (code that is run at the start of every page request), but they work<\/em><br \/>\n<em>just as well in your config file if it\u2019s in php (some alternatives to php are xml or ini files).<\/em><br \/>\n<em>*\/<\/em><\/p>\n<p><em>\/*<\/em><br \/>\n<em>Creating constants for heavily used paths makes things a lot easier.<\/em><br \/>\n<em>ex. require_once(LIBRARY_PATH . \u201cPaginator.php\u201d)<\/em><br \/>\n<em>*\/<\/em><br \/>\n<em>defined(\u201dLIBRARY_PATH\u201d)<\/em><br \/>\n<em>or define(\u201dLIBRARY_PATH\u201d, realpath(dirname(__FILE__) . \u2018\/library\u2019));<\/em><\/p>\n<p><em>defined(\u201dTEMPLATES_PATH\u201d)<\/em><br \/>\n<em>or define(\u201dTEMPLATES_PATH\u201d, realpath(dirname(__FILE__) . \u2018\/templates\u2019));<\/em><\/p>\n<p><em>\/*<\/em><br \/>\n<em>Error reporting.<\/em><br \/>\n<em>*\/<\/em><br \/>\n<em>ini_set(\u201derror_reporting\u201d, \u201ctrue\u201d);<\/em><br \/>\n<em>error_reporting(E_ALL|E_STRCT);<\/em><\/p>\n<p><em>?&gt;<\/em><\/p>\n<p>\u00c9se es un archivo config drop-in simple. Una serie multi-dimensional sirve como una estructura flexible para acceder a varios \u00edtems del archivo config tales como credenciales de la base de datos.<\/p>\n<ul type=\"disc\">\n<li>db &#8211; Almacena credenciales de base de dato u otra informaci\u00f3n perteneciente a nuestra base de datos.<\/li>\n<li>paths &#8211; Caminos comunmente usados a varios recursos de tu sitio.\n<ul type=\"circle\">\n<li>Archivos log<\/li>\n<li>Directorios de carga<\/li>\n<li>Recursos<\/li>\n<\/ul>\n<\/li>\n<li>urls &#8211; Almacenar URLs puede ser muy \u00fatil al referenciar recursos remotos a trav\u00e9s de tu sitio.<\/li>\n<li>emails &#8211; Almacena emails de admin o debuggeo para utilizar al manejar errores o formularios de contacto.<\/li>\n<\/ul>\n<p>Utilizar constantes para aquellos caminos que son m\u00e1s utilizados hace que incluir declaraciones (require o include) sea rapid\u00edsimo y si el camino alguna vez cambia, s\u00f3lo deber\u00e1s actualizarlo en un lugar.<\/p>\n<h2><strong>Utilizando diferentes archivos config para distintos entornos<br \/>\n<\/strong><\/h2>\n<p>Al utilizar diferentes archivos config para distintos entornos puedes programar propiedades relevantes dependiendo de cada uno. Esto quiere decir que si utilizas diferentes credenciales de base de datos, o diferentes caminos, para cada entorno, programando el archivo config respectivo te asegurar\u00e1 que tu c\u00f3digo funcionar\u00e1 a la perfecci\u00f3n al actualizar tu sitio en vivo. Esto tambi\u00e9n te permite obtener diferentes reportes de error basado en cada entorno. Pero recuerda nunca jam\u00e1s mostrar los errores en tu sitio en vivo, ya que hacer esto puede exponer informaci\u00f3n importante y privada a los usuarios.<\/p>\n<h2><strong>El dise\u00f1o<\/strong><\/h2>\n<p>Los template reutilizables son grandes salvadores de tiempo. Existen magn\u00edficas librer\u00edas para realizar templates (tal como\u00a0<a title=\"Smarty\" href=\"http:\/\/smarty.net\/\" target=\"_blank\">Smarty<\/a>). \u00c9stas ofrecen una gran cantidad de funcionalidades. Pero como \u00e9ste es un sitio simple, no nos tomaremos demasiado tiempo en programar la librer\u00eda y utilizaremos el template m\u00e1s b\u00e1sico. Logramos esto incorporando secciones comunes o m\u00f3dulos en nuestras p\u00e1ginas del sitio, de esta forma, si deseamos cambiar algo en la cabecera, se propagar\u00e1 a todo el sitio.<\/p>\n<h2><strong>header.php<\/strong><\/h2>\n<p>&lt;!DOCTYPE html PUBLIC \u201c-\/\/W3C\/\/DTD HTML 4.01\/\/EN\u201d<br \/>\n\u201chttp:\/\/www.w3.org\/TR\/html4\/strict.dtd\u201d&gt;<\/p>\n<p>&lt;html lang=\u201den\u201d&gt;<br \/>\n&lt;head&gt;<br \/>\n&lt;meta http-equiv=\u201dContent-Type\u201d content=\u201dtext\/html; charset=utf-8\u2033&gt;<br \/>\n&lt;title&gt;Simple Site&lt;\/title&gt;<br \/>\n&lt;\/head&gt;<\/p>\n<p>&lt;body&gt;<br \/>\n&lt;div id=\u201dheader\u201d&gt;<br \/>\n&lt;h1&gt;Simple Site&lt;\/h1&gt;<br \/>\n&lt;ul class=\u201dnav global\u201d&gt;<br \/>\n&lt;li&gt;&lt;a href=\u201d#\u201d&gt;Home&lt;\/a&gt;&lt;\/li&gt;<br \/>\n&lt;li&gt;&lt;a href=\u201d#\u201d&gt;Articles&lt;\/a&gt;&lt;\/li&gt;<br \/>\n&lt;li&gt;&lt;a href=\u201d#\u201d&gt;Portfolio&lt;\/a&gt;&lt;\/li&gt;<br \/>\n&lt;\/ul&gt;<\/p>\n<p>&lt;\/div&gt;<\/p>\n<h2><strong>rightPanel.php<\/strong><\/h2>\n<blockquote><p>&lt;div id=\u201dsiteControls\u201d&gt;<br \/>\n&lt;ul class=\u201dcategories\u201d&gt;<br \/>\n&lt;li&gt;PHP&lt;\/li&gt;<br \/>\n&lt;li&gt;HTML&lt;\/li&gt;<br \/>\n&lt;li&gt;CSS&lt;\/li&gt;<br \/>\n&lt;\/ul&gt;<br \/>\n&lt;div class=\u201dads\u201d&gt;<br \/>\n&lt;!\u2013 ads code \u2013&gt;<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;\/div&gt;<\/p><\/blockquote>\n<h2><strong>footer.php<\/strong><\/h2>\n<blockquote><p>&lt;div id=\u201dfooter\u201d&gt;<br \/>\nFooter content\u2026<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt;<\/p><\/blockquote>\n<h2><strong>index.php<\/strong><\/h2>\n<p>Digamos que ya pusimos todos los elementos del dise\u00f1o (cabecera, pie de p\u00e1gina, panel derecho) en nuestro directorio de recursos como templates.<\/p>\n<blockquote><p>&lt;?php<br \/>\n\/\/ load up your config file<br \/>\nrequire_once(\u201d\/path\/to\/resources\/config.php\u201d);<\/p>\n<p>require_once(TEMPLATES_PATH . \u201c\/header.php\u201d);<br \/>\n?&gt;<br \/>\n&lt;div id=\u201dcontainer\u201d&gt;<br \/>\n&lt;div id=\u201dcontent\u201d&gt;<br \/>\n&lt;!\u2013 content \u2013&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;?php<br \/>\nrequire_once(TEMPLATES_PATH . \u201c\/rightPanel.php\u201d);<br \/>\n?&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;?php<br \/>\nrequire_once(TEMPLATES_PATH . \u201c\/footer.php\u201d);<br \/>\n?&gt;<\/p><\/blockquote>\n<h2>Avanzando un poco m\u00e1s<\/h2>\n<p>Si bien este sistema del template b\u00e1sico te permite tener un gran comienzo, puedes llevarlo mucho m\u00e1s lejos. Por ejemplo, puedes crear una clase o funciones que incluyan todos los archivos de template y aceptar un archivo de contenido como un argumento para que dibuje dentro del dise\u00f1o. De esta forma no necesitas seguir incluyendo los archivos de template en cada p\u00e1gina de tu sitio. Aqu\u00ed tienen un r\u00e1pido ejemplo:<\/p>\n<p><strong>\/resources\/library\/templateFunctions.php<\/strong><\/p>\n<blockquote><p>&lt;?php<br \/>\nrequire_once(realpath(dirname(__FILE__) . \u201c\/..\/config.php\u201d));<\/p>\n<p>function renderLayoutWithContentFile($contentFile, $variables = array())<br \/>\n{<br \/>\n$contentFileFullPath = TEMPLATES_PATH . \u201c\/\u201d . $contentFile;<\/p>\n<p>\/\/ making sure passed in variables are in scope of the template<br \/>\n\/\/ each key in the $variables array will become a variable<br \/>\nif (count($variables) &gt; 0) {<br \/>\nforeach ($variables as $key =&gt; $value) {<br \/>\nif (strlen($key) &gt; 0) {<br \/>\n${$key} = $value;<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>require_once(TEMPLATES_PATH . \u201c\/header.php\u201d);<\/p>\n<p>echo \u201c&lt;div id=\\\u201dcontainer\\\u201d&gt;\\n\u201d<br \/>\n. \u201c\\t&lt;div id=\\\u201dcontent\\\u201d&gt;\\n\u201d;<\/p>\n<p>if (file_exists($contentFileFullPath)) {<br \/>\nrequire_once($contentFileFullPath);<br \/>\n} else {<br \/>\n\/*<br \/>\nIf the file isn\u2019t found the error can be handled in lots of ways.<br \/>\nIn this case we will just include an error template.<br \/>\n*\/<br \/>\nrequire_once(TEMPLATES_PATH . \u201c\/error.php\u201d);<br \/>\n}<\/p>\n<p>\/\/ close content div<br \/>\necho \u201c\\t&lt;\/div&gt;\\n\u201d;<\/p>\n<p>require_once(TEMPLATES_PATH . \u201c\/rightPanel.php\u201d);<\/p>\n<p>\/\/ close container div<br \/>\necho \u201c&lt;\/div&gt;\\n\u201d;<\/p>\n<p>require_once(TEMPLATES_PATH . \u201c\/footer.php\u201d);<br \/>\n}<br \/>\n?&gt;<\/p><\/blockquote>\n<h2><strong>index.php<\/strong><\/h2>\n<p>Esto es asumiendo que en tu directorio de templates tengas un archivo llamado home.php que act\u00faa como template contenedor.<\/p>\n<blockquote><p>&lt;?php<\/p>\n<p>require_once(realpath(dirname(__FILE__) . \u201c\/..\/resources\/config.php\u201d));<\/p>\n<p>require_once(LIBRARY_PATH . \u201c\/templateFunctions.php\u201d);<\/p>\n<p>\/*<br \/>\nNow you can handle all your php logic outside of the template<br \/>\nfile which makes for very clean code!<br \/>\n*\/<\/p>\n<p>$setInIndexDotPhp = \u201cHey! I was set in the index.php file.\u201d;<\/p>\n<p>\/\/ Must pass in variables (as an array) to use in template<br \/>\n$variables = array(<br \/>\n\u2019setInIndexDotPhp\u2019 =&gt; $setInIndexDotPhp<br \/>\n);<\/p>\n<p>renderLayoutWithContentFile(\u201dhome.php\u201d, $variables);<\/p>\n<p>?&gt;<\/p><\/blockquote>\n<h2><strong>home.php<\/strong><\/h2>\n<blockquote><p>&lt;!\u2013 Homepage content \u2013&gt;<br \/>\n&lt;h2&gt;Home Page&lt;\/h2&gt;<\/p>\n<p>&lt;?php<\/p>\n<p>\/*<br \/>\nAny variables passed in through the variables parameter in our renderLayoutWithContentPage() function<br \/>\nare available in here.<br \/>\n*\/<\/p>\n<p>echo $setInIndexDotPhp;<\/p>\n<p>?&gt;<\/p><\/blockquote>\n<h2><strong>Beneficios que incluye este m\u00e9todo:<\/strong><\/h2>\n<ul type=\"disc\">\n<li>Mejor separaci\u00f3n de l\u00f3gica y vista (php and html). Esta separaci\u00f3n permite un c\u00f3digo m\u00e1s limpio y nuestro trabajo como desarrolladores\/dise\u00f1adores se vuelve mucho m\u00e1s f\u00e1cil.<\/li>\n<li>Encapsular la l\u00f3gica del template en una funci\u00f3n nos permite realizar cambios en c\u00f3mo rinde el template sin tener que actualizarlo en cada p\u00e1gina de nuestro sitio.<\/li>\n<\/ul>\n<h2><strong>Symlinks<\/strong><\/h2>\n<p>En los sistemas basado en Unix (OS X, Linux) existe una funcionalidad genial llamada Symlinks (Symbolic Links). Los symlinks son referencias a directorios o archivos del filesystem. Esto es muy bueno cuando tenemos un recurso compartido, como por ejemplo una librer\u00eda que utilizamos en m\u00faltiples proyectos. Estas son algunas de las cosas que se puede lograr con los symlinks:<\/p>\n<ul type=\"disc\">\n<li>Tener dos versiones de tu directorio de recursos. Al actualizar tu servidor vivo podr\u00e1s subir tus \u00faltimos archivos en un directorio arbitrario. Simplemente apunta el symlink a este nuevo directorio, actualiz\u00e1ndo autom\u00e1ticamente tu c\u00f3digo base.<\/li>\n<li>Los recursos compartidos se manejan f\u00e1cilmente con los symlinks.<\/li>\n<\/ul>\n<h2>Symlinks vs Hardlinks<\/h2>\n<p>Symlinks, o softlinks, actu\u00e1n como referencias de caminos completos en el filesystem. Puedes utilizar symlinks en m\u00faltiples locaciones y el filesystem los trata como si fueran el propio archivo o el directorio que referencian. Hardlinks, por su parte, apuntan a un archivo del disco (piensa en los atajos de windows); te llevan a la verdadera locaci\u00f3n del archivo.<\/p>\n<p>Al usar symlinks debes fijarte que la configuraci\u00f3n de tu servidor est\u00e9 programada para seguirlos. Para Apache esto se hace en el archivo httpd.conf . Encuentra el bloque de directorio y aseg\u00farate que la opci\u00f3n FollowSymLinks est\u00e9 ah\u00ed. De lo contrario, a\u00f1\u00e1dela y reinicia Apache.<\/p>\n<blockquote>\n<div>&lt;Directory\u00a0\/&gt;<br \/>\nOptions\u00a0FollowSymLinks<br \/>\nAllowOverride\u00a0None<br \/>\n&lt;\/Directory&gt;<\/div>\n<\/blockquote>\n<h2>Creando Symlinks en OS X<\/h2>\n<p>Existen dos formas de crear symlinks en OS X:<\/p>\n<ul type=\"disc\">\n<li>Por medio de la l\u00ednea de comando, navega (utilizando \u201ccd, change directory\u201d) hasta el directorio en el que deseas que el symlink sea creado, luego utiliza el siguiente comando:<\/li>\n<\/ul>\n<blockquote><p>$: ln -s \/path\/to\/actual\/dir targetDir<\/p><\/blockquote>\n<p>Por lo que si nuestra librer\u00eda de costumbre se alberga en ~\/Sites\/libraries\/myCustomLibrary haremos cd hasta donde deseamos utilizar esta librer\u00eda cd ~\/Sites\/mySite\/resources\/library e ingresamos:<\/p>\n<blockquote><p>$: ln -s ~\/Sites\/libraries\/myCustomLibrary myCustomLibrary<\/p><\/blockquote>\n<p>Nota: Este m\u00e9todo deber\u00eda funcionar en todos los sistemas operativos que se basan en Unix.<\/p>\n<p>Otra alternativa es a trav\u00e9s del buscador. Manteniendo presionado Alt + Cmd mientras hacemos clic y arrastramos un archivo, a Symlink (o alias en OS X) que apunta al archivo ser\u00e1 creado.<\/p>\n<h2>Creando Symlinks en Windows<\/h2>\n<p>Para lograr esto en Windows necesitar\u00e1s utilizar el comando mklink en el Prompt Command:<\/p>\n<blockquote><p>C:\\mklink \/D C:\\libraries\\myCustomLibrary C:\\Users\\derek\\Sites\\mySite\\resources\\library\\myCustomLibrary<\/p><\/blockquote>\n<h2>En Resumen<\/h2>\n<p>Estos consejos son para principiantes o aquellas personas que se encuentran creando sitios simples o aplicaciones. Para los que deseen realizar aplicaciones o sitios m\u00e1s complejos les resultar\u00e1 \u00fatil considerar algo m\u00e1s avanzado como la arquitectura MVC y Object Oriented programming. Esperemos, de todas formas, que encuentren \u00fatiles estos consejos cuando comiencen su pr\u00f3ximo proyecto PHP.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Al comenzar a\u00a0trabajar\u00a0con el\u00a0lenguaje\u00a0de programaci\u00f3n\u00a0PHP, puede resultar algo\u00a0desorientador descifrar\u00a0c\u00f3mo es\u00a0la mejor forma\u00a0deorganizar\u00a0nuestro\u00a0proyecto. Si alguna vez has estado confundido sobre\u00a0en d\u00f3nde\u00a0poner\u00a0tus im\u00e1genes, galer\u00edas externas, o c\u00f3mo\u00a0mantener tu l\u00f3gica\u00a0separada deldise\u00f1o, estos\u00a0consejos\u00a0te resultar\u00e1n muy \u00fatiles y\u00a0te guiar\u00e1n\u00a0en la direcci\u00f3n correcta. Estructura del directorio Podr\u00eda decirse que lo m\u00e1s importante para iniciar rapidamente tu proyecto PHP es poseer una [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-9","post","type-post","status-publish","format-standard","hentry","category-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador<\/title>\n<meta name=\"description\" content=\"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador\" \/>\n<meta property=\"og:description\" content=\"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Desarrollador\" \/>\n<meta property=\"article:published_time\" content=\"2013-01-31T16:54:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-02-13T08:30:18+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/einaweb.es\/dev\/wp-content\/uploads\/2013\/01\/1.png\" \/>\n<meta name=\"author\" content=\"Angel Fernandez Gutierrez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@afernandezg76\" \/>\n<meta name=\"twitter:site\" content=\"@afernandezg76\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Angel Fernandez Gutierrez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/\",\"url\":\"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/\",\"name\":\"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador\",\"isPartOf\":{\"@id\":\"http:\/\/www.einaweb.es\/develop\/#website\"},\"datePublished\":\"2013-01-31T16:54:54+00:00\",\"dateModified\":\"2013-02-13T08:30:18+00:00\",\"author\":{\"@id\":\"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/2d3361868423160a6db46ce6f9fc9a3c\"},\"description\":\"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador\",\"breadcrumb\":{\"@id\":\"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"http:\/\/www.einaweb.es\/develop\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C\u00f3mo organizar tu proyecto PHP de la mejor manera\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/#website\",\"url\":\"http:\/\/www.einaweb.es\/develop\/\",\"name\":\"Blog Desarrollador\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.einaweb.es\/develop\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/2d3361868423160a6db46ce6f9fc9a3c\",\"name\":\"Angel Fernandez Gutierrez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/366f7c75ad085d0dcc2c290559c1aa5947679d86e3a8c55db42ac1c26e16c816?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/366f7c75ad085d0dcc2c290559c1aa5947679d86e3a8c55db42ac1c26e16c816?s=96&d=mm&r=g\",\"caption\":\"Angel Fernandez Gutierrez\"},\"url\":\"http:\/\/www.einaweb.es\/develop\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador","description":"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador","og_description":"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador","og_url":"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/","og_site_name":"Blog Desarrollador","article_published_time":"2013-01-31T16:54:54+00:00","article_modified_time":"2013-02-13T08:30:18+00:00","og_image":[{"url":"http:\/\/einaweb.es\/dev\/wp-content\/uploads\/2013\/01\/1.png"}],"author":"Angel Fernandez Gutierrez","twitter_card":"summary_large_image","twitter_creator":"@afernandezg76","twitter_site":"@afernandezg76","twitter_misc":{"Escrito por":"Angel Fernandez Gutierrez","Tiempo de lectura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/","url":"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/","name":"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador","isPartOf":{"@id":"http:\/\/www.einaweb.es\/develop\/#website"},"datePublished":"2013-01-31T16:54:54+00:00","dateModified":"2013-02-13T08:30:18+00:00","author":{"@id":"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/2d3361868423160a6db46ce6f9fc9a3c"},"description":"C\u00f3mo organizar tu proyecto PHP de la mejor manera - Blog Desarrollador","breadcrumb":{"@id":"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.einaweb.es\/develop\/como-organizar-tu-proyecto-php-de-la-mejor-manera\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"http:\/\/www.einaweb.es\/develop\/"},{"@type":"ListItem","position":2,"name":"C\u00f3mo organizar tu proyecto PHP de la mejor manera"}]},{"@type":"WebSite","@id":"http:\/\/www.einaweb.es\/develop\/#website","url":"http:\/\/www.einaweb.es\/develop\/","name":"Blog Desarrollador","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.einaweb.es\/develop\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es"},{"@type":"Person","@id":"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/2d3361868423160a6db46ce6f9fc9a3c","name":"Angel Fernandez Gutierrez","image":{"@type":"ImageObject","inLanguage":"es","@id":"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/366f7c75ad085d0dcc2c290559c1aa5947679d86e3a8c55db42ac1c26e16c816?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/366f7c75ad085d0dcc2c290559c1aa5947679d86e3a8c55db42ac1c26e16c816?s=96&d=mm&r=g","caption":"Angel Fernandez Gutierrez"},"url":"http:\/\/www.einaweb.es\/develop\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/posts\/9","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/comments?post=9"}],"version-history":[{"count":4,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/posts\/9\/revisions"}],"predecessor-version":[{"id":21,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/posts\/9\/revisions\/21"}],"wp:attachment":[{"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/media?parent=9"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/categories?post=9"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/tags?post=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}