从框架走向无框架[关闭]


89

作为一种业余爱好,我已经在PHP中开发了大约8年。在2009年,我选择了Codeigniter,从那时起,我一直没有开发出一个项目。

我发现,如果我使用纯PHP工作,我会知道,或者能够快速找到相应代码段,这使我无法尝试修改其工作方式以达到所需的方式。

我已经尝试了CodeIgniter,Kohana和Symfony。我喜欢它的易用性(我也已经开始使用doctrine作为ORM,这极大地加速了我的数据库工作),但是我发现项目花费的时间是纯PHP的3-4倍。当我找不到以前用纯PHP解决的问题的解决方案时,我感到无聊和沮丧。

有没有人从使用框架转变为无框架方法。是否有类似基本安全框架的内容(防止XSS,过滤发布的数据,提供用于数据库的清除功能)?我认为类似的事情比全面框架能给我带来更多好处。我认为学习使用框架已经教会了我很多东西,但是我会更高兴使用自己的代码。


5
我很想听听您为什么说使用框架要比无框架花费3-4倍的时间。.您介意对此进行更多说明吗?
卢克曼

7
CI或任何框架的好处之一是,它迫使您进入设计模式,对于不习惯于您的特定开发风格的开发人员而言,它更易于维护。同样,在较大的环境中,将视图与逻辑分开是必不可少的,因此CSS专家可以在不踩踏开发人员脚趾的情况下完成他们的工作。
凯尔·诺兰德

1
很好的问题,如果可以选择的话,我会使用纯PHP。但是大多数时候,我工作的人都希望我使用框架,所以我只收取额外的时间:)我觉得自己的代码可读,井井有条,稳定。也许他们担心如果发生灾难并且所有代码都处于“您无法自定义的自定义框架”状态,必须让您继续工作。
SSH

Answers:


101

当前版本的PHP5包含许多您正在寻找的标准框架安全框架。

如果您接受HTML作为输入,建议您抓取HTML Purifier并通过filter_input_array设置中的FILTER_CALLBACK行调用它。它基于白名单的输入安全性方法是针对XSS的强大(非常强大)的第一道防线。

据我所知,PHP没有提供防止跨站点请求伪造的机制,但是我确信Google可以帮助您。在OWASP安全备忘包括在其上的部分,如果你想实现自己的保护。

出于好奇,我决定也开始研究独立组件,这是到目前为止我发现的内容:

模板:

  • PHP模板继承(常规PHP加上模板继承)
  • TWIG(Django / Jinja2 / Liquid样式的语法,包括自动转义和沙箱。编译为高速缓存的PHP以提高速度。)
  • DwooSmarty的更快,更强大的PHP5样式的继承者。包括与现有Smarty模板的兼容性系统。)

我仍然没有适当研究的东西:

  • 路由调度(到目前为止,仅找到RouteMapNet_URL_Mapper。谢谢cweiske。)
  • ORM(以防裸PDO不是您的事)

谢谢,所有非常好的建议,我现在就开始研究它们!
Alex C 2010年

4
如果需要模板引擎,请换取Smarty for Dwoo。从功能上讲,它几乎与Smarty相同,但不会融合CPU。
菲尔·斯特金

pear.php.net/package/Net_URL_Mapper是一个路由调度程序。
cweiske 2011年

4
如果框架使您放慢速度,则应避免使用模板引擎,尤其是像鼠疫这样的Smarty。它们的含义很好,但是它们只是创建一种新的,非直观的方式来完成PHP已经完成的工作。
猫头鹰

取决于您要完成的工作以及框架为什么会使您减速。
ssokolow

10

我不相信框架...我曾在许多框架中工作过。

讨厌MVC框架的原因:

1)代码膨胀,我购买了有助于我发展的高级课程。例如表单类或SQL类。

2)我相信MVC框架不容易移植,尤其是在使用依赖项管理器时。

