propel / sf-propel-o-r-m-plugin
Propel的symfony 1.x插件。
Requires
- composer/installers: ^v1.12.0
- propel/propel1: ~1.6
This package is auto-updated.
Last update: 2024-09-07 21:54:50 UTC
README
通过分支1.6替换symfony核心Propel插件为最新版本的Propel。
安装
Composer方式
将require添加到您的composer.json中。名称虽然奇怪,但像Composer的symfony1安装程序那样正确地将驼峰命名。Composer会自动将其安装到您的项目插件目录,并添加依赖项。
{
"config": {
"vendor-dir": "lib/vendor"
},
"require": {
"propel/sf-propel-o-r-m-plugin": "dev-master"
}
}
当然,别忘了将Composer的自动加载器添加到您的ProjectConfiguration中。
// config/ProjectConfiguration.class.php require __DIR__ .'/../lib/vendor/autoload.php'; require_once dirname(__FILE__) .'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php'; sfCoreAutoload::register(); class ProjectConfiguration extends sfProjectConfiguration { public function setup() { $this->enablePlugins(array( 'sfPropelORMPlugin', ... )); // mandatory because of the Composer vendor directory naming scheme sfConfig::set('sf_phing_path', sfConfig::get('sf_lib_dir') .'/vendor/phing/phing'); sfConfig::set('sf_propel_path', sfConfig::get('sf_lib_dir') .'/vendor/propel/propel1'); } }
Git方式
从Github克隆插件
git clone https://github.com/propelorm/sfPropelORMPlugin.git plugins/sfPropelORMPlugin
cd plugins/sfPropelORMPlugin
git submodule update --init
如果您将Git用作项目的版本控制系统,最好将插件作为子模块添加。
git submodule add https://github.com/propelorm/sfPropelORMPlugin.git plugins/sfPropelORMPlugin
git submodule update --init --recursive
由于Phing和Propel库都包含在插件中,您必须为插件初始化子模块。
SVN方式
通过子版本控制系统安装插件
svn checkout https://github.com/propelorm/sfPropelORMPlugin/trunk plugins/sfPropelORMPlugin
安装Phing
和Propel
svn checkout http://phing.mirror.svn.symfony-project.com/tags/2.3.3/classes/phing lib/vendor/phing
svn checkout https://github.com/propelorm/Propel/tags/1.6.5 lib/vendor/propel
最后一步
禁用核心Propel插件并启用sfPropelORMPlugin
。此外,更改Propel和Phing库的位置。
// config/ProjectConfiguration.class.php class ProjectConfiguration extends sfProjectConfiguration { public function setup() { //setup the location for our phing and propel libs sfConfig::set('sf_phing_path', sfConfig::get('sf_root_dir').'/plugins/sfPropelORMPlugin/lib/vendor/phing/'); sfConfig::set('sf_propel_path', sfConfig::get('sf_root_dir').'/plugins/sfPropelORMPlugin/lib/vendor/propel/'); sfConfig::set('sf_propel_generator_path', sfConfig::get('sf_root_dir').'/plugins/sfPropelORMPlugin/lib/vendor/propel/generator/lib/'); $this->enablePlugins('sfPropelORMPlugin'); } }
可选:更新测试项目中propel
和phing
文件夹的引用。
// plugins/sfPropelORMPlugin/test/functional/fixtures/config/ProjectConfiguration.class.php class ProjectConfiguration extends sfProjectConfiguration { public function setup() { $this->enablePlugins(array('sfPropelORMPlugin')); $this->setPluginPath('sfPropelORMPlugin', realpath(dirname(__FILE__) . '/../../../..')); // SVN way //sfConfig::set('sf_propel_path', SF_DIR.'/../lib/vendor/propel'); //sfConfig::set('sf_phing_path', SF_DIR.'/../lib/vendor/phing'); // Git way sfConfig::set('sf_propel_path', realpath(dirname(__FILE__) . '/../../../../lib/vendor/propel')); sfConfig::set('sf_phing_path', realpath(dirname(__FILE__) . '/../../../../lib/vendor/phing')); }
在安装插件后,您应该更新插件资源。
php symfony plugin:publish-assets
在您的项目的config/propel.ini
文件中更改symfony行为路径
// config/propel.ini propel.behavior.symfony.class = plugins.sfPropelORMPlugin.lib.behavior.SfPropelBehaviorSymfony propel.behavior.symfony_i18n.class = plugins.sfPropelORMPlugin.lib.behavior.SfPropelBehaviorI18n propel.behavior.symfony_i18n_translation.class = plugins.sfPropelORMPlugin.lib.behavior.SfPropelBehaviorI18nTranslation propel.behavior.symfony_behaviors.class = plugins.sfPropelORMPlugin.lib.behavior.SfPropelBehaviorSymfonyBehaviors propel.behavior.symfony_timestampable.class = plugins.sfPropelORMPlugin.lib.behavior.SfPropelBehaviorTimestampable
(重新)构建模型
php symfony propel:build --all-classes
Propel 1.6的新特性
Propel 1.6是对Propel 1.4(symfony 1.3和1.4捆绑的版本)的向后兼容演化,它添加了一些非常有趣的功能。在这些功能中,您将找到新的Propel查询API,它本质上是一个加强版的Criteria。
// find the 10 latest books published by authror 'Leo' $books = BookQuery::create() ->useAuthorQuery() ->filterByFirstName('Leo') ->endUse() ->orderByPublishedAt('desc') ->limit(10) ->find($con);
Propel 1.6还支持多对多关系、集合、按需激活、新的核心行为(见下文)、更好的Oracle支持,并且现在采用MIT许可证。
核心Propel行为
Propel 1.6将大多数常见行为捆绑在新的、健壮的构建时间实现中。这些核心行为提供更快的运行时执行和修改数据模型的能力。
sfPropelORMPlugin
允许您从您的schema.yml
中直接注册核心Propel行为。例如,从Section
模型创建树结构
propel: section: _attributes: { phpName: Section } _propel_behaviors: - nested_set id: ~ title: { type: varchar(100), required: true primaryString: true }
提示:请查看此插件源代码中的doc/schema.md
文件,以获取YAML架构格式的完整参考。
您还可以在propel.ini
配置文件中直接为所有模型注册行为。sfPropelORMPlugin
已启用symfony
和symfony_i18n
行为以支持symfony的行为系统和模型本地化功能,但您可以轻松添加自己的行为。
propel.behavior.default = symfony,symfony_i18n,alternative_coding_standards,auto_add_pk
管理生成器扩展
该插件附带了一个名为'admin15'的新管理生成器主题。此主题与sfPropelPlugin的管理生成器主题向后兼容,并基于新的Propel 1.6查询对象提供额外功能。
列表视图增强
- 简单相关对象激活:您不需要编写自定义的
doSelectJoinXXX()
方法来激活相关对象。与之前的peer_method
和peer_count_method
设置相比,with
设置更强大,更容易使用。 - 自定义查询方法:您可以通过设置
query_methods
参数来细化执行的查询,以显示列表视图。这允许在无需额外查询的情况下填充额外的列,或预先过滤列表以隐藏用户不应看到的行。 - 所有列均可排序:虚拟列和外键列现在可以在列表视图中进行排序。您需要设置用于排序的排序方法,但这只需一行代码。不再有列标题无法点击进行排序的列表了!
- 轻松链接到过滤列表:使用新主题,编写到过滤列表视图的链接非常简单。只需添加GET参数,就像您以前使用symfony 1.2中的管理生成器那样,就可以正常工作。
- 链接到另一个管理模块:为了使外键列链接到另一个模块中相关对象的编辑视图,您不再需要创建部分。只需在外国键字段配置中定义
link_module
设置,然后就可以开始了。 - 轻松自定义过滤器:一旦您可以利用生成的Propel查询类,添加自定义过滤器就会变得非常容易。这允许您,例如,在两分钟内设置全文搜索输入,通过使用单个过滤器来替换多个文本过滤器,从而提高可用性。
- 自动排序链接:如果模块是在具有排序行为的模型上生成的,则自动添加记录上移和下移的操作。
筛选和编辑表单增强
- YAML小部件定制:
generator.yml
格式已扩展,允许直接在YAML中定制小部件和验证器,无需编辑表单对象。您还可以在表定义中的display
列表中安全地省略字段,而不会丢失任何数据。 - 纯文本字段:如果您想在表单中显示一些数据而不允许用户编辑它,请使用
type: plain
属性,就像在symfony 1.2的旧日子里一样。这对于由模型管理的列非常有用,如created_at
和updated_at
列。
新admin15
生成器主题的选项已完全在插件源代码中的doc/admin_generator.md
文件中进行了文档记录,并由实际示例进行了说明。
表单子框架修改
- 更新
sfWidgetFormPropelChoice
小部件:该小部件现在使用新的查询API。您可以通过执行自定义查询方法并使用新的query_methods
选项,更轻松地自定义选择列表。 - 更新Propel验证器:
sfValidatorPropelChoice
和sfValidatorPropelUnique
都进行了更新,以使用新的PropelQuery对象,并接受类似于sfWidgetFormPropelChoice
的query_methods
选项。 - 纯文本小部件和验证器:这个新小部件允许在表单中显示字段,而不会让用户更改它。
- 轻松嵌入关系:与主对象一起编辑相关对象(例如,在
Post
表单中编辑Comments
)变得轻而易举。新的sfFormPropel::embedRelation()
方法会自动完成所有工作,以检索相关对象、为每个相关对象构建表单,并将相关对象表单嵌入到主表单中。嵌入的关系表单允许您无需额外代码即可编辑、添加和删除相关对象。
class ArticleForm extends BaseArticleForm { public function configure() { $this->embedRelation('Book'); } }
Propel小部件、验证器和表单类已在插件源代码中的doc/form.md
文件中进行了完全文档记录。
筛选子框架修改
现在,您可以合并或嵌入筛选器到筛选器中,这完全是即插即用的。
class ArticleFilter extends BaseArticleFilter { public function configure() { $this->mergeForm(new AuthorFilter()); } }
路由修改
该插件提供了两个新的路由类,分别是 sfPropelORMRoute
和 sfPropelORMRouteCollection
。这些类默认用于由 propel 管理生成器构建的模型中。它们的行为与之前的 sfPropelRoute
类类似——只是不再使用 methods
选项。相反,使用 query_methods
选项在调用 getObject()
和 getObjects()
时执行一系列任意的查询方法。
author: class: sfPropelORMRouteCollection options: model: author module: author prefix_path: /author column: id query_methods: object: [filterByIsPublished] list: [filterByIsPublished, orderByLastName] with_wildcard_routes: true
query_methods
也可以有额外的参数数组。
author: class: sfPropelORMRouteCollection options: model: author module: author prefix_path: /author column: id query_methods: object: filterByIsPublished: [false] list: filterByIsPublished: [] orderBy: [LastName] with_wildcard_routes: true
sfPropelORMRoute
还让您的代码在动作中更容易阅读。您可以直接使用对象的路线类名调用getter,而不仅仅是调用 getObject()
。
public function executeShow(sfWebRequest $request) { // using sfPropelORMRoute with 'Author' as model $this->author = $this->getRoute()->getAuthor(); }
在 sfPropelORMRoute
和 sfPropelORMRouteCollection
中都新增了一个选项,即 connection
选项,它允许设置要使用的特定的 Propel 连接。示例
author_show: url: /author/:id class: sfPropelORMRoute param: { module: myModule, action: show } options: { model: Author, type: object, connection: my_connection }
author: class: sfPropelORMRouteCollection options: model: Author module: author prefix_path: /author column: id connection: my_connection with_wildcard_routes: true