yaf && cli實戰筆記

     爲了更好的與web區分(配置文件,argc、argv判斷等等).從新建立一個入口文件是比較好的作法。php

1 $app = new YafApplication(APP_PATH . "/conf/application.ini");
2 
3 $app->getDispatcher()->dispatch(new YafRequestSimple());

 

     這樣入口文件就完成了。接下來,你須要學會yaf命令行的調用方法。來一個示例:web

1 php cli.php request_uri="/daemon/start"

 

     Yaf_Request_Simple的構造函數能夠不接受任何參數, 在這種狀況下, Yaf_Request_Simple會在命令行參數中, 尋找一個字符串參數, 若是找到, 則會把請求的request_uri置爲這個字符串。數據庫

     request_uri=」/daemon/start」 中的路徑即是Controller的路由路徑。在例子裏指向/Controller/Daemon.php 中的 startAction()。bootstrap

     還有一種方法,經過Yaf_Application::execute(..)去實現。先看一下這個函數的定義:app

1 public void Yaf_Application::execute ( callable $entry , string $... )
2 2
3 This method is typically used to run Yaf_Application in a crontab work. Make the crontab work can also use the autoloader and Bootstrap mechanism.

     第一參數須要定義一個回調函數,也能夠是一個類中的某個函數。示例:函數

1 $application->execute("main", $argc, $argv);

     或this

1 $application->execute(array("Class","Method"), $argc, $argv);

     後面的參數爲一個可變列表,值爲你但願傳入的參數。綜上所述,咱們的另一種入口文件能夠寫成:spa

1 $app = new YafApplication(APP_PATH . "/conf/application.ini");
2 2
3 $app->execute('callback', $avg1, $avg2 , ...);

     若是須要經過bootstrap去初始化。只須要和web同樣改成:命令行

1 $app->bootstrap()->execute('callback', $avg1, $avg2 , ...);

 

     最優美的解決辦法     
 1 // parse cli
 2 
 3 if ($request->isCli ()) {
 4 
 5     global $argc, $argv;
 6 
 7     if ($argc > 1) {
 8 
 9         $module = '';
10 
11         $uri = $argv [1];
12 
13         if (preg_match ( '/^[^?]*%/i', $uri )) {
14 
15             list ( $module, $uri ) = explode ( '%', $uri, 2 );
16         }
17 
18         $module = strtolower ( $module );
19 
20         $modules = Yaf_Application::app ()->getModules ();
21 
22         if (in_array ( ucfirst ( $module ), $modules )) {
23 
24             $request->setModuleName ( $module );
25 
26         }
27 
28         if (false === strpos ( $uri, '?' )) {
29 
30             $args = array ();
31 
32         } else {
33 
34             list ( $uri, $args ) = explode ( '?', $uri, 2 );
35 
36             parse_str ( $args, $args );
37 
38         }
39 
40         foreach ( $args as $k => $v ) {
41 
42             $request->setParam ( $k, $v );
43 
44         }
45 
46         $request->setRequestUri ( $uri );
47 
48         if ($request->isRouted () && ! empty ( $uri )) {
49 
50             if (false !== strpos ( $uri, '/' )) {
51 
52                 list ( $controller, $action ) = explode ( '/', $uri );
53 
54                 $request->setActionName ( $action );
55 
56             } else {
57                 $controller = $uri;
58 
59             }
60 
61             $request->setControllerName ( ucfirst ( strtolower ( $controller ) ) );
62 
63         }
64 
65     }
66 
67 }

        如下爲個人項目開發實例代碼:code

 1 //cli.php 入口文件
 2 <?php
 3 # 全局
 4 define("APPLICATION_PATH", realpath((phpversion() >= "5.3"? __DIR__: dirname(__FILE__)).'/../'));
 5 date_default_timezone_set("Asia/Shanghai");
 6 # 加載配置文件
 7 $app = new Yaf_Application(APPLICATION_PATH . "/conf/application.ini", 'common');
 8 # 數據庫配置
 9 Yaf_Registry::set("config", $config = Yaf_Application::app()->getConfig());
10 # request_uri
11 $app->getDispatcher()->dispatch(new Yaf_Request_Simple());

 

 1 //lib 雞肋(基類)
 2 <?php
 3 /**
 4  * cli base
 5  */
 6 abstract class Ctrl_Cli extends Yaf_Controller_Abstract{
 7     /**
 8      * 構造函數
 9      */
10     public function init(){
11         #only for cli
12         if(!$this->getRequest()->isCli()){
13             ErrorController::page403();
14         }
15     }
16 }
 1 //功能類和方法
 2 <?php
 3 class Cli_InviteController extends Ctrl_Cli
 4 {
 5     /**
 6      * @desc 邀請推薦獎勵
 7      */
 8     public function indexAction()
 9     {
10 
11 
12         exit('finish');
13     }
14 }
相關文章
相關標籤/搜索