0

0

Minor【 PHP框架】3.路由、控制器、视图

php中文网

php中文网

发布时间:2016-06-20 08:42:15

|

1545人浏览过

|

来源于php中文网

原创

3.1 路由

  漂亮的URL绝对是一个严肃的web应用程序必须做到的,这种方式使index.php?article_id=57这类的丑陋URL被隐藏,由更受欢迎的像 /read/intro-to-symfony 来替代。

  3.1.1 路由配置

  配置文件为app/Config/routes.php

<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> [
  </span>'/demo/{productName}'            =><span style="color: #000000;">  [
        </span>'name'                =>    'test1',
        'controller'        =>    'App\Modules\Demo\Controller\FooController',
        'action'            =>    'bar',
        'required'          =>  ['productName' => '\w+'],<span style="color: #000000;">
    ]</span>,<span style="color: #000000;">
];</span>

  以上边代码为例详述一下如何配置一个优雅(laravel病上身...)的路由

立即学习PHP免费学习笔记(深入)”;

  '/demo/{productName}'是路由的匹配规则,其中配置中的required制定的就是productName必须满足的正则条件,在框架的实际运行过程中会将路由规则+required解析为正则表达式/demo/(\w+) ,当url(eg: xxx.xxx.xxx/demo/testproduct)匹配到这条正则时就会执行配置中的controller的action,具体的执行为:FooController->bar($productName);

  可以看到路由规则中的大括号的内容(productName)就是就是bar这个方法的参数。所以在匹配路由时一定要注意路由规则必须与具体的控制器的方法的参数个数是一致的,不然就会抛出ControllerException。

  3.1.2 默认路由配置

    如果我们每定义一个Controller就要配置一个路由就会导致开发效率较低,为了防止这种问题发生Minor提供了默认路由机制。当我们访问http://xxx.xxx.xxx/demo/foo/bar时就会执行App\Modules\Demo\FooController的bar方法,即默认路由为:

  http://xxx.xxx.xxx/{模块名}/{控制器名}/{方法名}

  3.1.3 缺点

  正如你所见,Minor的路由并不强大。不支持请求方法的限制,不支持htttps限制,不支持过滤器。

 

3.2 控制器

  3.2.1 创建一个自己的控制器

  Controller的定义非常简单,只要继承Minor\Controller\Controller基础类就可以了(当然你也可以不继承,但是基类中的方法和属性就不能使用了,这很好理解),首先创建文件夹app/Modules/Demo/Controller/,然后再创建文件FooController.php:

<?<span style="color: #000000;">php
namespace App\Modules\Demo\Controller;

</span><span style="color: #0000ff;">use</span><span style="color: #000000;"> Minor\Controller\Controller;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义一个控制器</span>
<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义一个方法   </span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
        </span><span style="color: #0000ff;">return</span> 'Hello World'<span style="color: #000000;">;
    }
}</span>

  通过访问xxx.xxx.xxx/demo/foo/bar(默认路由,你也可以配置自己的路由)就可看到返回了Hello World。

  3.2.2 Url生成

  调用Url的gen方法可以将默认路径转为符合路由规则的url

<span style="color: #800080;">$url</span> = Url:gen(<span style="color: #800080;">$path</span>);

  如根据3.1.1中的路由配置Url::gen('/demo/foo/bar?productName=test') 将返回 /demo/test。

  

  3.2.3 页面跳转redirect、重定向forward

  Minor提供了三个跳转的方法分别是redirect、forward、forwardUrl(这三个都是Minor\Controller\Controller的protected方法)。

优设AI导航
优设AI导航

优设网旗下专业全面的AI工具导航

下载

  当跳转到另外一个url时可以在控制器这样调用:$this->redirect($url);

  当转向(froward)到另外一个url时可以在控制器中这样调用: $this->forwardUrl($url);(该方法的实现其实就是通过路由解析出url请求的控制器和方法然后调用forward($controller, $action, $param))

  当转向(forward)到另外一个方法时可以在控制器中这样调用: $this->forward($controller, $action, $params); (参数$controller是控制器的类名,包含命名空间)

  例:

<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
        </span><span style="color: #800080;">$this</span>->redirect('www.baidu.com'<span style="color: #000000;">);
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->forward('App\Modules\Demo\Controller\FooController', 'bar', 'test'<span style="color: #000000;">);
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->forward('/demo/testpro'<span style="color: #000000;">);
    }
}    </span>

  3.2.4 获取请求参数

  调用MinorRequest的get($paramName, $defaultParamValue = null) 或者 post($paramName, $defaultParamValue = null)方法就可以获取请求方法,在控制器中可以这样调用:

