2

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

任何想法 ?

4

2 回答 2

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');
});
于 2017-04-08T22:58:16.133 回答
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;属性。不过,这可能不是最好的解决方案。

于 2017-04-07T07:07:10.877 回答