我目前正在重建管理应用程序并寻找您的最佳实践建议!对不起,如果我没有正确的术语,但我该怎么做呢?
以“用户”为例 - 通常我们可以创建一个包含“名称”,“用户名”,“密码”等属性的类,然后制作一些方法,例如getUser($user_ID)
,getAllUsers()
最后,我们最终得到一个名称/值对的数组/数组; array('name' => 'Joe Bloggs', 'username' => 'joe_90', 'password' => '123456', etc)
。
问题是我希望这个对象更多地了解它的每个属性。
考虑“用户名” - 除了知道它的价值之外,我希望对象知道类似的东西;哪个文本标签应该显示在窗体上的控件旁边,验证时我应该使用哪个正则表达式,哪个错误信息是合适的?这些东西似乎属于模型。
我越是处理这个问题,我就越看到其他的东西;应使用哪个HTML元素来显示此属性,“registration_date”等属性的最小/最大值是什么?
我设想这个类看起来像这样(简化):
class User {
...etc...
private static $model = array();
...etc...
function __construct(){
...etc...
$this->model['username']['value'] = NULL; // A default value used for new objects.
$this->model['username']['label'] = dictionary::lookup('username'); // Displayed on the HTML form. Actual string comes from a translation database.
$this->model['username']['regex'] = '/^[0-9a-z_]{4,64}$/i'; // Used for both client-side validation and backend validation/sanitising;
$this->model['username']['HTML'] = 'text'; // Which type of HTML control should be used to interact with this property.
...etc...
$this->model['registration_date']['value'] = 'now'; // Default value
$this->model['registration_date']['label'] = dictionary::lookup('registration_date');
$this->model['registration_date']['minimum'] = '2007-06-05'; // These values could be set by a permissions/override object.
$this->model['registration_date']['maximum'] = '+1 week';
$this->model['registration_date']['HTML'] = 'datepicker';
...etc...
}
...etc...
function getUser($user_ID){
...etc...
// getUser pulls the real data from the database and overwrites the default value for that property.
return $this->model;
}
}
基本上,我希望这些信息位于一个位置,这样我就不必重复HTML标记,验证例程等的代码。我的想法是我可以将用户数组提供给HTML表单助手并拥有它会自动创建表单,控件和JavaScript验证。
然后,我可以使用通用set($data = array(), $model = array())
方法在后端使用相同的对象,以避免使用setUsername($username)
,setRegistrationDate($registration_date)
等单独的方法...
$this->model
中使用getUser()
意味着会覆盖对象模型,而将模型保留为原型并让getUser()
继承属性会更好。谢谢!
更新
我已经知道Java有类注释 - http://en.wikipedia.org/wiki/Java_annotations - 这似乎或多或少是我所要求的。我找到了这篇文章 - http://interfacelab.com/metadataattributes-in-php - 有没有人对这样的编程有任何见解?
答案 0 :(得分:3)
你在那里正确的轨道。说到模型,我认为有很多方法,“正确”的方法通常取决于你的应用类型。
您的模型可以直接是Active Record,可能是table row data gateway或“POPO”,普通的旧PHP对象(换句话说,是一个没有实现任何特定模式的类)。 / p>
无论您决定哪种方式最适合您,验证等内容都可以放入模型类中。您应该能够将用户作为用户对象,而不是关联数组 - 这是主要的事情。
这看起来是一种明智的做法
是的,除了表格标签之外。最好有一个单独的数据源,如表单标签,因为您最终可能希望能够对它们进行本地化。此外,标签实际上与用户对象无关 - 它与显示表单有关。
我将如何处理此问题(建议)
我会有一个代表单个用户的User对象。应该可以创建一个空用户或从数组创建它(例如,从数据库结果中创建一个很容易)。用户对象也应该能够验证自己,例如,你可以给它一个方法“isValid”,当被调用时将检查所有值的有效性。
我还有一个用户存储库类(或者可能只是User类上的一些静态方法),可用于从数据库中获取用户并将其存储回来。此存储库将在获取时直接返回用户对象,并接受用户对象作为保存的参数。
至于表单的内容,你可能有一个表单类,它接受一个用户对象。然后它可以自动从用户获取值并使用它来验证自己。
我在这里写了一些关于这个主题的文章:http://codeutopia.net/blog/2009/02/28/creating-a-simple-abstract-model-to-reduce-boilerplate-code/以及在该文章末尾链接的其他一些帖子。
希望这会有所帮助。我只是想提醒一下,我的方法也不完美=)
答案 1 :(得分:2)
对你的抽象回应很可能根本不会有所帮助,但我很高兴能得到这些值得一提的投票:)
你在这里处理两个不同的模型,在某些世界我们称之为类和实例,在另一个世界中我们谈论类和个体,在其他世界中我们在A-Box和T-Box语句之间进行区分。 / p>
你在这里处理两组数据,我将用纯文本写出来:
User a Class .
username a Property;
domain User;
range String .
registration_date a Property;
domain User;
range Date .
这是你的类数据,T-Box语句,蓝图,你如何描述你的应用程序的宇宙 - 这不是宇宙中'事物'的描述,而是你用它来描述你的东西宇宙,你的实例数据..所以你有:
user1 a User ;
username "bob";
registration_date "2010-07-02" .
这是您的实例,个人,A-Box数据,您宇宙中的东西。
你可能会注意到,你想知道如何做的所有其他事情,验证,向属性添加标签等等都属于第一组,即描述你的宇宙的东西,而不是其中的东西。那就是你想要在纯文本中再添加它的地方..
username a Property;
domain User;
range String;
title "Username";
validation [ type Regex; value '/^[0-9a-z_]{4,64}$/i' ] .
所有这一切的重点是帮助你分析你得到的其他答案 - 你会注意到在你的建议中你将这两组不同的数据混合在一起,并且在某种程度上它是一件好事 - 希望你可以看到PHP中的类通常扮演Classes的角色(不出所料),每个对象(或类的实例)都包含单个实例数据 - 但是你已经开始将Universe的这两个部分合并在一起尝试并在提供的PHP语言结构之外创建一组可重用的大类。
从这里你有两条路径,你可以折叠成行并按照语言结构使你的代码可以重复使用,并遵循建议的模式,如MVC(如果你还没有做,那对你有好处) - 或者你可以进入一个描述这些世界的前沿世界,我们建立框架来理解关于我们的宇宙及其中的事物的数据,但它是一个抽象的地方,尽管很长一段时间很难提高生产力。术语是通向未来的道路。
无论如何,我希望以某种方式帮助你掌握其他回应。
一切顺利!
答案 2 :(得分:1)
答案 3 :(得分:0)
您正在使用模型 - 视图 - 控制器(MVC)架构。
M只存储数据。没有显示信息,只有键入的键值对。
C处理操纵此信息的逻辑。它会根据用户输入更改M.
V是处理显示事物的部分。它应该像Smarty模板,而不是用于生成HTML的大量原始PHP。
把它全部“放在一个地方”是错误的做法。你不会有与MVC重复的代码 - 每个部分都是一个独特的步骤。这可以提高代码重用,可读性和可维护性。