Symfony2.5快速开发

前言:sf2是一个重量级框架,基本上能做http的任何事情,使用灵活的配置直接使用通用代码以减少开发,基于composer集成多个功能包,自身核心主要解决controller级相关问题。本指南主要面向有框架相关基础的php中级程序员,推荐使用循环学习法学成sf2框架。

 

 

一、准备工作

1、服务器php5.4+mysql5.1+,并配置好web 网站 http://127.0.0.1/ 可访问。

2php.ini里设置:

[xdebug]

zend_extension = php_xdebug-2.2.5-5.5-vc11-nts-x86_64.dll

xdebug.max_nesting_level = 250

realpath_cache_size = 1024

3、下载sf

http://symfony.com/download?v=Symfony_Standard_Vendors_2.5.6.zip

http://zyme.name/Symfony_Standard_Vendors_2.5.6.zip

4、开发布署:为了方便访问,解压sf包到http://127.0.0.1/web根目录即可,然后能访问 http://127.0.0.1/Symfony/web/config.php 查看是否安装合格,点这页的config...online进行系统简单安装,然后 http://127.0.0.1/Symfony/web/app_dev.php/ 就是首页。

5、以后本文 -/ 代指 http://127.0.0.1/Symfony/web/app_dev.php/ 路径, ~/ 代指硬盘中 .../ Symfony/ 目录。

 

6、欢迎页面上的要点:

右上角的搜索可以搜索到sf官网上的文档内容,

RUN THE DEMO可以看到默认演示网站(这是示例,可以研究),其源代码在~/src/Acme里,

页脚是debug工具条,里面重点关注request,logs,routing,doctrine

7、相关参考:

http://symfony.com/doc/current/quick_tour/the_big_picture.html

http://symfony.com/doc/current/index.html

http://firehare.blog.51cto.com/809276/592385

http://symfony.cn/docs/quick_tour/index.html

http://www.howzhi.com/course/5389/

http://www.chrisyue.com/posts/270.translation-create-your-own-framework-on-top-of-the-symfony2-components-index

http://firehare.blog.51cto.com/809276/703599

 

 

二、博客实例.准备.注册

1、本例实现简单的blog系统,功能要点为:注册,登录,文章列表,分页,录入,修改等。知识要点为:包,控制器,路由,数据层,表单,视图等。

2、数据库,sf2支持从ormmysql,这里使用我们的习惯:从mysqlorm,执行mysql代码,产生一些简单的blog系统数据表

