我创建了一个类(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();
}
答案 0 :(得分:1)
单身人士允许单次执行的代码使用相同的实例。在每次执行(页面加载)时,都会创建一个新实例。对ParseDAO::getInstance()
的每次调用都将返回相同的实例,但仅在该执行上下文中。
如果没有看到loginParse
和getUserId
中的代码,最有可能发生的是您在ParseDAO
类中存储信息。该信息将在同一执行上下文中保留,但在下次执行时将消失(因为它是一个新实例)。
您必须使用Sessions在多次执行中保留信息。
答案 1 :(得分:0)
Laravel的Service Container提供了一种快速简便的方法,可以将类绑定为单例,而无需自己实现该模式。因此,您可以使用它来向服务容器注册单身:
app()->bind('ParseDAO', function ($app) {
return new ParseDAO;
});
然后您可以使用它来访问该实例:
$instance = app('ParseDAO');
这将确保您始终获得相同的实例。您可以在Laravel Documentation中阅读有关单身人士和Laravel服务容器的更多信息。