摘要:幫助你開始使用的簡易指南。第一種方式參考第二種方式參考使用參考簡單粗暴的理解是把下的對(duì)應(yīng)成數(shù)據(jù)庫的表,類屬性對(duì)應(yīng)表字段。
幫助你開始使用 phalcon 的簡易指南。
簡介Phalcon 2將于2015年4月17日發(fā)布,這個(gè)版本大約85%的代碼是基于 Zephir 語言重寫的。Zephir是開源的,使用類似PHP語法的語言,生成C語言代碼,并編譯成PHP擴(kuò)展。這提高了PHP擴(kuò)展的開發(fā)效率,并降低了框架的后期維護(hù)成本。
phalcon-devtools安裝 https://github.com/phalcon/phalcon-devtools 之后可以幫助自動(dòng)生成目錄結(jié)構(gòu)和代碼。同時(shí)把ide目錄下的相應(yīng)版本加入IDE的External libraries之后,可以幫助IDE自動(dòng)完成代碼。
nginx配置配置nginx的時(shí)候,建議用$_SERVER[‘REQUEST_URI’]方式,這樣可以防止自動(dòng)加入$_GET[‘_url’]的隱規(guī)則,在參數(shù)簽名時(shí),如果你忘記這個(gè)隱規(guī)則會(huì)導(dǎo)至簽名驗(yàn)證失敗。
參考配置:
server { listen 80; server_name www.example.com; index index.html index.htm index.php; root $root_path/example/public; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ .php$ { try_files $uri =404; fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
這樣設(shè)置后,代碼也要參考URI Sources調(diào)整
$router->setUriSource(Router::URI_SOURCE_SERVER_REQUEST_URI);代碼結(jié)構(gòu)
phalcon框架對(duì)代碼結(jié)構(gòu)并沒有約定,你可以按自己的實(shí)際需要自行組織代碼結(jié)構(gòu),這里有一個(gè)供參考的例子:https://github.com/phalcon/mvc。
實(shí)際項(xiàng)目中,代碼分層至少要分三層,controller/view -> services -> models
services和models為了重用,可以參考composer的組織方式,放到vendor。
使用PSR-4規(guī)范的namespace自動(dòng)加載。
處理404404要處理3個(gè)場景
沒有匹配route
dispatch時(shí)沒找到controller文件
dispatch時(shí)沒找到action方法
當(dāng)沒有匹配route時(shí),會(huì)使用用默認(rèn)的namespace,默認(rèn)的module,默認(rèn)的controller,默認(rèn)的action,默認(rèn)的params。此時(shí)你或許會(huì)困惑為何一個(gè)請求會(huì)顯示默認(rèn)首頁。
參考not found paths,配置route
// Not Found Paths $router->notFound([ "controller" => "errors", "action" => "route404" ]);
參考handling not found exceptions在注入dispatcher服務(wù)時(shí)初始化代碼如下
$di->setShared("dispatcher", function () { $eventsManager = new EventsManager(); $eventsManager->attach("dispatch:beforeException", function ($event, $dispatcher, $exception) { if ($exception instanceof DispatcherException) { switch ($exception->getCode()) { case Dispatcher::EXCEPTION_HANDLER_NOT_FOUND: case Dispatcher::EXCEPTION_ACTION_NOT_FOUND: $dispatcher->forward([ "controller" => "errors", "action" => "show404", "params" => array("message" => $exception->getMessage()) ]); return false; } } $dispatcher->forward([ "controller" => "errors", "action" => "show500" ]); return false; }); $dispatcher = new MvcDispatcher(); $dispatcher->setDefaultNamespace(" amespaceControllers"); $dispatcher->setEventsManager($eventsManager); return $dispatcher; });
以代碼由于還攔截了其它異常,且沒有throw $exception,會(huì)中斷異常調(diào)用鏈,可以考慮把異常$exception->getMessage(), $exception->getFile(),$exception->getLine(),$exception->getCode()信息傳給view,判斷是開發(fā)模式就顯示,生產(chǎn)模式就不顯示。
使用原生 SQL原則上是不允許使用原生的SQL的,某些場景一定要用的情況下,建議把所有的sql放到config內(nèi),在service層讀取使用。
第一種方式參考Finding Rows
$sql = "SELECT id, name FROM robots ORDER BY name"; $connection = PhalconDI::getDefault()->get("db"); $result = $connection->query($sql); $result->setFetchMode(Db::FETCH_ASSOC); echo $connection->getSQLStatement(); // sql $data = $result->fetchAll(); print_r($data);第二種方式
參考Using Raw SQL
// A raw SQL statement $sql = "SELECT * FROM robots WHERE id > 0"; $robot = new Robots(); $result = $robot->getReadConnection()->query($sql); $result->setFetchMode(Db::FETCH_ASSOC); $data = $result->fetchAll(); print_r($data); echo $robot->getReadConnection()->getSQLStatement();使用PHQL
參考Phalcon Query Language (PHQL)
簡單粗暴的理解是把models下的namespaceclass對(duì)應(yīng)成數(shù)據(jù)庫的表,類屬性對(duì)應(yīng)表字段。
理解了PHQL之后就可以讀下Working with Models
理解事件驅(qū)動(dòng)model類的事件調(diào)用順序如下:參考官方文檔http://docs.phalconphp.com/en/latest/reference/models.html#events-and-events-manager
數(shù)據(jù)庫分庫,讀寫分離,負(fù)載均衡用命名空間區(qū)分不同的數(shù)據(jù)庫實(shí)例,對(duì)應(yīng)代碼結(jié)構(gòu)上是不同的目錄區(qū)分,在同一目錄下基類負(fù)責(zé)初始化連接。連接來自初始化時(shí)注入的多個(gè)db服務(wù)
隱規(guī)則:
initialize()在每個(gè)請求期間只會(huì)調(diào)用一次
為每個(gè) new 創(chuàng)建的實(shí)例執(zhí)行初始化任務(wù)使用onConstruct()
namespace CompanyModelsNotification; /** * Class BaseModel * * beforeSave()和afterFetch()成對(duì)使用,用于讀寫數(shù)據(jù)時(shí)自動(dòng)轉(zhuǎn)化數(shù)據(jù)。 * 例如自動(dòng)執(zhí)行serialize unSerialize * * save()發(fā)生時(shí)事件調(diào)用順序是 * initialize, * onConstruct, * beforeValidation, * beforeValidationOnCreate, * afterValidationOnCreate, * afterValidation, * beforeSave, * beforeCreate, * afterCreate, * afterSave, * * @package CompanyModelsNotification */ class BaseModel extends PhalconMvcModel { /** * - initialize()在每個(gè)請求期間只會(huì)調(diào)用一次 * - 子類必需調(diào)用父類方法 * - 為每個(gè) new 創(chuàng)建的實(shí)例執(zhí)行初始化任務(wù)使用onConstruct() */ public function initialize() { $this->setConnectionService("db_notification"); //$this->setConnectionService("node1"); //$this->setConnectionService("node2"); // //真實(shí)場景可能使用mysqlnd_ms擴(kuò)展或者h(yuǎn)aproxy //僅演示讀負(fù)載均衡一種思路 //$dbSlave = ["node1", "node2", "node3"]; //$key = array_rand($dbSlave); //$db = $dbSlave[$key]; //$this->setReadConnectionService($db); // // //$this->setReadConnectionService("dbRead"); //$this->setWriteConnectionService("dbWrite"); } }表前綴與分表
model中提供的getSource()方法,合理運(yùn)用即可。
class BaseModel extends PhalconMvcModel { public function getSource() { return "v1".str_tolower(get_class($this)); } } class User extends BaseModel { ... } class Robots extends PhalconMvcModel { public function getSource() { return "robots_" . date("Ym"); } }cookie
2.0.9之前的版本先set("key"),然后再正常的set("key","value")。也就是set兩次繞過bug。
2.0.x分支已經(jīng)修復(fù)這個(gè)bug,查看github源碼
下面的單元測試可以重現(xiàn)這個(gè)bug。如果使用2.0.9之前的版本,建議采用兩次set
public function testCookies() { // di factory $di = new PhalconDiFactoryDefault(); $di->setShared("crypt", function () { $crypt = new PhalconCrypt(); // don"t use PADDING_DEFAULT, Affect the cookie result $crypt->setPadding(PhalconCrypt::PADDING_ZERO); $crypt->setKey("secret_key@123456789"); // Use your own key! return $crypt; }); // http cookies $di->setShared("cookies", function () { $cookies = new PhalconHttpResponseCookies(); $cookies->useEncryption(false); return $cookies; }); /** @var PhalconHttpResponseCookiesInterface $cookies */ $cookies = PhalconDI::getDefault()->get("cookies"); $_COOKIE["key"] = "1234567890"; $_COOKIE["key2"] = "0987654321"; //$cookies->set("key"); // ver <= 2.0.9 uncomment will test passed //$cookies->set("key2"); // ver <= 2.0.9 uncomment will test passed $this->assertEquals("1234567890", $cookies->get("key")->getValue()); $cookies->set("key", "value", time() + 3600, "/", false, "kinhom.com", true); $cookies->set("key2", "value2", time() + 3600, "/", false, "kinhom.com", true); $this->assertInstanceOf("PhalconHttpCookie", $cookies->get("key")); /* * phalcon ver <= 2.0.9 * Failed asserting that two strings are equal. * Expected :"value" * Actual :"1234567890" */ $this->assertEquals("value", $cookies->get("key")->getValue()); $this->assertEquals("value2", $cookies->get("key2")->getValue()); }view 渲染順序是
volt模板文件內(nèi) {{ content() }} 是聯(lián)接各個(gè)模板的橋梁,完整的順序是setMainView() -> setTemplateAfter() -> setLayout() -> setTemplateBefore -> pick()
即Main Layout -> Layout -> Action View
controller中若echo字符串,Action view內(nèi)要寫上{{ content() }}才會(huì)輸出。
參考范例https://github.com/phalcon/invo
https://github.com/phalcon/forum
背景知識(shí)無論你是否使用phalcon框架,做為PHP開發(fā)者,有些背景知識(shí)是必需要了解的。
從 PHP 5.2.x 移植到 PHP 5.3.x
從 PHP 5.3.X 遷移到 PHP 5.4.X
從 PHP 5.4.x 遷移到 PHP 5.5.x
從PHP 5.5.x 移植到 PHP 5.6.x
PHP標(biāo)準(zhǔn)庫 (SPL)
PHPUnit
xdebug,xhprof
composer,中文
PHP Framework Interop Group
phpDocumentor,apigen
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31916.html
摘要:是什么是開源全功能棧使用擴(kuò)展編寫針對(duì)高性能優(yōu)化的框架。也是松耦合的,可以根據(jù)項(xiàng)目的需要任意使用其他對(duì)象。安裝支持版本的不支持普通方式的編譯安裝,只能通過安裝。因此安裝之前,請先安裝。 Phalcon 是什么? Phalcon 是開源、全功能棧、使用 C 擴(kuò)展編寫、針對(duì)高性能優(yōu)化的 PHP 5 框架。 開發(fā)者不需要學(xué)習(xí)和使用 C 語言的功能, 因?yàn)樗械墓δ芏家?PHP 類的方式暴露出來...
摘要:初次認(rèn)識(shí)是在剛學(xué)的時(shí)候最近終于有機(jī)會(huì)用上了故此說說使用上的一些感受個(gè)人是很喜歡這套框架的方式使用依賴注入讓代碼組織很靈活耦合也很低但是也許是框架東西太多了遇到幾個(gè)坑上一年以上的也還沒解決不過有一定開發(fā)經(jīng)驗(yàn)的話還是可以自己修復(fù)的被這幾個(gè)坑浪費(fèi) 初次認(rèn)識(shí)phalcon是在剛學(xué)php的時(shí)候,最近終于有機(jī)會(huì)用上了.故此說說使用上的一些感受 個(gè)人是很喜歡phalcon這套框架的方式,使用...
摘要:原文發(fā)表于入門教程之目錄結(jié)構(gòu)很多初學(xué)的朋友,對(duì)于以框架為基礎(chǔ)構(gòu)建的項(xiàng)目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。只需要通過注冊這些目錄結(jié)構(gòu),即可正常使用。 原文發(fā)表于:Phalcon入門教程之目錄結(jié)構(gòu) 很多初學(xué)Phalcon的朋友,對(duì)于以Phalcon框架為基礎(chǔ)構(gòu)建的項(xiàng)目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。比如多模塊的項(xiàng)目中,如何共用libs類庫和models目錄中模型類的情況,就有很...
摘要:下載源碼源碼地址下載下載源碼地址下載修改文件,指定生成語法文件到目前為止,會(huì)在目錄下生成對(duì)應(yīng)版本的目錄在中導(dǎo)入最后重啟 1、下載Phalcon源碼 git clone https://github.com/phalcon/cphalcon.git 源碼地址:下載 2、下載phalcon-devtools git clone https://github.com/phalcon/phal...
摘要:本文描述了框架中數(shù)據(jù)庫操作方法,主要討論框架的組件中的操作方法。屬性方法在框架中支持屬性的擴(kuò)展查詢,在上例中,可以把條件語句改為同時(shí)省略查詢條件結(jié)果不變。 本文描述了PHP-Phalcon框架中數(shù)據(jù)庫操作方法,主要討論P(yáng)halcon框架的Model組件中的操作方法。更詳細(xì)的Model介紹請參考:官方文檔 1. 連接數(shù)據(jù)庫 在Phalcon框架中,通過在DI中注入db參數(shù)來實(shí)現(xiàn)數(shù)據(jù)庫的...
閱讀 2898·2021-10-27 14:19
閱讀 536·2021-10-18 13:29
閱讀 1127·2021-07-29 13:56
閱讀 3546·2019-08-30 13:19
閱讀 1926·2019-08-29 12:50
閱讀 1034·2019-08-23 18:16
閱讀 3520·2019-08-22 15:37
閱讀 1897·2019-08-22 15:37