<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
       $minorRequest = <span style="color: #800080;">$this->app->getMinorRequest()</span>; </span><br>    $paramValue = <span style="color: #000000;">$minorRequest</span>->get('paramKey', 'defaultValue'<span style="color: #000000;">);<br>    ...
    }
}   </span>

  3.2.5 获取请求方法

  调用MinorRequest的getMethod()方法就可以获取请求的方法:

<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
       </span><span style="color: #800080;">$minorRequest</span> = <span style="color: #800080;">$this</span>->app-><span style="color: #000000;">getMinorRequest(); 
    </span><span style="color: #800080;">$method</span> = <span style="color: #800080;">$minorRequest</span>-><span style="color: #000000;">getMethod();
    </span>...<span style="color: #000000;">
    }
}  </span>

 

3.3 视图

  Minor提供了一个极其强大的模板引擎,这个模板引擎的名称就是: PHP。是的!你没看错就是PHP。为什么Minor不提供一个类似于smarty或者Twig这样的模板引擎呢? 因为没有必要,PHP本身已经足够好了,如果Minor再造一个模板引擎无疑就会使Minor更难上手,所以Minor直接使用PHP作为视图文件的语言。

  3.3.1 在控制器中使用视图

  在控制器中使用视图只需要调用View::render('模块名:控制器名:视图文件名', ['param1key' => 'param1value', 'param2key' => 'param2value' ...]);例:

<span style="color: #0000ff;">class</span> FooController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar()
    {
        </span><span style="color: #800080;">$param1</span> = 'Hello'<span style="color: #000000;">;
        </span><span style="color: #800080;">$param2</span> = 'World'<span style="color: #000000;">; 
        </span><span style="color: #0000ff;">return</span> View::render('Demo:Foo:bar.php', ['param1' => <span style="color: #800080;">$param1</span>, 'param2' => <span style="color: #800080;">$param2</span><span style="color: #000000;">]);
    }
}  </span>

  render函数的第二个参数(['param1key' => 'param1value', 'param2key' => 'param2value' ...])就是向视图文件中传递的变量,我们可以在视图文件中使用这些变量:

文件:app/Modules/Demo/Controller/Tpl/Foo/bar.php<br><?php echo $param1key;?><br><?=$param2key ?>

  3.3.2 视图内置函数

  Minor提供了两个视图文件中可以使用的函数:

<span style="color: #0000ff;">function</span> include_tpl(<span style="color: #800080;">$module</span>, <span style="color: #800080;">$controller</span>, <span style="color: #800080;">$tpl</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">require_once</span> (!<span style="color: #008080;">defined</span>('APP_DIR') ? APP_DIR : <span style="color: #008080;">realpath</span>(__DIR__ . '/../../app/') .DIRECTORY_SEPARATOR) . 'Modules' . '/' . <span style="color: #800080;">$module</span> . '/Tpl/' . <span style="color: #800080;">$controller</span> . '/' . <span style="color: #800080;">$tpl</span><span style="color: #000000;">;
}

</span><span style="color: #0000ff;">function</span> url(<span style="color: #800080;">$path</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">return</span> Url::gen(<span style="color: #800080;">$path</span><span style="color: #000000;">);
}</span>

  使用:

<span style="color: #000000;">html>   
    </span><span style="color: #0000ff;"><?</span><span style="color: #ff00ff;">php include_tpl('Public', 'Public', 'header.php');</span><span style="color: #0000ff;">?></span> 
    <span style="color: #0000ff;"><</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span>
        <span style="color: #0000ff;"><</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">></span>Hello!<span style="color: #0000ff;"></</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">></span>
        <span style="color: #0000ff;"><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="<?php url('/demo/foo/bar?productName=testpro');?>"</span><span style="color: #0000ff;">></span>
    <span style="color: #0000ff;"></</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"></</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>

  这两个函数定义在app/Resource/functions.php文件中,你可以在这个文件中自定义你需要的视图函数。

 

3.4 响应

  可以在控制器中通过调用App对象的getMinorResponse()方法来获取当前MinorResponse对象。 MinorResponse类提供了六个方法分别是:

<span style="color: #000000;">public function send(); // 用于将响应对象发送给客户端

public function setHeader($header);// 设置响应头

public function setContent($content); // 设置响应对象的内容

public function beforeContent($content); // 在当前已有的内容之前添加内容

public function appendContent($content); // 在当前已有内容之后追加内容

public function getContent(); // 获取对象中的响应内容</span>

 

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1226

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

402

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

252

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

39

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

119

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

77

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

17

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

902

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

124

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP6.x 微实战--十天技能课堂
ThinkPHP6.x 微实战--十天技能课堂

共26课时 | 1.8万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号