Symfony项目中Propel 2行为声明配置报错,求正确配置方法
我之前也踩过Propel 1升级到Propel 2时的行为配置坑,确实和旧版本差异不小,来一步步帮你理清正确的配置方式:
首先,先解决你遇到的报错Unrecognized option "behaviors" under "propel.database"——这是因为你还保留了Propel 1的配置习惯,把behaviors放在了propel.database节点下,但Propel 2已经完全移除了这个配置位置,得先把这部分错误配置删掉。
接下来分两种情况说明行为的正确声明方式:
1. 内置行为(比如你用到的geo_location)
如果是Propel 2自带的内置行为,不需要额外注册类,直接在schema.xml的对应<table>节点里添加行为标签就行:
<table name="your_target_table"> <!-- 其他字段、索引配置 --> <behavior name="geo_location"> <!-- 如果这个行为需要自定义参数,在这里添加,比如: <parameter name="latitude_column" value="lat" /> <parameter name="longitude_column" value="lng" /> --> </behavior> </table>
2. 自定义行为(比如你之前的MyBundle\MyBehavior)
自定义行为需要先注册类,有两种常用方式:
方式一:在schema.xml中全局/局部注册
- 全局注册:在
<database>节点下声明,整个schema里的表都可以直接使用这个行为:
<database name="default" namespace="YourBundle\Model"> <!-- 全局注册自定义行为 --> <behavior name="my_behavior" class="MyBundle\MyBehavior" /> <!-- 你的表定义 --> <table name="user"> <!-- 直接使用已注册的自定义行为 --> <behavior name="my_behavior" /> <!-- 同时使用内置行为 --> <behavior name="geo_location" /> </table> </database>
- 局部注册:只在特定
<table>节点下声明,仅该表可用:
<table name="order"> <!-- 只在这个表中启用该自定义行为 --> <behavior name="my_behavior" class="MyBundle\MyBehavior" /> </table>
方式二:在Symfony的config.yml中全局注册
如果你想在配置层面统一管理行为,可以把自定义行为配置在propel.behaviors节点下(注意是propel的直接子节点,不是propel.database):
propel: # 其他Propel配置(比如database、generator等) behaviors: my_behavior: class: MyBundle\MyBehavior # 内置行为如果需要全局默认参数也可以在这里配置 geo_location: parameters: latitude_column: lat longitude_column: lng
配置完之后,就能在任意schema.xml的表节点里直接用<behavior name="my_behavior"/>或者<behavior name="geo_location"/>了。
最后提醒一句:自定义行为的类需要符合Propel 2的规范,要么实现Propel\Runtime\Behavior\BehaviorInterface,要么继承Propel\Runtime\Behavior\AbstractBehavior,否则会出现找不到行为类的错误。
现在按照上面的方式调整配置后,重新执行propel:model:build命令应该就能正常生成模型了。
内容的提问来源于stack exchange,提问作者skyhell

