Laravel 5中的Singleton类

时间:2016-05-26 13:26:15

标签: php laravel-5 singleton laravel-5.2

我使用的是Laravel Framework 5.2.32版。我希望创建一个Singleton类,其对象可以在所有控制器上访问。我已经实现了如下课程。

class MyController extends Controller {

    public function initSingleton() {
        SingletonClazz::getInstance();
        SingletonClazz::getInstance();
        SingletonClazz::getInstance();
    }
}

我正在创建一个类的对象,如下所示

Route::group(['prefix' => 'singleton'], function() {
    Route::get('/', [
        'uses' => 'MyController@initSingleton'
    ]);
});

route.php文件配置如下

public void fill(final ArrayAdapter<ItemObject> adapter, final ItemObject item, final int position) {
            imgScreenShot.setImageResource(item.getScreenShot());

            String albumName = item.getAlbumName();
            String albumAuthor = item.getAlbumAuthor();

            float musicNameWidthSizeViaParent = widthSizeViaParent(txtAlbumName, albumName);
            float musicAuthorWidthSizeViaParent = widthSizeViaParent(txtAlbumAuthor, albumAuthor);

            if (musicNameWidthSizeViaParent < 0) {
                for (int i = 1; i < albumName.length() - 1; i++) {
                    if (widthSizeViaParent(txtAlbumName, albumName.substring(0, i).trim() + "...") < 0) {
                        albumName = albumName.substring(0, i - 1).trim() + "...";
                        break;
                    }
                }
            }

            if (musicAuthorWidthSizeViaParent < 0) {
                for (int i = 1; i < albumAuthor.length() - 1; i++) {
                    if (widthSizeViaParent(txtAlbumName, albumAuthor.substring(0, i).trim() + "...") < 0) {
                        albumAuthor = albumAuthor.substring(0, i - 1).trim() + "...";
                        break;
                    }
                }
            }

            txtAlbumName.setText(albumName);
            txtAlbumAuthor.setText(albumAuthor);
        }

当我调用网址http://localhost:8080/singleton/initSingleton时,结果为'已创建,已创建,已创建'。当我再次调用URL时,结果是相同的,而我希望它是'已经创建,已经创建,已经创建'

您能否指导此实施的问题。

2 个答案:

答案 0 :(得分:3)

将每个请求发送到PHP服务器,它将作为空白表处理,因此它从一开始就初始化Lavarel。上一个请求中定义的变量不会自动保存到下一个请求中。

PHP的设计方式,建立在以这种方式设计的HTTP协议之上。

您可以做的是将对象存储在会话中:

<?php
  session_start();

  if(isset($_SESSION['instance'])){
    $singleton = $_SESSION['instance'];
  } else {
    $singleton = SingletonClazz::getInstance();
    $_SESSION['instance'] = SingletonClazz::$instance;
  }

?>

但是再次为什么你想要那个,如果是这样,我 真的 建议改变你的实现。 单例是结构代码,其中有多个类具有类似的接口,无用的数据不应存储到会话中。

答案 1 :(得分:1)

为什么你没有使用Laravel IoC来实现单身? 杰夫兰伯特在评论中是完全正确的。