和symfony一起经营电视台欧宝娱乐app下载地址
OktoLab GmbH是一家位于奥地利维也纳的小公司,专门在电子媒体领域提供硬件和软件服务,主要是视频和电视制作。这包括出租摄像机或视频编辑工作站等设备,以及编辑/剪辑服务和软件开发。主要客户是Okto TV,这是一家依靠公共资金运营的社区电视台。欧宝下载链接
当我(David Hermann)在2008年年中加入OktoLab时,我们不得不面临一些严峻的挑战。之前的开发人员在短时间内就离开了公司,留下了各种各样的软件服务,这些服务要么松散地耦合,要么根本没有耦合:
- 程序规划软件(PHP4/Postgres)
- 一个电子表格文件和一个带有粘性标签的白板来完成计划阶段
- 一些计划还必须在iCal中可视化
- 一个地址簿和培训计划(Ruby on Rails/Postgres)
- 用户帐户管理器(PHP4/LDAP)
- 电视剧经理(Cocoa/Postgres通过PHP服务)
- 库存和租赁管理器(PHP4/MySQL)
- 为各种任务提供大量的shell脚本(bash, PHP)
- 多博客网页的测试版Wordpress MU实例
这种情况不是由开发商造成的,而是公司发展的结果。然而,情况已经失控,所以有巨大的压力来改善它。2008年夏天,我在这里,一堆粗糙的应用程序摆在我面前,没有相似之处,还有一个明确的下一步要做的指示:
“取代节目策划和电视剧软件,让它们更好用。一定要选择一个坚实的基础来建造。”
于是我照做了。但如何?
项目开始
那时我有大约7年的PHP经验,包括PHP3/4(我在早期的phpBB社区很活跃)和OOP PHP5,几个月前完成了一个巨大的项目。欧宝下载链接但这项任务需要另一种方法,我开始寻找一个框架来帮助我有效地完成这项工作。经过一番搜索和评估,我不得不在CakePHP, Zend Framework和symfony之间做出决定。欧宝娱乐app下载地址欧宝娱乐app下载地址Symfony刚刚发布了1.1版本,我立刻被它简单而可扩展的工作方式和出色的文档所吸引。欧宝体育电话在检查了所有的需求后,我决定支持symfony,我从来没有后悔过这个决定,也没有怀疑过这是一个正确的决定。欧宝娱乐app下载地址
后来事情进展得很快。我们事先做了大量的计划和评估,所以每天的工作流程可以描述得尽可能详细。这是项目的一个非常重要的阶段,因为我们发现迄今为止使用的软件根本不能满足需求。除此之外,电视时间表的规划能力非常有限,令人不满意。
我很快创建了最初的几个模型定义和用户界面,大多数事情都按照预期进行。因为当时Doctrine还没有完全稳定,所以我决定使用更成熟的Propel作为我的ORM。这个决定也被证明是好的——我从来没有遇到过任何严重的ORM问题,所以我能够专注于应用程序本身。
升级到symfony 1.欧宝娱乐app下载地址2并了解表单
在symfony 1.2发布欧宝娱乐app下载地址后不久,我决定升级这个项目。因为有相当多的部分做得不是很好(例如控制器中有太多的代码,以及有很多依赖关系的表单),我利用这个机会重构了最明显的错误。填写正确的表格实际上比预期的要困难得多。该应用程序使用大量手工制作的表单,需要自定义输入,例如使用位图保存在单个字节(7位)中的工作日选择器或具有动态添加选项的多个嵌入式表单。
在深入研究了表单代码库和当时不太完整的表单文档之后,我终于正确地使用了它们,并发现了如何正确使用表单。欧宝体育电话这是18个月学习和使用symfony过程中最困难的部分之一,但每一分钟都是值得的:现在所有的表单都完全按照我想要的做,不管它们有多复杂。欧宝娱乐app下载地址我不得不编写一些自定义小部件和验证器,但一旦您习惯了它,它就非常简单而且非常强大。
JavaScript和AJAX
项目的另一个重要部分与symfony关系不大,但也必须进行集成:一个完全动态的日历欧宝娱乐app下载地址视图来取代iCal“解决方案”。为此我使用了jQuery,它工作得很好。使用AJAX将日历连接到symfony应用程序非常简单。欧宝娱乐app下载地址
旁注:您知道没有一个日历应用程序或库可以正确地显示夏令时切换时间(3月为+1,10月为-1)吗?我很惊讶,但除了电视台,似乎没有人需要这个功能!考虑到这一点,也许有一些工作时间的会计应用程序,但我从未见过。
其他一些AJAX函数也很容易实现。控制器/动作部分的清晰分离使得向symfony添加AJAX变得轻而易举。欧宝娱乐app下载地址
资料及验收
从项目的一开始,提供真实的测试数据就非常重要。这是通过创建一个命令行导入器来完成的,该导入器从Postgres数据库中提取所有现有数据并将其推入新模型。这样,作为我们测试用户的一小群关键人员就总是拥有可以与现有软件进行比较的最新数据。
强制用户接受的另一个重要方面是在项目开始时创建一个吸引人的视觉风格。外部设计师出色地提供了一个基本模板,可以快速集成,使应用程序不仅表现出色,而且外观出色。因此,用户非常期待2009年10月的正式发布日,届时旧的规划软件将被禁用,取而代之的是新的symfony驱动的程序规划工具。欧宝娱乐app下载地址
连接世界其他地方:API
使用symfony强大的REST功能,很容易实现读写接口,这些接口支持与外部世界欧宝娱乐app下载地址的各种连接的各种输出格式。这些接口包括视频文本的生成、网站上的在线程序、播放服务器的播放列表等等。symfony再次展示欧宝娱乐app下载地址了其强大的灵活性和易于使用的语法。
最重要的接口之一是程序数据交换接口。有许多“消费”应用程序需要了解电视节目表。它们中的大多数以简单的XML格式接收数据。
- 每当在播放系统上播放一个新文件时,脚本就会请求即将到来的节目数据来更新空中视频文本。
- 主页日程总览通过获取未来3周的数据并上传到web服务器,每天更新5次。
- 使用简单的XSL转换,可以将相同的XML数据转换为iCal格式,以便在任何日历应用程序中都可以查看。
- 以RSS格式提供系列节目(例如特定系列的网页)将很快推出。
- 为了与电视杂志交换时间表,它还以各种专有的XML格式提供。内容从API中提取并上传到杂志的FTP服务器。
该API还用于与合作的社区电视台和公共媒体档案交换内容元数据。欧宝下载链接与程序API相反,它还提供写访问。
此外,一些系列相关元数据定期发布到视频文本服务器和网站上。
该API可通过与前端分离的symfony应用程序使用,因此它可欧宝娱乐app下载地址以使用不同的安全性和缓存选项。这也很容易允许API在不同的服务器上运行以供外部访问。
另一个迁移:symfony 1.3/1欧宝娱乐app下载地址.4
目前(2010年初),程序规划软件正在移植到symfony 1.4。欧宝娱乐app下载地址大部分的工作已经完成了(其实并没有那么多,因为代码一开始就很干净),也没有什么意想不到的困难,所以只有一些小的事情需要调整,例如一些表单小部件扩展了其他小部件的轻微变化。考虑到symfony 1.4将有整欧宝娱乐app下载地址整3年的支持,在一个稳定的环境中,软件的完整生命周期将至少跨越4年,这在这个快节奏的网络软件世界中是相当长的时间。
那其他的项目呢?
在初始阶段完成,程序规划软件开始成型后,其他应用程序也进行了部分重写或现代化。到2010年年中,Okto TV上的每一个应用程序都将运行在symfony上——甚至Wordpress网站也将被symf欧宝娱乐app下载地址ony驱动的CMS所取代(这是一项正在进行的工作)。应用程序之间的所有接口都将使用干净的REST实现。更换每一个应用程序总共需要2年时间,这其实很短。
如果没有symfony的强大功能和灵活性,这一切都不可能实现。欧宝娱乐app下载地址仅程序规划软件现在就使用了超过60个数据库表,并且还在定期添加更多的表,而且由于最重要的组件已经使用事件分派器而不是直接调用进行了解耦,因此还有很大的进一步扩展空间。
另一个有趣的项目是各种视频处理任务的自动化,比如格式转换。为此目的创建的批处理队列系统已经接近完成,但其中包含的有趣细节足以写成另一篇完整的文章。
组织的影响
从客户的角度来看,在大量的工作投入到新软件的创建之后,最重要的问题是:收益是什么?总的来说,我们可以看到完成工作所需的时间减少了约30%。是的,新软件节省了大约三分之一的时间,而旧软件所需的时间甚至更少!这不是1个人的30%,而是4个人的30%,这使得其中一人完全可以用于其他任务,如视频材料的质量或内容检查。检查视频甚至比在iCal推广播日期更有趣!
这主要是因为我们花了大量时间去分析和优化所有的工作流程。过去单独计划一天需要3-4个小时,而现在大约10分钟就能完成(而且更不容易出错)。如果没有symf欧宝娱乐app下载地址ony的灵活性,这是不可能的!
作者简介
大卫·赫尔曼(David Herrmann)是一位年近30岁的机械、电子和软件工程师,他喜欢任何一种技术东西,只要它能提供新的创造性的使用方式。他曾在各种平台上使用多种语言编写代码,但主要是PHP、Java和JavaScript。不工作的时候,大卫会花时间和家人在一起或骑自行车。他有时会写一些关于软件开发的文章blog.vworld.at
本案例研究由symfony框架的用户提供,并在相关各方的许可下发布。欧宝娱乐app下载地址您是否有兴趣将您的案例研究发表在symfony博客上?欧宝娱乐app下载地址欢迎联系我们的社区经理Stefan Koopman欧宝下载链接schap (Stefan。Koopmanschap at - sy欧宝娱乐app下载地址mfony-project - dot - com)。
评论
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
@Davide:我们坚持使用《Propel》,因为切换到《Doctrine》只会让人头疼。因为到目前为止,Propel工作得很好,规模也很大,所以没有理由更换。
我个人也更喜欢getter和setter直接访问属性,原因如下:
a)它感觉更干净(这是我对Java的看法;-),它允许更干净的界面
b)由于各种原因,我不得不重写许多getter和setter
C) setter链是人类历史上最伟大的发明之一;-)
@Marc:出于好奇:那是哪家地方电视台?你也可以给我发邮件:david [[at]] vworld。在;-)
我想知道,既然事件分派器是一个相当新的和强大的概念,并且您说您正在广泛地使用它,也许您可以展示一些如何使用它的示例?那会很震撼的。
谢谢,
丹尼尔