调用指定控制器


不通过路由, 直接调用指定的控制器和方法

程序入口

require __DIR__ . '/../../crossboot.php';
Cross\Core\Delegate::loadApp('web')->get('main:index');

get()方法接受三个参数:

  • 第一个参数指明要调用的控制器和方法, 如果省略方法名, 会调用控制器的index方法
  • 第二个参数为运行时要传给指定控制器的参数数组
  • 第三个参数为一个布尔值, 默认是flase, 表示直接输出结果, 如果该参数的值为true, 则返回输出内容

一般使用方法

run()配合实现访问权限控制, 比如admin这个app的入口定义如下:

session_start();
require __DIR__ . '/../../crossboot.php';
$admin = Cross\Core\Delegate::loadApp('admin');

//登录成功后$_SESSION['u']会被赋值
//如果$_SESSION['u']为空,访问任何页面都只会输出登录界面
if (empty($_SESSION['u'])) {
    $admin->get('Main:login');
} else {
    $admin->run();
}

除此之外还可以把框架当脚手架来用, 手动解析URL参数, 调用指定的控制器

require __DIR__ . '/../../crossboot.php';
$web = Cross\Core\Delegate::loadApp('web');

//例如url为:http://localhost/?controller=main&action=index&a=b&b=2&c=3
$request = $_GET + $_POST;
$controller = !empty($request['controller'])?$request['controller']:'defaultController';
$action = !empty($request['action'])?$request['action']:'defaultAction';
unset($request['controller'], $request['action']);

try {
    //调用指定控制器和方法并传参
    $web->get("{$controller}:{$action}", $request);
} catch (Exception $e) {
    //正式环境下捕获运行过程中的异常信息
    //调用指定的控制器处理异常信息
    $web->get('error');
}

还易于与第三方程序配合, 实现更强大的功能, 例如用workerman处理socket链接, 用cp处理逻辑

//框架依赖的唯一常量
define('PROJECT_PATH', __DIR__);

//使用composer install来进行安装
//require PROJECT_PATH . '/vendor/autoload.php';

//使用压缩包安装时候,需要引入框架根目录下的boot.php文件
require PROJECT_PATH . '/lib/crossphp/boot.php';

//载入workerman
require PROJECT_PATH . '/lib/workerman-for-win-master/Autoloader.php';

use Workerman\Worker;

$app = Cross\Core\Delegate::loadApp('api');
$worker = new Worker('tcp://0.0.0.0:1234');
$worker->count = 3;
$worker->onMessage = function($connection, $data) use($app) {	
	//解析客户端参数
    //调用指定控制器将结果交给workerman发送至客户端
    $content = $app->get('main:index', array(), true);
    $connection->send($content);	
};

Worker::runAll();