在 CodeIgniter 用户指南中,示例模型对相应数据库表中的每个字段都有一个属性:
class Blogmodel extends CI_Model {
var $title = '';
var $content = '';
var $date = '';
//...
Run Code Online (Sandbox Code Playgroud)
然而,当它返回一组博客文章时,它们只是通用对象。
function get_last_ten_entries()
{
$query = $this->db->get('entries', 10);
return $query->result();
}
Run Code Online (Sandbox Code Playgroud)
如果每篇博文都只是一个通用对象,那么类开头的属性的目的是什么?
似乎将每篇博客文章都作为一个完全成熟的模型对象填充它的内容会很好。然后您可以编写在内部获取值的方法。但是,用户指南中的所有示例似乎都显示每个控制器具有每个模型的一个实例,并使用该对象获取包含数据库值的通用对象。此外,示例实例化模型的方式 ( $this->load->model('Blog');
) 很明显,您只需要在控制器中拥有模型的一个实例。
如果我的博客文章有一个status
作为整数存储在数据库中的值,但在几个不同的控制器中,我想将该值显示为人类可读的字符串,我应该把那个函数/方法放在哪里?由于我需要在多个控制器中使用它,并且它特定于一个对象,因此我认为它应该是模型对象的一种方法。如果每篇博文都是模型的一个实例,我可以这样写:
function get_human_status()
{
$lookup = array(
1 => 'Active',
2 => 'Hidden',
3 => 'Pending');
return $lookup[$this->status];
}
Run Code Online (Sandbox Code Playgroud)
但是,如果每篇博客文章都是一个通用对象,则它必须如下所示:
function get_human_status($data)
{
$lookup = array(
1 => 'Active',
2 => 'Hidden',
3 => 'Pending');
return $lookup[$data->status];
} …
Run Code Online (Sandbox Code Playgroud) 以下代码是否显示了缓存完全构建的页面和数据库查询的可接受方式?
构建页面的缓存是__construct
在控制器中启动的,然后完成__destruct
,在此示例中,所有页面都缓存为文件的默认值15分钟.
查询缓存完成,apc
并且它们在每个查询的指定时间内存储在内存中.在实际站点中,将有另一个apc缓存类,以便在需要时可以更改它.
我的目标是建立最简单的mvc,我失败了还是我在正确的轨道上?
调节器
//config
//autoloader
//initialiser -
class controller {
var $cacheUrl;
function __construct(){
$cacheBuiltPage = new cache();
$this->cacheUrl = $cacheBuiltPage->startFullCache();
}
function __destruct(){
$cacheBuiltPage = new cache();
$cacheBuiltPage->endFullCache($this->cacheUrl);
}
}
class forumcontroller extends controller{
function buildForumThread(){
$threadOb = new thread();
$threadTitle = $threadOb->getTitle($data['id']);
require 'thread.php';
}
}
Run Code Online (Sandbox Code Playgroud)
模型
class thread extends model{
public function getTitle($threadId){
$core = Connect::getInstance();
$data = $core->dbh->selectQuery("SELECT title FROM table WHERE id = 1");
return $data;
} …
Run Code Online (Sandbox Code Playgroud) 这是最重要的最佳实践问题。
假设我有一个表格:
<form action="self.php" method="POST">
<input type="text" name="aA" />
<input type="text" name="aB" />
<input type="text" name="aC" />
</form>
Run Code Online (Sandbox Code Playgroud)
以及PHP中的相应类:
class A
{
public function getA(){
return $this->a;
}
public function setA($a){
$this->a = $a;
}
public function getB(){
return $this->b;
}
public function setB($b){
$this->b = $b;
}
public function getC(){
return $this->c;
}
public function setC($c){
$this->c = $c;
}
private $a;
private $b;
private $c;
}
Run Code Online (Sandbox Code Playgroud)
而且我设法以某种方式从表单发送数据。现在,我需要将表单数据转换为A的实例。
我当前正在执行以下操作:
abstract class AStrategy {
public function doMapping(){
$a = new …
Run Code Online (Sandbox Code Playgroud) 正如标题所说的那样,是否有人对如何在laravel 4中正确使用模型有一个不错的解释?我使用预先存在的用户模型很好.但我在某个地方读到了查询,这应该在你自己的模型中完成.
所以我所拥有的基本上是一种可以进行状态更新的表单(如facebook),并将其存储在数据库中,但查询是通过控制器运行的.
我想通过一个模型完成它.
有关这方面的任何信息都会很棒!提前致谢
应该何时制作新型号或控制器?是否只有控制器与相应的视图1对1一起使用,并且控制器和模型是这样的?或者,控制器的功能是否与任何特定视图无关?例如,投票,如果所有投票代码都在投票控制器中,或者在具有使用投票的观点的控制器之间传播.似乎投票控制员可能是最好的.
我正在构建一个小的PHP MVC,而且我已经在一个小区域编码的墙上.我想我需要"部分视图",但我可能能够使用现有代码实现某些功能.
我的控制器目前是最简单的形式:
目前的观点:
一切都很好,但是控制器和视图中的代码现在变得相当大,我已经达到了需要在主视图(1和2)中包含"模块"或子视图的情况.
例如,如果加载了view2,那么我需要显示(作为view2的一部分)另一个视图,比如3部分注册注册表单.此注册表单也附带了自己的控制器文件.
我可以做这样的事情,它可以工作并让你知道我想要做什么,但我承认这打破了MVC设计模式.
视图
<div id="mydiv">Some content</div>
<div id="mysignup"> <?php include('controller_signup.php'); ?></div>
<div id="content"> The views main page content </div>
Run Code Online (Sandbox Code Playgroud)
然后将视图从控制器中拉出,放在正确的位置.
如上所述,我认为我需要使用部分视图,但是我发现的大多数信息都是针对ASP的,而且我有点丢失了!
我原以为这是一个相当普遍的问题,所以我认为有一个明显的解决方案!
谢谢!
最近我开始使用Codeigniter
框架来开发RESTFul
移动应用程序的Web服务.
当我在网站和youtube上查看各种教程时,我发现a的概念Model
在PHP应用程序上下文中的使用方式不同.
有何不同?
好吧,正如我一直认为模型类应该是这样的,
Cat.php
<?php
class Cat {
// Class variables
private $colour;
public __construct() {
$colour = 'Brown';
}
// Getters and Setters
public function getColour() {
return $this->colour;
}
public function setColour($newColour) {
$this->colour = $newColour;
}
}
?>
Run Code Online (Sandbox Code Playgroud)
但是,在通过互联网搜索好的教程时,我发现人们只是使用可以访问数据库的数据并将其返回的数据Controller
.
我没有看到任何人在Model中编写普通类(如果你是Java人员,我们称之为POJO)
现在,我在阅读和观看这些教程后所要求的是,
在PHP应用程序框架的上下文中,Model类是数据库的连接器,它在查询时返回与应用程序相关的数据.用SQL语言我们称之为,
CRUD功能
在基于Codeigniter的框架创建的Web应用程序中,MVC模式用于设计应用程序.Model类是具有将应用程序连接到数据库并返回数据的函数,并且有助于在应用程序的数据库上执行所有CRUD操作.
我已经获得了大学任务,我必须在C#WinForms中开发一个国际象棋游戏,并且建议我们遵循模型 - 视图 - 控制器设计模式.我很难确定哪些代码应该放在哪里,所以我希望得到一些建议和对我的设计的一般批评.对于那些勇于尝试遍历我的意大利面条代码的人来说,这是完整的项目.对于其他人来说,这是对我迄今为止所提出的内容的描述:
模型层:
Piece
- 代表一个棋子.已经派生类King
,Queen
,Rook
等,它们重写虚拟方法来定义每个片类型的运动行为.Player
- 一个小的实用程序类,除了将每个玩家的部分存储在一个List<Piece>
对象中并对它们执行全局操作(单个部分不能(或不应该)自己执行)(如检查,清除) en passant和castle move等查看图层:
frmChess
- 申请的主要形式.覆盖WndProc
以在用户调整窗体大小时保持窗体的1:1宽高比,否则只是一个普通窗体.Board
- TableLayoutPanel
我在Visual Studio设计器中编辑的标准WinForms的简单派生,有8列和行.这个类的单个实例位于主窗体上,除了简化方块的对齐和显示之外,它实际上没有做任何事情.控制器层:
Game
- 一个静态类,它将64s Square
(见下文)存储在一个List<Square>
对象中,并且有各种方法允许在给定(x,y)坐标处获得正方形,将游戏状态保存/加载到二进制文件中或从二进制文件中加载击破.不确定:
Square
- 标准WinForms控件的另一个简单派生,即Panel
.其中64个已添加到Board
设计时,每个都是空的,或Piece
在任何给定时间保持单个实例.那件作品还有一个圆形的方形参考,我想改变它,因为它看起来像是视图层中的正方形,模型应该对视图一无所知.我还覆盖了square的OnPaint
方法,在其前景中绘制其包含的片段图像,并在主窗体中连接一个事件处理程序,连接到每个方块的Click事件,以便可以选择和移动片段.我也可以从这里想到许多其他的事情,例如确定可以攻击或正在攻击这个方块的其他方块.所以这让我觉得也许它毕竟应该成为模型的一部分...任何想法?
PieceMove
- 此类在测试检查时处理移动的执行和撤消,并且还允许测试移动是否会导致移动块的团队检查,从而使移动无效.我真的不知道这应该被视为模型的一部分还是移动控制器.同样在那个音符上,我应该有一个单独的移动控制器,视图控制器等,还是只有一个控制器类可以完成所有这些操作?
最后,我知道这个帖子太长了所以我为此道歉,但我想实现一个事件驱动的方法来通知模型的变化视图,例如选择一块,移动一块,团队在检查,团队在将死,等等.我该怎么办?
提前感谢大家花时间阅读本文和/或我的代码; 对此,我真的非常感激!:d
我正在尝试使用Slim3框架以及Twig模板系统在php中创建一个身份验证系统,对于数据库,我正在使用MySQL和PDO。我也在尝试使用模型视图控制器设计模式来实现它。但是我很难理解如何为Web应用程序使用MVC结构。我在网上查看了过多的解释,似乎没有明确的答案。很多人说要使用PHP框架,例如Laravel,Symfony或CodeIgniter,因为他们显然采用了类似MVC的结构。但是,我宁愿保持简单,并手动编写代码,而不是使用框架。
我目前对MVC有两种解释。此图中描绘了第一个:
我看到的另一种解释是:(摘自该YouTube视频)
我已经做了研究。问题和答案,如这和这个是有帮助的。但是我仍然不确定如何构造自己的应用程序,特别是识别和理解MVC的模型方面。现在,我将说明身份验证应用程序的注册过程。这样您就知道我的代码是如何工作的。
首先,我有一个SQLQueries类,该类将一系列SQL语句简单地放入函数中。然后,我有一个SQLWrapper类,该类具有的功能可以例如在数据库中存储新用户的详细信息。此类还从SQLQueries类调用函数。我也有一个ValidateSanitize类,该类具有清理用户输入以及检查用户输入在表单中是否有效的功能。我认为这三个类是MVC模型方面的一部分,但我不确定。我看到了许多其他的使用“用户模型类”的教程,但我的应用程序中找不到它们。
我的视图只是显示HTML的Twig模板,例如主页,注册,登录等。然后我有了控制器。我打算让多个控制器执行不同的操作。目前,我只实现了AuthController,该控制器负责注册和登录用户。
因此,AuthController要做的第一件事是在名为getRegisterForm的函数中显示注册表。用户提交表单后,postRegisterForm函数将获取该用户输入并将其分配给有污染的变量。
public function postRegisterForm($request, $response)
{
$arr_tainted_params = $request->getParsedBody();
$tainted_email = $arr_tainted_params['email']; it a variable
$tainted_username = $arr_tainted_params['username'];
$tainted_password = $arr_tainted_params['password'];
$tainted_password_confirm = $arr_tainted_params['password_confirm'];
Run Code Online (Sandbox Code Playgroud)
接下来,实例化所有前面的三个类以及数据库详细信息,以便可以在AuthController中使用它们的功能:
$sanitizer_validator = $this->container->ValidateSanitize;
$sql_wrapper = $this->container->SQLWrapper;
$sql_queries = $this->container->SQLQueries;
$db_handle = $this->container->get('dbase');
Run Code Online (Sandbox Code Playgroud)
然后,使用sanitize_input函数清除受污染的用户详细信息。然后,将清理后的用户详细信息输入到validate函数中,以确保它们不会触发任何验证冲突。密码也在此处散列:
$cleaned_email = $sanitizer_validator->sanitize_input($tainted_email, FILTER_SANITIZE_EMAIL);
$cleaned_username = $sanitizer_validator->sanitize_input($tainted_username, FILTER_SANITIZE_STRING);
$cleaned_password = $sanitizer_validator->sanitize_input($tainted_password, FILTER_SANITIZE_STRING);
$cleaned_password_confirm = $sanitizer_validator->sanitize_input($tainted_password_confirm, FILTER_SANITIZE_STRING);
$hashed_cleaned_password = password_hash($cleaned_password, PASSWORD_DEFAULT);
$sanitizer_validator->check_email_exists($cleaned_email);
$sanitizer_validator->validate_email($cleaned_email);
$sanitizer_validator->validate_username($cleaned_username);
$sanitizer_validator->validate_password($cleaned_password);
$sanitizer_validator?validate_password_confirm($cleaned_password_confirm);
Run Code Online (Sandbox Code Playgroud)
最后,有一个if语句,检查所有验证错误消息是否为空。如果是的话,我们将为SQLWrapper类提供数据库详细信息以及SQLQueries类对象。然后,通过调用SQLWrapper类store-details函数将用户详细信息插入数据库。最后,我们将用户定向到登录页面,以便用户可以登录其新注册的帐户。
if ($sanitizer_validator->get_validate_messages('email_error') == ' …
Run Code Online (Sandbox Code Playgroud) 我有 PostController,这是它的方法store()
。
public function store(Request $request)
{
$this->handleUploadedImage(
$request->file('upload'),
$request->input('CKEditorFuncNum')
);
$post = Post::create([
'content' => request('content'),
'is_published' => request('is_published'),
'slug' => Carbon::now()->format('Y-m-d-His'),
'title' => $this->firstSentence(request('content')),
'template' => $this->randomTemplate(request('template')),
]);
$post->tag(explode(',', $request->tags));
return redirect()->route('posts');
}
Run Code Online (Sandbox Code Playgroud)
方法handleUploadedImage()
现在存储在 PostController 本身中。但我将在其他控制器中使用它。我应该把它移到哪里?不在 Request 类中,因为它与验证无关。不在 Models/Post 中,因为它不仅适用于 Post 模型。对于服务提供者类来说,它并不是那么全局的函数。
方法firstSentence()
和randomTemplate()
也存储在该控制器中。它们只会在其中使用。也许我应该将它们移到模型/帖子中?那么,到底如何在 method 中调用它们store()
(更具体地说,在 method 中create()
)?
我阅读了该理论,并且(希望)理解了瘦控制器和胖模型的概念,但我需要针对此示例提供一些实用的具体建议。您能否建议移动到哪里以及如何调用这些方法?
我对CodeIgniter MVC的原理提出了一个"简单"的问题.如果我查看CI(模型)中的手册,我会看到例如:
function insert_entry()
{
$this->title = $_POST['title']; // please read the below note
$this->content = $_POST['content'];
$this->date = time();
$this->db->insert('entries', $this);
}
Run Code Online (Sandbox Code Playgroud)
好吧,好吧 - 以这种方式输入数据很糟糕我知道:)但是如果我们使用"$ this-> input-> post()"...对我来说它看起来并不好.在使用模型中的函数之前处理控制器中的数据不是更好吗?也许模型部分看起来如此:
function insert_entry($data)
{
$this->db->insert('entries', $data);
}
Run Code Online (Sandbox Code Playgroud)
在像这样的控制器中:
$this->load->model('Blog');
$data = array();
$data['title'] = $this->input->post('title');
$data['content'] = $this->input->post('content');
$this->Blog->insert_entry($data);
Run Code Online (Sandbox Code Playgroud)
但我在哪里运行验证等...模型或控制器?也许有人明白我想知道什么.也许你有更多的经验,链接或其他什么.谢谢!
我有一个控制器,可以获取要传递给视图的数据.向此注入(通过疙瘩容器)服务,该服务使用许多域模型+业务逻辑来创建数据.
服务本身有一个注入其中的"存储库"类,它有创建数据映射器和返回域模型实例的方法.
我知道我可能没有深入了解存储库概念,因为Martin Fowler将其设置为"在映射层上构建另一层抽象"和"存储库在域和数据映射层之间进行调解,就像在-memory域对象集合." 所以我可能会错误地使用这个术语.
服务:
class InputService
{
private $repos;
public function __construct($repo) {
$this->repos = $repo;
}
public function getInitialData()
{
$product = $this->repo->getProduct();
$country = $this->repo->getCountry();
$spinalPoint = $this->repo->getPoint();
/*business logic with model instances to produce data array*/
return //array of data
}
}
Run Code Online (Sandbox Code Playgroud)
库:
class InputRepository
{
private $db;
public function __construct($db) {
$this->db = $db;
}
public function getCountry()
{
$mapper = new CountryMapper($this->db);
$country = $mapper->fetch();
return $country; //returns country object
} …
Run Code Online (Sandbox Code Playgroud) php model-view-controller datamapper decoupling repository-pattern
我刚刚进入MVC设计模式.这里的一个简单示例并不清楚我对控制器使用的概念.你能否解释一下控制器的实际用途,同时保持简单.
模型:
class Model {
public $text;
public function __construct() {
$this->text = 'Hello world!';
}
}
Run Code Online (Sandbox Code Playgroud)
控制器:
class Controller {
private $model;
public function __construct(Model $model) {
$this->model = $model;
}
}
Run Code Online (Sandbox Code Playgroud)
视图:
class View {
private $model;
//private $controller;
public function __construct(/*Controller $controller,*/ Model $model) {
//$this->controller = $controller;
$this->model = $model;
}
public function output() {
return '<h1>' . $this->model->text .'</h1>';
}
}
Run Code Online (Sandbox Code Playgroud)
指数:
require_once('Model.php');
require_once('Controller.php');
require_once('View.php');
//initiate the triad
$model = new Model();
//It is important …
Run Code Online (Sandbox Code Playgroud) php ×11
codeigniter ×4
model ×3
oop ×3
laravel ×2
architecture ×1
asp.net-mvc ×1
c# ×1
caching ×1
datamapper ×1
decoupling ×1
forms ×1
laravel-4 ×1
partial ×1
slim-3 ×1
views ×1
winforms ×1