php\symfony3 学习记录(三) 路由和控制器
来源:互联网 发布:hadoop 数据抓取 编辑:程序博客网 时间:2024/05/24 04:16
参考官方文档:http: //symfony.com/doc/current/book/routing.html
http: //symfony.com/doc/current/book/controller.html
(一)整体认识
先看symfony下的一个完整示例:(来自官方的Book)
namespace AppBundle\Controller;use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Symfony\Component\HttpFoundation\Response;class BlogController extends Controller{ /** * @Route("/blog/{slug}", name="blog_show") */ public function showAction($slug) { return new Response($slug); }}一个Controller类可以不继承Controller。但仅在继承Controller时才能够使用symfony内的模板对网页进行渲染。关于模板的使用见官方教程的第七章:Creating and Using templates
(1). Header部分:
如果要继承Controller,需要在代码开头处加上:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
在使用Response类时,需加上:
use Symfony\Component\HttpFoundation\Response;
在使用JsonResponse类时,需加上:
use Symfony\Component\HttpFoundation\JsonResponse;
使用路由机制时应加上:(一般都有)
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;(2). 类部分:
class BlogController extends Controller{ /** * @Route("/blog/{slug}", name="blog_show") */ public function showAction($slug) { return new Response($slug); }}这部分是一个设定好的路由机制:
/** * @Route("/blog/{slug}", name="blog_show") */name属性的值决定了该条路由的名字,起类似ID的标记作用。{ slug }部分是一个变量,将作为参数传入下面的Action函数进行处理。
这里是一个Action函数,按照开发要求实现具体的功能:
public function showAction($slug) { return new Response($slug); }
该控制器的最终功能: 将URL为:localhost/ blog/whatever 中的 whatever传 入showAction函数进行处理, 然后whatever作为响应打印在页面上。
symfony处理请求的逻辑流:(图来自于官网)
下面分别学习Routing和Controller。
(二)路由机制 (Routing)
1. 路由是做什么的 ?
由官方文档的 原句: Therouting layer is a tool that translates the incoming URL intoa specific controller to execute.
从中可以看出路由的功能: 将一个特定URL交给一个特定的控制器进行处理。这里的控制器即一个类,类中包括具体的php函数(这里称之为动作,即Action)。
2. 如何使用路由机制?
路由的语法: 基本是 path + attributes
path(路径): 由斜线与字符串构成,中间可以有多个变量,每个变量由一对花括号标识出。
attributes(属性):
属性名 含义 用法 defaults 设置变量的默认值,构成默认的URL路径。 defaults = {”变量名1“ = ”默认值1“, ...}requirements 给变量加上限制条件,往往出于合法性的要求。 requirements = {”变量名1“ = ”正则表达式1“, ......}位置通常是在Action函数之上:
/** * @Route("/blog/{slug}", _attrib ="_value") */
对于属性的使用的示例:
(1). 用defualts来设置默认路径:
/** * @Route("/blog/{page}", defaults={"page" = 1}) */这时若访问 /blog 等同于访问 /blog/1 , 若没有设定defaults值时,试图访问/blog 是非法的。
(1). 用requirements来限制变量取值:
/** * @Route( * "/articles/{_locale}/{year}/{title}.{_format}", * defaults={"_format": "html"}, * requirements={ * "_locale": "en|fr", // _locale的取值范围为"en"或者"fr" * "_format": "html|rss", // _format的取值范围为"html"或者"rss" * "year": "\d+" // year的取值范围为整数 * } * ) */3. 一些特别的用法:
可以利用@Method指定不同类型的http请求由不同控制器进行处理。写法为: @Method({"method"})
示例程序:
/** * @Route("/api/posts/{id}") * @Method({"GET","HEAD"}) */
4. 路由信息管理&调试方法:
通过命令 $ php bin/console debug:router 可以查看当前已有的路由名字与URL的对应情况。
可以指定某一路由名查看相应的信息 : $ php bin/console debug:router article_show
<pre name="code" class="php">也可以根据URL反查是否有对应的路由: $ php bin/console router:match /blog/my-latest-post5. 最后是关于生成URL的部分内容, 官方文档总结得很清楚,可以在用到的时候查看官方文档。
(三)控制器 (Controller)
1. 什么是控制器?
Acontroller is a PHP callable you create that takes information from the HTTP request and creates and returns an HTTP response (as a Symfony Response
object).
symfony这里的控制器实际上指的是我们要完成的action函数(并非控制器类),而action函数一般会放在一个Controller类里。一开始有点混淆控制器和控制器类的概念了。 注意控制器 ≠ 控制器类! 这里所指的控制器也并非在请求流图中见到的前端控制器。前端控制器是在 /web 下的很短的php代码,用于引导所有的请求。我们不需要对前端控制器做任何编辑。
2. 控制器的特点
(1). 一个控制器类中可以有多个控制器(Action函数)
(2). 控制器参数的顺序改变对控制器的功能没有影响。
(3). 控制器的每一个所需参数都必须能找到对应的路由参数。
(4). 控制器的参数可以比路由参数少。(仅用部分参数)
3. 通过继承Controller来获取symfony提供的服务
可通过get( ) 方法获取服务:
$templating = $this->get('templating');$router = $this->get('router');$mailer = $this->get('mailer');
使用debug:container
控制台命令获得所有的服务列表:
$ php bin/console debug:container
4. 多种应用:(官方文档总结得很清晰,随用随查)
(1). 异常的抛出与处理(404页面)
(2). 一闪而过的页面的实现(Flash Messages)
5. 创建请求对象
官方示例:
use Symfony\Component\HttpFoundation\Response;// create a simple Response with a 200 status code (the default)$response = new Response('Hello '.$name, Response::HTTP_OK);// create a JSON-response with a 200 status code$response = new Response(json_encode(array('name' => $name)));$response->headers->set('Content-Type', 'application/json');
- php\symfony3 学习记录(三) 路由和控制器
- php\symfony3 学习记录(一)创建第一个symfony项目
- php\symfony3 学习记录(二)Apache服务器配置&创建第一个网页
- AngularJS控制器和过滤器学习(三)
- laravel 学习笔记——路由(路由与控制器)
- laravel 学习笔记——路由(路由与控制器)
- Laravel 学习笔记——路由(路由与控制器)
- php Laravel框架学习(三) 之 路由
- PHP的配置路由控制器
- AngularJs学习笔记(三)控制器和过滤器
- AngulerJS学习(三) 路由
- laravel 学习笔记——路由(路由与控制器、资源路由)
- MVC 控制器和 路由,及路由调试
- Laravel 路由和控制器子目录
- express4.x学习记录——关于路由控制器的写法
- Laravel学习:路由、视图、控制器工作流程(2)
- Backbone入门指南(七):Router和History (路由控制器)
- Backbone入门指南(七):Router和History (路由控制器)
- Ubuntu配置sublime text 3的c编译环境
- 大二下学期开始
- 移植LAMP服务器到嵌入式平台
- java 调用solr服务器 实现增删改查 及高亮显示
- Java与javascript
- php\symfony3 学习记录(三) 路由和控制器
- 趣味算法-0的迷宫
- 算法代码实现之归并排序,Golang(Go语言)实现,自顶向下与自底向上两种方式
- Data Structures And Problem Solving Using Java (Fourth Edition)中译版(Java 常见异常篇)
- jQuery学习笔记01
- 华为oj 从单向链表中删除指定值的节点
- tableView 取消选中状态
- LA 3942 背单词 trie树+dp
- this指向