Backend\Controllers\Users 必须定义 属性 $relationConfig
Backend\Controllers\Users must define property $relationConfig
我喜欢构建一个插件,其中前端用户属于后端用户(一对多关系)。对于后端用户,我想用关系管理器显示部分以将许多前端用户添加到后端用户。如果我尝试在 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'
});
});
我得到一个错误:Class Backend\Controllers\Users 必须定义 属性 由 Backend\Behaviors\RelationController 行为使用的 $relationConfig
如果我尝试手动放置:
public $relationConfig = '$/plg-user/plg/controllers/plg-ctr/config_relation.yaml'
到 Backend\Controllers\Users 控制器,一切正常。
有什么想法吗?
我以完全相同的方式扩展了前端用户控制器并且它有效:
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:
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;
在后端用户控制器中不存在。解决方法可能是创建您自己的后端用户控制器 class,它继承自 Backend\Controllers\Users
并向其添加 public $relationConfig;
属性。这可能不是最好的解决方案。
问题的出现是因为任何实现 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');
});
我喜欢构建一个插件,其中前端用户属于后端用户(一对多关系)。对于后端用户,我想用关系管理器显示部分以将许多前端用户添加到后端用户。如果我尝试在 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'
});
});
我得到一个错误:Class Backend\Controllers\Users 必须定义 属性 由 Backend\Behaviors\RelationController 行为使用的 $relationConfig
如果我尝试手动放置:
public $relationConfig = '$/plg-user/plg/controllers/plg-ctr/config_relation.yaml'
到 Backend\Controllers\Users 控制器,一切正常。
有什么想法吗?
我以完全相同的方式扩展了前端用户控制器并且它有效:
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:
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;
在后端用户控制器中不存在。解决方法可能是创建您自己的后端用户控制器 class,它继承自 Backend\Controllers\Users
并向其添加 public $relationConfig;
属性。这可能不是最好的解决方案。
问题的出现是因为任何实现 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');
});