CREATE TABLE `user` (

  `user_id` int(9) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',

  `username` varchar(20) NOT NULL COMMENT '用户名称',

  `password` varchar(32) NOT NULL COMMENT '登录密码',

  PRIMARY KEY (`user_id`),

  UNIQUE KEY `username` (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员表';

 

CREATE TABLE `post` (

  `post_id` int(9) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章ID',

  `user_id` int(9) unsigned NOT NULL COMMENT '用户ID',

  `title` varchar(250) NOT NULL COMMENT '文章标题',

  `content` text NOT NULL COMMENT '文章内容',

  `created` datetime NOT NULL COMMENT '创建时间',

  PRIMARY KEY (`post_id`),

  KEY `user_id` (`user_id`),

  CONSTRAINT `post_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章表';

3、创建site包,到 ~/ 目录下运行命令

php app/console generate:bundle --namespace=Site/BlogBundle

在以下提示后输入相关值,即使用注释作配置,并创建目录结构,其它默认回车即可

Configuration format (yml, xml, php, or annotation): annotation

Do you want to generate the whole directory structure [no]? yes

这会产生一些默认文件到~/src/Site/BlogBundle目录,同时访问 - /hello/zyme 有内容显示。

4、映射mysql表到entity文件,到 ~/ 目录下运行命令

php app/console doctrine:mapping:import SiteBlogBundle yml

这会产生两个文件到~/src/Site/BlogBundle/Resources/config/doctrine目录。

再到 ~/ 目录下运行命令

php app/console doctrine:mapping:convert annotation src

这会产生两个文件到~/src/Site/BlogBundle/Entity目录。

再到 ~/ 目录下运行命令

php app/console doctrine:generate:entities SiteBlogBundle

这会自动补充完entityorm属性的getset方法。这两个文件即是mysqlModel

5、实现会员表单模型,到 ~/ 目录下运行命令

php app/console generate:doctrine:form SiteBlogBundle:User

这会产生UserType.php文件到~/src/Site/BlogBundle/Form目录。这是会员formModel

6、实现文章表单模型,到 ~/ 目录下运行命令

php app/console generate:doctrine:form SiteBlogBundle:Post

这会产生PostType.php文件到~/src/Site/BlogBundle/Form目录。这是文章formModel

7、实现会员表单控制器,里面有两个功能:注册和登录,到 ~/ 目录下运行命令

php app/console generate:controller --controller=SiteBlogBundle:User

在以下提示后输入相关值,即创建了两个action及其route,其它默认回车即可

New action name (press <return> to stop adding actions): registerAction

Action route [/register]: /user/register

New action name (press <return> to stop adding actions): loginAction

Action route [/login]: /user/login

这会自动产生~/src/Site/BlogBundle/Controller/UserController.php文件,即userController

同时自动产生~/src/Site/BlogBundle/Resources/views/User下模板文件,即userView

8、完善会员表单控制器registerAction方法,编辑~/src/....../UserController.php文件

class前面增加

use Site\BlogBundle\Entity\User;

use Site\BlogBundle\Form\UserType;

并修改registerAction()

    public function registerAction()

    {

                   $form = $this->createForm(new UserType(), new User());

                   $form->add('确定', 'submit');

                   $form->handleRequest($this->getRequest());

                   if ($form->isValid())

                   {

                            $em = $this->getDoctrine()->getManager();

                            $em->persist($form->getData());

                            $em->flush();

                            exit('OK.'.__METHOD__);

                   }

        return ['form' => $form->createView()];

         }

 

9、完善会员注册表单视图,编辑~/src/...... /views/User下模板文件为

{% extends "::base.html.twig" %}

{% block body %}

    {{ form(form) }}

{% endblock %}

10、访问网页 -/user/register ,注册一个会员,返回ok即可。

 

 

三、博客实例.登录

1、系统对登录的处理,需要几个要点配合:防火墙,访问控制,用户接口,登录表单等。

2、用户接口,扩充 ~/src/Site/BlogBundle/Entity/User.php 实现 UserInterface 接口

use Symfony\Component\Security\Core\User\UserInterface;

class User implements UserInterface

{

    #......# 增加的对UserInterface 接口的实现方法

    public function getRoles()

    {

        return array('ROLE_USER');

    }

    public function getSalt() { }

    public function eraseCredentials() { }

}

3、网站配置,修改 ~/app/config/security.yml 文件内应有以下设置

security:

    encoders:

        Site\BlogBundle\Entity\User: plaintext

    providers:

        site_blog_user:

            entity: { class: SiteBlogBundle:User, property: username }

    firewalls:

        dev:

            pattern:  ^/(_(profiler|wdt)|css|images|js)/

            security:  false

        site_blog_pass_area:

            pattern:   ^/user/(login|register)$

            security:  false

        site_blog_secured_area:

            pattern:   ^/

            provider:  site_blog_user

            http_basic:

                realm: "Secured Area"

    access_control:

        - { path: ^/user/(login|register)$, roles: IS_AUTHENTICATED_ANONYMOUSLY }

        - { path: ^/, roles: ROLE_USER }

此时,访问 -/user/register 时不会提示输入密码框,访问其它如 -/ 时,都会提示需要密码。

4、以上配置,登录使用的是http认证,可以修改为常用的登录表单认证,方法见官方文档。

 

 

三、博客实例.文章增加.修改.删除

 

 

四、博客实例.文章列表分页

 

五、多语言

1、修改app配置文件,~/app/config/config.yml

framework:

    translator:      { fallback: "%locale%" }

2、增加各种语言的译文文件,比如这里支持en(英文) / zh(简体中文) / zh-tw(繁体中文),在....../Resources/translations目录下,创建三个文件messages.en.yml/messages.zh.yml

#文件messages.en.yml的内容

sf.good: Symfony is good

#文件messages.zh.yml的内容

sf.good: 简体中文

#文件messages.zh-tw.yml的内容

sf.good: 中文繁体

3、在控制器里使用多语言结果,比如-/hello/zyme对应的控制器indexAction修改为

    public function indexAction($name)

    {

                   $this->getRequest()->setLocale('en'); // 分别设置为en/zh/zh-tw不同翻译结果

                   $name = $this->get('translator')->trans('sf.good');

        return array('name' => $name);

    }

然后访问 -/hello/zyme 可以看到不同的翻译结果

4、或者,不在控制器里使用多语言结果,也可以在view文件里进行翻译输出

{% trans %}sf.good{% endtrans %}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章