Singleton PHP在多个控制器上

时间:2016-04-09 18:50:04

标签: php laravel

我创建了一个类(ParseDAO.php)并使用此方法使其成为单例:

public static function getInstance(){
    if (self::$instance == null) {
        self::$instance = new self();
    }
    return self::$instance;
}

然后我创建了2个控制器。一个登录的东西(LoginController.php)和另一个做仪表板的东西(DashboardController.php)

在LoginController.php中我使用此代码并且它完美地运行:

    $instance = ParseDAO::getInstance();

    $loginResponse = $instance->loginParse($request->get('userName'), $request->get('password'));

    if($loginResponse == true){
        return redirect()->route('dashboard');
    }
    else {
        return view('login.erroLogin');
    }

在DashboardController我有这个代码:

    $instance = ParseDAO::getInstance();

    $userId = $instance->getUserId();

第二行只返回objectId表单解析。如果我把这行放在loginController.php上它会返回正确的Id,但是在DashboardController.php(我需要这些数据的地方)没有任何返回。 它就像使用单例创建另一个实例一样。

有谁知道如何解决这个问题?

遵循loginParse和getUserId:

的代码
 /**
 * Method login
 */
public function loginParse($username, $password){
    if($username != null && $password != null){
        try {
            self::$user = ParseUser::logIn($username, $password);
            return true;
        }catch (ParseException $error){
            return false;
        }
    }
    else{
        return false;
    }
}

/**
 * @return getUserId
 */
public function getUserId(){
    return self::$user->getObjectId();
}

这是构造函数代码(使用真正的键):

public function __construct()
{
    ParseClient::initialize('xxx','xxx','xxx');
    self::$user = new ParseUser();
}

2 个答案:

答案 0 :(得分:1)

单身人士允许单次执行的代码使用相同的实例。在每次执行(页面加载)时,都会创建一个新实例。对ParseDAO::getInstance()的每次调用都将返回相同的实例,但仅在该执行上下文中。

如果没有看到loginParsegetUserId中的代码,最有可能发生的是您在ParseDAO类中存储信息。该信息将在同一执行上下文中保留,但在下次执行时将消失(因为它是一个新实例)。

您必须使用Sessions在多次执行中保留信息。

答案 1 :(得分:0)

Laravel的Service Container提供了一种快速简便的方法,可以将类绑定为单例,而无需自己实现该模式。因此,您可以使用它来向服务容器注册单身:

app()->bind('ParseDAO', function ($app) {
    return new ParseDAO;
});

然后您可以使用它来访问该实例:

$instance = app('ParseDAO');

这将确保您始终获得相同的实例。您可以在Laravel Documentation中阅读有关单身人士和Laravel服务容器的更多信息。