作为一个爱好,我已经用PHP开发了大约8年.在2009年,我选择了codeigniter,从那时起我就没有成功开发出一个项目.
我发现如果我想要如何修改它以我想要的方式工作,如果我在纯PHP中工作,我知道,或者我能够快速找到一个片段,这让我感到迟钝.
我已经尝试过CodeIgniter,Kohana和Symfony.我喜欢易用性(我也开始使用doctrine作为一个ORM,大大加快了我的数据库工作),但我发现项目花了我3-4倍于纯PHP的时间.当我无法找到解决我之前在纯PHP中解决的问题的解决方案时,我感到无聊和沮丧.
有没有人从使用框架回到无框架方法.是否有类似基本安全框架的东西(阻止XSS,过滤发布的数据,提供与数据库一起使用的清理功能)?我认为这样的事情比完整的框架更有益于我.我认为学习使用框架已经教会了我很多东西,但我会更乐意使用我自己的代码.
我一直在使用CodeIgniter,而且我对它的Active Record非常满意.用它查询数据库真是太棒了.
最近我开始了一个新项目,我不能再使用这样的框架了.
是否有一个简单的PHP Active Record库可以完成它的工作并且不受阻碍(类似于CodeIgniter的版本)?
我有以下示例,其中我倾向于使用几个类来创建一个简单的Web应用程序.
文件层次结构如下所示.
> cupid
- libs
- request
- router
- database
- view
- bootstrap.php
- index.php
Run Code Online (Sandbox Code Playgroud)
在index.php刚刚调用bootstrap.php又包含这样的事情:
// bootstrap.php
namespace cupid
use request, router, database, view;
spl_autoload_register(function($class){ /* autoload */ });
$request = new view;
$response = new response;
$router = new router;
$database = new database;
$router->get('/blog/{id}', function($id) use ($database, $view) {
$article = $database->select("SELECT blog, content FROM foo WHERE id = ?",[$id]);
$view->layout('blogPage', ['article'=>$article]);
});
Run Code Online (Sandbox Code Playgroud)
你可能会说,我的问题是这一行:
$article = $database->select("SELECT blog, content FROM …Run Code Online (Sandbox Code Playgroud) 下面的引用已经说服终于去了ORM.在过去,我真的不喜欢ORM并将其作为一种愚蠢的sql方式写下来.处理sql中的分层数据是我不想处理的痛苦.
我们有这些"对象 - 关系映射器"的东西是有原因的,这是因为称为对象 - 关系阻抗不匹配的问题.基本上,用于确保它们保持完整的数据库的正式数学模型遵循具有行和列的表系统以及对其他表的引用,而我们今天使用的大多数编程语言中的数据结构在嵌套的树状结构中操纵数据.它更像是电子表格和XML文档之间的区别,或者是分类帐和族树图之间的区别.- http://zork.net/motd/nick/django/your-favorite-orm-sucks.html
我想要一点点努力设置.我的项目大部分都很小,所以当我只使用它们进行少量查询时,我不想花太多时间来定义模型.
我使用codeigniter作为php框架,使用MySQL作为数据库.
好吧,看到我Zend_Db_Table被LINQ宠坏后不满意,我正在寻求开始用PHP学习ORM.普遍的共识似乎是Doctrine和Propel是唯一值得认真使用的好东西 - 无论我的意见如何,我都想使用至少适度受欢迎的东西,这样以后的人们可以看看我正在工作的这个应用程序在没有头部爆炸的情况下:P
我目前倾向于Propel,因为它的文档似乎更完整,它支持嵌套的集合模型(也称为"修改的预订树横向模型"),开箱即用.但是,我喜欢Doctrine使用名称空间和其他PHP 5.3功能,而且它似乎更受欢迎.
从那些使用ORM和Zend Framework的人那里,它与现有的框架(如果有的话)更好地融合?使用Zend的任一框架都应注意哪些问题?
从这段代码:
$toolbox = RedBean_Setup::kickstartDev("mysql:*****************");
$r = $toolbox->getRedBean();
$test = $r->dispense("test");
$test->nom = 'Test #1';
$test->date = '2010-07-08';
$test->date_deux = '08/07/2010';
$test->num = 5;
$id = $r->store( $test );
Run Code Online (Sandbox Code Playgroud)
我得到这个SQL:
CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) unsigned NOT NULL auto_increment,
`nom` varchar(255) collate utf8_unicode_ci default NULL,
`date` varchar(255) collate utf8_unicode_ci default NULL,
`num` tinyint(3) unsigned default NULL,
`date_deux` varchar(255) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;
--
-- Dumping data for …Run Code Online (Sandbox Code Playgroud) 我有一个包含商店ID和玩家ID的表,以及玩家的积分.我想要做的是将点从一个商店转移到另一个商店,事实是商店ID和玩家ID形成一个独特的索引.我想要做的是重复密钥更新,而不是让它失败,将一个条目的点添加到另一个并删除"from"条目.就像是:
UPDATE `playerspoints`
SET `boardId`=$to
WHERE `boardId`=$from
ON DUPLICATE KEY UPDATE `points`=.... get the idea?
Run Code Online (Sandbox Code Playgroud) 我的问题是如何从应用程序的模型层抽象数据库连接?主要关注点是能够轻松地从不同类型的数据库进行更改.也许你从一个平面文件,逗号分隔的数据库开始.然后,您想要移动到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类生成查询的方式.好处?缺点是什么?可预见的问题?黄金三镖客?
我的问题实际上不是ajax加载本身,更多的是没有javascript加载它的能力.我的意思是,我应付自如,当我编写我的整个项目只基于Ajax的可用性或 只是不使用Ajax.
//编辑:尽管Arend已经有了或多或少的有效答案,但同时"这个问题没有直接答案".但是,我想看看像我这样的场景开发人员的其他一些方法!即使只是一些链接可以帮助!
基本上我只是感到沮丧,在同一页面上编码所有内容两次,以确保没有和启用Javascript的用户都有相同的体验.这很烦人,我总是想知道其他人如何解决这个问题.
当我更新例如两个依赖于相同变量的div时,它会变得混乱.这是一个例子:
非JS版本
require 'classobject.class.php';
$another_var = 'something';
$class = new classobject($_POST['variable']); // just an example to show that this is dynamic - I'm aware of injection!
$function = $class->returnsth(); // returns 1
if(isset($_POST)) {
echo '<div id="one">Module 1 says:'; $require 'module_one.php'; echo '</div>';
echo '<br /><br />';
echo '<div id="two">Module 2 says:'; $require 'module_two.php'; echo '</div>';
}
Run Code Online (Sandbox Code Playgroud)
现在我module_two.php和module_two.php我的代码执行不同取决于$ function的返回变量.喜欢:
if($function >= 1 && another_var != 'something') {
// …Run Code Online (Sandbox Code Playgroud) php ×9
orm ×4
codeigniter ×3
mysql ×2
abstraction ×1
activerecord ×1
ajax ×1
asynchronous ×1
database ×1
frameworks ×1
jquery ×1
linq ×1
model ×1
oop ×1
page-refresh ×1
redbean ×1
sql ×1
sql-update ×1