第一个问题
请问,您能解释一下在MVC中如何实现最简单的ACL.
这是在Controller中使用Acl的第一种方法......
<?php
class MyController extends Controller {
public function myMethod() {
//It is just abstract code
$acl = new Acl();
$acl->setController('MyController');
$acl->setMethod('myMethod');
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!");
...
}
}
?>
Run Code Online (Sandbox Code Playgroud)
这是一个非常糟糕的方法,它的缺点是我们必须将Acl代码添加到每个控制器的方法中,但我们不需要任何其他依赖项!
接下来的方法是制作所有控制器的方法private
并将ACL代码添加到控制器的__call
方法中.
<?php
class MyController extends Controller {
private function myMethod() {
...
}
public function __call($name, $params) {
//It is just abstract code
$acl = new Acl();
$acl->setController(__CLASS__);
$acl->setMethod($name);
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!"); …
Run Code Online (Sandbox Code Playgroud) 我一直在阅读很多博客,主张胖模型和瘦控制器方法,尤其是.Rails阵营.因此,路由器基本上只是找出在什么控制器上调用什么方法,并且所有控制器方法都在调用模型上的相应方法然后调出视图.所以我在这里有两个我不明白的问题:
你在哪里划线?这不仅仅是落入神模式吗?
architecture model-view-controller design-patterns god-object
我很难理解这个词的含义是什么:
Entity
,Model
,DataModel
,ViewModel
任何人都可以帮我理解他们吗?谢谢你们.
我一直在为我的新工作学习Zend及其MVC应用程序结构,并发现使用它只是困扰我,原因是我无法完全理解.然后在学习过程中,我遇到了一些文章,如MVC:No Silver Bullet以及关于MVC和Web应用程序主题的播客.播客中的那个人对MVC作为一个Web应用程序架构提出了非常好的理由,并且扼杀了许多让我烦恼的东西.
但问题仍然存在,如果MVC不适合Web应用程序,那么它是什么?
我的PHP系统中存在常见的MVC情况:Controller
从View
包含$_POST
数据接收请求.现在我有三种方法来处理数据:
a)Controller
唯一调用Model
和Model
处理$_POST
数据.
b)在Controller
所述转换$_POST
数据成变量,并将它们传递到Model
.
c)Controller
将$_POST
数据转换为Model
域对象并仅将对象传递给Model
.
目前,我正在关注选项A,但我认为这是错误的,所以我在考虑使用选项C.
那么,根据MVC,处理$_POST
数据的正确方法是什么?
编辑目前,我没有使用任何MVC框架.
编辑2通常,同样Controller
处理来自浏览器,Web服务,离线应用程序等的请求,或者每个人都有自己的请求Controller
?
我在阅读MVC中的Views概念时似乎存在问题,根据我所读到的,它们是在应用程序中管理表示的层,但是我一直在阅读的许多材料似乎都有所不同.来自PHP Master.com的这个问题.
View是一个具有返回一些HTML代码的函数的类,HTML的其余部分在哪里?它应该放在访问此View代码的独立.html页面中吗?
在本文中,来自php-html.net的View是一个扩展名为.php的简单HTML文件,但它们如何访问这些数据?我require()
在第一个教程中看不到或类似于实例化.
在阅读了很多帖子和Stack Overflow资源后,我仍然遇到一个关于"在哪里放置业务逻辑?"的着名问题.阅读StackOverflow问题和博客文章,我相信我已经很好地理解了代码分离的问题.
假设我有一个Web表单,您可以在其中添加将添加到数据库的用户.此示例涉及以下概念:
如果我没有错过任何东西,你必须创建一个包含一些属性,getter,setter等的实体,以使其持久存在于db中.如果您想获取或编写该实体,您将使用entityManager
和,用于"非规范"查询entityRepository
(这是您可以适合"查询语言"查询的地方).
现在,您必须为所有业务逻辑定义服务(即具有"惰性"实例的PHP类); 这是放置"重"代码的地方.将服务记录到应用程序后,几乎可以在任何地方使用它,并且涉及代码重用等.
当您渲染并发布表单时,您将它与您的实体绑定(当然还有约束)并使用上面定义的所有概念将它们放在一起.
所以,"old-me"会以这种方式编写控制器的动作:
public function indexAction(Request $request)
{
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$em = $this->getDoctrine()->getEntityManager();
$parameters = $request->request->get('User'); //form retriving
$id = $parameters['id'];
$user = $em->getRepository('SestanteUserBundle:User')->find($id);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$em->flush();
$modified = True;
}
$users = $this->getDoctrine()->getEntityManager()->getRepository('SestanteUserBundle:User')->findAll();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
Run Code Online (Sandbox Code Playgroud)
"New-me"以这种方式重构了代码:
public function indexAction(Request $request)
{
$um = $this->get('user_manager');
$modified …
Run Code Online (Sandbox Code Playgroud) 如何解析可测试控制器的依赖关系?
工作原理:URI路由到Controller,Controller可能具有执行某项任务的依赖关系.
<?php
require 'vendor/autoload.php';
/*
* Registry
* Singleton
* Tight coupling
* Testable?
*/
$request = new Example\Http\Request();
Example\Dependency\Registry::getInstance()->set('request', $request);
$controller = new Example\Controller\RegistryController();
$controller->indexAction();
/*
* Service Locator
*
* Testable? Hard!
*
*/
$request = new Example\Http\Request();
$serviceLocator = new Example\Dependency\ServiceLocator();
$serviceLocator->set('request', $request);
$controller = new Example\Controller\ServiceLocatorController($serviceLocator);
$controller->indexAction();
/*
* Poor Man
*
* Testable? Yes!
* Pain in the ass to create with many dependencies, and how do we know specifically what dependencies a controller …
Run Code Online (Sandbox Code Playgroud) 在一个很好的设计.是否应该在单独的业务逻辑层(在asp.net MVC模型中)处理访问数据库,或者将IQueryable
s或DbContext
对象传递给控制器是否可以?
为什么?各自的优点和缺点是什么?
我正在用C#构建一个ASP.NET MVC应用程序.它使用EntityFramework作为ORM.
让我们稍微简化一下这个场景.
我有一个可爱的蓬松小猫数据库表.每只小猫都有小猫图像链接,小猫蓬松指数,小猫名称和小猫ID.这些映射到EF生成的POCO调用Kitten
.我可能会在其他项目中使用此类,而不仅仅是asp.net MVC项目.
我有一个KittenController
应该去取最新的蓬松小猫/Kittens
.它可能包含选择小猫的一些逻辑,但不是太多的逻辑.我一直在和朋友争论如何实现这一点,我不会透露双方:)
public ActionResult Kittens() // some parameters might be here
{
using(var db = new KittenEntities()){ // db can also be injected,
var result = db.Kittens // this explicit query is here
.Where(kitten=>kitten.fluffiness > 10)
.Select(kitten=>new {
Name=kitten.name,
Url=kitten.imageUrl
}).Take(10);
return Json(result,JsonRequestBehavior.AllowGet);
}
}
Run Code Online (Sandbox Code Playgroud)
public class Kitten{
public string Name {get; set; }
public string Url {get; …
Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc entity-framework controller separation-of-concerns
早些时候,许多开发人员认为视图不应该像大多数框架那样直接与模型通信.
然后,这个意见似乎是错误的,我找到了一些文章,这些文章说视图可以直接与模型沟通.
http://r.je/views-are-not-templates.html
http://www.tonymarston.net/php-mysql/model-view-controller.html
模型,视图,控制器混淆
以及
模型应该如何在MVC中构建?
大多数这些文章引用了维基百科,模型 - 视图 - 控制器的块,引号是:
视图查询模型以生成适当的用户界面(例如视图列出购物车的内容).视图从模型中获取自己的数据.在一些实现中,控制器可以向视图发出一般指令以呈现其自身.在其他情况下,视图会自动通知需要屏幕更新的状态(Observer)更改模型.
啊,这是来自维基百科,这样一个权威的网站,一定是对的!
但现在,当我打开MVC http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller的wiki链接时,该页面已于今年9月14日(今年)进行了编辑2013),上面的句子已经消失了.
视图的新定义是:
视图通过控制器从模型请求向用户生成输出表示所需的信息.
现在我又困惑了,新的定义说视图应该通过控制器从模型中请求数据......
视图应该直接在地球上访问模型吗?
php ×6
architecture ×2
controller ×2
acl ×1
asp.net-mvc ×1
c# ×1
coding-style ×1
datamodel ×1
dependencies ×1
entity ×1
god-object ×1
model ×1
oop ×1
post ×1
registry ×1
symfony ×1
viewmodel ×1