加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

Symfony2学习笔记之控制器用法详解

发布时间:2020-05-25 14:29:19 所属栏目:PHP 来源:互联网
导读:这篇文章主要介绍了Symfony2控制器用法,详细分析了Symfony控制器的功能,实现技巧与相关技术细节,需要的朋友可以参考下

本文实例讲述了Symfony2控制器用法。分享给大家供大家参考,具体如下:

一个controller是你创建的一个PHP函数,它接收HTTP请求(request)并创建和返回一个HTTP回复(Response)。回复对象(Response)可以是一个HTML页面,一个XML文档,一个序列化的JSON数组,一个图片,一个重定向,一个404错误或者任何你想要的内容。controller中可以包含任何渲染你页面内容的所需要的逻辑。

下面是一个controller最简单的例子,仅仅打印一个Hello world!

Controller的终极目标都是相同的那就是创建并返回一个Response对象。按照这个思路,你可以从request对象读取信息,加载数据库资源,发送email,或者在用户的Session中写入信息。但是所有情况下,Controller将最终都会返回一个Response对象并被分发会客户端。

比如如下情况:

Controller A 准备一个Response对象来表现网站homepage内容。 Controller B 从Request中读取slug参数从数据库中加载一个blog内容并创建一个Response对象来显示这个blog。如果slug在数据库中不存在,它将创建并返回一个带有404状态码的Response对象.

Controller C 处理一个从联系表单,它从Request对象中读取表单信息,保存联系信息到数据库并发邮件给管理员。最后,它创建一个Response对象重定向客户端浏览器到联系表单感谢页面。

Requests,Controller,Response的生命周期

Symfony2项目中处理的每一个Request都是经过了相同的简单生命周期。框架负责重复的任务,最终执行一个controller,该controller会包含你的应用程序代码:

1.每个Request都会被一个统一的前端控制器文件(比如,app.php,或者app_dev.php)处理,它会启动应用程序。 2.Router从Request中读取URI信息,并找到匹配它的Route,从该Route中读取_controller参数。 3.匹配成功的route的controller被执行,controller中的代码创建并返回一个Response对象。 4.HTTP头和生成的Response对象内容将会被发回客户端。

创建一个页面跟创建一个controller一样容易,创建一个路由来映射一个URL到该controller。

注意:尽管从名字上来看,前端控制器和controller差不多,其实它们是不同的。 一个前端控制器是一个存放于web目录下的PHP文件,多有的Request都会通过它被重定向。每一个应用程序都会有一个产品前端控制器app.php和一个开发用的前端控制器app_dev.php。你不需要编辑,查看或者担心它们。

看一个简单的Controller: 任何的PHP可调用内容(比如函数,对象方法或者一个Closure)都可以成为一个controller。Symfongy2中,一个controller通常为controller对象中一个单一的方法。Controllers通常也被称为actions。

Hello '.$name.'!'); } }

注意在这个例子中controller是indexAction方法,它存在于controller类(HelloController)中。不要混淆,之所以定义一个controller类(HelloController)只是为了方便组织多个controllers/actions在一起。一般情况下,一个controller类会有多个controllers/actions。

上面例子中的controller相当简单:

Namespace行是symfony2使用了PHP5.3的命名空间功能来为整个controller类指定命名空间。 use关键字导入了Response类,这是我们的controller必须返回的内容。

Controller类名字都是由其名字后面加Controller来定义,但是只有前面的部分才是其真正名字,为了统一起见,在后面统一添加Controller。 在路由配置时只会取前面部分。

Controller类中每个被用于真正controller的方法都会被添加一个统一的后缀Action,同样我们在配置其路由时也只会取前面部分而忽略掉Action。把它映射到某个URL。

每个controller方法的最后必然会创建一个Response对象并返回它。

映射一个URL到一个Controller方法:

上面例子中的controller方法返回一个简单的HTML页面。如果要在浏览器中访问到该页面,那么你需要为它创建一个route,把它映射到一个特定模式的URL上。

XML格式:

PHP代码格式:

add('hello',new Route('/hello/{name}',array( '_controller' => 'AcmeHelloBundle:Hello:index',)));

现在想URL /hello/ryan 将被映射到HelloController::indexAction() controller并将ryan传递给$name变量。

创建一个所谓的页面,其实就是创建一个controller方法和一个相关的route。

注意我们使用的指向controller方法的表示语法:AcmeHelloBundle:Hello:index

Symfony2使用了一个非常灵活的字符串声明来指向不同的controller。它告诉Symfony2在一个名叫AcmeHelloBundle的bundle中去查找一个叫HelloController的类,并执行它的indexAction()方法。在这个例子中,我们的路由配置直接写在了app/config/ 目录下,一个更好的组织方式是把你的路由放到各自的bundle中。

路由参数作为Controller方法参变量

你已经了_controller参数 AcmeHelloBundle:Hello:index指向一个位于AcmeHelloBundle中名叫HelloController::indexAction()的方法。有趣的是路由中参数都会被传递给该方法。

上例中controller方法有一个唯一参数,$name,它对应着route中定义的{name}占位符名称。事实上,等你执行你的controller时,Symfony2会匹配controller和route中每一个参数。

如果我修改一下Hello的路由定义:

YAML格式:

XML格式:

PHP代码格式:

add('hello',new Route('/hello/{first_name}/{last_name}','color' => 'green',)));

这时候controller中可以获取这些参变量了:

$last_name,跟排列顺序无关。

Controller方法中的参数必须匹配route中定义的参数下面为hello route定义的controller方法将会抛出异常:

如果我们把$foo变量变为可选变量,那么就不会抛异常了。

并不是每一个在route中定义的参数都需要在controller中有与之对应的签名参变量的,比如hello route中定义的{$last_name} 如果对你没什么意义的话可以在controller中省略掉它。

反之,如果你在Controller签名中定义了变量,并且不是可选变量,那么必须在route中有与之对应的参数被定义。

在route定义中有一个特殊参数 _route,它匹配route的名称(如上例中的hello)。虽然不常用,但是它也可以作为controller方法的一个参变量使用。

Request作为一个Controller方法签名变量

为了方便,你可能会让symfony传递你的Request对象作为参数到你的controller方法。这在你处理表单时尤为方便。

createForm(...); $form->bindRequest($request); // ... }

Controller基类

为了方便,Symfony2定义了一个Controller基类,包含了一些常用的controller任务并给了你的controller类访问任何你需要的资源的途径。通过继承该类,你可以获得许多帮助方法。

Hello '.$name.'!'); } }

在Symfony中controller并不一定非得继承Controller基类,因为它内部的帮助方法等都不是必须的。你也可以继承 SymfonyComponentDependencyInjectionContainerAware 服务容器对象可以通过container属性来访问。同时你也可以把controller定义成service。

通用的Controller任务:

尽管Controller可以干任何事情,但是大部分的controller还是要重复的干一些基础的任务。比如 重定向,跳转,渲染模板和访问核心服务等。

重定向(redirecting)

如果你想重定向你的用户到另一个页面,可以使用redirect()方法。

redirect($this->generateUrl('homepage')); }

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读