3)我相信,如果您不得不使用带有大量处理身份验证等有用类的样板,那么实际上您可以使用MVC框架编写更多代码。

4)大多数框架本机也只适合一两个数据库。

我建议您找到一个带有身份验证和文本编辑器的表单框架,以及一个类似于madoo和电子邮件类的sql框架...

您90%的应用程序始终是表单,sql和ajax类-其余的仅在需要时可以获取

我是一个极简主义者,我想让应用程序中的代码不执行任何操作……以防万一我需要它对我不起作用。


关于“我购买高级课程”的说法:您从哪里购买此类课程,目的是什么?谢谢。
dotancohen 2015年

我同意。同时,许多框架也对性能产生了很大的影响。
developerbmw

8

有了这么多的经验,您必须拥有一套自己喜欢的库,手工挑选它们并提出自己的简单框架。框架或没有框架(以及那个框架)取决于当前项目的类型,没有什么适合所有人的。因此,我强烈建议您,如果您认为现有的框架正在减慢您的速度,请花一些时间并提出一个可以根据您的需求工作的框架。


8

根据您一直以来将PHP用作业余爱好的声明以及您的配置文件声明“慢慢到达那里”,这似乎是一个学习曲线问题。您似乎没有经验的深度和广度,无法a)了解如何在框架强加的结构中工作,以及b)因此无法从框架实现的效率中受益。

我敦促您坚持下去。返回到视频教程的开头。找到并阅读其他人的代码,直到您理解为止。从头开始构建项目-简单地开始,然后添加功能。关注论坛,尝试在阅读答复之前自己回答问题。

我在各种平台上从事专业编程已经近20年了,但花了我一段时间才适应CI。但是现在我就不会再使用纯PHP(针对我自己的项目)了,除非我拥有一个规模足够大的站点,以至于暴露了可量化的性能问题(例如Twitter)。


无论我是否也喜欢框架,我仍然处于临界点。我肯定理解了OP的观点,但是我也看到了您的观点...学习框架就像学习一种全新的语言。您必须了解框架的工作方式。但是,我要努力解决的另一件事是,如果我的工作方式哲学与框架哲学不同。我仍在寻找适合我的一个。(等不及.NET MVC3)
mpen 2010年

