后端\ Controllers \ Users必须定义属性$ relationConfig

时间:2017-04-05 20:17:15

标签: php octobercms octobercms-backend octobercms-plugins

我喜欢构建一个插件,其中前端用户属于后端用户(一对多关系)。对于后端用户,我希望使用Relation Manager显示部分内容,以向BackendUser添加许多前端用户。如果我尝试在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 \ RelationController行为使用的属性$ relationConfig

如果我尝试手动放置:

public $relationConfig = '$/plg-user/plg/controllers/plg-ctr/config_relation.yaml'

到后端\控制器\用户控制器一切都好。

任何想法?

2 个答案:

答案 0 :(得分:3)

出现问题的原因是任何实现October\Rain\Extension\ExtendableTrait特征的对象(如用户控制器一样,可以在其上调用::extend())可以防止在第一次分配时自动声明未声明的属性

相反,您必须使用addDynamicProperty($property, $value)方法向对象添加未声明的属性。这在以前没有记录,并记录在octobercms/docs@9d454c

现在,您的案例的工作代码示例为

/**
 * 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');
});

答案 1 :(得分:0)

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

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;属性。这可能不是最好的解决方案。

相关问题