从代码中获取行为相关的配置
Get behavior related configuration from code
是否可以访问与行为相关的配置?在这种特定情况下,行为附加到 table。我想知道是否有可能以某种方式获取字段 属性,稍后在代码中?
<?php
class MyRandomTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
...
// Add Cipher behavior
$this->addBehavior('CipherBehavior.Cipher', [
'fields' => [
'original' => 'string',
'changed' => 'string',
]
]);
}
...
}
?>
如果我加载 table 并转储内容,我看不到列出的行为:
$table = TableRegistry::get('MyRandomTable');
var_dump($table);
部分转储内容:
protected '_behaviors' =>
object(Cake\ORM\BehaviorRegistry)[170]
protected '_table' =>
&object(Cake\ORM\Table)[172]
protected '_methodMap' =>
array (size=0)
empty
protected '_finderMap' =>
array (size=0)
empty
protected '_loaded' =>
array (size=0)
empty
protected '_eventManager' =>
object(Cake\Event\EventManager)[165]
protected '_listeners' =>
array (size=0)
...
protected '_isGlobal' => boolean false
protected '_eventList' => null
protected '_trackEvents' => boolean false
protected '_eventClass' => string '\Cake\Event\Event' (length=17)
我想在控制器中做的是获取字段并将它们传递给视图。
编辑 #1
使用 CakePHP v3.3.16
编辑 #2
我看到了行为信息,因为我在加载 table 时错过了插件前缀:
$table = TableRegistry::get('PluginName.MyRandomTable');
显示:
protected '_behaviors' =>
object(Cake\ORM\BehaviorRegistry)[143]
protected '_table' =>
&object(PluginName\Model\Table\MyRandomTable)[94]
protected '_methodMap' =>
array (size=4)
'timestamp' =>
array (size=2)
...
'touch' =>
array (size=2)
...
'encrypt' =>
array (size=2)
...
'decrypt' =>
array (size=2)
...
protected '_finderMap' =>
array (size=0)
empty
protected '_loaded' =>
array (size=2)
'Timestamp' =>
object(Cake\ORM\Behavior\TimestampBehavior)[181]
...
'Cipher' =>
object(CipherBehavior\Model\Behavior\CipherBehavior)[192]
...
protected '_eventManager' =>
object(Cake\Event\EventManager)[175]
protected '_listeners' =>
array (size=4)
...
protected '_isGlobal' => boolean false
protected '_eventList' => null
protected '_trackEvents' => boolean false
protected '_eventClass' => string '\Cake\Event\Event' (length=17)
您可以通过 schema()->columns()
.
获取 table 的列名
例子-
$getColumnArray = $this->Users->schema()->columns();//return Users Table Colums Name Array
$getColumnArray = $this->Users->associations()->keys()//return Users assocation table key
首先你的tableclass文件不正确,它需要一个命名空间,否则找不到,你最终会得到一个\Cake\ORM\Table
的实例(所谓的 auto/generic-table) 而不是其中的具体子 class,因此您的行为缺失。
话虽这么说,但这取决于行为的编程方式。如果它遵循默认配置模式,那么您可以通过它的 config()
或 getConfig()
(从 CakePHP 3.4 开始)方法访问配置。
当然,您必须访问该行为,而不仅仅是它所附加的 table class。这是使用行为注册表完成的,可通过 Table::behaviors()
方法获得:
$fields = $table->behaviors()->get('Cipher')->config('fields');
另见
是否可以访问与行为相关的配置?在这种特定情况下,行为附加到 table。我想知道是否有可能以某种方式获取字段 属性,稍后在代码中?
<?php
class MyRandomTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
...
// Add Cipher behavior
$this->addBehavior('CipherBehavior.Cipher', [
'fields' => [
'original' => 'string',
'changed' => 'string',
]
]);
}
...
}
?>
如果我加载 table 并转储内容,我看不到列出的行为:
$table = TableRegistry::get('MyRandomTable');
var_dump($table);
部分转储内容:
protected '_behaviors' =>
object(Cake\ORM\BehaviorRegistry)[170]
protected '_table' =>
&object(Cake\ORM\Table)[172]
protected '_methodMap' =>
array (size=0)
empty
protected '_finderMap' =>
array (size=0)
empty
protected '_loaded' =>
array (size=0)
empty
protected '_eventManager' =>
object(Cake\Event\EventManager)[165]
protected '_listeners' =>
array (size=0)
...
protected '_isGlobal' => boolean false
protected '_eventList' => null
protected '_trackEvents' => boolean false
protected '_eventClass' => string '\Cake\Event\Event' (length=17)
我想在控制器中做的是获取字段并将它们传递给视图。
编辑 #1
使用 CakePHP v3.3.16
编辑 #2
我看到了行为信息,因为我在加载 table 时错过了插件前缀:
$table = TableRegistry::get('PluginName.MyRandomTable');
显示:
protected '_behaviors' =>
object(Cake\ORM\BehaviorRegistry)[143]
protected '_table' =>
&object(PluginName\Model\Table\MyRandomTable)[94]
protected '_methodMap' =>
array (size=4)
'timestamp' =>
array (size=2)
...
'touch' =>
array (size=2)
...
'encrypt' =>
array (size=2)
...
'decrypt' =>
array (size=2)
...
protected '_finderMap' =>
array (size=0)
empty
protected '_loaded' =>
array (size=2)
'Timestamp' =>
object(Cake\ORM\Behavior\TimestampBehavior)[181]
...
'Cipher' =>
object(CipherBehavior\Model\Behavior\CipherBehavior)[192]
...
protected '_eventManager' =>
object(Cake\Event\EventManager)[175]
protected '_listeners' =>
array (size=4)
...
protected '_isGlobal' => boolean false
protected '_eventList' => null
protected '_trackEvents' => boolean false
protected '_eventClass' => string '\Cake\Event\Event' (length=17)
您可以通过 schema()->columns()
.
例子-
$getColumnArray = $this->Users->schema()->columns();//return Users Table Colums Name Array
$getColumnArray = $this->Users->associations()->keys()//return Users assocation table key
首先你的tableclass文件不正确,它需要一个命名空间,否则找不到,你最终会得到一个\Cake\ORM\Table
的实例(所谓的 auto/generic-table) 而不是其中的具体子 class,因此您的行为缺失。
话虽这么说,但这取决于行为的编程方式。如果它遵循默认配置模式,那么您可以通过它的 config()
或 getConfig()
(从 CakePHP 3.4 开始)方法访问配置。
当然,您必须访问该行为,而不仅仅是它所附加的 table class。这是使用行为注册表完成的,可通过 Table::behaviors()
方法获得:
$fields = $table->behaviors()->get('Cipher')->config('fields');
另见