人生最大的错误是不断担心会犯错 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

命令行模式运行yaf框架应用之cli模式

Yaf/Yar学习笔记 memory发布于January 11, 2017 标签: PHP, Yaf

为了更好的与web区分(配置文件,argc、argv判断等等).重新创建一个入口文件是比较好的做法。

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

这样入口文件就完成了。接下来,你需要学会yaf命令行的调用方法。来一个示例:

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

Yaf_Request_Simple的构造函数可以不接受任何参数, 在这种情况下, Yaf_Request_Simple会在命令行参数中, 寻找一个字符串参数, 如果找到, 则会把请求的request_uri置为这个字符串。
request_uri=”/daemon/start” 中的路径便是Controller的路由路径。在例子里指向/Controller/Daemon.php 中的 startAction()。

还有一种方法,通过Yaf_Application::execute(..)去实现。先看一下这个函数的定义:

public void Yaf_Application::execute ( callable $entry , string $... )
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.

第一参数需要定义一个回调函数,也可以是一个类中的某个函数。示例:

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

后面的参数为一个可变列表,值为你希望传入的参数。综上所述,我们的另外一种入口文件可以写成:

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

如果需要通过bootstrap去初始化。只需要和web一样改为:

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

最优美的解决办法

// parse cli
if ($request->isCli ()) {
    global $argc, $argv;
    if ($argc > 1) {
        $module = '';
        $uri = $argv [1];
        if (preg_match ( '/^[^?]*%/i', $uri )) {
            list ( $module, $uri ) = explode ( '%', $uri, 2 );
        }
        $module = strtolower ( $module );
        $modules = Yaf_Application::app ()->getModules ();
        if (in_array ( ucfirst ( $module ), $modules )) {
            $request->setModuleName ( $module );
        }
        if (false === strpos ( $uri, '?' )) {
            $args = array ();
        } else {
            list ( $uri, $args ) = explode ( '?', $uri, 2 );
            parse_str ( $args, $args );
        }
        foreach ( $args as $k => $v ) {
            $request->setParam ( $k, $v );
        }
        $request->setRequestUri ( $uri );
        if ($request->isRouted () && ! empty ( $uri )) {
            if (false !== strpos ( $uri, '/' )) {
                list ( $controller, $action ) = explode ( '/', $uri );
                $request->setActionName ( $action );
            } else {
                $controller = $uri;
            }
            $request->setControllerName ( ucfirst ( strtolower ( $controller ) ) );
        }
    }
}

如果在插件中实现,routerStartup只需要$request->setRequestUri ( $uri ),如果是dispatchLoopStartup需要单独setControllerName和setActionName。

相关推荐

添加新评论

网站状态

  • 栏目分类:35个
  • 发布文章:1089篇
  • 用户评论:583条

最新回复

  • PHP程序员雷雪松: 非常详细的windows下MySQL的安装!!!
  • 嘿嘿: 高大上 嘿嘿
  • 嘿嘿: 呦西~~
  • memory: 实在是抱歉,我昨天找了一下我WIN电脑上的编译,发现当时编译完测...
  • kavid: 楼主发到我的邮箱呗 kavid@sina.com
  • 凯哥自媒体: 这个很不错,谢谢分享
  • memory: 在单位WINPC上,周一吧,我努力记着想死这事儿,到时候打包了发上来!
  • kavid: 楼主能把dll分享出来吗??正好我用的php 7.1php官方的...
  • zhaoliang0112: 厉害了,我哥的!!
  • zhaoliang0112: 希望能够有个系统的教程,就不要在去网上找了,直接这里学习!! :)
  • memory: 这是13年淘宝dba分享的一片文章,网上应该还有,我拿过来还没有...
  • wqintel: 而net.ipv4.tcp_mem则是配置tcp的内存大小,其单...
  • memory: 我这个站不是java写的哟~~~这是typecho开源博客程序改...
  • memory: 可以使用nginx反向代理后台的这个5000端口。
  • jarjar: 博主的java站好快啊
  • 凤凰山草民: java站这么快,厉害
  • 若铭: psdash可以部署到nginx上吗?
  • PHP程序员雷雪松: 很实用的PHP代码块!!!
  • codes: 把 .dll 发出来让我试试啊
  • 凯哥自媒体: 这个挺不错的