Page, le cadre PHP MVC ultra-simpliste
Voir les projets enfants de ce projet: https://github.com/h3rb/papi et https://github.com/h3rb/pageminmin
Démontrer la configuration d'une nouvelle application "Page" Framework dans un domaine APACHE2 préconfiguré 2 http://indedev.space Cliquez ici pour la démo: https://asciinema.org/a/dbaycbfxgbyh4jqmbj1vnxumr
La démonstration ci-dessus montre comment:
Copyright (C) 2015-2017, H. Elwood Gilliland III Tous droits réservés.
La redistribution et l'utilisation dans les formulaires source et binaire, avec ou sans modification, sont autorisées à condition que les conditions suivantes soient remplies:
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.
Ce logiciel est fourni par les détenteurs de droits d'auteur et les contributeurs "tels quels" et toutes les garanties expresses ou implicites, y compris, mais sans s'y limiter, les garanties implicites de qualité marchande et d'adéquation à un usage particulier sont déclinées. En aucun cas, le titulaire ou les contributeurs du droit d'auteur ne sera pas responsable de tout dommage directement, indirect, accessoire, spécial, exemplaire ou consécutif (y compris, mais sans interruption commerciale) Si vous êtes conseillé de la possibilité de tels dégâts.
Page Framework est super facile mais a très peu de documents. Il suffit de lire index.php et de creuser à partir de là pour voir comment fonctionnent les connexions. La page d'inscription n'est pas encore effectuée, mais la connexion est disponible pour le compte d'administration par défaut.
À partir de ce point, vous pouvez tout faire. La page est spécifiquement bonne pour développer un minimum d'applications Web basées sur PHP-> PDO. Tout ce dont vous avez besoin pour installer la page est de le mettre dans un dossier et de vérifier son .htaccess et un paramètre de chemin, et vous êtes doré. Les déploiements de plusieurs pages peuvent partager la même base de données d'authentification. Pourquoi utiliser un cadre gargantuesen après tout? Tout ce dont vous avez besoin est ici pour commencer à créer des outils de collaboration pour les équipes ou des services Web publics comme des blogs, des sites de médias sociaux personnalisés, peu importe!
Veuillez noter que tout ce dont vous avez vraiment besoin apparaît dans le dossier "Core", tout le reste n'est que l'implémentation en plus de ce noyau. Tout ce que Core fournit est l'objet Page, l'emballage APD et certaines fonctionnalités vraiment utiles, tout le reste est implémenté dans le dossier principal ou l'un des autres sous-lameurs. Si vous comprenez tout dans / core /, tout le reste peut être supprimé (sauf peut-être le dossier de cache). Pour revenir au minimum, coupez simplement le "noyau" avec un emporte-pièce. Il y a une version de ceci disponible maintenant appelé Pagemin http://github.com/h3rb/pagemin
La page a été écrite pour PHP5 mais fonctionne très bien dans PHP7 car il utilise un ensemble minimal de fonctionnalités de langage PHP. La seule chose que vous devrez surveiller est l'utilisation de l'ampère et de la braille et des pages de démonstration peut l'utiliser sous la forme de & $ p, mais vous pouvez simplement le remplacer par $ p. Le projet a été lancé en 2008, mais n'avait pas le nom de "page" alors. Il a été relancé, recentré et renommé en 2014, lorsqu'il est devenu une «graine» pour les systèmes intranet internes d'une startup d'impression 3D. Je l'utilise pour fabriquer des outils pour LostastRonaut.com, et en tant que "gélose" de base pour d'autres sites Web de lampes où je veux beaucoup de fonctionnalités arrière personnalisées. Il a également été utilisé sur WAMP.
Utilisations:
Jusqu'à présent, avec ce cadre, j'ai fabriqué plusieurs systèmes d'entreprise entièrement fonctionnels et en utilisant. J'ai fait un intranet d'entreprise sécurisé, un système de gestion de contenu partagé en ligne basé sur une base de données et un outil d'édition pour un service de conception, un site Web de métriques de produit intégré avec traitement des données et plusieurs applications de services publics. Il est facile de déployer puis de commencer à se développer dès que vous connaissez les bases. Fonctionne le plus de manière fiable uniquement sur la pile de lampe. Les implémentations WAMP peuvent fonctionner avec certaines modifications, mais pas de Gaurantees. A été déployé sur les instances AWS et peut être réduit à une empreinte minimale si vous supprimez l'exemple de fonctionnalité qui est emballée avec elle.
Vous pouvez simplement coller la page dans un dossier et le joindre à la base de données. Vous pouvez répéter ce processus si vous souhaitez créer plusieurs ensembles de fonctionnalités.
Fournit les bases:
Philosophie:
Exemple d'un fichier PHP typique "Page" Controller-View:
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.Exemple d'un "PHP automatisé à partir d'un script" Fichier PHP:
include " core/automation.php " ; // Does everything Page does except create the Page class.. no Auth either.
//... load models and do stuff to db ...Pour configurer la journalisation granulaire complète (stockée dans Cache / Logs / Last-Log.txt):
global $ plog_level ; $ plog_level = 1 ; // must appear before Page.php is included
include ' core/Page.php ' ;Exemple de la façon de créer un nouveau modèle:
Comment se connecter au tableau d'une base de données à l'aide d'un modèle:
global $ database ;
$ my_model = new tableName ( $ database );Voir les fichiers dans Core / PDO / pour savoir comment tout fonctionne.
Installer et utiliser jQuery
Page prend en charge toute version de jQuery et possède certaines fonctionnalités de base qui vous permettent de déployer par programme JQuery. Contrairement à d'autres frameworks ou méthodes organisationnelles de code, vous voudrez diviser votre plugin jQuery dans les dossiers CSS / et JS /, en plaçant le CSS et les images dans CSS / et les fichiers JavaScript dans JS / afin que vous puissiez utiliser $ page-> js () $ page-> css () pour les charger. Utilisez $ page-> jq () pour coller les lignes dans la zone de document Ready () et utilisez $ page-> js () pour ajouter au javascript global de la page.
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 );');De plus, vous voudrez savoir que si vous chargez votre propre jQuery personnalisé, modifiez la séquence de chargement dans core / page.php à la version de votre choix à l'emplacement de votre choix, soit le charger via une autre méthode et informer la page qu'elle est déjà installée afin de ne pas l'installer deux fois, en faisant:
$page->jq_loaded=TRUE;
Widget de données commune "Modification en direct" intégrée
(Méthodes dans Page Core Class, mais faisant partie de la fonctionnalité non essentielle)
La page a été utilisée pour modifier les données de la base de données - en tant que base de données frontale pour un intranet d'entreprise - et vous permet de modifier les données à la volée. Vous pouvez même utiliser des fonctionnalités intégrées comme le verrouillage automatique et le verrouillage des lignes pour protéger les données de l'édition de sniping. Le support de verrouillage des lignes est en lambeaux / autolocks.php
Tous ces widgets sont liés à Ajax. *. Files PHP et ont quelques inconvénients mineurs. Ils sont écrits pour fonctionner, mais au détriment du réseau (il ne cache ni ne retarde les messages sortants). De plus, si vous quittez rapidement la page après avoir changé quelque chose, la demande peut ne pas se terminer. Donc, si vous allez quitter la page, attendez au moins 1 à 2 secondes selon la latence actuelle du réseau.
En outre, vous devez utiliser ACLS pour sécuriser vos utilisateurs de la base de données de l'édition de choses qu'ils ne sont pas autorisées. Vous pouvez utiliser ACLS par le niveau de table de table ou de champ, sous la forme de Edit-Tablename ou Edit-Tablename-Fieldname. La classe ACL est définie dans Shreds / ACL.php et ces "balises" ACL sont vérifiées dans certains des fichiers AJAX. *. PHP. Ils doivent être stockés sur le profil de l'utilisateur. Les ACL spéciaux "admin" et "su" vous permettent de contourner cette sécurité! Soyez prudent là-bas.
Vous devez utiliser jQuery et les plug-ins de support dont ils ont besoin, et vous devez activer ces fonctionnalités en utilisant $ page-> bind_loadPlugins ();
Une fois activé, vous utilisez les options $ Page-> Bind * pour modifier votre base de données globale principale. Vous devez les lire dans core / page.php
$ p = new Page ();
$ p -> Bind_LoadPlugins (); // Automatically loads jQuery and the required jQuery plugins.
$ p -> BindString (...);voir/
Contient tout ce que vous souhaitez appeler expressément une "vue" - non incluse automatiquement, invoquer: inclure "View / MyView.php"
automation/
Contient tout ce que cela ne vous dérange pas avoir dans le dossier Web (sinon, utilisez un dossier appelé / hors ligne) généralement sous la forme de scripts bash et / ou php qui utilisent le point d'entrée core / automatisation.php.
cache /
Contient des fichiers journaux (à partir de la fonction PLOG) et de la mise en cache pour tous les plugins que vous pourriez utiliser, ou tout ce que vous souhaitez mettre en cache.
Assurez-vous que cela est inscrit et tous ses sous-voleurs ...
cœur/
Contient le cœur du cadre de page. Core / Page.php est celui que vous souhaitez inclure tout le temps. Core / Automation.php est destiné aux scripts hors ligne qui doivent accéder à vos modèles. Core / Utility.php est l'endroit où je garde toutes les fonctions d'assistance utiles.
Core / PDO /
Contient la fonctionnalité liée à l'OPD. Celui que vous devez étendre est le modèle. Vous devez les lire pour avoir une idée des options et de l'interface.
CSS /
Contient vos fichiers principaux.css et autres fichiers CSS pour les plugins ou les zones spéciales de votre site. Vous pouvez inclure ces fichiers comme celui-ci:
$ p -> CSS ( ' main.css ' ); // Includes css/main.css
$ p -> CSS ( ' myplugin/plugin.css ' ); // Includes css/myplugin/plugin.css. moteurs /
Ce dossier contient tout ce qui est plus "semblable à un moteur", et les fichiers sont automatiquement inclus, ils devraient, à l'exception de .htaccess, se terminer par .php et être un code valide (pas d'erreurs de syntaxe).
formes /
Contient des fichiers spécialisés pour la classe DataForm, généralement nommé comme form_name.txt, utilisé pour cartographier directement un formulaire Web classique sur les champs dans une base de données pour la saisie et l'édition de données.
exemples /
Contient quelques exemples et notes.
mondial/
Ce dossier contient tout ce qui est "de type global", et les fichiers sont automatiquement inclus, ils devraient, à l'exception de .htaccess, se terminer par .php et être un code valide (pas d'erreurs de syntaxe). Généralement, vous invoquez simplement la directive globale et la configuration des valeurs par défaut, bien que vous puissiez le rendre "plus intelligent" comme vous le souhaitez.
html /
Contient des extraits HTML qui peuvent être chargés dans une page -> html par référence de fichier, exemple $ p-> html ('myfile.html') est automatiquement découvert dans html /
JS /
Mettez vos fichiers JavaScript ici. Lorsque vous $p->JS('somefile.js') il sera ici, et il reconnaît également les URL CDN.
phtml /
Tout ce que vous souhaitez évaluer et inclut le HTML en mode mixte doit être ici. Pas vraiment une fonctionnalité recommandée, mais je l'ai ajouté si vous voulez faire ce genre de chose.
schémas /
Quels que soient les schémas de base de données que vous avez utilisés pour créer, votre site peut être stocké ici, mais il n'est pas sûr. Supprimez ce dossier si vous le souhaitez.
paramètres/
Contient des fichiers de configuration. Tous les fichiers de ce dossier sont chargés automatiquement et devraient se terminer par .php et contenir du code PHP valide.
ui /
Contient des fichiers d'extraits d'interface utilisateur qui utilisent la classe de base d'interface utilisateur dans core/ui.php - j'ai fini par faire le mien en shreds/ à la place, mais vous pouvez l'utiliser si vous le souhaitez. Tous les fichiers de ce dossier sont chargés automatiquement et devraient se terminer par .php et contenir du code PHP valide.
modèle/
Contient des fichiers de configuration. Tous les fichiers de ce dossier sont chargés automatiquement et devraient se terminer par .php et contenir du code PHP valide.
lambe /
Contient des modules, des extraits, des fonctions, peu importe, peu importe. Je l'utilise pour envelopper des plug-ins jQuery (ou d'autres pièces JavaScript) en PHP pour le prétraitement lorsque je ne veux pas le gérer d'une autre manière. Par exemple, j'ai implémenté la fonctionnalité liée à Muuri.js de cette façon, afin que vous puissiez l'utiliser dans un point de terminaison plutôt que dans un fragment de page d'inclusion HTML / dossier, ou un fichier JS inclus.
modules /
Fichiers que vous souhaitez inclure manuellement. Semblable au vendeur / dossier en gâteau. include 'module/whatever.php'
je/
Vos images! Ceux-ci sont tous référencés dans les fichiers .html par exemple. Ou vous pouvez les référencer avec i/
docs /
Documentation que vous souhaitez mettre à disposition sur votre site ou pour d'autres personnes. S'il y a un .sql ici, supprimez-le après l'avoir utilisé.
Vous aurez besoin que A2enmod expire incluent la réécriture de McRypt et peut-être d'autres.
Pour plus de commodité, j'ai inclus un guide ici pour vous guider à travers la configuration Ubuntu / Php / Apache2. Cela fonctionne bien sur les instances AWS EC2. Après, cela peut nécessiter un redémarrage de la machine.
Si vous installez PHP7.1 avec FPM, sur Ubuntu 16.04 LTS, vous auriez fait cela avant l'un des éléments ci-dessus:
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
Nom d'utilisateur d'administration par défaut: mot de passe d'administration pour admin: un seul espace '' (modifier une fois que vous vous connectez)
Fatal error: Call to a member function Select() on a non-object in /var/www/core/PDO/model.php on line 104
Cela signifie que votre base de données n'est pas configurée correctement. Soit il n'existe pas, soit il n'est tout simplement pas disponible.
L'exemple de page squelette du site est livré avec, y compris l'authentique intégré, a été écrit dans une version moins stricte de MySQL que celle qui est installée par défaut. Vous verrez des erreurs lorsque vous écrivez dans la base de données si tel est le cas.
Pour désactiver certaines de ces restrictions, SSH dans votre serveur comme racine et créez ce fichier: /etc/mysql/conf.d/disable_strict_mode.cnf
Ouvrez le fichier et entrez ces deux lignes:
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Terminez l'opération en redémarrant MySQL.
sudo service mysql restart
Pour démarrer complètement un projet à partir de zéro en utilisant uniquement la fonctionnalité principale
Performance et journalisation
Vous ne devez jamais autoriser les paramètres $ PLOG_LEVEL = 1 sur un serveur de production.
Vous ne devez pas garder vos schémas dans votre dossier Web public, cela inclut la page préemballée_authdb.sql, pour des raisons évidentes.
Propriété sur les données
Notez que vous devez vérifier toutes les demandes de propriété et de visibilité liées à la base de données. Finalement, une fois que j'ai eu le temps de mettre en œuvre le module de base Porm, Page gèrera une partie de vous pour vous concernant la propriété sur les données, mais c'est à vous d'effectuer le durcissement et la validation nécessaires des données à récupérer et à stocker à partir de la base de données. Sachant cela, bon nombre de l' ajax.?.php .php peut ne pas vérifier la propriété des données car la page a été initialement écrite pour un outil transparent et utilisé en interne. Vous devez implémenter votre propre système de propriété de base de données (groupes et autorisations individuelles, publics et privés).
Cacher le code source privé
La page repose sur la fonction de fichier .htaccess d'Apache2 (ou la spécificité de configuration générale dans VHOST ou HTTPD ou ports ou le .conf que vous utilisez) pour définir des autorisations et paramètres spéciaux de chaque dossier Web et de ses sous-dossiers. Ceci est fait pour permettre à Page d'être inséré dans d'autres projets, ou pour qu'il soit placé à plusieurs endroits sur le même serveur Web. Page, la page peut être placée dans un dossier et presque tous les fichiers seront masqués, sauf dans le dossier principal. Même les nouveaux sous-dossiers que vous faites ne seront pas accessibles au public, sauf si vous créez un fichier .htaccess qui le permet.
Si vous utilisez nginx ou autre chose qu'Apache, vous pouvez ignorer les deux paragraphes suivants et suivre les instructions.
Cependant, certaines personnes semblent penser que c'est une mauvaise idée. Tant que vous faites attention au type de code que vous ajoutez à la page, vous devriez pouvoir créer un site Web sécurisé. Dans le passé, cela a été fait pour PHP en testant en haut de chaque fichier inclus, si la ressource était chargée ou non par un navigateur distant ou inclus dans un fichier (codeigniter, zend, par exemple). Page ne fait pas cela, parce que l'ensemble du dossier est inaccessible, et aussi s'ils parviennent à exécuter l'un des fichiers "classe", rien ne se passerait d'une importance. Quoi qu'il en soit, certaines personnes semblent croire que les pirates peuvent en quelque sorte tromper Apache2 pour ignorer les fichiers .htaccess. La page et ses capacités de téléchargement, ne le permettez pas. En outre, Page ne nécessite pas eval() pour quoi que ce soit, car il n'utilise les mêmes méthodes pour implémenter MVC que les autres cadres (CodeIgniter, Zend, par exemple).
Si vous pensez que la justification que mettre du code dans un dossier exposé mais non accessible est une mauvaise idée, alors pour votre page peut être rendue plus sécurisée en le déplaçant dans un dossier hors ligne et en exposant uniquement des points de terminaison PHP publics (fichiers que vous souhaitez que les gens parcourent) dans votre dossier de serveur Web. Personnellement, je ne vois pas l'avantage, sauf qu'il vous empêche de gâcher et de ne pas avoir les fichiers .htaccess en place dont vous avez besoin. Un effet secondaire pour le faire est que si vous avez plusieurs sites construits sur la page et que vous souhaitez maintenir un seul noyau, vous pouvez utiliser cette même méthode pour le faire.
Pour garder la page hors de la solution et dans un dossier Web hors ligne:
Vous devrez peut-être ajuster les premières lignes de votre core / page.php réel pour refléter cette différence de chemin, où vous voyez include_all et include_once lié au noyau, mais cela devrait être bien car à ce stade, il est relatif au fichier core/Page.php inclus.
Si vous avez inclus manuellement des modules, vous devrez ajouter /path/to/page/folder/
Un jour, je mettrai davantage implémenter Pown, ce qui facilitera les caractéristiques de semis de base de données et de migration de schéma pour faciliter la vie. You will be able to create an entire description of a database in a specialized text file (it will look like class declarations in C++ / Java), and convert that to a JSON tree (which you could also read from a file) and then feed that to a Pown class constructor, and attempt to deploy the database, or migrate it using $orm->Deploy() (where migration will add missing table columns, and modify existing columns detecting the old Type d'abord)
Pensées
Au fur et à mesure que j'utilise de plus en plus de page, je trouve cela addictif. Page a un équivalent dans le monde de Nodejs: ExpressJS. Quoi qu'il en soit, ces vieilles mains tapent encore PHP beaucoup plus rapidement. J'utilise PHP pour des outils internes sur LostastRonaut.com assez efficacement car il est relativement similaire au C ++ dans lequel j'ai écrit mon moteur de jeu Windows. Je travaille également sur d'autres sites Web qui l'utiliseront. Il n'y a toujours rien qui semble plus puissant que de pouvoir rendre JavaScript personnalisé en utilisant PHP, même s'il s'agit d'un cauchemar de syntaxe.