你使用什么PHP应用程序devise/devise模式?

请和我一起分享您最喜爱的应用程序devise/devise模式以供在PHP中使用。 有些事情我想知道:

  • 你的文件夹是如何devise的
  • 如何在PHP应用程序中使用对象oritentation
  • 你有处理CRUD,分页或其他常见任务的标准方式吗?
  • 你如何避免使用重复的代码? 你有什么方法来图书馆/共享通用代码等?
  • 什么方法可以让你的代码更优雅?

你不必回答所有这些,回答这些或其中一些将是有益的。

我这样问的原因是因为我厌倦了在PHP中编写重复的丑陋代码,我想为自由职业者项目制作一个小框架,这将使编程更容易,让我专注于具有挑战性的任务而不是形成validation,分页以及其他一些普通的活动,这些活动占了PHP编程工作的80%

所有意见表示赞赏

我可能会因此而被拒绝,但是如果你真的想写自己的框架,我会说去做,因为你会从经验中学到很多东西。 这里提到的其他框架是伟大的,经过testing,你不会使用它们做出错误的决定,但这是你的select。

在开始编写你的框架之前,先看看其他框架(在它们的语法,目录结构,命名模式,devise模式等),并试图弄清楚为什么他们做了他们所做的事情,如果有的话,你会做不同的事情。 尝试几个教程,并使用他们的代码,做一些示例应用程序。 如果这样做后,你不喜欢使用它们,然后开始计划你的框架,保持什么工作,改善什么没有。

如果你决定推出自己的产品,下面是我自己的经验推荐的一些东西:

  • 使安全性成为您的首要任务 – 如果您编写数据访问层,请使用绑定参数。 如果你写一个表格类,防止CSRF和XSS。 赶上你的例外,并处理你的错误。 确保你的PHP环境是安全的。 不要尝试使用自己的encryptionalgorithm。 如果你不专注于安全性,那么写出自己的框架是不值得的。
  • 评论你的代码 – 你将需要评论来帮助你记住你的代码在一段时间后是如何工作的。 我通常发现docblock评论是绰绰有余。 除此之外,评论你为什么做了什么,而不是你做了什么。 如果你需要解释一下,你可能需要重构。
  • 单一责任类和方法 – 你的大部分类和方法都应该做一件事,而且只做一件事。 尤其要注意数据库 – 你的分页类不应该依赖于你的数据访问对象,也不应该是几乎任何其他(低级)类。
  • unit testing – 如果你的每个方法只做一件事情,testing它们应该会容易得多,并且会产生更好的代码。 先写testing,然后通过testing代码。 这也会给你更大的自由度,以便在不破坏某些东西的情况下进行重构。
  • 抽象相似类 – 如果你有多个相同类的类,创build一个父类,使用类之间的相似性并扩展它。
  • 委托和模块化 – 如果你正在编写一个validation系统(你可能会这么做),不要把每个validation器作为一个超validation类中的方法。 将它们分成单独的类并根据需要调用它们。 这可以应用于很多领域:filter,语言,algorithm,validation器等等。
  • 保护和私有化 – 在大多数情况下,最好使用getter和setter方法,而不是直接访问类variables。
  • 一致的API – 如果你有一个render()方法和一个draw()方法在不同的类中做相同的事情,那么select一个,并在所有类中使用它。 对于使用相同参数的方法,保持参数的顺序相同。 一致的API是一个更简单的API。
  • 记住自动加载 – 类名可能会变得笨重而长,但Zend命名类和组织目录的方式使得自动加载更容易。 更新 :从PHP 5.3开始,您应该开始使用名称空间。
  • 永远不要回显或打印任何东西 – 把它作为返回值,让用户决定是否应该回显。 很多时候你会使用返回值作为另一个方法的参数。
  • 不要试图解决世界的问题 – 解决你自己的第一个问题。 如果你现在不需要一个function,比如本地化数字或date或货币的类,不要写它。 等到你需要它。
  • 不要预优化 – 在微调之前,用你的框架构build一些简单的应用程序。 否则,你可以花费大量的时间在没有生产力的地方。
  • 使用源代码pipe理 – 如果您花费无数个小时创build杰作,请不要冒险迷失方向。

我不得不同意上面的海报。 如果您在使用PHP进行编程时不使用框架,那么确实是用双手绑在背后编程的。 我个人推荐CodeIgniter 。 这是最快的框架,很容易学习,并且有一个非常活跃的社区。 您的所有问题都将由框架回答:

* How your folders are designed 

CodeIgniter(或者任何相关的框架)把你的逻辑分成视图,模型和控制器,每个视图都有自己的文件夹。

 * Do you have a standard way of dealing with CRUD, pagination, or any other common tasks? 

CI有一个分页库,它有像DataMapper这样的第三方库,用于以面向对象的方式(ORM)封装你的CRUD调用。

 * What are ways in which you can make your code more elegant? 

