【澳门葡京备用网址】Symfony2开荒之调整器用法实例深入分析,Symfony2学习笔记之调整器用法详解

正文实例深入分析了Symfony2开荒之调节器用法。分享给我们供我们参照他事他说加以考察,具体如下:

本文实例呈报了Symfony2创立页面包车型地铁议程。共享给大家供大家参照他事他说加以考察,具体如下:

本文实例陈说了Symfony2调整器用法。分享给大家供大家参谋,具体如下:

正文实例叙述了Symfony2实以后doctrine中放到数据的主意。分享给大家供大家参考,具体如下:

调节器是PHP函数,通过它,你能够依附HTTP乞求创设职责音信,并且创设和再次来到HTTP响应。响应得以是HTML页面、XML文书档案、类别化的JSON数组、图片、重定向、404荒唐以致是你能够想到的凡事。调整器中蕴藏了您应用程序须要创制响应的肤浅逻辑。

在Symfony2中创制页面只需求两步:

三个controller是您成立的三个PHP函数,它接受HTTP央浼(request)并创办和重返一个HTTP回复(Response)。回复对象(Response)能够是二个HTML页面,一个XML文书档案,一个系列化的JSON数组,多少个图片,三个重定向,二个404破绽百出或然别的你想要的从头到尾的经过。controller中能够包涵其余渲染你页面内容的所急需的逻辑。

咱俩在采用symfony的时候,临时须要在数据库中放置一些数量,那么咱们怎么在doctrine中装置呢?

收起央浼,再次回到响应的着力生命周期

1、创设路由:路由定义你页面包车型大巴U奇骏I(如/about)并点名要推行的调控器(PHP函数)。当传入的乞求URubiconL相配该路由时,Symfony2将施行内定的调节器;

上边是一个controller最简便易行的事例,仅仅打字与印刷叁个Hello world!

所幸,symfony已经为我们封装好了。这里,我们要求用到DoctrineFixturesBundle。

1、每一个恳求都被单个前端调控器(如app.php或index.php)文件管理,前端调节器担负辅导框架;
2、路由查看并协作央浼新闻,并将其针对性二个特定的路由,该路由决定调用哪个调节器;
3、执行调控器,调节器中的代码将创立并回到贰个Response对象;
4、HTTP头和Response对象的开始和结果将发回客户端。

2、创设调控器:调整器是二个PHP函数,它接受传入的央求并将其转移成Symfony2的Response对象。

use Symfony\Component\HttpFoundation\Response;
public function helloAction()
{
 return new Response('Hello world!');
}

首先步,在composer.json中引进所需的DoctrineFixturesBundle:

虽说名称相似,但前者调节器与我们在本章节所说的调节器是例外的,前端调整器是您web目录中的三个PHP小文件,全数的呼吁都直接通过它。一个天下无敌的应用程序将有三个用以生产的前端调节器(如app.php)和贰个用于支付的前端调整器(如app_dev.php)。你能够永恒没有须要对前边三个调节器进行编辑、查看和担忧。

大家欣赏那样轻易的贯彻,因为它符合Web的职业措施。每二个Web交互都是由HTTP恳求开头,应用程序的职分便是粗略地解释诉求并再次来到相应的HTTP响应。Symfony2遵循这一口径,并为你提供工具,以保障在应用程序的用户和复杂性增加时仍保持非凡地组织性。

Controller的终极目的都以一致的那正是创建并重临几个Response对象。依照那几个思路,你能够从request对象读取信息,加载数据库能源,发送email,恐怕在用户的Session中写入音信。可是具备景况下,Controller将最终都会回去三个Response对象并被分发会客户端。

{
  "require": {
    "doctrine/doctrine-fixtures-bundle": "2.2.*"
  }
}

编写二个简短的调控器

“Hello Symfony2” 页

譬如说如下情状:

第二步,执行composer:

最近一篇《Symfony学习特别钟入门精华教程》已经说了怎么创制Bundle以后径直说哪些增多调控器。调节器是infoAction方法,它隶属于一个说了算器类(UserController)。不要对名称感觉思疑:调节器类只是轻松将多少个调整器聚焦在同步的。平时状态下,调控器类将停放几个调控器(如updateAction、deleteAction等)。

让我们从杰出的“hello,world”程序开首,当大家达成后,用户能够通过探问下列U陆风X8L来收获一声问候:

Controller A 希图三个Response对象来呈现网址homepage内容。
Controller B
从Request中读取slug参数从数据库中加载四个blog内容并创造贰个Response对象来展现那些blog。如若slug在数据库中空中楼阁,它将成立并回到二个分包404状态码的Response对象.

composer update doctrine/doctrine-fixtures-bundle
//Symfony2充分利用了PHP5.3的名称空间的功能去为整个控制器类命名空间
namespace ZM\ApiBundle\Controller;
//use关键字导入类,是控制器必须返回的
//出于方便的考虑,Symfony2提供了一个Controller基类,以帮助实现常用的一些控制器任务,你的控制器类能够访问所需的资源。通过继承该类,你可以利用其中的一些方法。
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
class UserController extends Controller {
  /**
   * 用户个人中心查看
   * @return Response
   */
  public function infoAction() {
    $conn = $this->getDoctrine()->getConnection();
    $request = Request::createFromGlobals()->request;
    $phone = $request->get('phone');
    $result = $conn->fetchAssoc("SELECT * FROM user WHERE phone = ? LIMIT 1", array($phone));
    //控制器创建并返回一个Response对象
    return new Response(json_encode($result), '200', array('Content-Type' => 'application/json'));
  }
}
http://localhost/app_dev.php/hello/Symfony

Controller C
管理三个从联系表单,它从Request对象中读取表单新闻,保存联系新闻到数据库并发邮件给管理员。最终,它成立二个Response对象重定向客户端浏览器到关系表单谢谢页面。

