我喜欢构建一个插件,其中前端用户属于后端用户(一对多关系)。对于后端用户,我希望使用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'
到后端\控制器\用户控制器一切都好。
任何想法?
答案 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;
属性。这可能不是最好的解决方案。