我已经看到代码编写,几乎所有非路由相关的代码都传递给模型.我还看到了代码,其中所有数据库持久性都由模型处理,但非DB处理由控制器处理.
哪种方法更好?
我见过很多人说Symfony2,Zend Framework 2和其他人都是事件驱动的.
在桌面世界中,通过事件驱动编程,我了解应用程序将在其状态发生变化时通知其观察者.
由于PHP应用程序是无状态的,因此无法做到这一点.IE将观察者绑定到视图,观察用户使用界面时的更改.相反,它需要一个新的请求过程才能更新视图.所以,这不是一个事件,而是一个全新的要求.
另一方面,有一个类似的概念:事件驱动的架构.
在这里你可以阅读:
http://en.wikipedia.org/wiki/Event-driven_programming
http://en.wikipedia.org/wiki/Event-driven_architecture
另一个是:
http://en.wikipedia.org/wiki/Signal_programming
信号是向进程发出事件发生的通知.信号有时被描述为软件中断.信号类似于硬件中断,因为它们中断了程序的正常执行流程; 在大多数情况下,无法准确预测信号何时到达.
- Stackoverflow [singals]标签描述
而且,我以前称之为事件驱动的东西似乎与Qt引入的信号和插槽模式更相关(观察者模式实现)
举个例子,Prado框架声称是事件驱动的:
http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Applications(应用程序生命周期部分)
http://www.pradosoft.com/docs/manual/System/TApplication.html#methodonEndRequest
IIRC,这不是一个事件驱动的应用程序,而是只是实现该类的类所使用的插件钩子(信号和插槽)observable Interface
.我的意思是,考虑桌面应用程序使用事件的方式以及无状态应用程序使用事件的方式(作为插件):第一个使用整个应用程序的事件,包括视图,最后一个仅用于服务器端操作.
一个与面向方面的编程(带信号和插槽)更相关,另一个与横切关注点/AOP 没有特别的关系.换句话说,它与应用程序状态更相关.
那么,实际上这些术语之间的关系以及它们之间的区别是什么?
这些术语只是通用模式吗?因此,实现观察者模式的所有内容都可以被视为事件驱动的?
UPDATE
Zend框架2
我上面链接的关于AOP的文章(http://mwop.net/blog/251-Aspects,-Filters,-and-Signals,-Oh,-My!.html)由Matthew Weier O'Phinney撰写( ZF领袖).IIRC,它没有提到"事件驱动",只提到信号和插槽.
Symfony 2
Symfony2
EventDispatcher
组件描述没有提及"事件驱动"应用程序:http: //symfony.com/doc/current/components/event_dispatcher/introduction.html 它只包含对"事件"的引用(确实,由信号和插槽处理).
两个框架似乎都使用信号和插槽中的拦截过滤器模式,以便在请求过程中处理同步事件.
我正在重写一个大网站,需要非常扎实的架构,这里是我的几个问题,请原谅我混合苹果和橙子,也许还有奇异果:)我做了很多研究,最后完全糊涂了.
主要问题:您将采用哪种方法来构建一个预计会以各种方式增长的大型网站?
单个入口点,数据库中的页面数据,通过将GET变量与数据库条目相关联来拉出(?pageid = whatever)
单个入口点,页面数据在单独的文件中,包含基于GET变量(?pageid =包含whatever.php的任何内容)
MVC(好吧,伙计们,我都是为了这个,但是除了检查所有的教程和框架之外无法掌握这个概念,他们是否将"视图"存储在数据库中?从示例中可以看出,如果你有1000页相同的话它们可以由1个模型塑造,但我仍然需要1000个"视图"文件?)
PAC - 这对我来说听起来更合乎逻辑,但没有找到太多资源 - 如果这是一个好方法,你能推荐任何书籍或链接吗?
DAL/DAO/DDD - 在发布问题之前,我通过努力阅读堆栈溢出来了解这些术语.不确定它是否属于此列表
坐下来创建我自己的架构(如果没有人在这里启发我可能会这样做:)
没有提到的东西......
谢谢.
我正在研究原型使用文档数据库(目前MongoDB,可能会改变),并发现.NET驱动程序有点痛苦,所以我想我会用Repository模式抽象数据访问.这应该可以很容易地将你正在使用的任何驱动程序(NoRM,mongodb-csharp,simple-mongob)替换为你的杀手f#mongodb驱动程序,它在准备就绪时不会吮吸.
我的问题是关于添加操作.这将对数据库产生一些副作用,因此对All的后续调用将会有所不同.我应该关心吗?在C#传统上我不会,但我觉得在F#我应该.
这是通用存储库接口:
type IRepository<'a> =
interface
abstract member All : unit -> seq<'a>
// Add has a side-effect of modifying the database
abstract member Add : 'a -> unit
end
Run Code Online (Sandbox Code Playgroud)
以下是MongoDB实现的外观:
type Repository<'b when 'b : not struct>(server:MongoDB.IMongo,database) =
interface IRepository<'b> with
member x.All() =
// connect and return all
member x.Add(document:'b) =
// add and return unit
Run Code Online (Sandbox Code Playgroud)
在整个应用程序中,我将使用IRepository,从而可以轻松更改驱动程序和可能的数据库.
调用All很好,但是添加我希望的是而不是返回单元,返回一个新的存储库实例.就像是:
// Add has a side-effect of modifying the database
// but …
Run Code Online (Sandbox Code Playgroud) array_unshift ($ids,$product_id => $catalog_tag);
Run Code Online (Sandbox Code Playgroud)
如果我放
array($product_id => $catalog_tag)
Run Code Online (Sandbox Code Playgroud)
会工作,但不会添加$ product_id作为关键..我想在开始时添加它
我的问题是如何从应用程序的模型层抽象数据库连接?主要关注点是能够轻松地从不同类型的数据库进行更改.也许你从一个平面文件,逗号分隔的数据库开始.然后,您想要移动到SQL数据库.然后您决定LDAP实现会更好.一个人如何轻松地计划这样的事情?
举一个简单的例子,假设您有一个名字,姓氏和电子邮件的用户.表示它的非常简单的PHP类可能如下所示(请忽略公共实例变量的问题):
<?php
class User {
public $first;
public $last;
public $email;
}
?>
Run Code Online (Sandbox Code Playgroud)
我经常看到人们有一个DAO类,其中嵌入了SQL,如下所示:
<?php
class UserDAO {
public $id;
public $fist;
public $last;
public $email;
public function create( &$db ) {
$sql = "INSERT INTO user VALUES( '$first', '$last', '$email' )";
$db->query( $sql );
}
}
?>
Run Code Online (Sandbox Code Playgroud)
我这样的策略的问题是当你想要改变你的数据库时,你必须改变每个DAO类的创建,更新,加载,删除功能来处理你的新类型的数据库.即使你有一个程序为你自动生成它们(我不是特别喜欢它),你必须编辑这个程序才能使它现在正常工作.
你对如何处理这个问题有什么建议?
我目前的想法是为DAO对象创建一个超类,它有自己的创建,删除,更新,加载函数.但是,这些函数将获取DAO属性的数组并生成查询本身.通过这种方式,唯一的SQL是在SuperDAO类中,而不是分散在几个类中.然后,如果要更改数据库层,则只需更改SuperDAO类生成查询的方式.好处?缺点是什么?可预见的问题?黄金三镖客?
我有两张桌子.一个是提交给我们的报告表.另一个是临时表,其中包含最终应提交给我们的报告记录.我想只显示临时表中与报告表中的记录不匹配的记录(因此显示仍然必须提交的报告).
示例数据是:
Reports table:
CREATE TABLE [dbo].[Reports]
(
[ReportID] [int] IDENTITY(1,1) NOT NULL,
[ReportDate] [date] NULL,
[AssessmentID] [int] NOT NULL,
[ReportType] [varchar](50) NULL
);
AssessmentID ReportType ReportID
1 1st Quarterly 27
2 1st Quarterly 30
2 2nd Quarterly 31
2 3rd Quarterly 32
QuarterlyReportsDue table:
CREATE TABLE #QuarterlyReportsDue
(
AssessmentID INT,
InstallationDate DATE,
QuarterlyReportType VARCHAR(50)
);
AssessmentID InstallationDate QuarterlyReportType
1 2009-08-14 1st Quarterly
1 2009-08-14 2nd Quarterly
1 2009-08-14 3rd Quarterly
1 2009-08-14 4th Quarterly
2 2008-05-16 4th Quarterly
2 …
Run Code Online (Sandbox Code Playgroud) 每个Web开发人员应该知道哪些必须知道的MYSQL函数(如IF等..)?
我有一个带有文件上传字段的表单,我已经创建了一个模型行为文件来处理文件处理.
我有两个函数,beforeSave和afterSave:
在beforeSave中我做了一些事情,然后将数据中的文件值设置为null,以便保存.否则它会尝试保存数组,而数据库只需要一个字符串(文件名)
在afterSave中,我根据表单上的一些文本字段生成一个新的文件名,并在其前面添加lastInsertId.我还将文件从temp移动到所需位置.这一切都很好,但是当我尝试将新文件名保存到模型时,它就不起作用了.
我做了很多测试和调试,也花了几个小时在线搜索.结论是你不能保存在afterSave中,它会自动触发并在之前再次运行.
所以我的问题是,如何更新新插入的模型?插入的文件名需要在其名称中包含主键,并在beforeSave时具有未知.
感谢任何帮助!贾森
读取查找最近30分钟未访问/修改的文件?我对变更时间和访问时间之间的差异感到困惑.
你能详细说明差异并找出你的陈述吗?