php中request中cmd,YAF中使用命令行(Cli模式)

为了更好的与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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值