gpt4 book ai didi

php - 这是如何在 PHP OO 中使用 MVC 模式

转载 作者:可可西里 更新时间:2023-11-01 13:51:29 24 4
gpt4 key购买 nike

我正在尝试构建一个不错的 PHP 框架供个人使用。我知道有很多现有的,但这是一次很好的学习经历,涵盖了绝大多数不同的挑战,真的教会了我很多东西,以及当我完成后有一个成品,我希望可以用来开发其他项目并且由于我正在构建它,所以应该没有关于如何使用它的学习曲线。

一些基本目标,
- 使用 PHP 面向对象而不是过程。
- 使用 MVC 或类似的东西来了解有关此样式的更多信息。
- 轻量级和快速/良好的性能

这是我的计划站点结构,不包括一些其他的 javascript、图像、css、一些辅助函数/文件等文件夹。

/////////////网站结构/////////////

site.com/
/index.php
site.com/library/
/Config.class.php
/Photos.class.php
/Mail.class.php
/Filter.class.php
/QRcodes.class.php
/Router.class.php
/Database.class.php
/Templates.class.php
/etc, etc,etc......
site.com/modules/
/account/
/model
/views
/controllers
/users/
/model
/views
/controllers
/messages/
/model
/views
/controllers
/API/
/model
/views
/controllers
/forums/
/model
/views
/controllers
/blogs/
/model
/views
/controllers
/etc, etc, etc, etc.............
/model
/views
/controllers

我决定通过单个入口点 index.php 路由所有请求
我将构建一个路由器类/对象,它将使用正则表达式将 URI 与可能目的地的 map 进行匹配。这是我目前对这部分内容的一个片段......

<?php
//get url from URL
$uri = isset($_GET['uri']) ? $_GET['uri'] : null;

$uri_route_map = array(
//users/account like http://mysite.com/users/324 (any digit)
'users/friends/page-(?<page_number>\d+)' => 'modules/users/friends/page-$1',
'users/friends/edit/page-(?<page_number>\d+)' => 'modules/users/friends/edit/page-$1',
'users/friends/edit' => 'modules/users/friends/edit',
'users/friends/' => 'modules/users/friends/',
'users/online' => 'modules/users/online/' ,
'users/online/page-(?<page_number>\d+)' => 'modules/users/online/page-$1',
'users/create' => 'modules/users/create',
'users/settings' => 'modules/users/settings',
'users/logout(?<page_number>\d+)' => 'modules/users/logout',
'users/login' => 'modules/users/login',
'users/home' => 'modules/users/home',

//forums
'forums/' => 'modules/forums/index',
'forums/viewthread/(?<id_number>\d+)' => 'modules/forums/viewthread/$1',
'forums/viewforum/(?<id_number>\d+)' => 'modules/forums/viewforum/$1',
'forums/viewthread/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewthread/$1/page-$2',
'forums/viewforum/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewforum/$1/page-$2',

// TESTING new method to define class and page better!
'users/home' => array('PAGE CLASS NAME', 'ACTION NAME')

//blog routes coming soon
//mail message routes coming soon
//various other routes coming soon
);

//////////////////////////////////
class Router
{
public function __construct()
{
}

public function get_route($uri, array $uri_routes)
{
foreach ($uri_routes as $rUri => $rRoute) {
if (preg_match("#^{$rUri}$#Ui", $uri, $uri_digits)) {
//if page number and ID number in uri then set it locally
$page_number = (isset($uri_digits['page_number']) ? $uri_digits['page_number'] : null);
$id_number = (isset($uri_digits['id_number']) ? $uri_digits['id_number'] : null);
echo '<hr> $page_number = ' . $page_number . '<BR><hr> $id_number = ' . $id_number;
$uri = preg_replace("#^{$rUri}$#Ui", $rRoute, $uri);
echo '<BR><BR>Match found: ' . $uri_routes . '<BR><BR>';
break;
}
}
$uri = explode('/', $uri);
}
}

$uri = new Router();
$uri = $uri->get_routes($_GET['uri'], $uri_route_map);

?>



请注意

上面的代码都是测试代码,会被更改,这只是概念

正如您所看到的,我计划让 index.php 获取 URI,根据有效路径检查它,如果找到,它将包含或构建一个标题部分,然后构建内容部分,最后是页面的页 footer 分。

例如,如果您要访问... www.test.com/blogs/userid-32423/page-23

页面将...

  • 构建标题()
  • 创建对象博客... $blogs = new Blogs;
  • 调用 $blogs->viewbyID($userID,$paging);//$userID 为 32423,$paging 为 URI 中的 23
  • 构建页 footer 分

现在基于我的文件夹结构。我相信上面示例中的博客类文件将被视为 CONTROLLER。如果到目前为止我是正确的,那么这个调用 blogs->viewbyID(ID,PAGE) viewbyID 方法的博客类将设置一些代码,查询数据库并为页面设置一些变量,然后它可能包含一个博客模板文件。此博客模板文件可被视为 VIEWS

现在我可能整个概念都错了,这就是为什么我发布了这么多代码和文本来尝试解释我对它的看法,请给我想法、建议,告诉我我在哪里完全错误,以及我可能在哪里在正确的轨道上,我将非常感谢任何建设性的批评或想法。如果我在上面对 MVC 模式的 View 、 Controller 部分的使用是正确的,那么我的代码的哪一部分将被视为模态?出于某种原因,这让我有些困惑。

奖金问题...关于表单发布,我应该在哪里处理这些?在我的示例中,我专注于博客模块,所以让我们说 POST 用于添加新的博客条目和 POST 用于编辑博客条目,这些应该在哪里处理(模态, View , Controller )?

最佳答案

Controller 的工作是检查用户的输入并确定请求的内容。一旦确定,就会调用模型。然后 Controller 获取模型的有效负载并将其提供给 View 。

基本上,模型是业务的模型想要添加博客文章?那么Blog模型会有一个->add或者->save方法(由controller调用。blog controller也可能有一个add 方法,但它不是为了与数据库对话。它是为了检查输入,然后调用模型进行实际保存)。模型方法并不总是与数据库交互,但它们通常会。

就添加/编辑而言,它们几乎总是共享相同的 View ,并且可以共享相同的 Controller 方法(如果可行的话)。

请记住, Controller 是您所有客户端的入口点。您的应用程序处理的每个 URL 都应该映射到一个 Controller 方法。然后 Controller 告诉模型做什么,将用户输入传递给它。

关于php - 这是如何在 PHP OO 中使用 MVC 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com