前言:sf2是一个重量级框架,基本上能做http的任何事情,使用灵活的配置直接使用通用代码以减少开发,基于composer集成多个功能包,自身核心主要解决controller级相关问题。本指南主要面向有框架相关基础的php中级程序员,推荐使用循环学习法学成sf2框架。
一、准备工作
1、服务器php5.4+,mysql5.1+,并配置好web 网站 http://127.0.0.1/ 可访问。
2、php.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支持从orm到mysql,这里使用我们的习惯:从mysql到orm,执行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 |
这会自动补充完entity中orm属性的get和set方法。这两个文件即是mysql的Model。
5、实现会员表单模型,到 ~/ 目录下运行命令
php app/console generate:doctrine:form SiteBlogBundle:User |
这会产生UserType.php文件到~/src/Site/BlogBundle/Form目录。这是会员form的Model。
6、实现文章表单模型,到 ~/ 目录下运行命令
php app/console generate:doctrine:form SiteBlogBundle:Post |
这会产生PostType.php文件到~/src/Site/BlogBundle/Form目录。这是文章form的Model。
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文件,即user的Controller。
同时自动产生~/src/Site/BlogBundle/Resources/views/User下模板文件,即user的View。
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 %} |
本文出自 “晓军知了” 博客,请务必保留此出处http://9670708.blog.51cto.com/9660708/1587680
原文地址:http://9670708.blog.51cto.com/9660708/1587680