其三步,在基本(app/AppKernel.php)中注册此bundle:

正文永世地址:
正文来源 IT985博客 ,转发时请表明出处及相应链接。

实际,你能够将Symfony换来任何的名号来问候,要开创该页,大家只需轻巧地通过三个步骤来张开:

Requests,Controller, Response的生命周期

// ...
public function registerBundles()
{
  $bundles = array(
    // ...
    new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(),
    // ...
  );
  // ...
}

越多关于PHP框架相关内容感兴趣的读者可查阅本站专项论题:《php优良开辟框架计算》,《codeigniter入门教程》,《CI(CodeIgniter)框架进级教程》,《Yii框架入门及常用本领总括》及《ThinkPHP入门教程》

本学科已经假定你下载了Symfony2,並且配备好了Web服务器。上述U昂科威L借使localhost指向您新的Symfony2项目。安装实际情况参见安装Symfony2。

Symfony2项目中拍卖的每二个Request都是经过了同等的粗略生命周期。框架肩负重复的义务,最后实践四个controller,该controller会蕴含你的应用程序代码:

第四步,在须求安置数据的bundle下创办二个PHP类文件,如src/Acme/HelloBundle/DataFixtures/ORM/LoadUserData.php,其代码如下:

盼望本文所述对大家基于Symfony框架的PHP程序设计具有扶助。

创建Bundle

1.每一个Request都会被二个联结的前端调节器文件(举例,app.php,可能app_dev.php)处理,它会运营应用程序。
2.Router从Request中读取U奥迪Q5I消息,并找到相称它的Route,从该Route中读取_controller参数。
3.匹配成功的route的controller被实施,controller中的代码成立并回到八个Response对象。
4.HTTP头和生成的Response对象内容将会被发回客户端。

// src/Acme/HelloBundle/DataFixtures/ORM/LoadUserData.php
namespace Acme\HelloBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Acme\HelloBundle\Entity\User;
class LoadUserData implements FixtureInterface
{
  /**
   * {@inheritDoc}
   */
  public function load(ObjectManager $manager)
  {
    $userAdmin = new User();
    $userAdmin->setUsername('admin');
    $userAdmin->setPassword('test');
    $manager->persist($userAdmin);
    $manager->flush();
  }
}

你恐怕感兴趣的稿子:

  • Symfony2使用Doctrine进行数据库查询方式实例总计
  • Symfony2实现从数据库获取数据的方式小结
  • Symfony2创造页面实例详解
  • Symfony2之session与cookie用法小结
  • Symfony2框架学习笔记之表单用法详解
  • Symfony2框架创立项目与模板设置实例详解
  • Symfony2学习笔记之插件格式剖判
  • Symfony2学习笔记之系统路由详解
  • Symfony2学习笔记之调整器用法详解
  • Symfony2学习笔记之模板用法详解
  • Symfony2安装第三方Bundles实例详解
  • Symfony2使用第三方库Upload制作图纸上传实例详解
  • Symfony2联合查询完毕情势

在始发从前,你必要创设一个Bundle。在Symfony第22中学,Bundle也便是插件,你应用程序中的全部代码都急需放在Bundle中。Bundle只是三个目录(具备PHP的称号空间),里面的内容都与有些特定效用相关(参见Bundle系统)。运维下列命令,创制AcmeStudyBundle(本章所建的玩耍之作)。

始建多个页面跟创立一个controller同样轻易,成立三个路由来映射贰个UPRADOL到该controller。

第五步,通过console施行放到数据命令:

php app/console Acme/StudyBundle[/]

注意:就算从名字上来看,前端调控器和controller大概,其实它们是不一致的。
二个前端调控器是二个存放于web目录下的PHP文件,多一些Request都会由此它被重定向。每贰个应用程序都会有二个产品前端调整器app.php和一个支出用的前端调控器app_dev.php。你无需编写制定,查看恐怕怀恋它们。

php app/console doctrine:fixtures:load #为防止数据库中原先的值被清除,可使用 --append 参数

接下去,在app/autoloader.php文件中加多了以下语句,以担保Acme名字空间被辅导(参见自动加载章节):

看叁个简便的Controller:
任何的PHP可调用内容(举个例子函数,对象方法照旧三个Closure)都得以产生贰个controller。Symfongy第22中学,多少个controller平常为controller对象中七个纯粹的不二法门。Controllers平时也被称为actions。

此命令有以下多少个参数:

$loader->registerNamespaces(array(
  'Acme' => __DIR__.'/../src',
  // ...
));
// src/Acme/HelloBundle/Controller/HelloController.php
namespace Acme\HelloBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController
{
 public function indexAction($name)
 {
  return new Response('<html><body>Hello '.$name.'!</body></html>');
 }
}

【澳门葡京备用网址】Symfony2开荒之调整器用法实例深入分析,Symfony2学习笔记之调整器用法详解。–fixtures=/path/to/fixture – Use
this option to manually specify the directory where the fixtures classes
should be loaded;
–append – Use this flag to append
data instead of deleting data before loading it (deleting first is the
default behavior);
–em=manager_name – Manually specify
the entity manager to use for loading the data.

最后在app/AppKernel.php文件的registerBundles()方法中伊始化Bundle。

瞩目在那个事例中controller是indexAction方法,它存在于controller类(HelloController)中。不要混淆,之所以定义多少个controller类(HelloController)只是为着便利组织多个controllers/actions在一道。一般情形下,二个controller类会有八个controllers/actions。

合菲律宾语档:

// app/AppKernel.php
public function registerBundles()
{
  $bundles = array(
    // ...
    new Acme\StudyBundle\AcmeStudyBundle(),
  );
  // ...
  return $bundles;
}

上边例子中的controller拾贰分轻巧:

正文永恒地址:
正文来源 IT985博客 ,转发时请注解出处及相应链接。

