摘要:幫助你開始使用的簡易指南。第一種方式參考第二種方式參考使用參考簡單粗暴的理解是把下的對應成數據庫的表,類屬性對應表字段。
幫助你開始使用 phalcon 的簡易指南。
簡介Phalcon 2將于2015年4月17日發布,這個版本大約85%的代碼是基于 Zephir 語言重寫的。Zephir是開源的,使用類似PHP語法的語言,生成C語言代碼,并編譯成PHP擴展。這提高了PHP擴展的開發效率,并降低了框架的后期維護成本。
phalcon-devtools安裝 https://github.com/phalcon/phalcon-devtools 之后可以幫助自動生成目錄結構和代碼。同時把ide目錄下的相應版本加入IDE的External libraries之后,可以幫助IDE自動完成代碼。
nginx配置配置nginx的時候,建議用$_SERVER[‘REQUEST_URI’]方式,這樣可以防止自動加入$_GET[‘_url’]的隱規則,在參數簽名時,如果你忘記這個隱規則會導至簽名驗證失敗。
參考配置:
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; } }
這樣設置后,代碼也要參考URI Sources調整
$router->setUriSource(Router::URI_SOURCE_SERVER_REQUEST_URI);代碼結構
phalcon框架對代碼結構并沒有約定,你可以按自己的實際需要自行組織代碼結構,這里有一個供參考的例子:https://github.com/phalcon/mvc。
實際項目中,代碼分層至少要分三層,controller/view -> services -> models
services和models為了重用,可以參考composer的組織方式,放到vendor。
使用PSR-4規范的namespace自動加載。
處理404404要處理3個場景
沒有匹配route
dispatch時沒找到controller文件
dispatch時沒找到action方法
當沒有匹配route時,會使用用默認的namespace,默認的module,默認的controller,默認的action,默認的params。此時你或許會困惑為何一個請求會顯示默認首頁。
參考not found paths,配置route
// Not Found Paths $router->notFound([ "controller" => "errors", "action" => "route404" ]);
參考handling not found exceptions在注入dispatcher服務時初始化代碼如下
$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,會中斷異常調用鏈,可以考慮把異常$exception->getMessage(), $exception->getFile(),$exception->getLine(),$exception->getCode()信息傳給view,判斷是開發模式就顯示,生產模式就不顯示。
使用原生 SQL原則上是不允許使用原生的SQL的,某些場景一定要用的情況下,建議把所有的sql放到config內,在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對應成數據庫的表,類屬性對應表字段。
理解了PHQL之后就可以讀下Working with Models
理解事件驅動model類的事件調用順序如下:參考官方文檔http://docs.phalconphp.com/en/latest/reference/models.html#events-and-events-manager
數據庫分庫,讀寫分離,負載均衡用命名空間區分不同的數據庫實例,對應代碼結構上是不同的目錄區分,在同一目錄下基類負責初始化連接。連接來自初始化時注入的多個db服務
隱規則:
initialize()在每個請求期間只會調用一次
為每個 new 創建的實例執行初始化任務使用onConstruct()
namespace CompanyModelsNotification; /** * Class BaseModel * * beforeSave()和afterFetch()成對使用,用于讀寫數據時自動轉化數據。 * 例如自動執行serialize unSerialize * * save()發生時事件調用順序是 * initialize, * onConstruct, * beforeValidation, * beforeValidationOnCreate, * afterValidationOnCreate, * afterValidation, * beforeSave, * beforeCreate, * afterCreate, * afterSave, * * @package CompanyModelsNotification */ class BaseModel extends PhalconMvcModel { /** * - initialize()在每個請求期間只會調用一次 * - 子類必需調用父類方法 * - 為每個 new 創建的實例執行初始化任務使用onConstruct() */ public function initialize() { $this->setConnectionService("db_notification"); //$this->setConnectionService("node1"); //$this->setConnectionService("node2"); // //真實場景可能使用mysqlnd_ms擴展或者haproxy //僅演示讀負載均衡一種思路 //$dbSlave = ["node1", "node2", "node3"]; //$key = array_rand($dbSlave); //$db = $dbSlave[$key]; //$this->setReadConnectionService($db); // // //$this->setReadConnectionService("dbRead"); //$this->setWriteConnectionService("dbWrite"); } }表前綴與分表
model中提供的getSource()方法,合理運用即可。
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分支已經修復這個bug,查看github源碼
下面的單元測試可以重現這個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模板文件內 {{ content() }} 是聯接各個模板的橋梁,完整的順序是setMainView() -> setTemplateAfter() -> setLayout() -> setTemplateBefore -> pick()
即Main Layout -> Layout -> Action View
controller中若echo字符串,Action view內要寫上{{ content() }}才會輸出。
參考范例https://github.com/phalcon/invo
https://github.com/phalcon/forum
背景知識無論你是否使用phalcon框架,做為PHP開發者,有些背景知識是必需要了解的。
從 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標準庫 (SPL)
PHPUnit
xdebug,xhprof
composer,中文
PHP Framework Interop Group
phpDocumentor,apigen
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/31916.html
摘要:是什么是開源全功能棧使用擴展編寫針對高性能優化的框架。也是松耦合的,可以根據項目的需要任意使用其他對象。安裝支持版本的不支持普通方式的編譯安裝,只能通過安裝。因此安裝之前,請先安裝。 Phalcon 是什么? Phalcon 是開源、全功能棧、使用 C 擴展編寫、針對高性能優化的 PHP 5 框架。 開發者不需要學習和使用 C 語言的功能, 因為所有的功能都以 PHP 類的方式暴露出來...
摘要:初次認識是在剛學的時候最近終于有機會用上了故此說說使用上的一些感受個人是很喜歡這套框架的方式使用依賴注入讓代碼組織很靈活耦合也很低但是也許是框架東西太多了遇到幾個坑上一年以上的也還沒解決不過有一定開發經驗的話還是可以自己修復的被這幾個坑浪費 初次認識phalcon是在剛學php的時候,最近終于有機會用上了.故此說說使用上的一些感受 個人是很喜歡phalcon這套框架的方式,使用...
摘要:原文發表于入門教程之目錄結構很多初學的朋友,對于以框架為基礎構建的項目,應該如何組織目錄結構有點摸不著頭腦。只需要通過注冊這些目錄結構,即可正常使用。 原文發表于:Phalcon入門教程之目錄結構 很多初學Phalcon的朋友,對于以Phalcon框架為基礎構建的項目,應該如何組織目錄結構有點摸不著頭腦。比如多模塊的項目中,如何共用libs類庫和models目錄中模型類的情況,就有很...
摘要:下載源碼源碼地址下載下載源碼地址下載修改文件,指定生成語法文件到目前為止,會在目錄下生成對應版本的目錄在中導入最后重啟 1、下載Phalcon源碼 git clone https://github.com/phalcon/cphalcon.git 源碼地址:下載 2、下載phalcon-devtools git clone https://github.com/phalcon/phal...
摘要:本文描述了框架中數據庫操作方法,主要討論框架的組件中的操作方法。屬性方法在框架中支持屬性的擴展查詢,在上例中,可以把條件語句改為同時省略查詢條件結果不變。 本文描述了PHP-Phalcon框架中數據庫操作方法,主要討論Phalcon框架的Model組件中的操作方法。更詳細的Model介紹請參考:官方文檔 1. 連接數據庫 在Phalcon框架中,通過在DI中注入db參數來實現數據庫的...
閱讀 2912·2021-10-27 14:19
閱讀 542·2021-10-18 13:29
閱讀 1137·2021-07-29 13:56
閱讀 3556·2019-08-30 13:19
閱讀 1934·2019-08-29 12:50
閱讀 1060·2019-08-23 18:16
閱讀 3526·2019-08-22 15:37
閱讀 1904·2019-08-22 15:37