頁面,超簡短的PHP MVC框架
請參閱此項目的子項目:https://github.com/h3rb/papi和https://github.com/h3rb/pagemin
在預先配置的Apache2服務域http://indiedev.space在此處單擊此處以進行演示:https://asciinema.org/a/dbaycbfxgbyh4jqmbj1vnxumrh4jqmbj1vnxumr
以上演示顯示瞭如何:
版權(C)2015-2017,H。 ElwoodGilliland III保留所有權利。
如果滿足以下條件:
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.
該軟件由版權所有者和貢獻者“按原樣”提供,任何明示或暗示的保證,包括但不限於對適銷性和特定目的適合性的隱含保證。在任何情況下,版權持有人或貢獻者均不得對任何直接,間接,偶然,特殊,特殊,示例性或結果損害均承擔任何責任(包括但不限於替代商品或服務的採購,損失,數據或利潤損失,數據或利潤;還是造成的,無論是在合同中造成的,或者在任何責任中造成的責任,或者是否有任何責任,或者在任何責任中,是否有任何責任,或者是否有任何責任,或者是否有責任,是否有責任,是否有責任。告知可能造成這種損害的可能性。
頁面框架非常簡單,但文檔很少。只需讀取index.php,然後從那裡挖掘,以查看登錄方式。註冊頁面尚未製作,但登錄頁面可用於默認管理員帳戶。
從這一點開始,您可以做任何事情。頁面非常適合開發最小的基於PHP-> PDO的Web應用程序。您需要安裝的頁面就是將其放入文件夾中,然後仔細檢查其.htaccess和一個路徑設置,並且您是金色的。多頁部署可以共享相同的身份驗證數據庫。畢竟為什麼要使用一些Gargantuan框架?您需要的一切都在這裡開始為團隊建立協作工具,或者像博客,自定義社交媒體網站等公共網站服務一樣!
請注意,您真正需要的所有內容都出現在“核心”文件夾中,其他所有內容都只是在該核心之上實現。所有核心提供的都是頁面對象,PDO包裝器和一些真正有用的功能,其他所有內容都在主文件夾或其他子文件夾中實現。如果您了解 /core /中的所有內容,則可以刪除其他所有內容(也許是緩存文件夾除外)。為了恢復最低限度,只需用曲奇切刀將“核心”切出即可。現在有一個可用的版本稱為Pagemin http://github.com/h3rb/pagemin
Page是為PHP5編寫的,但在PHP7中工作正常,因為它使用了最小的PHP語言功能。您要注意的一件事是使用ampersand(&),因為某些切碎和演示頁可能會以&$ p的形式使用它,但您可以簡單地用$ p替換它。該項目始於2008年,但沒有名稱“頁面”。它在2014年被恢復,重新集中並重命名,當時它成為3D打印初創公司內部Intranet系統的“種子”。我使用它為Lostastronaut.com製作工具,並用作我想要大量自定義後端功能的其他燈網站的基本“瓊脂”。它也已用於WAMP。
用途:
到目前為止,我已經製造了幾個功能齊全且可用的公司係統。我製作了一個安全的公司Intranet,一個基於數據庫的在線共享內容管理系統和設計部門的編輯工具,一個包含數據處理的集成產品指標網站以及一些實用程序應用程序。一旦您知道基礎知識,就很容易部署然後開始開發。僅在燈泡上可靠地工作。 WAMP實施可能會進行一些修改,但沒有Gaurantees。已部署到AWS實例,如果您刪除包裝包裝的樣品功能,則可以減少到最小的足跡。
您可以將頁面貼在文件夾中,然後將其連接到數據庫。如果要創建多個功能集,則可以重複該過程。
提供基礎知識:
哲學:
典型的“頁面”控制器視圖php文件的示例:
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.典型的“來自腳本的自動化PHP”的示例:PHP文件:
include " core/automation.php " ; // Does everything Page does except create the Page class.. no Auth either.
//... load models and do stuff to db ...要設置完整的顆粒記錄(存儲在緩存/日誌/last-log.txt中):
global $ plog_level ; $ plog_level = 1 ; // must appear before Page.php is included
include ' core/Page.php ' ;如何製作新模型的示例:
如何使用模型將數據庫表附加到數據庫表上:
global $ database ;
$ my_model = new tableName ( $ database );請參閱Core/ PDO/中的文件,以了解所有內容的工作原理。
安裝和使用jQuery
頁面支持任何版本的jQuery,並且具有一些基本功能,可讓您通過編程方式部署jQuery。與其他框架或代碼組織方法不同,您需要將jQuery插件分解到CSS/和JS/文件夾中,將CSS和圖像放在CSS/以及JavaScript文件中,以便在JS/中將其放置在JS/中,以便您可以使用$ page-> js()$ page()$ page-> css()來加載它們。使用$ page-> jq()將線路貼在文檔Ready()區域中,並使用$ page-> js()添加到頁面的全局JavaScript中。
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 );');另外,您需要意識到,如果您加載自己的自定義jQuery,要么在選擇位置將加載序列修改為您選擇的版本,要么通過另一種方法加載它並告知頁面已經安裝了它,以免安裝它兩次,通過執行以下操作:
$page->jq_loaded=TRUE;
內置的“實時編輯”常見數據窗口小部件
(頁面核心類中的方法,但非核心功能的一部分)
頁面已用於編輯數據庫數據 - 作為公司內部網的數據庫前端 - 並讓您和其他人即時編輯數據。您甚至可以使用內置功能(例如自動鎖定和行鎖定)來保護數據免受編輯狙擊。行鎖定支持是在shreds/autolocks.php中
所有這些小部件都與AJAX綁定。 *。 php文件,並有幾個小缺點。它們被寫入工作,但以網絡為代價(它不會緩存或延遲傳出消息)。另外,如果您在更改某些內容後迅速離開頁面,請求可能無法完成。因此,如果您要離開頁面,請至少等待1-2秒,具體取決於您當前的網絡延遲。
另外,您需要使用ACL來保護數據庫用戶不允許編輯不允許的內容。您可以使用粒度的表格或現場級別使用ACL,以編輯式tablename或Edit-tableName-fieldName的形式使用。 ACL類在shreds/acl.php中定義,這些ACL“標籤”已在某些AJAX中檢查。 *。 php文件。它們必須存儲在用戶的個人資料上。特殊的ACLS“ Admin”和“ SU”讓您繞過此安全性!在那裡小心。
您必須使用jQuery及其所需的支持插件,並且必須使用$ page-> bind_loadplugins()激活這些功能;
激活後,您可以使用$ page-> bind*選項來修改主要的全局$數據庫。您應該在core/pag.php中閱讀它們
$ p = new Page ();
$ p -> Bind_LoadPlugins (); // Automatically loads jQuery and the required jQuery plugins.
$ p -> BindString (...);看法/
包含您要明確稱為“視圖”的任何東西 - 不包括自動包含,請調用:include“ view/myview.php”
自動化/
包含您不介意在Web文件夾中使用的任何內容(否則,使用一個稱為/離線的文件夾)通常以bash和/或php腳本的形式使用core/automation.php輸入點。
快取/
包含日誌文件(來自PLOG函數)和您可能使用的任何插件或其他要緩存的任何插件的緩存。
確保這是可以寫的,所有的子文件夾...
核/
包含頁面框架的核心。 core/page.php是您一直要包含的一個。 core/automation.php適用於需要訪問模型的離線腳本。 core/utility.php是我保留所有有用的輔助功能的地方。
核心/PDO/
包含與PDO相關的功能。您需要擴展的是模型。您應該閱讀它們以了解選項和界面。
CSS/
包含您的Main.css和其他CSS文件,用於插件或網站的特殊區域。您可以像這樣包含這些文件:
$ p -> CSS ( ' main.css ' ); // Includes css/main.css
$ p -> CSS ( ' myplugin/plugin.css ' ); // Includes css/myplugin/plugin.css. 發動機/
該文件夾包含任何更“引擎”的內容,並且文件自動包含,因此除了.htaccess以外,它們應該以.php結尾,並且是有效的代碼(無語法錯誤)。
表格/
包含用於數據形式類的專用文件,通常稱為form_name.txt,用於將經典的Web表單直接映射到數據庫中的字段以進行數據輸入和編輯。
例子/
包含一些例子和筆記。
全球的/
該文件夾包含“類似全局”的任何內容,並且文件自動包含,因此除了.htaccess以外,它們應以.php結尾,並且是有效的代碼(無語法錯誤)。通常,您只是在調用全球指令並設置默認設置,儘管您可以以任何方式使其“更聰明”。
html/
包含可以加載到頁面 - > html的html摘要,示例$ p-> html('myfile.html')自動在html/
JS/
將您的JavaScript文件放在此處。當您$p->JS('somefile.js')時,它會在這裡查看,並且還可以識別CDN URL。
phtml/
您想要評估的任何內容都應在此處進行混合模式HTML。並不是真正的推薦功能,但是如果您想做這種事情,我會添加它。
圖式/
您用來創建網站的任何數據庫模式都可以在此處存儲,但這是不安全的。如果願意,請刪除此文件夾。
設定/
包含配置文件。該文件夾中的所有文件均自動加載,並且應以.php結尾並包含有效的PHP代碼。
ui/
包含在core/ui.php中使用UI base類的UI摘要文件 - 我最終以shreds/而改成我的,但是如果需要,您可以使用它。該文件夾中的所有文件均自動加載,並且應以.php結尾並包含有效的PHP代碼。
模型/
包含配置文件。該文件夾中的所有文件均自動加載,並且應以.php結尾並包含有效的PHP代碼。
切碎/
包含自動加載的模塊,片段,功能等。我用它將jQuery插件(或其他JavaScript作品)包裝在PHP中,以進行預處理,當我不想以另一種方式處理它時。例如,我以這種方式實現了Muuri.js相關的功能,因此您可以在端點而不是在HTML/文件夾包含頁面片段或隨附的JS文件中使用它。
模塊/
您要手動包含的文件。類似於蛋糕中的供應商/文件夾。 include 'module/whatever.php'
我/
你的圖像!這些都在.html文件中引用。或者您可以用i/參考它們
文件/
您想在您的網站或其他人上提供的文檔。如果這裡有.sql,請在使用它後將其刪除。
您將需要A2ENMOD到期,包括重寫MCRYPT以及其他一些可能的重寫。
為了方便起見,我在此處包含了一個Guidelet,可以引導您完成Ubuntu/php/apache2設置。這在AWS EC2實例上效果很好。之後,可能需要重新啟動機器。
如果您使用FPM安裝PHP7.1,在Ubuntu 16.04 LTS上,您將在上述任何一個之前完成此操作:
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
默認管理用戶名:管理員的管理密碼:單個空間''(登錄後更改)
Fatal error: Call to a member function Select() on a non-object in /var/www/core/PDO/model.php on line 104
這意味著您的數據庫無法正確設置。它是不存在的,或者根本不可用。
示例站點骨骼頁面附帶的,包括內置auth,是用MySQL的嚴格版本編寫的,而不是默認安裝的版本。如果是這種情況,您將在寫入數據庫時會看到錯誤。
要關閉其中一些限制,請以root的形式進入服務器並創建此文件: /etc/mysql/conf.d/disable_strict_mode.cnf
打開文件並輸入這兩行:
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
通過重新啟動MySQL來完成操作。
sudo service mysql restart
僅使用核心功能完全從頭開始啟動項目
性能和記錄
您絕對不應在生產服務器上允許$ plog_level = 1個設置。
您不應將模式保留在公共網絡文件夾中,這包括預先包裝的Page_authdb.sql,出於明顯的原因。
擁有數據的所有權
請注意,您必須審查所有與數據庫相關的請求,以獲得所有權和可見性。最終,一旦我有時間實施核心模塊量,頁面將為您處理與數據所有權有關的一些,但是要執行必須從數據庫中檢索和存儲的數據的必要硬化和驗證。知道這一點,許多ajax.?.php您應該實施自己的數據庫所有權系統(團體和個人,公共和私人權限)。
隱藏私人源代碼
頁面依賴於Apache2的.htaccess文件功能(或VHOST或HTTPD或端口中的常規配置特異性或您使用的.conf)來設置每個Web文件夾及其子文件夾的特殊權限和參數。這樣做是為了允許頁面插入其他項目,或者將其放置在同一Web服務器上的多個位置。開箱即用,可以將頁面放在文件夾中,幾乎所有文件都將隱藏在主文件夾中。即使您創建一個允許它的.htaccess文件,也無法公開訪問您的新子文件夾。
如果您使用的是NGINX或Apache以外的其他任何內容,則可以跳過接下來的兩段並按照說明進行操作。
但是,有些人似乎認為這是一個壞主意。只要您小心地將哪種代碼添加到頁面上,就應該能夠製作一個安全的網站。過去,這是通過在每個包含文件的頂部測試資源是否由遠程瀏覽器加載或包含在文件中(例如codeigniter,Zend)來完成。頁面沒有這樣做,因為整個文件夾都無法訪問,而且如果它們確實設法運行了一個“類”文件,那麼什麼都不會發生任何意義。無論如何,有些人似乎認為黑客可以以某種方式愚弄apache2忽略.htaccess文件。頁面及其上傳功能不允許這樣做。另外,頁面不需要eval()任何事物,因為它不使用相同的方法來實現MVC與其他框架(例如,codeigniter,zend)。
如果您認為將代碼放入暴露但不公開的文件夾中的理由是一個壞主意,那麼對於您來說,可以通過將其移動到離線文件夾中,而僅將PHP Public Public Pointpoint(您希望人們瀏覽的文件瀏覽到)在您的Web服務器文件夾中使其更加安全。我個人沒有看到好處,除了它使您不可能弄亂而沒有所需的.htaccess文件。這樣做的一種副作用是,如果您在頁面上構建了多個站點,並且想要維護一個核心,則可以使用這種相同的方法來實現。
要保持頁面範圍內和離線網絡文件夾:
您可能需要調整實際核心/page.php的前幾行才能反映此路徑差異,在此您可以看到Include_all和Include_once與Core相關的inception_once,但是它應該很好,因為此時相對於隨附的core/Page.php文件。
如果您手動包含了任何模塊,則必須添加/path/to/page/folder/
有一天,我將進一步實施Pown,這將促進數據庫播種和模式遷移功能,以使生活更輕鬆。 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 first)
想法
隨著我越來越多地使用頁面,我發現它令人上癮。頁面在nodejs的世界中具有等效:expressjs。無論如何,這些舊手仍然更快地鍵入PHP。我在Lostastronaut.com上使用PHP進行內部工具,因為它與我寫了Windows Game Engine的C ++相對相似。我還在其他一些可以使用它的網站上工作。仍然沒有什麼比能夠使用PHP自定義JavaScript渲染自定義的JavaScript更強大了,即使這是一場語法噩夢。