- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试构建一个不错的 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
页面将...
现在基于我的文件夹结构。我相信上面示例中的博客类文件将被视为 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/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!