【问题标题】:Custom function in Laravel return NULL but on var_dump is not NULLLaravel 中的自定义函数返回 NULL 但在 var_dump 上不是 NULL
【发布时间】:2017-07-31 07:33:18
【问题描述】:

我在 laravel 5.4 应用程序中有自定义类,它应该返回散列秘密。类是

class Hash {

   // Unencrypted secret

   private $secret;

   public function generateSecret(){

       $secret = generateSecretKey();

       $secret_hash = password_hash($secret, PASSWORD_BCRYPT);

       Session::put('secret-hash', $secret_hash);
       $this->secret = $secret;        
   }
}

然后在我的控制器中我有

use Hash;
class UsersController extends BaseController
{
    public function Auth()
    {
        $myhash = new Hash();
        $msg = '';

        $myhash->generateSecret();
        $enc = $myhash->encryptSecret($key->key);
        return View::make('users.auth', ['enc'=> $enc]);
    }
     ...
}

var_dump($myhash->generateSecret()); 从控制器返回 NULL

var_dump($secret) in public function generateSecret() 返回 string(15) "866094233422231" string(15) "583375207466239" 这是正确的。

UsersController 中的var_dump($myhash); 也返回正确的数据

String(15) "008844975703088" object(Hash)#329 (1) 
{ 
     ["secret":"Hash":private]=> string(15) "008844975703088" 
}

看来问题出在控制器和生成哈希$myhash->generateSecret();。该函数必须生成秘密(一个字符串),然后将其哈希$enc = $myhash->encryptSecret($key->key); 并显示在页面上。

任何想法为什么该功能不起作用?我不知道我还能尝试什么。

【问题讨论】:

  • 我认为 var_dump 显示 null 因为你的函数没有返回值。
  • 是的,我也这么认为,但是当我 var 直接在函数中转储它时,它会显示结果并且它不是 null,这对我来说很奇怪。
  • 返回你的函数 generateSecret 的值。
  • @aldrin27,这是generateSecret - string(15) "866094233422231" string(15) "583375207466239"的示例返回

标签: php laravel laravel-5


【解决方案1】:

generateSecret() 不返回任何内容,因此$myhash->generateSecret()NULLgenerateSecret() 确实$secret 设置为属性 ($this->secret = $secret),但由于 $secret 被声明为私有,因此您无法在类外访问它,因此您的 $myhash->secret控制器不起作用。

所以您有 2 个选项 - 要么返回秘密以便调用代码可以看到它,要么添加一个 getter 以使 $secret 在类外可访问。退货方式如下:

public function generateSecret(){
    $secret = generateSecretKey();
    $secret_hash = password_hash($secret, PASSWORD_BCRYPT);
    Session::put('secret-hash', $secret_hash);
    return $secret;
}

然后在你的控制器中:

$secret = $myhash->generateSecret();

【讨论】:

  • 感谢您的回答,抱歉耽搁了。我会用这种方式试一试,然后告诉你结果。
  • 只是一个问题:在我的本地服务器上工作但不能在线工作的原因是什么?
  • 对不起,但仍然是 bool(false)。我的意思是我不再在控制器中得到 NULL 但现在我得到 bool(false)
  • 我不确定你的代码现在是什么样子,但$secret 是否仍然来自generateSecretKey()?如果是,则 generateSecretKey() 正在返回 false ...再次尝试 var_dump() 以确认。
  • 感谢您的帮助。第二个 bool(false) 是我的错误。一切正常!
【解决方案2】:

这个函数:

public function generateSecret()
{

   $secret = generateSecretKey();

   $secret_hash = password_hash($secret, PASSWORD_BCRYPT);

   Session::put('secret-hash', $secret_hash);
   $this->secret = $secret;        
}

不返回任何数据,因此var_dump($myhash->generateSecret()); 将始终为空。

如果您需要在课堂外访问状态,则应使用 getter 公开状态。

【讨论】:

  • 我不明白,因为这个功能在 laravel 4.2 中就像这样完美地工作。
  • 抱歉,我的用户控制器中没有 getter,而我有 $myhash = new Hash();
  • 不,那只是实例化你的类。添加一个返回 $this->secret 的 getter,或者只是从 generateSecret() 中添加 return $secret;
  • @Don'tPanic, return $secret; 不会改变任何东西。也许我错了,但我只是用return $secret; 替换了$this->secret = $secret;,对吧?
  • 我添加了一个包含更多细节的答案。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多