PHP:不允许对闭包进行序列化

PHP:不允许对闭包进行序列化,php,facebook,serialization,opencart2.x,Php,Facebook,Serialization,Opencart2.x,整个场景是,我在我的opencart商店中添加了facebook登录扩展,当新用户使用facebook添加电子邮件和密码单击登录并单击登录时,一切正常,然后出现一个确认登录对话框,其中有两个按钮“取消”和“登录”,如果用户单击登录,则会将用户带到我的商店,但当用户单击时“取消”应将用户带回我的商店的登录页面,但它会给出错误“致命错误:不允许出现未捕获的异常,消息序列化为closure 哪一条是这条线的 “$\u会话[“HA::STORE”][$key]=序列化($value); 我正在使用包含此

整个场景是,我在我的opencart商店中添加了facebook登录扩展,当新用户使用facebook添加电子邮件和密码单击登录并单击登录时,一切正常,然后出现一个确认登录对话框,其中有两个按钮“取消”和“登录”,如果用户单击登录,则会将用户带到我的商店,但当用户单击时“取消”应将用户带回我的商店的登录页面,但它会给出错误
“致命错误:不允许出现未捕获的异常,消息序列化为closure

哪一条是这条线的
“$\u会话[“HA::STORE”][$key]=序列化($value);
我正在使用包含此行的以下函数:

public function set( $key, $value)
    {
        $key = strtolower( $key );

        $_SESSION["HA::STORE"][$key] = serialize($value);
    }
我试过这个 var_dump(serialize($value));并返回一个字符串 我如何序列化它?我已经搜索了它,但没有找到任何有用的解决方案

更新:

function login()
    {
        Hybrid_Logger::info( "Enter Hybrid_Provider_Adapter::login( {$this->id} ) " );

        if( ! $this->adapter ){
            throw new Exception( "Hybrid_Provider_Adapter::login() should not directly used." );
        }

        // clear all unneeded params
        foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
            Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.hauth_return_to"    );
            Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.hauth_endpoint"     );
            Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.id_provider_params" );
        }

        // make a fresh start
        $this->logout();

        # get hybridauth base url
        $HYBRID_AUTH_URL_BASE = Hybrid_Auth::$config["base_url"];

        # we make use of session_id() as storage hash to identify the current user
        # using session_regenerate_id() will be a problem, but ..
        $this->params["hauth_token"] = session_id();

        # set request timestamp
        $this->params["hauth_time"]  = time();

        # for default HybridAuth endpoint url hauth_login_start_url
        #   auth.start  required  the IDp ID
        #   auth.time   optional  login request timestamp
        $this->params["login_start"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.start={$this->id}&hauth.time={$this->params["hauth_time"]}";

        # for default HybridAuth endpoint url hauth_login_done_url
        #   auth.done   required  the IDp ID
        $this->params["login_done"]  = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.done={$this->id}";

        Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_return_to"    , $this->params["hauth_return_to"] );
        Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_endpoint"     , $this->params["login_done"] ); 
        Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.id_provider_params" , $this->params );

        // store config to be used by the end point 
        Hybrid_Auth::storage()->config( "CONFIG", Hybrid_Auth::$config );

        // move on
        Hybrid_Logger::debug( "Hybrid_Provider_Adapter::login( {$this->id} ), redirect the user to login_start URL." );

        Hybrid_Auth::redirect( $this->params["login_start"] );
    }
在函数_login中,set()由以下函数调用:

Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_return_to"    , $this->params["hauth_return_to"] );
        Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_endpoint"     , $this->params["login_done"] ); 
        Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.id_provider_params" , $this->params );

我猜您正在传递或正在传递a作为
set()
$value
参数

您需要使用检查并忽略闭包

或者,您可以捕获并忽略异常:

function set( $key, $value)
{
    $key = strtolower( $key );
    try{
        $_SESSION["HA::STORE"][$key] = serialize($value);
    } catch (\Exception $e) {
        // Catch the exception thrown and handle it however you want
    }
}

或者看看这个

var_dump(serialize($value));它返回一个字符串。我不明白$value是一个闭包,那么?@mehar444您没有提供足够的上下文让我解释。运行
var_dump(serialize($value));
$value
是一个闭包时,将导致抛出一个异常,如下所述:尝试代码后,它给出以下信息:警告:ReflectionFunction::_构造()预期参数1为字符串,数组在第63行的/var/www/html/mdpocketcliepboards.com/catalog/model/social\u login\u free/hybrid/storage.php中给出。实际上,当用户单击facebook登录对话框上的“取消”时,我正在使用facebook apiI。问题在于
set()的调用者
,它没有传递正确的参数。我怀疑您忘记在调用函数的函数名后添加
()
,因此它试图在会话中存储函数本身。显示调用
集()的代码
@Barmar我已经更新了这个问题,请看一看,如果您正在
$\u会话中存储某些内容,您不需要手动序列化它,这已经发生在会话处理程序代码中。当我使用$\u会话[“HA::STORE”][$key]=$value;
使用$\u会话[“HA::STORE”][$key]时,只需执行
$\u会话[“HA::STORE”][$key]=$value;它重定向回同一页面。当用户单击“取消”按钮时,此变量$value包含地址
function set( $key, $value)
{
    $key = strtolower( $key );
    try{
        $_SESSION["HA::STORE"][$key] = serialize($value);
    } catch (\Exception $e) {
        // Catch the exception thrown and handle it however you want
    }
}