2015-08-11 17:44:06 2479次浏览 2条回答 0 悬赏 26 金钱
public function actionLoad(){
    //在读入数据的时候可以实现下进度条。
    //基本思路,点击开始导入后其实是响应一个ajax请求。
    //然后就开始了数据导入,然后前台不段的请求这个
    if(\Yii::$app->request->isAjax){
        Yii::$app->response->format = Response::FORMAT_JSON;
        $tool = FileRead::getMe();
        $ans = round( ($tool->rowsRead) / ($tool->allRowsNum*101));
        $res = [
            'done'=>$ans,
        ];
        //var_dump(self::$fileRead);
        return $res;
    }
}
public function actionRealload(){
    //在这里触发真正的读写文件 。    
    $tool = FileRead::getMe();
    $tool->ReadAndWrite($_POST['filename']);
}

FileRead是一个类,我想让这个类成为单例。即在application的生命周期内只存在一次。
测试时发现,切换了不同的action 那么 静态方法:getMe()获取的就不是上一次在别的action里创建的。

我想实现的效果是在我读文件 ,并写入数据库的时候,出现个进度条,反映我写了多少。
现在我的想法是 前台不断请求actionLoad方法 返回当前已经读的。
actionRealload是真正要去读文件并写的。
现在我想要实现两个方法里使用的FileRead类是同一个。这就需要一个单例。但是我在这又造不出单例
或者大家给我如何写进度条一个提示。

  • 回答于 2015-08-11 18:31 举报

    仅单例来说, 可以自己写一个, 也可以使用Yii的依赖注入容器实现.

    Yii::container->setSingleton('fileRead',['class'=>'namespace\to\your\Class']);
    [仅举一个简单例子, 具体请看yii源码或者wiki].

    用的时候 Yii::$container->get('fileRead') 即可;

  • 回答于 2015-08-12 02:04 举报

    楼主,application的生命周期是跟着action的,你切换action的时候,application也跟着切换了,所以你得不到原来的单例了。

您需要登录后才可以回答。登录 | 立即注册
qiliux
助理

qiliux

注册时间:2015-07-27
最后登录:2016-01-26
在线时长:2小时22分
  • 粉丝1
  • 金钱94
  • 威望0
  • 积分114

热门问题