Php 后端\控制器\用户必须定义属性$relationConfig

Php 后端\控制器\用户必须定义属性$relationConfig,php,octobercms,octobercms-backend,octobercms-plugins,Php,Octobercms,Octobercms Backend,Octobercms Plugins,我喜欢构建一个插件,其中前端用户属于后端用户(一对多关系)。对于后端用户,我希望使用关系管理器显示一个部分,以便将许多前端用户添加到后端用户。如果我尝试在Plugin.php上动态定义一个属性,如: use Backend\Models\User as BackendUser; use Backend\Controllers\Users as BackendUsersController; public function boot(){ BackendUsersControl

我喜欢构建一个插件,其中前端用户属于后端用户(一对多关系)。对于后端用户,我希望使用关系管理器显示一个部分,以便将许多前端用户添加到后端用户。如果我尝试在Plugin.php上动态定义一个属性,如:

use Backend\Models\User as BackendUser;
use Backend\Controllers\Users as BackendUsersController;


public function boot(){    
    BackendUsersController::extend(function($controller) {  
        $controller->implement[] = 'Backend.Behaviors.RelationController';  
        $controller->relationConfig = '$/plg-user/plg/controllers/plg-ctr/config_relation.yaml'  
    });
});
我得到一个错误:类Backend\Controllers\Users必须定义Backend\Behaviors\relationcontrollerbehavior使用的属性$relationConfig

如果我尝试手动放置:

public $relationConfig = '$/plg-user/plg/controllers/plg-ctr/config_relation.yaml'
到后端\控制器\用户控制器,一切正常


有什么想法吗

我以完全相同的方式扩展了前端用户控制器,它可以工作:

UsersController::extend(function($controller){
    if(!isset($controller->implement['Backend.Behaviors.RelationController'])) {
        $controller->implement[] = 'Backend.Behaviors.RelationController';
    }
    $controller->relationConfig  =  '$/meysam/profile/controllers/profile/config_relations.yaml';
});
我认为区别在于,
relationConfig
已在前端用户控制器类中定义:

class Users extends Controller
{
    public $implement = [
        'Backend.Behaviors.FormController',
        'Backend.Behaviors.ListController'
    ];

    public $formConfig = 'config_form.yaml';
    public $listConfig = 'config_list.yaml';
    public $relationConfig;

public$relationConfig在后端用户控制器中不存在。解决方法可能是创建您自己的后端用户控制器类,该类继承自
backend\Controllers\Users
,并添加
public$relationConfig属性。但这可能不是最好的解决方案。

出现问题的原因是,任何实现
十月\Rain\Extension\extendedabletrait
特性的对象(就像用户控制器一样,这就是您可以调用
::extend()
的方式)都会阻止在第一次赋值时自动声明未声明的属性

相反,必须使用
addDynamicProperty($property,$value)
方法向对象添加未声明的属性。这是以前未记录的,并记录在中

您的案例的工作代码示例如下

/**
 * Extend the BackendUsers controller to include the RelationController behavior
 */
BackendUsersController::extend(function($controller) {

    // Implement the list controller behavior dynamically
    $controller->implement[] = 'Backend.Behaviors.RelationController';

    // Declare the relationConfig property dynamically for the RelationController behavior to use
    $controller->addDynamicProperty('relationConfig', '$/plg-user/plg/controllers/plg-ctr/config_relation.yaml');
});

嗨,梅萨姆。。。。非常感谢。我还认为创建自己的后端用户控制器类不是最好的解决方案;)。。。无法添加公共$relationConfig;动态设置为Backend\Controllers\Users类的属性?@JBee这是可能的,我不知道怎么做,我很想知道。Meysam看到我上面的答案谢谢你,卢克,你的解决方案很完美;)感谢您更新文档