【问题标题】:Backend\Controllers\Users must define property $relationConfigBackend\Controllers\Users 必须定义属性 $relationConfig
【发布时间】:2023-03-25 23:31:01
【问题描述】:

我喜欢构建一个前端用户属于后端用户的插件(一对多关系)。对于后端用户,我想使用关系管理器显示一个部分,以将许多前端用户添加到后端用户。如果我尝试在 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'

到 Backend\Controllers\Users Controller 一切正常。

任何想法?

【问题讨论】:

    标签: php octobercms octobercms-backend octobercms-plugins


    【解决方案1】:

    出现问题是因为任何实现 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');
    });
    

    【讨论】:

    • 非常感谢卢克,您的解决方案非常完美;)
    • 感谢更新文档
    【解决方案2】:

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

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

    【讨论】:

    • 嗨 Meysam.... 谢谢... ;属性到 Backend\Controllers\Users 类动态?
    • @JBee 有可能,我不知道该怎么做,我很想知道。
    • Meysam 在上面看到我的回答
    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2015-09-01
    • 2021-02-07
    • 1970-01-01
    相关资源
    最近更新 更多