Página, el marco MVC PHP ultra simplístico
Vea los proyectos infantiles de este proyecto: https://github.com/h3rb/papi y https://github.com/h3rb/pagemin
Demostrando la configuración de una nueva aplicación de marco de "página" en un dominio APOCHE2 prefigurado servido http://indiedev.space Haga clic aquí para la demostración: https://asciinema.org/a/dbaycbfxgbyh4jqmbj1vnxumr
La demostración anterior muestra cómo:
Copyright (c) 2015-2017, H. Elwood Gilliland III Todos los derechos reservados.
Redistribución y uso en formularios de origen y binarios, con o sin modificación, se permiten siempre que se cumplan las siguientes condiciones:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
Este software es proporcionado por los titulares de derechos de autor y contribuyentes "tal cual" y cualquier garantía expresa o implícita, incluidas, entre otros, las garantías implícitas de comerciabilidad y idoneidad para un propósito particular se renuncian. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, Incluso si se le aconseja la posibilidad de tal daño.
El marco de la página es súper fácil pero tiene muy pocos documentos. Simplemente lea index.php y busque desde allí para ver cómo funcionan los inicios de sesión. La página de registro aún no está realizada, pero el inicio de sesión está disponible para la cuenta de administración predeterminada.
Desde este punto puedes hacer cualquier cosa. La página es específicamente buena para desarrollar aplicaciones web mínimas PHP-> basadas en PDO. Todo lo que necesita para instalar la página es ponerla en una carpeta y verificar su doble configuración .htaccess y una ruta, y está dorado. Las implementaciones de múltiples páginas pueden compartir la misma base de datos de autenticación. ¿Por qué usar un marco gigantesco después de todo? ¡Todo lo que necesita está aquí para comenzar a construir herramientas de colaboración para equipos o servicio web públicos como blogs, sitios de redes sociales personalizados, lo que sea!
Tenga en cuenta que todo lo que realmente necesita aparece en la carpeta "Core", todo lo demás es solo una implementación además de ese núcleo. All Core proporciona el objeto de página, el envoltorio PDO y algunas características realmente fundamentalmente útiles, todo lo demás se implementa en la carpeta principal o en uno de los otros subcarpesos. Si comprende todo en /core /, todo lo demás se puede eliminar (excepto tal vez la carpeta de caché). Para volver al mínimo, simplemente corte el "núcleo" con un cortador de galletas. Hay una versión de esto disponible ahora llamada Pagemin http://github.com/h3rb/pagemin
Page fue escrita para PHP5, pero funciona bien en PHP7, ya que utiliza un conjunto mínimo de características del lenguaje PHP. Lo único que tendrá que tener en cuenta es el uso de Ampersand (&) ya que algunas pagas de demostración pueden usarlo en forma de $ P, pero simplemente puede reemplazarlo con $ P. El proyecto se inició en 2008, pero no tenía el nombre "página" entonces. Fue revivido, reenfocado y renombrado en 2014, cuando se convirtió en una "semilla" para los sistemas internos de intranet internos de una startup de impresión 3D. Lo uso para hacer herramientas para Lostastronaut.com, y como un "agar" básico para otros sitios web de lámparas donde quiero mucha funcionalidad de fondo personalizado. También se ha utilizado en WAMP.
Usos:
Con este marco hasta ahora, he realizado varios sistemas corporativos totalmente funcionales y en uso. Hice una intranet corporativa segura, un sistema de gestión de contenido compartido en línea basado en la base de datos y una herramienta de edición para un departamento de diseño, un sitio web integrado de métricas de productos completos con procesamiento de datos y varias aplicaciones de servicios públicos. Es fácil de implementar y luego comenzar a desarrollar tan pronto como conozca lo básico. Funciona más confiablemente solo en la pila de lámparas. Las implementaciones de WAMP pueden funcionar con algunas modificaciones, pero no hay gaurantes. Se ha implementado en instancias de AWS y puede reducirse a una huella mínima si elimina la funcionalidad de muestra que se empaqueta con ella.
Simplemente puede pegar la página en una carpeta y adjuntarla a la base de datos. Puede repetir ese proceso si desea crear múltiples conjuntos de funcionalidad.
Proporciona lo básico:
Filosofía:
Ejemplo de un archivo PHP de visión del controlador "página" típico:
include " core/Page.php " ;
$ p = new Page ;
$ p -> title = " My wickid page " ;
if ( Session:: is_logged_in () ) // Checks to see if user is logged in or not...
$ p -> HTML ( " Hey I'm logged in!!!! YAY! " );
else $ p -> HTML ( " not logged in.. :( " );
$ p -> Render (); // Puts page to screen.Ejemplo de un archivo típico de "PHP automatizado de un script":
include " core/automation.php " ; // Does everything Page does except create the Page class.. no Auth either.
//... load models and do stuff to db ...Para configurar el registro granular completo (almacenado en caché/logs/last-log.txt):
global $ plog_level ; $ plog_level = 1 ; // must appear before Page.php is included
include ' core/Page.php ' ;Ejemplo de cómo hacer un nuevo modelo:
Cómo adjuntar a la tabla de una base de datos utilizando un modelo:
global $ database ;
$ my_model = new tableName ( $ database );Vea los archivos en Core/ PDO/ para aprender cómo funciona todo.
Instalación y uso de jQuery
Page admite cualquier versión de jQuery y tiene algunas características básicas que le permiten implementar programáticamente jQuery. A diferencia de otros marcos o métodos de organización de código, querrá dividir su complemento jQuery en el CSS/ y JS/ carpetas, colocando los CSS e imágenes en CSS/ y los archivos JavaScript en JS/ para que pueda usar $ Page-> JS () $ Page-> CSS () para cargarlos. Use $ Page-> Jq () para pegar líneas en el área de documento Ready () y use $ Page-> JS () para agregar al JavaScript global de la página.
include ' core/Page.php ' ;
$ p = new Page ();
$ p -> JS ( ' somejsfile.js ' );
$ p -> JS ( ' http://cdn.url.com ' );
$ p -> JQuery (); // Loads Jquery automatically
$ p -> JQ ( '
$("#docisready").on("click" ... );
' );
$ p -> JS ( ' var myGlobal=1; setInterval(function(){alert( ' foo');}, 1000 );');Además, querrá tener en cuenta que si carga su propia jQuery personalizada, modifique la secuencia de carga en Core/Page.php a la versión de su elección en la ubicación de su elección, o lo cargue a través de otro método e informe a la página que ya está instalado para no instalarlo dos veces, haciendo: haciendo: haciendo:
$page->jq_loaded=TRUE;
Widgetry de datos comunes incorporado "Edición en vivo"
(Métodos en la clase central de la página, pero parte de la funcionalidad no esencial)
La página se ha utilizado para editar datos de la base de datos, como una base de datos front-end para una intranet corporativa, y le permite a usted y a otros editar datos sobre la marcha. Incluso puede usar funciones incorporadas como bloqueo automático y bloqueo de filas para proteger los datos de Editar Sniping. El soporte de bloqueo de filas está en frases/autolocks.php
Todos estos widgets están vinculados a los archivos AJAX.*. PHP y tienen un par de inconvenientes menores. Están escritos para trabajar, pero a expensas de la red (no almacena en caché ni retrasa los mensajes salientes). Además, si sale rápidamente de la página después de cambiar algo, la solicitud puede no completarse. Entonces, si va a dejar la página, espere al menos 1-2 segundos dependiendo de su latencia de red actual.
Además, debe usar ACL para asegurar que los usuarios de su base de datos editen cosas que no están permitidas. Puede usar ACL por nivel de granularidad a nivel de tabla o campo, en forma de edit-Tablename o edit-Tablename-FieldName. La clase ACL se define en trituros/acl.php y estas "etiquetas" de ACL se verifican en algunos de los archivos AJAX.*. PHP. Deben almacenarse en el perfil del usuario. ¡El ACLS especial "Admin" y "Su" te permiten evitar esta seguridad! Ten cuidado por ahí.
Debe usar jQuery y los complementos de soporte que requieren, y debe activar estas características usando $ Page-> bind_loadplugins ();
Una vez activado, utiliza las opciones $ Page-> Bind* para modificar su base de datos $ Global $ principal. Deberías leerlos en Core/Page.php
$ p = new Page ();
$ p -> Bind_LoadPlugins (); // Automatically loads jQuery and the required jQuery plugins.
$ p -> BindString (...);vista/
Contiene cualquier cosa que desee llamar expresamente una "vista", no incluida automáticamente, invoca con: incluir "Ver/myView.php"
automatización/
Contiene cualquier cosa que no le importe tener en la carpeta web (de lo contrario, use una carpeta llamada/fuera de línea) generalmente en forma de scripts bash y/o php que usan el punto de entrada Core/Automation.php.
cache/
Contiene archivos de registro (desde la función PLOG) y almacenamiento en caché para cualquier complemento que pueda estar utilizando o cualquier otra cosa que desee almacenar en caché.
Asegúrese de que esto sea escrito y todos sus subcarpetas ...
centro/
Contiene el núcleo del marco de la página. Core/Page.php es el que desea incluir todo el tiempo. Core/Automation.php es para scripts fuera de línea que necesitan acceder a sus modelos. Core/Utility.php es donde mantengo todas las funciones útiles de ayuda.
núcleo/PDO/
Contiene la funcionalidad relacionada con PDO. El que necesita extender es el modelo. Debe leerlos para tener una idea de las opciones y la interfaz.
CSS/
Contiene su principal.css y otros archivos CSS para complementos o áreas especiales de su sitio. Puede incluir estos archivos como este:
$ p -> CSS ( ' main.css ' ); // Includes css/main.css
$ p -> CSS ( ' myplugin/plugin.css ' ); // Includes css/myplugin/plugin.css. motores/
Esta carpeta contiene cualquier cosa que sea más "similar al motor", y los archivos se incluyen automáticamente, por lo que deberían, con la excepción de .htaccess, terminar en .php y ser un código válido (sin errores de sintaxis).
formularios/
Contiene archivos especializados para la clase de información de datos, generalmente nombrada como form_name.txt, utilizada para asignar directamente un formulario web clásico a los campos en una base de datos para la entrada y edición de datos.
Ejemplos/
Contiene algunos ejemplos y notas.
global/
Esta carpeta contiene cualquier cosa que sea "global", y los archivos se incluyen automáticamente, por lo que deberían, con la excepción de .htaccess, terminar en .php y ser un código válido (sin errores de sintaxis). En general, solo está invocando la Directiva Global y configurando los valores predeterminados, aunque podría hacerlo "más inteligente" de la manera que desee.
html/
Contiene fragmentos HTML que se pueden cargar en una página -> html por referencia de archivo, ejemplo $ p-> html ('myFile.html') se descubre automáticamente en html/
js/
Pon sus archivos JavaScript aquí. Cuando $p->JS('somefile.js') se verá aquí, y también reconoce las URL CDN.
PhTML/
Cualquier cosa que desee evaluarse e incluye HTML en modo mixto debe estar aquí. Realmente no es una característica recomendada, pero la agregué si quieres hacer este tipo de cosas.
esquemas/
Cualesquiera que sean los esquemas de la base de datos que usó para crear su sitio se puede almacenar aquí, pero es inseguro. Elimine esta carpeta si lo desea.
ajustes/
Contiene archivos de configuración. Todos los archivos en esta carpeta se cargan automáticamente y deben terminar en .php y contener un código PHP válido.
ui/
Contiene archivos de fragmento de interfaz de usuario que hacen uso de la clase base de interfaz de usuario en core/ui.php : terminé haciendo el mío en shreds/ en su lugar, pero puede usar esto si lo desea. Todos los archivos en esta carpeta se cargan automáticamente y deben terminar en .php y contener un código PHP válido.
modelo/
Contiene archivos de configuración. Todos los archivos en esta carpeta se cargan automáticamente y deben terminar en .php y contener un código PHP válido.
Trituros/
Contiene módulos, fragmentos, funciones, funciones, lo que sea. Lo uso para envolver complementos jQuery (u otras piezas de JavaScript) en PHP para su procesamiento previo cuando no quiero manejarlo de otra manera. Por ejemplo, implementé la funcionalidad relacionada con Muuri.js de esta manera, para que pueda usarla en un punto final en lugar de en un fragmento de página de inclusión HTML/ carpeta, o en un archivo JS incluido.
módulos/
Archivos que desea incluir manualmente. Similar al proveedor/ carpeta en el pastel. include 'module/whatever.php'
i/
¡Tus imágenes! Todos estos se hacen referencia en los archivos .html, por ejemplo. O puedes hacer referencia a ellos con i/
docs/
Documentación que desea poner a disposición en su sitio o en otras personas. Si hay un .sql aquí, elimínelo después de usarlo.
Deberá que A2enMod expire incluya Rewrite McRypt y posiblemente otros.
Por conveniencia, he incluido un guía aquí para guiarlo a través de la configuración de Ubuntu/Php/Apache2. Esto funciona bien en las instancias de AWS EC2. Después, puede requerir un reinicio de la máquina.
Si está instalando PHP7.1 con FPM, en Ubuntu 16.04 LTS, lo habría hecho antes de cualquiera de lo anterior:
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y unzip apache2 php7.1 php7.1-cli php7.1-common libapache2-mod-php7.1 php7.1-mysql php7.1-fpm php7.1-curl php7.1-gd php7.1-bz2 php7.1-mcrypt php7.1-json php7.1-tidy php7.1-imagick php7.1-mbstring php-redis php-memcached
sudo a2enmod expires include rewrite mcrypt
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.1-fpm
sudo service apache2 restart
Nombre de usuario de administrador predeterminado: contraseña de administrador para administrador: un solo espacio '' (cambie una vez que inicie sesión)
Fatal error: Call to a member function Select() on a non-object in /var/www/core/PDO/model.php on line 104
Esto significa que su base de datos no está configurada correctamente. O no existe, o simplemente no está disponible.
La página del esqueleto del sitio de muestra viene, incluida la autenticación incorporada, se escribió en una versión menos estricta de MySQL que la que se instala de forma predeterminada. Verá errores al escribir en la base de datos si este es el caso.
Para apagar algunas de estas restricciones, ssh en su servidor como root y cree este archivo: /etc/mysql/conf.d/disable_strict_mode.cnf
Abra el archivo e ingrese estas dos líneas:
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Complete la operación reiniciando MySQL.
sudo service mysql restart
Para iniciar un proyecto completamente desde cero utilizando solo la funcionalidad central
Rendimiento y registro
Nunca debe permitir la configuración de $ PLOG_LEVED = 1 en un servidor de producción.
No debe mantener sus esquemas en su carpeta web pública, esto incluye el Page_Authdb.sql previamente empaquetado, por razones obvias.
Propiedad sobre datos
Tenga en cuenta que debe examinar todas las solicitudes relacionadas con la base de datos de propiedad y visibilidad. Eventualmente, una vez que tenga tiempo para implementar el módulo central Porm, la página manejará algo de esto para usted con respecto a la propiedad sobre los datos, pero depende de usted realizar el endurecimiento y la validación de los datos necesarios para recuperarse y almacenarse de la base de datos. Conociendo esto, muchos de los ajax.?.php Debe implementar su propio sistema de propiedad de bases de datos (permisos grupales e individuales, públicos y privados).
Ocultación del código fuente privado
La página se basa en la función del archivo .htaccess de Apache2 (o especificidad de configuración general dentro de VHOST o HTTPD o puertos o cualquiera que esté utilizando) para establecer permisos y parámetros especiales de cada carpeta web y sus subcarpetas. Esto se hace para permitir que la página se inserte en otros proyectos, o para que se coloque en múltiples lugares en el mismo servidor web. Página lodicera se puede colocar en una carpeta y casi todos los archivos estarán ocultos, excepto en la carpeta principal. Incluso las nuevas subcarpetas que realice no se puede acceder públicamente a menos que cree un archivo .htaccess que lo permita.
Si está utilizando NGINX o cualquier otra cosa que no sea Apache, puede omitir los siguientes dos párrafos y seguir las instrucciones.
Sin embargo, algunas personas parecen pensar que esta es una mala idea. Siempre que tenga cuidado con el tipo de código que agrega a la página, debería poder hacer un sitio web seguro. En el pasado, esto se realizó para PHP mediante la prueba en la parte superior de cada archivo incluido si el recurso estaba siendo cargado o no por un navegador remoto o si se incluyó en un archivo (CodeIgniter, Zend, por ejemplo). Page no hace esto, porque toda la carpeta es inaccesible, y también si lograron ejecutar uno de los archivos de "clase", no sucedería nada de importancia. De todos modos, algunas personas parecen creer que los piratas informáticos pueden engañar de alguna manera a Apache2 para ignorar los archivos .htaccess. La página y sus capacidades de carga no lo permiten. Además, la página no requiere que eval() se use para cualquier cosa, porque no utiliza los mismos métodos para implementar MVC que otros marcos (CodeInigner, Zend, por ejemplo).
Si cree que la justificación de que poner el código en una carpeta expuesta pero no accesible es una mala idea, entonces para su página se puede hacer más segura moviéndolo a una carpeta fuera de línea y exponiendo solo los puntos finales públicos de PHP (los archivos a los que desea que las personas naveguen) en la carpeta de su servidor web. Personalmente, no veo el beneficio, excepto que le hace imposible estropear y no tener los archivos .htaccess en su lugar que necesita. Un efecto secundario de hacer esto es que si tiene varios sitios construidos en la página y desea mantener un solo núcleo, puede usar este mismo método para hacerlo.
Para mantener la página fuera del alcance y en una carpeta web fuera de línea:
Es posible que deba ajustar las primeras líneas de su núcleo/page real.php para reflejar esta diferencia de ruta, donde ve include_all e incluyen_once relacionada con el núcleo, pero debería estar bien ya que en este punto es relativo al archivo core/Page.php incluido.
Si ha incluido manualmente algún módulo, tendrá que agregar /path/to/page/folder/
Un día implementaré más bien, lo que facilitará las características de siembra de base de datos y migración de esquemas para facilitar la vida. Podrá crear una descripción completa de una base de datos en un archivo de texto especializado (se verá como declaraciones de clase en C ++ / Java), y convertir eso a un árbol JSON (que también podría leer desde un archivo) y luego alimentar eso a una construcción de clases de la clase POWN e intentar implementar la data de data, o migrarlo usando $orm->Deploy() primero)
Pensamientos
A medida que uso la página cada vez más, la encuentro adictiva. Page tiene un equivalente en el mundo de NodeJS: Expressjs. De todos modos, estas viejas manos todavía escriben PHP mucho más rápido. Utilizo PHP para herramientas internas en Lostastronaut.com de manera bastante efectiva porque es relativamente similar al C ++ en los que he escrito mi motor de juegos de Windows. También estoy trabajando en otros sitios web que lo usarán. Todavía no hay nada que se sienta más poderoso que ser capaz de representar JavaScript personalizado usando PHP, incluso si es una pesadilla de sintaxis.