模型,视图和控制器的分离使代码非常优雅。

(使用框架时,我没有回答的两个问题几乎是隐含的)

我想很多PHP开发人员都遵循类似的路线:小脚本 – >程序/内联代码 – >可能看看模板 – > OOP – >然后框架。 我认为PHP开发人员可能已经习惯于使用PHP“成长起来”,学习devise模式以匹配当前版本的可用function,这是相当普遍的。

MVC是当今stream行框架中最常用的devise模式。 CakePHP是我的首选框架,尽pipeSymphony和Zend也很受欢迎 – 值得尝试一下,很快就会变得很明显,你会感觉最舒服的。

对于大多数项目(快速开发和可移植代码是优先考虑的),我使用Cake,但是对于轻量级应用程序(我最近开发的一个是Good Baad ),您希望快速运行(在低规格硬件上),并且不需要由大型框架之一的function所增加的体积/重量我推荐阅读Rasmus Lerdorf关于他的No Framework PHP MVC框架的文章。

基本上,如果你是在一个真正的面向对象的语言,鼓励漂亮的代码和最好的devise实践之后,PHP总是会失去像Ruby Python和C#的。 但是,PHP有其优点,例如不需要模板语言(它是一种),PHP可以非常快速且廉价地运行,并且不需要为所有应用程序提供大型框架。

我鼓励采用一种devise模式,将devise模式的可pipe理性(如MVC)与PHP的优势结合起来。

我几乎感觉像是一个破碎的logging,但我build议你看看一些常见的框架,有两个原因:

  1. 即使你select不使用,其中一些写得很好,devise也很好。 我特别喜欢Zend Framework,但我会在一秒钟之内回来。
  2. 问自己为什么要重新发明轮子。 你真的觉得你理解其他人面临的相同的devise问题比背后的社区要好得多吗(在这里插入select的框架)来certificate从头开始写点东西是正确的吗? 作为一个最初研究几个框架的人,他们认为他们太大了,提出了太多的学习曲线或者太多的开销,所以我自己开发了,我可以告诉你,从头开始写自己是一个很大的痛苦,如果你可以简单地使用现有的,可以很容易地扩展。

说到使用一个可以轻松扩展的框架,我对Zend Framework有非常积极的经验。 它是内聚的,而松耦合的结构使得可以快速和容易地扩展任何现有的组件,并且整个框架围绕这个想法devise,即您将需要编写自己的帮助器和插件类来添加其整体function。

我发现Zend Framework是非常灵活的,我运行一个单独的网站作为Zend Framework MVC的一部分,并成为我旧的糟糕的框架,甚至更老的代码,我还没有重写。 事实上,因为在我们的重写过程中,我们发现使用旧框架的页面运行速度慢得让人难以接受,所以我已经将单页切换到了Zend Framework架构下运行。

要回答您的一些问题,我build议您查看Martin Fowler的企业应用程序体系结构模式。 他提供了许多有关如何解决这些常见问题的宝贵见解,例如如何在应用程序中创build数据库交互层。 福勒还涵盖了MVC和Front Page Controller等主题。

我在这里解释了我的大多数PHP方法。

但现在,我只是在任何地方使用Django。

当我第一次厌倦了混合代码和html时,我开始使用smarty模板引擎。 经过一段时间的黑客攻击,我意识到编写自己的框架只是重复工作。

我已经做了一些Joomla项目,这是一个真正的CMS,但它给客户很多的内容控制。

最终,我已经决定使用一个真正的框架为我的项目。 我使用的是symfony ,它受Rails的启发,并且有很好的文档logging,但是我听说cakePHP和ZendFramework也非常好。

我使用Zend Framework,它几乎定义了文件夹布局和OOP(MVC范例)。 对于常见的任务,例如分页我使用Zend_Paginator (我的模型类实现Zend_Paginator_Adapter_Interface ),为了validation我使用Zend_Validate类等。由于我可以完全专注于业务逻辑,而不是重新发明轮子。

使用Zend Framework和Doctrine ,我的文件夹结构通常如下所示:

 root app config (db config, routing config, misc config) doctrine (fixtures, migrations, generated stuff, etc) lib logs models (doctrine models) modules (zend mvc modules) bootstrap.php docs (db diagrams, specs, coding standards, various docs) pub (web root) tests tools (console tools, ie doctrine-cli) vendor (zend and doctrine libraries, preferably as svn-externals) 

我一直在搞我自己的东西一段时间,现在每次我都无法完全完成它,因为我被卡住了。

然后,我来实现我是否做对了一部分。

因此,我已经放弃了写我自己的一个人群最喜欢的:Zend。

我看着别人,但似乎Zend已经有一段时间了,他们知道他们的事情。

MVC也是我现在写的东西。