####yaf 學習 C擴展的php框架 Yaf採用自動加載機制,若是你的類庫不符合yaf的標準,請將你的php.ini
中的yaf.use_spl_autoload
設置爲1,php
使用bootstrap
,在yaf
中提供整個項目的啓動配置,能夠將不少自定義的方法放到裏面bootstrap
使用bootstapapi
####yaf 使用cli來調試程序 [Notice]php框架
yaf 使用php cli
來調試程序,首先確保你的phpinfo()
和php -m
下都能找到yaf
擴展,不然會報Yaf_Application Not Found
錯誤session
/*加載你的配置文件*/ $app = new Yaf_Application(APP_PATH . "/conf/application.ini",'test'); /*將傳統的bootstrap入口文件替換成爲路由轉發*/ $app->getDispatcher()->dispatch( new Yaf_Request_Simple());
####yaf拋出異常 首先須要在你的入口文件index.php
添加 $app->getDispatcher()->catchException(true);
開啓捕獲錯誤app
以後在你的controller控制器下建立Error.php
框架
在文件中寫入如下內容ide
class ErrorController extends BaseController{ /*當這些保存$exception->getCode()時候,直接顯示404*/ public function errorAction($exception){ switch($exception->getCode()) { case YAF_ERR_LOADFAILD: case YAF_ERR_LOADFAILD_MODULE: case YAF_ERR_LOADFAILD_CONTROLLER: case YAF_ERR_NOTFOUND_CONTROLLER: case YAF_ERR_LOADFAILD_ACTION: case YAF_ERR_NOTFOUND_CONTROLLER: //404 header( "HTTP/1.1 404 Not Found" ); header( "Status: 404 Not Found" ); break; default: echo "No Action"; break; } } }
引伸一些yaf的報錯常量學習
YAF_VERSION(Yaf\VERSION) Yaf框架的三位版本信息 YAF_ENVIRON(Yaf\ENVIRON Yaf的環境常量, 指明瞭要讀取的配置的節, 默認的是product YAF_ERR_STARTUP_FAILED(Yaf\ERR\STARTUP_FAILED) Yaf的錯誤代碼常量, 表示啓動失敗, 值爲512 YAF_ERR_ROUTE_FAILED(Yaf\ERR\ROUTE_FAILED) Yaf的錯誤代碼常量, 表示路由失敗, 值爲513 YAF_ERR_DISPATCH_FAILED(Yaf\ERR\DISPATCH_FAILED) Yaf的錯誤代碼常量, 表示分發失敗, 值爲514 YAF_ERR_NOTFOUND_MODULE(Yaf\ERR\NOTFOUD\MODULE) Yaf的錯誤代碼常量, 表示找不到指定的模塊, 值爲515 YAF_ERR_NOTFOUND_CONTROLLER(Yaf\ERR\NOTFOUD\CONTROLLER) Yaf的錯誤代碼常量, 表示找不到指定的Controller, 值爲516 YAF_ERR_NOTFOUND_ACTION(Yaf\ERR\NOTFOUD\ACTION) Yaf的錯誤代碼常量, 表示找不到指定的Action, 值爲517 YAF_ERR_NOTFOUND_VIEW(Yaf\ERR\NOTFOUD\VIEW) Yaf的錯誤代碼常量, 表示找不到指定的視圖文件, 值爲518 YAF_ERR_CALL_FAILED(Yaf\ERR\CALL_FAILED) Yaf的錯誤代碼常量, 表示調用失敗, 值爲519 YAF_ERR_AUTOLOAD_FAILED(Yaf\ERR\AUTOLOAD_FAILED) Yaf的錯誤代碼常量, 表示自動加載類失敗, 值爲520 YAF_ERR_TYPE_ERROR(Yaf\ERR\TYPE_ERROR) Yaf的錯誤代碼常量, 表示關鍵邏輯的參數錯誤, 值爲521
####yaf引用smarty來展現輸出測試
測試.ini
文件的smarty
配置是否正確加載
$config = new Yaf_Config_Ini(APP_PATH.'/conf/application.ini', 'base'); echo $config->get("smarty")->compile_dir;
在bootstrap.php中加載視圖引擎&相關配置文件
public function _initView(Yaf_Dispatcher $dispatcher){ /*加載整合yaf&smarty模板類*/ Yaf_Loader::import(APP_LIBRARY."/Adapter.php"); /*加載application.ini下的smarty的*/ $config = new Yaf_Config_Ini(APP_PATH.'/conf/application.ini', 'smarty'); $smarty = new Smarty_Adapter(null , $config->get("smarty")); Yaf_Dispatcher::getInstance()->setView($smarty); }
而且在bootstrap中添加
/*關閉yaf自動渲染,不然數據會出現兩次*/ public function _init(){ Yaf_Dispatcher::getInstance()->disableView(); }
配置文件中具體smarty配置 [smarty] smarty.left_delimiter = "{" smarty.right_delimiter = "}" smarty.template_dir = APP_PATH "/application/views/" smarty.compile_dir = APP_PATH "/application/views/cache/compile" smarty.cache_dir = APP_PATH "/application/views/cache/"
在library
下建立Adapter.php
存入整合yaf&smarty
的語法
<?php /*Yaf 引入smarty*/ /*具體要看smarty在你項目中的位置*/ Yaf_Loader::import( Smarty."/Smarty.class.php"); Yaf_Loader::import( Smarty."/sysplugins/smarty_internal_templatecompilerbase.php"); Yaf_Loader::import( Smarty."/sysplugins/smarty_internal_templatelexer.php"); Yaf_Loader::import( Smarty."/sysplugins/smarty_internal_templateparser.php"); Yaf_Loader::import( Smarty."/sysplugins/smarty_internal_compilebase.php"); Yaf_Loader::import( Smarty."/sysplugins/smarty_internal_write_file.php"); class Smarty_Adapter implements Yaf_View_Interface { /** * Smarty object * @var Smarty */ public $_smarty; /** * 實例化smarty * * @param string $tmplPath * @param array $extraParams * @return void */ public function __construct($tmplPath = null, $extraParams = array()) { $this->_smarty = new Smarty; if (null !== $tmplPath) { $this->setScriptPath($tmplPath); } // var_dump($extraParams); foreach ($extraParams as $key => $value) { $this->_smarty->$key = $value; } } /** * Return the template engine object * * @return Smarty */ public function getEngine() { return $this->_smarty; } /** * Set the path to the templates * * @param string $path The directory to set as the path. * @return void */ public function setScriptPath($path) { if (is_readable($path)) { $this->_smarty->template_dir = $path; return; } throw new Exception('Invalid path provided'); } /** * Retrieve the current template directory * * @return string */ public function getScriptPath() { return $this->_smarty->template_dir; } /** * Alias for setScriptPath * * @param string $path * @param string $prefix Unused * @return void */ public function setBasePath($path, $prefix = 'Zend_View') { return $this->setScriptPath($path); } /** * Alias for setScriptPath * * @param string $path * @param string $prefix Unused * @return void */ public function addBasePath($path, $prefix = 'Zend_View') { return $this->setScriptPath($path); } /** * Assign a variable to the template * * @param string $key The variable name. * @param mixed $val The variable value. * @return void */ public function __set($key, $val) { $this->_smarty->assign($key, $val); } /** * Allows testing with empty() and isset() to work * * @param string $key * @return boolean */ public function __isset($key) { return (null !== $this->_smarty->get_template_vars($key)); } /** * Allows unset() on object properties to work * * @param string $key * @return void */ public function __unset($key) { $this->_smarty->clear_assign($key); } /** * Assign variables to the template * * Allows setting a specific key to the specified value, OR passing * an array of key => value pairs to set en masse. * * @see __set() * @param string|array $spec The assignment strategy to use (key or * array of key => value pairs) * @param mixed $value (Optional) If assigning a named variable, * use this as the value. * @return void */ public function assign($spec, $value = null) { if (is_array($spec)) { $this->_smarty->assign($spec); return; } $this->_smarty->assign($spec, $value); } /** * Clear all assigned variables * * Clears all variables assigned to Zend_View either via * {@link assign()} or property overloading * ({@link __get()}/{@link __set()}). * * @return void */ public function clearVars() { $this->_smarty->clear_all_assign(); } /** * Processes a template and returns the output. * * @param string $name The template to process. * @return string The output. */ public function render($name, $value = NULL) { return $this->_smarty->fetch($name); } public function display($name, $value = NULL) { echo $this->_smarty->fetch($name); } }
在你的Action
方法裏寫入
$this->getView()->assign('content', 'hello World!!!!!!!!!!!'); $this->getView()->display('index/index.tpl');
以後在你的.tpl
寫入
{$content}
注意模板的路徑,就能夠在頁面中看到輸出的效果了
####yaf使用session 獲取session
實例$session = Yaf_Session::getInstance()
, 設置一個username
$session->username='test'
獲取username
$session->username
刪除session
unset($session->username)
yaf沒法在本身的controller
使用__construct
方法,所以Yaf_Controller_Abstract
提供了一個魔術方法Yaf_Controller_Abstract::init()
當controller
被實例化的時候被調用
####yaf使用多模塊的使用
在application\conntrollers\
下定義的控制器都屬於Index
模塊
那麼項目中不可能只有一個模塊,那麼多模塊咱們如何處理呢?
在目錄application\
下新建目錄modules
。除了默認模塊,其餘模塊都放在application\modules\
下。
新建一個模塊,模塊名自定義。假設個人新模塊叫Api吧。 建立目錄application\modules\Api
。
修改項目配置文件conf\application.ini:
application.modules = "Index,Api"
在新模塊下建立控制器 在目錄application\modules\Api\
下建立控制器目錄controllers
,用於存放模塊Api下的控制器文件。
新建文件application\modules\Api\controllers\Passport.php:
<?php class PassportController extends Yaf_Controller_Abstract { public function loginAction() { echo '我是登陸接口'; return false; } }
http://127.0.0.1/api/passport/login