到目前为止,我还不知道任何其他框架,所以我不能一概而论。但是使用框架不是一个全有或全无的主张。例如,我发现CI的缓存库(页面,数据库)不足且不容易扩展。因此,我使用了第三方缓存库(Phil Sturgeon's),对此我感到非常满意。
coolgeek

坚持使用它的另一个重要优点是,它使得以后学习其他框架变得相对容易。这就是为什么您经常看到指定特定框架(例如CI)的工作清单,但要说明具有类似框架(例如Zend或Symfony)的经验。
coolgeek

2

Zend Framework真的是超强的。您可以根据需要使用任意数量的元素。它全部用php编码并开放源代码,因此您可以破解它并自己制作。不同组件之间的依赖程度不像其他框架那样。

您可以使用Zend的某些组件构建自己的简单框架,而不会出现任何问题。

看看吧!


3
他正试图摆脱框架。
WarmWaffles

1
@WarmWaffles。Wich就是为什么我谈到使用ZF的部分。令人惊讶的是,您不希望这个家伙为所有事情重新发明轮子。
Iznogood

2
伊兹诺古德有一个很好的观点。ZF不仅仅是一个框架。我发现这些软件包对于执行许多常见任务非常有用,并且没有强迫您使用其MVC模式或数据库访问方法或其他任何东西的有用信息。当然,您也可以使用Pear模块。
鲍勃·巴德利

2
是的,图书馆也是一个框架。但是,他正在寻找易于使用的东西,而上次我检查Zend的命名空间混乱且难以输入时。@Bob_Baddeley PEAR是个好建议
WarmWaffles

@WarmWaffles我想对每个人都好。也许您现在可以在1.10.x重新检查Zend,然后说1.8完全不同。
Iznogood

2

我确切地知道您的感觉。我4到5年前开始使用PHP(我来自Delphi,哈哈),然后开始使用纯PHP。我得到的是一个“ CMS面板样”,仅读取所有表字段并创建表单。一段时间之后,我以某种方式了解了PHP框架的知识,我首先尝试了CakePHP,之后我不喜欢,后来进入Yii的想法是非常直观且易于使用的(有了Gii生成器,它几乎可以动摇了)。我尝试了Symfony,ZF2,Laravel,Yii2-Beta和RAD的一些框架,但仍然感觉不如之前的框架快。

碰巧我开发了自己的框架(很自然地,有一天我醒来并说“我要创建一个新框架”,这不时发生)。我知道这是一个不好的坏习惯,并且“重新发明轮子”是个坏习惯,但是,我现在开发项目的速度要快得多(不仅限于PHP)。

由于它的代码是一个完整的MESS,所以我大约一个月前开始重新构造我的框架,现在它使用composer,遵循php框架之间存在的通用规则,即MVC。

为什么要重新配制?因为如果有人需要修理我的项目,那将不是另一回事。

所以我了解你。

我的建议是,准备您的工具(将其称为框架,预设应用程序或任何人称呼它的工具),并以您感觉较好的方式使用它,但仍要遵循一些通用规则(如MVC,“易于模块化”的东西您可以在损坏的情况下进行更换。


1

为了基本的安全性,我使用了一个自定义过滤器方法来包装我的superglobals。它的语法需要一些习惯,但比PHP filter_var()API简单,并且不允许您进行清理:

 $_GET->text("inputvar") or $_POST->name["field"]

它还允许内联$ _REQUEST-> sql()进行转义。但是对于数据库工作,请继续使用参数化的SQL或您选择的DAL / ORM。


那绝对是一个聪明的解决方案,但是我不确定为什么您认为过滤器API很麻烦。如果有的话,我认为filter_input_array()非常好。(从根本上讲,因为它使以一种合理的声明方式在一处定义给定请求类型的所有输入变得简单。永远不要低估这种事情的好处。)
ssokolow 2010年

@ssokolow:的确,filter_input_array()一口气就能做到。但是filter_ *函数已经具有太多的灵活性,并且太多的参数不适合它。这就是为什么我认为人们会避开它(即使从技术上来说这是一个很好的解决方案)。
马里奥

也许。我认为部分问题是,除了最近进入这个世界上,仍然有很多人在他们的书架上摆着PHP4书籍之外,它的广告宣传不足,官方文档不够清晰,而W3Schools文档往往会分享Google最高业绩的信息还不够全面。
ssokolow


1

我不知道是什么困扰着您,但codeigniter是一个不错的框架。它有不错的文档,并且由于很多人使用codeigniter,因此您会在其文档,论坛或stackoverflow中找到所有帮助。我在许多框架上工作( Codeigniter,CakePHP,Zend,Spring 3.0,Ruby on Rails),但我必须说Codeigniter具有最好的文档。Codeigiter中有很多东西是自动处理的,您不必担心安全性。使用核心PHP就像重新发明轮子。最重要的是,一旦习惯了从内核到框架的过渡,您将需要付出大量的努力,您才会开始喜欢它。一旦知道了它的来龙去脉,Ruby on Rails也是一个很棒的框架有双倍的速度。


2
自从我发布此文档以来已经过去了两年多,实际上我曾经使用纯PHP进行过一段时间,但是此后又转换回了PHP-完全正确,它非常易于使用。我当前的首选设置是CI,数据库使用phpActiveRecord,模板使用Twig。
Alex C

是的,phpActiveRecord看起来不错。您是否曾经尝试过Laravel?(laravel.com)我想您会发现它默认具有内置的CI,phpActiveRecord和Twig的最佳功能。我本人曾是CakePHP开发人员,但最近热衷于研究Laravel。
西蒙东
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.