今昔您早已设置好您的Bundle,并能够在你Bundle中营造你的应用程序了。

Namespace行是symfony2使用了PHP5.3的命名空间效果来为一体controller类钦定命名空间。
use关键字导入了Response类,那是我们的controller必须再次回到的原委。

越多关于PHP框架相关内容感兴趣的读者可查阅本站专项论题:《php非凡开拓框架总括》,《codeigniter入门教程》,《CI(CodeIgniter)框架进级教程》,《Yii框架入门及常用手艺计算》及《ThinkPHP入门教程》

成立路由

Controller类名字都以由其名字背后加Controller来定义,不过唯有前边的局地才是其确实名字,为了统一同见,在后边统一加多Controller。
在路由布署时只会取前边部分。

目的在于本文所述对大家基于Symfony框架的PHP程序设计有所协助。

缺省意况下,Symfony2的路由配置文件放置在app/config/routing.yml目录中。在Symfony第22中学全部的陈设文件也能够选取PHP或XML格式编写。

Controller类中每一个被用来真正controller的措施都会被增多二个集合的后缀Action,一样大家在配置其路由时也只会取前面部分而忽视掉Action。把它映射到某些UHavalL。

您只怕感兴趣的稿子:

  • Symfony数据校验方法实例深入分析
  • 哪些在symfony中导出为CSV文件中的数据
  • Symfony2实现在controller中获取url的方法
  • Symfony2框架学习笔记之表单用法详解
  • Symfony2学习笔记之系统路由详解
  • Symfony2学习笔记之调整器用法详解
  • Symfony2学习笔记之模板用法详解
  • Symfony2安装第三方Bundles实例详解
  • Symfony2
    session用法实例深入分析
  • 高品质PHP框架Symfony2特出入门教程
  • Symfony2达成从数据库获取数据的办法小结
# app/config/routing.yml
homepage:
  pattern: /
  defaults: { _controller: FrameworkBundle:Default:index }
hello:
  resource: "@AcmeStudyBundle/Resources/config/routing.yml"

每一种controller方法的尾声一定会创建二个Response对象并赶回它。

路由配置文件的前几行定义了用户央求”/”(首页)财富所调用的代码,更风趣的是最后一部分,它导入了放在AcmeStudyBundle中的其它路由配置文件。

炫彩多个U凯雷德L到贰个Controller方法:

# src/Acme/StudyBundle/Resources/config/routing.yml
hello:
  pattern: /hello/{name}
  defaults: { _controller: AcmeStudyBundle:Hello:index }

地点例子中的controller方法重返三个简练的HTML页面。若是要在浏览器中寻访到该页面,那么您必要为它创立贰个route,把它映射到二个特定方式的UCRUISERL上。

路由由几个核心部分构成,pattern(形式)显著哪些U途胜I相称本路由,defaults数组钦命要运营的调控器。在pattern中的占位符{name}是个通配符,它象征诸如/hello/赖安,
/hello/Fabien或任何一般的U瑞鹰I相称该路由。{name}占位参数也被发送到控制器,以便大家得以采用它的值去问候用户。

# app/config/routing.yml
hello:
 pattern:  /hello/{name}
 defaults:  { _controller: AcmeHelloBundle:Hello:index }

路由系统在开创应用程序强大、灵活的UQX56L结构方面具有广大为之侧目的成效,详细情况请参见《Symfony2学习笔记之系统路由详解》

XML格式:

开创调整器

<!-- app/config/routing.xml -->
<route id="hello" pattern="/hello/{name}">
 <default key="_controller">AcmeHelloBundle:Hello:index</default>
</route>

当象/hello/赖安这样的U奥德赛I被应用程序管理时,hello路由被相配,况兼AcmeStudyBundle:Hello:index调节器通过Symfony2框架被实施。创造页面进程的第二步正是创办这一个调控器

PHP代码格式:

骨子里调节器也只是是由你成立并因而Symfony2推行的PHP函数,那些定制的应用程序代码应用诉求新闻去创设和图谋所需能源。除了部分高端案例外,调控器最终的输出都是完全一样的:三个Response对象。

// app/config/routing.php
$collection->add('hello', new Route('/hello/{name}', array(
 '_controller' => 'AcmeHelloBundle:Hello:index',
)));
// src/Acme/StudyBundle/Controller/HelloController.php
namespace Acme\StudyBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController
{
  public function indexAction($name)
  {
    return new Response('<html><body>Hello '.$name.'!</body></html>');
  }
}

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

调控器很简单,它制造一个新的Response对象,该目的的率先个参数是它回到的响应内容(在本例中是个一点都不大HTML页)。

创办一个所谓的页面,其实正是创办二个controller方法和贰个有关的route。

恭贺您,仅仅只是在创造了一个路由和调整器之后,你就已经猎取了二个全职能页!假如您的装置未有失常态的话,你的应用程序就能够跟你打招呼了:

留心大家使用的针对controller方法的意味语法:AcmeHelloBundle:Hello:index

http://localhost/app_dev.php/hello/Ryan

Symfony2使用了一个特别灵活的字符串申明来针对分歧的controller。它报告Symfony2在叁个叫作AcmeHelloBundle的bundle中去寻找二个叫HelloController的类,并推行它的indexAction()方法。在那一个例子中,大家的路由配置直接写在了app/config/
目录下,一个越来越好的公司情势是把您的路由放到各自的bundle中。

三个可选但却被平日使用的步骤便是创建三个模板。

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

在创制页面时间调节制器是主入口和重要性部分,越来越多新闻能够在调节器章节找到。

您曾经了_controller参数
AcmeHelloBundle:Hello:index指向二个放在AcmeHelloBundle中称之为HelloController::indexAction()的秘诀。风趣的是路由中参数都会被传送给该措施。

创设模板

