【问题标题】:phalcon Dynamic Class creation fails with error?phalcon 动态类创建失败并出现错误?
【发布时间】:2023-04-01 21:30:02
【问题描述】:

我正在尝试使用用户模型中的模型函数创建动态模型类,但是由于某种原因它无法识别类位置。它给了我一个错误

Fatal error: Class 'VarEducation' not found

下面是函数

public function partner()
{
    $view_service=new ViewService();
    $partner_vars_check=$view_service->getUserVarPartnerModelCheckMappingArray();
    foreach($partner_vars_check as $partner_key=>$partner_var){
        $table= str_replace("p_","var_",$partner_key);
        $sql = "SELECT * FROM ".$table."
                WHERE id='" . $this->{$partner_key} . "'
                ORDER BY id DESC";
        $partner_obj = new $partner_var();
        $this->{$partner_key} = new \Phalcon\Mvc\Model\Resultset\Simple(null, $partner_obj,
            $partner_obj->getReadConnection()->query($sql));
    }
}

知道是什么原因造成的吗?

视图服务提供的数据如下

public function getUserVarPartnerModelCheckMappingArray() { 

    return array( 
        'p_education' => 'VarEducation', 
        'p_body' => 'VarBody', 
        'p_ethnicity' => 'VarEthnicity', 
        'p_religion' => 'VarReligion', 
        'p_family' => 'VarFamily', 
    ); 
}

【问题讨论】:

  • 可能使用正确的命名空间?代码看起来正确。

标签: php phalcon


【解决方案1】:

无论您做什么,如果您将模型隐藏在任何命名空间中,则必须使用映射数组提供完整的命名空间。比方说,你所有的模型都在 Application\Models 的命名空间中,你必须这样使用它:

public function getUserVarPartnerModelCheckMappingArray() { 

    return array( 
        'p_education' => '\Application\Models\VarEducation', 
        'p_body' => '\Application\Models\VarBody', 
        'p_ethnicity' => '\Application\Models\VarEthnicity', 
        'p_religion' => '\Application\Models\VarReligion', 
        'p_family' => '\Application\Models\VarFamily', 
    ); 
}

并不是说我宁愿切换/大小写如此少量的选项并直接使用模型,而不是手动构建 SQL。

【讨论】:

  • 虽然您的解决方案有效,但如果我只是执行 new VarEducation(没有动态创建),我不知道没有命名空间它是如何工作的
  • 动态创建似乎用完了它被调用的命名空间,因此您应该提供完整的命名空间以使其工作。符合 phpwtf
【解决方案2】:

即使类名是变量,Phalcon 也应该正确加载类。尝试将问题分解为:

$myClass='VarEducation';
$partner_obj = new $myClass();

还可以尝试从您的模型列表中注释掉该特定模型并查看您的其他模型是否有效,也许在找到该特定模型而不是其他模型时出错。检查您的/app/config/loader.php 文件并确保您正在注册您的模型目录。然后确保文件VarEducation.php 存在于您的模型目录以及您的其他模型中。还要确保文件中的类名与文件名匹配,并且您已将类命名为VarEducation。还要确保它没有命名空间。还要确保您没有忘记前导 <?php 并且该文件没有任何错误。如果一切都失败了,你可以简单地从你的 loader.php 文件中加载这个类,比如:

$loader->registerClasses(array(
    'VarEducation' => $config->application->modelsDir.'/VarEducation.php'
));

确保对模型进行简单的测试:$x=new VarEducation(); 我建议在您的索引控制器中通过test 操作执行此操作。如果这些都不起作用,请在尝试我的建议时用你的结果评论这篇文章,我会更新我的答案。

【讨论】:

    猜你喜欢
    • 2023-01-03
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2021-06-08
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多