我对MVC中"模型"的概念感到非常困惑.今天存在的大多数框架将模型放在Controller和数据库之间,而模型几乎就像数据库抽象层.随着Controller开始做越来越多的逻辑,'Fat Model Skinny Controller'的概念就丢失了.
在DDD中,还有域实体的概念,它具有唯一的身份.据我了解,用户是实体的一个很好的例子(例如,唯一的用户ID).实体有一个生命周期 - 它的值可以在整个动作过程中改变 - 然后它被保存或丢弃.
我上面描述的实体是我认为模型应该在MVC中的内容?我有多偏离基础?
为了使事情更加混乱,你会引入其他模式,例如Repository模式(可能会在其中放置一个Service).很清楚Repository如何与实体交互 - 它与模型有什么关系?
控制器可以有多个模型,这使得模型看起来像一个"数据库表"而不是一个独特的实体.
更新: 在这篇文章中,模型被描述为具有知识的东西,它可以是单数或对象的集合.所以听起来更像是一个实体,一个模型或多或少都是一样的.模型是一个包罗万象的术语,其中实体更具体.值对象也是一个模型.至少在MVC方面.也许???
所以,从非常粗略的角度来看,哪个更好?
没有"模特"真的......
class MyController {
public function index() {
$repo = new PostRepository();
$posts = $repo->findAllByDateRange('within 30 days');
foreach($posts as $post) {
echo $post->Author;
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者这个,它有一个模型作为DAO?
class MyController {
public function index() {
$model = new PostModel();
// maybe this returns a PostRepository?
$posts = $model->findAllByDateRange('within 30 days');
while($posts->getNext()) {
echo $posts->Post->Author;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两个例子都没有做我上面描述的内容.我很丢失.有什么输入?
简而言之,我有一个非常大的照片库,我试图在第一页加载时尽可能多地缓存缩略图.可能有1000多个缩略图.
第一个问题 - 尝试预加载/缓存那么多是愚蠢的吗?
第二个问题 - 当preload()函数触发时,整个浏览器停止响应一分钟到两分钟.此时回调会触发,因此预加载完成.有没有办法实现"智能预加载",在尝试加载这么多对象时不会妨碍用户体验/速度?
该$.preLoadImages功能来自这里:http://binarykitten.me.uk/dev/jq-plugins/107-jquery-image-preloader-plus-callbacks.html
这是我实现它的方式:
$(document).ready(function() {
setTimeout("preload()", 5000);
});
function preload() {
var images = ['image1.jpg', ... 'image1000.jpg'];
$.preLoadImages(images, function() { alert('done'); });
}
Run Code Online (Sandbox Code Playgroud)
1000张图片很多.我问得太多了吗?
哪个更好?
function test($val = 'a') {
if($val == 'a') {
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
要么
function test($val = 'a') {
if($val == 'a') {
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,他们做同样的事情.如果$val不是'a',则该函数返回false.只是个人喜好?
我已经对此做了一些搜索,但找不到任何形式的最佳实践或推荐 - 也许那是因为没有.我在我的网站上使用各种jQuery插件,除了TinyMCE和其他一些插件,以及我网站的特定JS文件.最重要的是,我有三个样式表......随着网站的增长,还有更多样式!
是否存在任何类型的"限制"或任何您应该注意包含标记中的脚本的内容?我知道每一个都是需要完成的另一个HTTP请求,但是如果它们都被缩小并且尽可能小,那么会出现问题吗?
<link rel="stylesheet" type="text/css" href="http://mysite.com/assets/css/redmond.css" />
<link rel="stylesheet" type="text/css" href="http://mysite.com/assets/css/style.css" />
<link rel="stylesheet" type="text/css" href="http://mysite.com/assets/css/jqueryFileTree.css" />
<!--[if gte IE 7]>
<link rel="stylesheet" type="text/css" href="http://mysite.com/scripts/style.ie.css" />
<![endif]-->
<script type="text/javascript" src="http://mysite.com/assets/js/jquery.js"></script>
<script type="text/javascript" src="http://mysite.com/assets/js/jquery-ui.js"></script>
<script type="text/javascript" src="http://mysite.com/assets/js/jqueryFileTree.js"></script>
<script type="text/javascript" src="http://mysite.com/assets/js/jqminmax.js"></script>
<script type="text/javascript" src="http://mysite.com/assets/js/jquery.corner.js"></script>
<script type="text/javascript" src="http://mysite.com/assets/js/jquery.jeditable.js"></script>
<script type="text/javascript" src="http://mysite.com/assets/js/jquery.qtip.js"></script>
<script type="text/javascript" src="http://mysite.com/assets/plugins/tinymce/tiny_mce.js"></script>
<script type="text/javascript" src="http://mysite.com/assets/js/latitude.js"></script>
Run Code Online (Sandbox Code Playgroud) ASP.NET MVC的新手(现在使用带Razor的MVC3),我很困惑将一个对象从Controller传递给View.具体来说,我正在试验MVC3和Rob Conery有趣的Massive(http://blog.wekeroad.com/helpy-stuff/and-i-shall-call-it-massive).我正在搞一个博客作为一个简单的Web应用程序来试验.
HomeController.cs:
public ActionResult Index()
{
var table = new DynamicModel("mydb", tableName: "Posts");
//grab all the posts
var posts = table.All();
ViewData["Posts"] = posts;
return View();
}
Run Code Online (Sandbox Code Playgroud)
这部分效果很好.但是我该怎么做?
return View(posts);
Run Code Online (Sandbox Code Playgroud)
如果我@posts.PostID在视图中引用,它会出错并说它无效.所以我尝试针对DynamicModel创建强类型视图,但posts仍然不存在.
我知道我可以创建一个ViewModel并针对该类型键入视图并将数据插入其中.这更多是关于理解Controller/View如何交互.
谢谢!
我已经回顾了MSDN文档和几个SO答案,并且所有迹象都表明这有效.在这一点上,我想我完全误解了会发生什么,或者我错过了我需要的一行代码.
简而言之,我有一个带按钮的WinForms应用程序,我想要另一个功能在代码中的某一点"点击"该按钮.这是相关的部分:
// form.Designer.cs
this.btnAddBranch.Click += new System.EventHandler(this.btn_add_Click);
Run Code Online (Sandbox Code Playgroud)
// form.cs
// using statements
public partial class EditClient : Form
{
// ...
public TestClick()
{
//btnAddBranch.PerformClick(); <-- would like to know why this fails ...
btn_add_Click(this, EventArgs.Empty);
}
private void btn_add_Click(object sender, EventArgs e)
{
MessageBox.Show("You clicked it!");
}
}
Run Code Online (Sandbox Code Playgroud)
注释行btnAddBranch.PerformClick()是我希望它会相当于它下面的行.但事实并非如此,它在TestClick()调用时似乎没有做任何事情.如果我执行未注释的行,它可以正常工作.
我错过了什么,还是我完全误解了什么?
我正在使用Laravel 4并试图为一些用户播种数据库.我正在使用Zizaco Confide插件,所以我的User模型扩展ConfideUser而不是Eloquent文档.我也为模型添加了一些字段,但没有什么超级复杂的.我试过删除这些字段,但我得到同样的问题.
我创建了一个UserSeeder我调用的类,DatabaseSeeder然后运行php artisan migrate:refresh --seed.它运行时没有错误,并返回"数据库已被播种",除了每个表都是如此users.没有用户插入.我尝试过创建用户User::create(array(...))以及$user = new User ... $user->save()得到相同的结果.没有错误被转储,并且我在系统上找不到任何日志.如果我在UserSeeder-> run()方法中插入一些var_dumps,我会看到使用正确的值创建对象,但没有保存.
我错过了什么?这是一些代码示例,如果需要我可以提供更多:
型号\ user.php的:
<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
use Zizaco\Confide\ConfideUser;
//class User extends Eloquent implements UserInterface, RemindableInterface {
class User extends ConfideUser
{
// for Entrust
use \Zizaco\Entrust\HasRole;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/** …Run Code Online (Sandbox Code Playgroud) 这是场景 - 我将PHP中的默认时区设置为UTC.我使用的所有日期/时间都设置为当前的UTC时间; 如果稍后显示,我会为该特定用户设置时区,并在其时区中显示日期.效果很好.
除了我有一个日期/时间,用户可以在表格上输入.它在24小时内以"YYYY-MM-DD HH:MM"形式出现(例如:"2014-09-18 17:00").用户自然将此时间设置为他们的时区,而不是UTC.
如果我使用输入值创建一个新的DateTime对象,它将以UTC格式保存,因此在稍后显示时会关闭几个小时(取决于原始时区).如果我在新对象上设置时区,它会改变该值,再次假设输入值为UTC.
我做了一些谷歌搜索,但没有发现任何关于PHP的问题(我找到了C#的几个答案).这可能与DateTime对象(或使用Carbon)有关吗?我是否坚持根据用户当前时区手动添加/减少小时数以将其置于UTC中?
我正在研究一个框架,我试图尽可能强烈地输入.(我在PHP中工作并从C#中学习了一些我喜欢的想法并试图在这个框架中使用它们.)我正在创建一个Collection类,它是域实体/对象的集合.它有点模仿List<T>.Net中的对象.
我遇到了阻碍我输入这个课程的障碍.如果我有一个UserCollection,它应该只允许User对象进入它.如果我有一个PostCollection,它应该只允许Post对象.
此框架中的所有集合都需要具有某些基本功能,例如添加,删除,迭代.我创建了一个界面,但发现我无法执行以下操作:
interface ICollection { public function add($obj) }
class PostCollection implements ICollection { public function add(Post $obj) {} }
Run Code Online (Sandbox Code Playgroud)
这打破了它对界面的依从性.但我不能强烈键入接口,因为所有集合都是相同的类型.所以我尝试了以下方法:
interface ICollection { public function add($obj) }
abstract class Collection implements ICollection { const type = 'null'; }
class PostCollection extends Collection {
const type = 'Post';
public function add($obj) {
if(!($obj instanceof self::type)) {
throw new UhOhException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此代码时,我得到syntax error, unexpected T_STRING, expecting T_VARIABLE or '$'了instanceof声明.对该问题进行了一些研究,看起来原因的根源在于$obj instanceof self …
此代码直接从Scott Gu的博客(http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx)复制:
Hello @name, the year is @DateTime.Now.Year
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,它的工作原理:
@foreach (var post in ViewBag.Posts)
{
@post.Title<br />
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试这个时,代码突出显示器将整个事件作为一个Razor声明并且编译器失败:
@foreach (var post in ViewBag.Posts)
{
@post.Title, by @post.Author<br />
}
Run Code Online (Sandbox Code Playgroud)
我得到Compiler Error Message: CS1525: Invalid expression term ','.再次,只是@post.Title<br />它编译得很好.
我在这里错过了什么?
php ×5
c# ×3
asp.net-mvc ×1
css ×1
date ×1
datetime ×1
eloquent ×1
entity ×1
if-statement ×1
image ×1
javascript ×1
jquery ×1
laravel-4 ×1
model ×1
mysql ×1
oop ×1
php-carbon ×1
razor ×1
winforms ×1
xhtml ×1