<?php
// src/Acme/HelloBundle/Controller/HelloController.php
namespace Acme\HelloBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class HelloController extends Controller
{
 public function indexAction($name)
 {
  // ...
 }
}

模板允许你把具备的彰显(如HTML代码)都放到单个文件中,何况选拔页面布局的不如区块。上面代码正是运用模板来替换调控器中的HTML代码。

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

// src/Acme/StudyBundle/Controller/HelloController.php
namespace Acme\StudyBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class HelloController extends Controller
{
  public function indexAction($name)
  {
    return $this->render('AcmeStudyBundle:Hello:index.html.twig', array('name' => $name));
    // 渲染PHP模板
    // return $this->render('AcmeStudyBundle:Hello:index.html.php', array('name' => $name));
  }
}

假定自己修改一下Hello的路由定义:

为了利用render()方法,你不可能不承继Controller类,该类加多了一部分大面积职分的相当的慢方法。

YAML格式:

render()方法创设贰个Response对象,该指标使用一定的开始和结果填充并通过沙盘渲染的。与任何调节器同样,你最终收获的是二个Response对象。

# app/config/routing.yml
hello:
 pattern:  /hello/{first_name}/{last_name}
 defaults:  { _controller: AcmeHelloBundle:Hello:index, color: green }

瞩目,这里有三种不一致渲染模板的事例,缺省情形下,Symfony2扶助三种渲染模板的格局:守旧的PHP模板和轻便强大的Twig模板。你能够任性挑选采纳其中的一种,也得以在平等品种中混用它们,那都不是难点。

XML格式:

调控器渲染AcmeStudyBundle:Hello:index.html.twig模板,该模板使用以下命名约定:

<!-- app/config/routing.xml -->
<route id="hello" pattern="/hello/{first_name}/{last_name}">
 <default key="_controller">AcmeHelloBundle:Hello:index</default>
 <default key="color">green</default>
</route>

Bundle名:Controller名:Template名

PHP代码格式:

在本例中,AcmeStudyBundle是Bundle名,Hello是调节器,index.html.twig是模板名。

// app/config/routing.php
$collection->add('hello', new Route('/hello/{first_name}/{last_name}', array(
 '_controller' => 'AcmeHelloBundle:Hello:index',
 'color'  => 'green',
)));
{# src/Acme/StudyBundle/Resources/views/Hello/index.html.twig #}
{% extends '::layout.html.twig' %}
{% block body %}
  Hello {{ name }}!
{% endblock %}

那儿候controller中能够收获那些参变量了:

让大家一行行地来:
第2行:extends定义了叁个父模板,模板分明定义了三个将被替换的布局文件;
第4行:block表示在这之中的内容将会交替掉名字为body的block,如作者辈所知,它在最后渲染时将担任layout.html.twig中名称叫body的block的渲染。
父模板::layout.html.twig省略了它的bundle名和决定器名(所以用三个冒号::代替),那意味着该模板在bundle外面,在app目录中。

public function indexAction($first_name, $last_name, $color)
{
 // ...
}
{# app/Resources/views/layout.html.twig #}
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>{% block title %}Hello Application{% endblock %}</title>
  </head>
  <body>
    {% block body %}{% endblock %}
  </body>
</html>

瞩目route定义中不管占位符变量照旧私下认可值变量都会被转正为controller方法的输入变量。当二个route相配成功时,它会面併占位符和defaults到贰个数组传递给controller。映射route参数到controller参数极度简单和灵活。它们从route到controller不相称顺序。Symfony能够把route中参变量的名字映射到controller方法签名中的变量名字。比方{last_name}
=> $last_name,跟排列顺序非亲非故。

主导模板文件定义了HTML布局,并用大家在index.html.twig模板中定义的名称为body的区块渲染。这里还定义了贰个名称叫title的区块,大家也足以选择在index.html.twig模板中定义。由于大家向来不在子模板中定义title区块,所以它依然使用缺省值”Hello
Application”。

Controller方法中的参数必须相称route中定义的参数下边为hello
route定义的controller方法将会抛出格外:

模板在渲染和集体页面内容方面包车型地铁效应拾贰分强大,它能够是HTML标记语言、CSS代码可能调控器大概要求回到的东东。模板引擎只是达到目的的手段。每一种调节器的对象是回去三个Response对象,模板就算强大,但它却是可选的,它只是为Response对象创立内容的工具而已。

public function indexAction($last_name, $color, $first_name)
{
 // ..
}

目录结构

假设大家把$foo变量变为可选变量,那么就不会抛极度了。

透过前面几段的学习,你早已知道了在Symfony第22中学开创和渲染页面包车型大巴步骤,也开头知道了Symfony2的团体和结构,在本章的最后,你将学会在哪里找到和停放分化品类的公文以及为啥如此做。

public function indexAction($first_name, $last_name, $color, $foo)
{
 // ..
}

固然如此Symfony2的目录结构特别灵活,但在缺省景色下,Symfony2照旧负有同样的、被推举的主干目录结构:

实际不是每三个在route中定义的参数都急需在controller中有与之相应的签名参变量的,举个例子hello
route中定义的{$last_name}
借使对你不妨意思的话能够在controller中省略掉它。

app/ : 该目录满含应用程序配置;
src/ : 全体种类的PHP代码都保留在该目录下;
vendor/ : 遵照预订放置全部供应商的库文件;
web/ : 那是web根目录,包涵部分大伙儿得以访谈的公文。

public function indexAction($first_name, $color)
{
 // ..
}

澳门葡京备用网址,WEB目录

恰恰相反,假如你在Controller签字中定义了变量,並且不是可选变量,那么必须在route中有与之相应的参数被定义。

web根目录是富有静态的、公共文件的家目录,包涵图像、样式表和javascript文件,这里也是前边多少个调控器所在的地点。

在route定义中有多个新鲜参数 _route,
它相配route的名号(如上例中的hello)。即便不经常用,可是它也能够看做controller方法的多个参变量使用。

// web/app.php
require_once __DIR__.'/../app/bootstrap.php';
require_once __DIR__.'/../app/AppKernel.php';
use Symfony\Component\HttpFoundation\Request;
$kernel = new AppKernel('prod', false);
$kernel->handle(Request::createFromGlobals())->send();

Request作为二个Controller方法具名变量

前端调控器(在此地是app.php)其实是一个PHP文件,在行使Symfony2应用程序时实践。它的作用就是应用内核类AppKernel,让应用程序自举。
利用前端调整器意味着要比使用古板的纯PHP程序有所更为灵活多变的ULX570L,当使用前端调节器时,UWranglerL格式如下所示:

为了便利,你大概会让symfony传递您的Request对象作为参数到您的controller方法。那在你处理表单时进一步有益。

http://localhost/app.php/hello/Ryan
use Symfony\Component\HttpFoundation\Request;
public function updateAction(Request $request)
{
 $form = $this->createForm(...);
 $form->bindRequest($request);
 // ...
}

前端调控器app.php被实践,UPRADOI(/hello/Ryan)通过路由配置被内部路由。若是采纳Apache的重写法则,你可以在不内定app.php的景色下强制实践它:

Controller基类

http://localhost/hello/Ryan

为了方便,Symfony2定义了二个Controller基类,包涵了一部分常用的controller职分并给了你的controller类访谈任何你需求的能源的不二秘籍。通过一连该类,你能够猎取广大支援方法。

虽说前端调控器在管理央求时少不了,但你比较少会去修改以至想到它,大家只是在条件一章中简要地提起它。

// src/Acme/HelloBundle/Controller/HelloController.php
namespace Acme\HelloBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController extends Controller
{
 public function indexAction($name)
 {
  return new Response('<html><body>Hello '.$name.'!</body></html>');
 }
}

应用程序(app)目录

在Symfony中controller并不一定非得继续Controller基类,因为它里面包车型客车扶持方法等都不是必须的。你也得以持续
Symfony\Component\DependencyInjection\ContainerAware
服务容器对象足以透过container属性来探问。同期你也足以把controller定义成service。

正如你在前端调节器所见到的那么,AppKernel类是全体应用程序的主入口,它肩负全部的安插,它被保存在app/目录中。

通用的Controller任务:

这么些类必须达成多个艺术,那几个方法是Symfony2须求让应用程序了然的。你如故在一早先就不用忧郁这一个点子,因为Symfony2会智能地为您填充它们:

即便Controller能够干任何事情,可是繁多的controller照旧要重新的干一些基础的任务。比方重定向,跳转,渲染模板和拜会基本服务等。

1、registerBundles(): 重返全体须求在应用程序中运作的bundle数组
(参见Bundle系统 );
2、registerContainerConfiguration(): 引导应用程序的主配置能源文件
(参见应用程序配置章节);
3、registerRootDir(): 返回app根目录 (缺省是 app/)

重定向(redirecting)

在普通支付中,你会时常应用app/目录,你会在app/config/目录中期维修改配置和路由文件(参见应用程序配置),也会使用app/cache/目录做为应用程序的缓存目录、使用app/logs/目录做为日志目录、使用app/Resources/目录做为应用程序等第的财富目录。在底下的章节中您将会学到越来越多关于那几个目录的内容。

假让你想重定向你的用户到另七个页面,能够采用redirect()方法。

机动加载

public function indexAction()
{
 return $this->redirect($this->generateUrl('homepage'));
}

当应用程序自举时,将包蕴三个极度的文件:app/autoload.php。该公文肩负机关加载src/和vender/目录中的全体文件。

此处generateUrl()方法是三个扶植函数,用于依据给定的route生成相应的ULX570L。暗中认可情况下,redirect()方法试行一个302重定向。若是要实践301重定向,那么须求修改第三个参数如下:

因为有机关加载器,你长久不要为利用include或require语句挂念。Symfony2利用类的名号空间分明它的职位,并自动加载富含你所需的类公事。

public function indexAction()
{
 return $this->redirect($this->generateUrl('homepage'), 301);
}
$loader->registerNamespaces(array(
  'Acme' => __DIR__.'/../src',
  // ...
));

redirect()方法其实是三个简化写法,真正的代码如下:

在这些布局中,Symfony2将追寻src/目录下Acme名称空间(假想公司的名称空间)的全数类。为了可以活动加载,Class
Name文件和Path必须遵从平等形式:

use Symfony\Component\HttpFoundation\RedirectResponse;
return new RedirectResponse($this->generateUrl('homepage'));

Class Name:
    Acme\StudyBundle\Controller\HelloController
Path:
    src/Acme/StudyBundle/Controller/HelloController.php

跳转(Forwarding)

app/autoload.php配置活动加载器在不相同的目录查找分化的PHP名称空间,也得以在供给时自定义。有关机关加载器的越来越多情形,参见怎样自动加载类。

您能够选拔forward()方法很轻松从贰个controller到另一个controller内部。它施行的是一个内部子须求,来调用钦赐的controller,所以不会发生用户客户端浏览器的重定向。forward()方法再次来到的Response对象还将从原controller重回。

源(src)目录

public function indexAction($name)
{
 $response = $this->forward('AcmeHelloBundle:Hello:fancy', array(
  'name' => $name,
  'color' => 'green'
 ));
 // further modify the response or return it directly
 return $response;
}

轻巧易行,src/目录包蕴全体在应用程序中运作的PHP代码。实际上在支付时,当先四分之二办事都是在该目录下做到的。缺省景观下,src/目录是空的,当你从头张开开垦时,你将起来填充bundle所在的目录,该目录包蕴你应用程序的代码。
不过bundle终归是何许呢?

此处forward()方法运用了跟route配置中一律的字符串参数。这里流传数组参数会作为目的调用controller的参数。当将controller嵌入到模板时,也会采取同一的接口。目的调用的controller方法应该是之类概念:

Bundle系统

public function fancyAction($name, $color)
{
 // ... create and return a Response object
}

Bundle与任何软件中的插件类似,但比它们更加好。关键的不一样点在于在Symfony2中怎样都以bundle,包涵框架的主旨功效和你为应用程序所写的代码。在Symfony第22中学,Bundle是一类公民,那让动用第三方Bundle的预建功效包或公布你和谐的Bundle变得老大心灵手巧。它也能够令你很轻便地挑选应用程序所需作用,并用你自身的措施去优化它们。

仿佛为一个route创制二个controller同样,跟参数的顺序无妨。symfony2
会相称索引键名称name到格局参数名称$name,即使顺序打乱也没涉及。跟其余Controller基类方法一样,forward方法也只是是多少个symfony2大旨函数的异常快写法。三个跳转能够直接通过http_kernel服务来产生,重临四个Response对象。

Bundle简单来讲正是在三个目录里用来落实单一作用的结构化文件集。你能够成立BlogBundle、ForumBundle或用户管理的Bundle(很多都早就以开源Bundle的样式存在)。每一个目录都含有与功用有关的内容,如PHP文件、模板、样式表、Javascripts、测量试验等。每一个Bundle都包罗某种意义的万事,而每个效应都必须在Bundle中落到实处。

$httpKernel = $this->container->get('http_kernel');
$response = $httpKernel->forward('AcmeHelloBundle:Hello:fancy', array(
 'name' => $name,
 'color' => 'green',
));

应用程序由在AppKernel类中的registerBundles()方法中定义的Bundle组成:

渲染模板:

// app/AppKernel.php
public function registerBundles()
{
  $bundles = array(
    new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
    new Symfony\Bundle\SecurityBundle\SecurityBundle(),
    new Symfony\Bundle\TwigBundle\TwigBundle(),
    new Symfony\Bundle\MonologBundle\MonologBundle(),
    new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
    new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
    new Symfony\Bundle\AsseticBundle\AsseticBundle(),
    new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
    new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
    // register your bundles
    new Acme\StudyBundle\AcmeStudyBundle(),
  );
  if (in_array($this->getEnvironment(), array('dev', 'test'))) {
    $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
  }
  return $bundles;
}

虽说不是必须的,然则大部分controller将最终渲染八个承受生成为controller肩负生成HTML的模版。renderView()方法会渲染叁个模板并再次来到它的内容。那个再次来到内容可以看作创制Response对象,以供controller重临使用。

通过registerBundles()方法,你就全部了应用程序全部Bundles的万事调控权(包括Symfony2的主题Bundle)

$content = $this->renderView('AcmeHelloBundle:Hello:index.html.twig', array('name' => $name));
return new Response($content);

无论Bundle在怎么地点,它都足以被Symfony2自动加载。比如,假设AcmeStudyBundle放在src/Acme目录中,请保管Acme的称呼空间被增加到app/autoload.php文件中,并映射到src/目录,这样它就可以被Symfony2自动加载了。

地点的代码完全能够更进一步的行使下边包车型客车代码情势来写:

创建Bundle

复制代码 代码如下:

为了向您体现Bundle系统是如何之大约,让大家创设四个名叫AcmeTestBundle的新Bundle,并激活它。

return $this->render(‘AcmeHelloBundle:Hello:index.html.twig’,
array(‘name’ => $name));

首先,成立八个src/Acme/TestBundle/
目录,并累加贰个名称为AcmeTestBundle.php的新文件:

那三种情景下,AcmeHelloBundle中的模板Resources/views/Hello/index.html.twig都会被渲染。

// src/Acme/TestBundle/AcmeTestBundle.php
namespace Acme\TestBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeTestBundle extends Bundle
{
}

renderview()方法是之类代码的急速写法:

AcmeTestBundle听从Bundle命名约定

$templating = $this->get('templating');
$content = $templating->render('AcmeHelloBundle:Hello:index.html.twig', array('name' => $name));

这些空类仅仅只是我们要求成立新Bundle的一片段。即使是空的,但这么些类已经够用庞大,并能够用来自定义Bundle的一坐一起。

自然也足以在子目录中渲染模板

现行反革命大家已经成立了笔者们的Bundle,大家需求经过Appkernel类激活它:

$templating->render('AcmeHelloBundle:Hello/Greetings:index.html.twig', array('name' => $name));
// index.html.twig 存放于 Resources/views/Hello/Greetings 目录.
// app/AppKernel.php
public function registerBundles()
{
  $bundles = array(
    // ...
    // register your bundles
    new Acme\TestBundle\AcmeTestBundle(),
  );
  // ...
  return $bundles;
}

寻访其余服务

固然近年来它还不可能做其余业务,但AcmeTestBundle未来早已足以接纳了。

若果是接二连三了Controller基类,你就足以由此get()方法访谈symfony2的劳务了。举个例子:

同样有益的是,Symfony也提供命令行接口去生成Bundle的骨干框架

$request = $this->getRequest();
$templating = $this->get('templating');
$router = $this->get('router');
$mailer = $this->get('mailer');
php app/console init:bundle "Acme\TestBundle" src

Symfony第22中学还恐怕有相当多的可用服务,相同的时间也勉励你定义自个儿的服务。要翻开全数的劳务,能够利用container:debug
命令行工具

扭转的Bundle框架满含一个着力调控器、模板和可自定义的路由能源。接下来大家将商谈谈越多的Symfony2命令行工具。

$ php app/console container:debug

任凭曾几何时,成立八个新的Bundle或应用第三方Bundle,都是内需确定保障该Bundle在registerBundles()中被激活。

处理不当和404页面

Bundle的目录结构

当某一件事物未有找到,你应当重新初始化HTTP协议再次回到三个404
回复。要做到这么些,你将抛出二个特出类其他百般。即使您是再而三了Controller基类,则:

Bundle的目录结构是轻巧而灵活的。缺省事态下,Bundle系统服从Symfony2全部Bundle之间维持代码一致性的预订集。让大家看看AcmeStudyoverBundle,因为它富含了Bundle的绝大大多因素:

public function indexAction()
{
 $product = // retrieve the object from database
 if (!$product) {
  throw $this->createNotFoundException('The product does not exist');
 }
 return $this->render(...);
}

1、Controller/目录:包涵该Bundle的调控器(如:HelloController.php);
2、Resources/config/目录:配置目录,包蕴路由布置(如:routing.yml);
3、Resources/views/目录:通过调整器名协会的沙盘(如:Hello/index.html.twig);
4、Resources/public/目录:包涵web能源(图片、样式表等),并被拷贝或软链接到项指标web/目录;
5、Tests/目录:存放该Bundle的享有测验。

createNotFoundException()方法创造叁个特定的NotFoundHttpException对象,它聊起底触发404
HTTP回复。当然你从你的controller方法中能够抛出任何类型的Exception
类,Symfony2会自动回到多少个500 HTTP回复代码。

基于Bundle达成的机能,它可小可大,它只含有你所供给的文件。

throw new \Exception('Something went wrong!');

你在本书中还将学习到何以长久化对象到数据库、创设和验证表单、翻译你的应用程序和编写制定测量检验等等,它们在Bundle中都有本身的任务和所饰演的角色。

管理Session

应用程序配置

Symfony2
提供了一个百般好的Session对象,你能够用它来在伏乞之间存贮有关用户的音信。暗许情状下,Symfony2
通过PHP自个儿的Session保存属性到cookie。在其余controller中存放和获得Session音讯将非常轻松:

应用程序由象征应用程序全部效能和特色的Bundle集构成。每种Bundle都能够因而YAML、XML或PHP编写的配备文件来自定义。缺省情形下,主配置文件放置在app/config/目录中,被命名字为config.yml、config.xml或config.php,那取决你所选择的格式:

$session = $this->getRequest()->getSession();
// 为用户的后一个请求使用存储一个属性
$session->set('foo', 'bar');
// 在另一个controller中为另一个请求获取该属性
$foo = $session->get('foo');
// 设置用户的本地化语言
$session->setLocale('fr');
# app/config/config.yml
framework:
  charset:     UTF-8
  secret:     xxxxxxxxxx
  form:      true
  csrf_protection: true
  router:     { resource: "%kernel.root_dir%/config/routing.yml" }
  validation:   { annotations: true }
  templating:   { engines: ['twig'] } #assets_version: SomeVersionScheme
  session:
    default_locale: en
    lifetime:    3600
    auto_start:   true
# Twig Configuration
twig:
  debug:      %kernel.debug%
  strict_variables: %kernel.debug%

Flash 消息

笔者们将要下一节景况中体现怎么着标准地挑选要辅导的文件/格式。

您可以为一定的央浼存款和储蓄小量的消息到用户的Session。那在拍卖一个表单时非常有用,你想重定向和一个一定的新闻展现在下八个伸手中。那连串型的音信被称之为Flash新闻。举个例子,倘使你管理八个表单提交:

每二个甲级条约,如framework或twig都被安顿成四个一定的Bundle。比如,framework被布署成Symfony2的中坚FrameworkBundle,并涵盖路由、模板和任何宗旨系统的安插。

public function updateAction()
{
 $form = $this->createForm(...);
 $form->bindRequest($this->getRequest());
 if ($form->isValid()) {
  // 做些排序处理
  $this->get('session')->setFlash('notice', 'Your changes were saved!');
  return $this->redirect($this->generateUrl(...));
 }
 return $this->render(...);
}

近年来别忧郁配置文件中各段中的特定配置选项,配置文件缺省值都以入情入理的。当你浏览Symfony2的各部分时,你将学到每一种部分的一定配置选项。

此例中,在拍卖完央求后,controller设置了三个notice
flash音讯并作了重定向。名字notice没什么意义,只是用来标志该新闻。在下二个移动的模版中,上边包车型客车代码能够渲染这些notic消息:

安顿格式

Twig

综观整个章节,全部的配置示范都用两种格式(YAML、XML和PHP)显示。它们每一种都有和煦的利害,以下是两种格式的证实:

{% if app.session.hasFlash('notice') %}
 <div class="flash-notice">
  {{ app.session.flash('notice') }}
 </div>
{% endif %}

1、YAML:简单、干净和易读
2、XML:有时比YAML更加强有力且帮助IDE的自发性实现
3、PHP:非常有力,但与规范配置格式比较易读性差

PHP代码:

环境

<?php if ($view['session']->hasFlash('notice')): ?>
 <div class="flash-notice">
  <?php echo $view['session']->getFlash('notice') ?>
 </div>
<?php endif; ?>

应用程序能够在差异的蒙受中运转。差别的条件分享同样的PHP代码(由前端调控器区分),但却具备完全差异的配备。开辟条件记录警告和谬误,而生产条件只记录错误。在支付情状中部分文件在历次央浼之后被重构,而在生产情况中却被缓存
。全部的情状都在同一机制中生活。

这么设计,flash消息就可见为标准的有些伏乞存在了。他们一般被设计出来正是用来重定向的。

固然创建新的情状是便于的,但Symfony2项目一般会从多少个景况早先(开拓、测验和生育)。通过在您浏览器中改造前端调节器,你能够很有利地让应用程序在差异的景况中切换。要将应用程序切换成支付条件,只须求通过开垦前端调整器去访谈应用程序就可以。

Response对象

http://localhost/app_dev.php/hello/Ryan

作为三个Controller来讲,独一必须落成的是回来两个Response对象。

倘让你想看看你的应用程序在生养条件中的展现 ,能够调用生产前端调节器:

Response对象是多少个PHP代码对HTTP Response的架空。
HTTP Response是贰个基于文本的消息有HTTP headers和
重临给客户端的内容结合。

http://localhost/app.php/hello/Ryan
//创建一个简单的Response对象,默认状态码为200
$response = new Response('Hello ' .$name, 200);
//创建一个基于JSON的Response对象,状态码也为200
$response = new Response(json_encode(array('name'=>$name)));
$response->headers->set('content-type','application/json');

只要您展开 web/app.php文件,你将开掘它曾经很醒目地被配置成选择生产条件:

中间headers属性是二个HeaderBag对象,内部含有众多卓有功能的格局来读取和转移Response的头消息。头名字被标准使用Content-Type
与content-type大概content_type效果等同。

$kernel = new AppCache(new AppKernel('prod', false));

乞请对象Request

您可以为三个新的条件创立一个新的前端调整器,只须要拷贝该公文,并将prod修改成其余值。

除开路由占位符的值以外,若是一而再了Controller基类那么该controller还是能够访谈Request对象。

因为生产境遇是为速度优化的,配置、路由和Twig模板都被编写翻译成纯的PHP类,同不平时候被缓存
。在生育条件中更改视图时,你需求排除这么些缓存文件,进而让它们重构:

$request = $this->getRequest();
$request->isXmlHttpRequest(); // 判断是不是Ajax请求
$request->getPreferredLanguage(array('en','fr'));
$request->query->get('page'); // 获取$_GET 参数
$request->request->get('page'); //获取$_POST参数
rm -rf app/cache/*

跟Response对象同样,Request对象的头也保留在HeaderBag对象中,能够好低价的被访问。

当进行自动测验时采纳测验情况,它并不能够从浏览器直接访问。参见测量检验章节以得到越来越多细节。

小结考虑:

条件安插

不论是曾几何时,你成立贰个页面,你谈到底须要为它写一些包蕴逻辑的代码。在Symfony中,那叫二个controller,
它是二个PHP的函数,它可以为了最后回来二个Response对象给用户能够做须要的别样专门的学业。简单来说,你能够选用继续三个Controller基类,它包括了许多实行controller通用职务的飞跃方法。譬如,你不想把HTML代码写入你的controller,
你能够选用render()方法来渲染并回到三个模板内容。

AppKernel类负担加载你所选的布局文件:

但愿本文所述对我们基于Symfony框架的PHP程序设计有着支持。

// app/AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader)
{
  $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}

您或者感兴趣的篇章:

  • Symfony查询办法实例小结
  • Symfony2联合查询实现情势
  • Symfony2使用Doctrine进行数据库查询形式实例计算
  • 高质量PHP框架Symfony2杰出入门教程
  • Symfony2达成从数据库获取数据的点子小结
  • Symfony2学习笔记之模板用法详解
  • Symfony2框架学习笔记之表单用法详解
  • Symfony2框架创立项目与模板设置实例详解
  • symfony2.4的twig中date用法深入分析
  • Symfony2安装第三方Bundles实例详解
  • Symfony2实现在controller中获取url的方法
  • Symfony2针对输入时间进行询问的章程深入分析

我们曾经知道.yml扩大名能够转移成.xml或.php,只要你欢欣使用XML或PHP来写配置。注意每一种情况也能够加载它们本人的配备文件。上面是为生产条件准备的安顿文件。

# app/config/config_dev.yml
imports:
  - { resource: config.yml }
framework:
  router:  { resource: "%kernel.root_dir%/config/routing_dev.yml" }
  profiler: { only_exceptions: false }
web_profiler:
  toolbar: true
  intercept_redirects: true
zend:
  logger:
    priority: debug
    path:   %kernel.logs_dir%/%kernel.environment%.log

import关键词与PHP格式中include语句同样,都是率先指引主配置文件(config.yml),文件的任何一些是为了拉长的日志和别的有助于开采情况的安装而对缺省安顿举办的调度。

在生养条件和测量试验意况都根据同样多少个模型:各个景况导入基本配备文件,然后修改它们的布局值去适应非常景况的内需。

小结

恭喜你,你今后曾经知道了Symfony2的基本原理,并高兴地窥见它是那样的惠及灵活。就算有不知凡几的功力,但大家得以牢记以下多少个体贴:

1、创立页面供给四个步骤,包罗路由、调节器和模板(可选);
2、各类应用程序都应该包括五个目录:web/(web财富和前端调整器)、app/(配置)、src/(你的Bundle)和vendor/(第三方代码);
3、Symfony2的种种作用(包罗Symfony2框架宗旨)都被集体进四个Bundle,Bundle是该意义的结构化文件集;
4、每一个Bundle的布署都寄存在app/config目录中,能够采纳YAML、XML和PHP编写;
5、通过分裂的前端调控器(如:app.php或app_dev.php)和铺排文件,各样情况都能够被访谈。

可望本文所述对大家基于Symfony框架的PHP程序设计有所帮忙。

你只怕感兴趣的篇章:

  • Symfony2联合查询达成方式
  • Symfony2使用Doctrine实行数据库查询情势实例总计
  • 高质量PHP框架Symfony2美丽入门教程
  • symfony表单与页面达成工夫
  • Symfony页面包车型客车核心创立实例详解
  • Symfony学习十分钟入门精彩教程
  • Symfony2完结从数据库获取数据的不二等秘书籍小结
  • Symfony2学习笔记之模板用法详解
  • Symfony数据校验方法实例分析
  • Symfony2框架学习笔记之表单用法详解
  • Symfony2安装的措施(2种艺术)
  • Symfony查询艺术实例小结

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website