이 글에서는 주로 Symfony2 프레임워크의 프로젝트 생성 방법과 템플릿 설정을 소개하고, Symfony2 프레임워크의 구체적인 단계와 세부 구현 코드를 예제 형식으로 자세히 분석합니다. 도움이 필요한 친구들이 참고하면 좋을 것 같아요.
환경 준비 및 개요
저는 Windows 및 virtualbox 가상 centos 시스템에서 netbean 편집기를 사용하는 데 익숙합니다. nginx+php-fpm+mysql이 사전 설치되어 있습니다. 물론 apache도 좋은 선택입니다. http:/를 사용하세요. /symfony in Windows 및 Centos의 개발 도메인 이름으로 사용됩니다.
1. 다운로드 및 환경 설정
1. Centos에서 개발 환경을 구축하는 방법은 자세히 설명하지 않습니다. 물론 Windows에서도 개발 환경을 구축할 수 있습니다.
2. 127.0.0.1 대신 Symfony를 사용하는 경우 liunx 시스템에서 /etc/hosts 파일을 수정하고 win7 시스템에서 C:WindowsSystem32driversetchost 파일을 수정합니다(관리자 권한으로 열어야 함)
유사한 콘텐츠 추가 IP 별칭 1 및 별칭 2로
# /etc/hosts 127.0.0.1 symblog dev symfony
3을 수동으로 다운로드합니다.
주의해야 할 유일한 사항은 앱/캐시 및 앱/로그 디렉터리가 777 권한으로 설정되어야 한다는 것입니다. Windows 개발 환경에서는 이 문제가 존재하지 않습니다.
4. 다운로드한 Symfony 파일의 웹 디렉터리를 가리키도록 Apache 또는 nginx 구성 파일의 Symfony 도메인 이름을 수정합니다.
이 시점에서 http://symfony/app_dev.php를 통해 Symfony의 기본 페이지에 액세스할 수 있습니다. 참조하고 배울 수 있는 몇 가지 데모가 있습니다.
app_dev.php에는 기본적으로 아래에 로드된 개발 도구 모음이 있으며, 이는 현재 페이지에 대한 일부 정보를 표시하여 프로그램 디버깅을 크게 촉진합니다. 환경 변수가 dev인 경우에만 표시됩니다.
5. Composer를 사용하여 설치하면 mysql 및 기타 관련 정보를 출력하라는 메시지가 표시됩니다. 이 정보를 수정하거나 파일을 직접 다운로드해야 하는 경우 "구성" 페이지에 들어가 관련 설정을 지정할 수 있습니다.
번들(패키지, 번들, 어셈블리, 프로젝트라고도 합니다. 영어로 부르죠)은 심포니의 기본으로, 하나씩 공유되는 재사용 가능한 코드 패키지이며 심포니 자체도 번들 실행으로 사용됩니다. 컨트롤러, 모듈, 템플릿은 물론 이미지, js, css 스타일 시트 및 기타 리소스도 포함됩니다. 매우 지저분한 일입니다. php5.3 이후에는 다른 번들이 네임스페이스를 사용합니다. 대부분의 cpenal 및 da 가상 호스트에는 php5.2 버전만 있는 것으로 보이며 Symfony2는 실행할 수 없습니다.
2. 번들 만들기
다음 예에서는 Symfony가 프로젝트를 빠르게 생성할 수 있는 다양한 도구를 제공합니다. 예를 들어, 기본 블로그 번들을 빠르게 생성하는 데 사용할 수 있습니다.
php app/console generate:bundle –namespace=Blogger/BlogBundle –format=yml
실행 후 모든 기본 설정을 사용하면 됩니다. 필요한 기본 컨트롤러, 모듈 및 템플릿을 쉽게 만들 수 있습니다. 다음 동작을 포함합니다:
번들 등록
symfony에서 사용되는 모든 번들은 먼저 등록해야 합니다. 일부 번들은 위에서 언급한 개발 도구 모음과 같은 개발 및 테스트 환경(개발 또는 테스트)에서만 사용됩니다. 아래 코드 조각은 번들 생성 명령이 BloggerBlogBundle 번들을 등록하는 방법을 보여줍니다.
// app/AppKernel.php class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // .. new Blogger\BlogBundle\BloggerBlogBundle(), ); // .. return $bundles; } // .. } }
routing
프레임워크로서 라우팅 기능은 app/config/routing.yml의 번들러 작성자에 의해 생성되고, Symfony는 yml에 있습니다. 구성 정보를 저장하는 형식입니다.
# app/config/routing.yml BloggerBlogBundle: resource: "@BloggerBlogBundle/Resources/config/routing.yml" prefix: /
접두사 옵션을 사용하면 블로그, 뉴스 등과 같은 하위 디렉터리에 배치할 수 있습니다.
파일
위 구성 파일 외에도 대부분의 mvc 프레임워크와 마찬가지로 대부분의 다른 파일은 src 디렉터리에 생성됩니다. Blogger 디렉토리는 src 아래에 생성되며 다양한 관련 항목을 저장하는 BlogBundle 하위 디렉토리가 있습니다. 차이점은 blogger와 유사한 디렉토리가 PHP 네임스페이스에 해당한다는 것입니다.
Default Controller
번들 생성기는 src 아래에 기본 컨트롤러를 생성합니다. 간단한 인사말은 http://symfony/app_dev.php/hello/world를 방문하여 볼 수 있습니다. 이 페이지 생성 방법에 관해:
routing
은 여전히 라우팅 중입니다. 차이점은 이전 라우팅이 전체 프로그램에 등록되어 사용된다는 것입니다. 여기서 라우팅은 src/Blogger/BlogBundle/의 사용을 제어합니다. Resources/config/ Routing.yml은 BloggerBlogBundle을 제어하고 다음 프로그램 조각을 포함합니다.
# src/Blogger/BlogBundle/Resources/config/routing.yml BloggerBlogBundle_homepage: pattern: /hello/{name} defaults: { _controller: BloggerBlogBundle:Default:index }
매개변수: URL 감지를 수행합니다. /hello/{name} 구조를 준수하는 모든 값은 {name}에 할당됩니다.
메소드: 거기 형식에는 제한이 없습니다. 이론 put, get, post, delete 등 모든 작업을 수행할 수 있습니다.
후속 조치: 위 두 항목이 충족되면 {name}이(가) 특정 파일로 전송되고 src/Blogger/BlogBundle/Controller/DefaultController.php 파일에 있는 기본 컨트롤러의 인덱스 동작이 사용됩니다. .
Controller
기본 프로덕션 번들러에서 컨트롤러 동작은 매우 간단합니다. {name} 매개변수는 템플릿 파일에 전달되고 전달됩니다.
// src/Blogger/BlogBundle/Controller/DefaultController.php namespace Blogger\BlogBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller { public function indexAction($name) { return $this->render('BloggerBlogBundle:Default:index.html.twig', array('name' => $name)); } }
BloggerBlogBundle:Default:index.html.twig가 사용됩니다. BloggerBlogBundle 보기 폴더의 Default 폴더 아래에 있는 index.html.twig 템플릿 파일입니다.
템플릿 파일
위의 템플릿 파일을 엽니다. 매우 간단한 코드입니다.
{# src/Blogger/BlogBundle/Resources/views/Default/index.html.twig #} Hello {{ name }}!
以上就是symfony的整个mvc流程, 这么多文件的作用只是输出一个 “hello world”. 理论上不用bundler创建器, 只是手动创建上述文件也可以实现相同效果。花费的时间就多了去了。
回到正题, 我们是创建博客系统, 所以不需要 hello world,
1.移除控制器 src/Blogger/BlogBundle/Controller/DefaultController.php
2.移除模板 src/Blogger/BlogBundle/Resources/views/Default/
3.最后移除路由 src/Blogger/BlogBundle/Resources/config/routing.yml
整个世界清静了。
三、让我们开始创建博客的主页
Twig的优点
在symfony中我们可以使用 Twig和php(这不是废话嘛)作为模板。使用Twig的以下优点:
1. 快: 是编绎过的php类, 可以占用更少的资源
2. 简洁:想想看要打, Twig输入的内容要少很多。
3. 可继承: 非常cool的一个功能
4. 安全: 转义功能默认开启, 甚至还可以为重要代码提供沙盒功能。
5. 可扩展: 需要额外的定制功能, 可以随时扩展
可继承是一个非常好的优点, 我们将使用三级继承结构来定制这个模板, 这将允许我们在三个不同层级修改模板, 方便自由定制。
主模板–level 1
<!– app/Resources/views/base.html.twig –> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html"; charset=utf-8" /> <title>{% block title %}symfony{% endblock %} – blog</title> <!–[if lt IE 9]> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]–> {% block stylesheets %} <link href='http://fonts.googleapis.com/css?family=Irish+Grover' rel='stylesheet' type='text/css'> <link href='http://fonts.googleapis.com/css?family=La+Belle+Aurore' rel='stylesheet' type='text/css'> <link href="{{ asset('css/screen.css') }}" type="text/css" rel="stylesheet" /> {% endblock %} <link rel="shortcut icon" href="{{ asset('favicon.ico') }}" /> </head> <body> <section id="wrapper"> <header id="header"> <p> {% block navigation %} <nav> <ul> <li><a href="#">Home</a></li> <li><a href="#">About</a></li> <li><a href="#">Contact</a></li> </ul> </nav> {% endblock %} </p> <hgroup> <h2>{% block blog_title %}<a href="#">symfony</a>{% endblock %}</h2> <h3>{% block blog_tagline %}<a href="#">creating a blog in Symfony2</a>{% endblock %}</h3> </hgroup> </header> <section> {% block body %}{% endblock %} </section> <aside> {% block sidebar %}{% endblock %} </aside> <p id="footer"> {% block footer %} <a href="http://blog.dengruo.com/201309/1409">Symfony2 博客教程</a> {% endblock %} </p> </section> {% block javascripts %}{% endblock %} </body> </html>
上面代码在引入了一个js文件, 在ie9版本前的浏览器中实现html, 以及两个css文件导入google fronts.
这构成了网页的主要内容结构, 相当于drupal的html.tpl.php+page.tpl.php.
让我们看一下头部文件
<title>{% block title %}blog{% endblock %} – symfony</title>
{% 标签中即不是html, 也不是php, 他是3个Twig标签中的一个, 用于执行某些动作。 这里可以找到完整的Twig控制动作用于这个标签。 回到当前代码, 是用于查找title的block并输出他, 如果没有则输出默认的symblo这个词。
Twig的可续承特性可以用于修改title, 我们可以在其它模板文件中重写它:
{% extends '::base.html.twig' %} {% block title %}The blog title goes here{% endblock %}
上面代码首先继承了第一次定义这个block的文件, 然后修改它。 网站标题部分会输出 'The blog title goes here – symfony'。
一般而言, 我们引用模板文件时会采用bundle:controller:template, 但是以上代码并没有bundle 和controller, 不包含这两个字段会直接引用app/Resources/views/ 文件夹下面的文件。
在css样式表中, 我们可以发现另一个Twig标签{{, 这是一个输出(说些什么)标签。
<link href="{{ asset('css/screen.css') }}" type="text/css" rel="stylesheet" />
这个标签用于输出变量或者表达式, 上面例子输出了asset函数的返回值, 这个函数提供可移植的方式来返回css,js, 图片的地址。
这个标签可以以特定格式输出我们想要内容, 比如时间:
{{ blog.created|date("d-m-Y") }}
全部过滤列表在 Twig 文档可以查到。
最后一个标签并没有在上述代码中出现, 它是{#, 只是一个注释标签
{# 注释内容可以输出在这里 #}
接下来我们将创建css样式表web/css/screen.css , 加入以下内容.
html,body,p,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;font-size:100%;font:inherit;vertical-align:baseline;margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}table{border-collapse:collapse;border-spacing:0} body { line-height: 1;font-family: Arial, Helvetica, sans-serif;font-size: 12px; width: 100%; height: 100%; color: #000; font-size: 14px; } .clear { clear: both; } #wrapper { margin: 10px auto; width: 1000px; } #wrapper a { text-decoration: none; color: #F48A00; } #wrapper span.highlight { color: #F48A00; } #header { border-bottom: 1px solid #ccc; margin-bottom: 20px; } #header .top { border-bottom: 1px solid #ccc; margin-bottom: 10px; } #header ul.navigation { list-style: none; text-align: right; } #header .navigation li { display: inline } #header .navigation li a { display: inline-block; padding: 10px 15px; border-left: 1px solid #ccc; } #header h2 { font-family: 'Irish Grover', cursive; font-size: 92px; text-align: center; line-height: 110px; } #header h2 a { color: #000; } #header h3 { text-align: center; font-family: 'La Belle Aurore', cursive; font-size: 24px; margin-bottom: 20px; font-weight: normal; } .main-col { width: 700px; display: inline-block; float: left; border-right: 1px solid #ccc; padding: 20px; margin-bottom: 20px; } .sidebar { width: 239px; padding: 10px; display: inline-block; } .main-col a { color: #F48A00; } .main-col h1, .main-col h2 { line-height: 1.2em; font-size: 32px; margin-bottom: 10px; font-weight: normal; color: #F48A00; } .main-col p { line-height: 1.5em; margin-bottom: 20px; } #footer { border-top: 1px solid #ccc; clear: both; text-align: center; padding: 10px; color: #aaa; }
Bundler模板–level 2
现在我们为blog bundler 创建模板, 创建src/Blogger/BlogBundle/Resources/views/layout.html.twig 并加入:
{# src/Blogger/BlogBundle/Resources/views/layout.html.twig #} {% extends '::base.html.twig' %} {% block sidebar %} Sidebar content {% endblock %}
非常简单的代码,1. 继承了一级模板, 并且为博客内容特别定制了侧边栏, 很显然我们并不想博客的布局与其它页面一样。 类似drupal7中page–content-type.tpl.php模板, 定制了某一特殊类型内容的布局。
具体页面布局–level 3
这个阶段已经涉及到创建具体页面, 所以需要先创建控制器src/Blogger/BlogBundle/Controller/PageController.php
// src/Blogger/BlogBundle/Controller/PageController.php namespace Blogger\BlogBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class PageController extends Controller { public function indexAction() { return $this->render('BloggerBlogBundle:Page:index.html.twig'); } }
然后创建相应的Twig文件: src/Blogger/BlogBundle/Resources/views/Page/index.html.twig
{# src/Blogger/BlogBundle/Resources/views/Page/index.html.twig #} {% extends 'BloggerBlogBundle::layout.html.twig' %} {% block body %} Blog homepage {% endblock %}
创建路由将首页引导到我们刚创建的页面:src/Blogger/BlogBundle/Resources/config/routing.yml
# src/Blogger/BlogBundle/Resources/config/routing.yml BloggerBlogBundle_homepage: pattern: / defaults: { _controller: BloggerBlogBundle:Page:index } requirements: _method: GET
再次访问 http://symfony/app_dev.php可以看见简单的首页。
四、再创建一个about页面
路由:在src/Blogger/BlogBundle/Resources/config/routing.yml中加入
# src/Blogger/BlogBundle/Resources/config/routing.yml BloggerBlogBundle_about: pattern: /about defaults: { _controller: BloggerBlogBundle:Page:about } requirements: _method: GET
当以get方式访问about页时执行位于BloggerBlogBundle命名空间的page控制器about动作。
控制器: 在src/Blogger/BlogBundle/Controller/PageController.php 于page控制器中加入about动作
// src/Blogger/BlogBundle/Controller/PageController.php // .. public function aboutAction() { return $this->render('BloggerBlogBundle:Page:about.html.twig'); } // ..
模板: 创建src/Blogger/BlogBundle/Resources/views/Page/about.html.twig 并加入相关页面文件
{# src/Blogger/BlogBundle/Resources/views/Page/about.html.twig #} {% extends 'BloggerBlogBundle::layout.html.twig' %} {% block body %} about page {% endblock %}
简单的三个流程增加了关于页面:http://symfony/app_dev.php/about
相关推荐:
Symfony가 템플릿 및 동작에서 요청 매개변수를 얻는 방법에 대한 자세한 설명
Symfony 템플릿 바로가기 변수 사용에 대한 자세한 설명
위 내용은 Symfony2 프레임워크에서 프로젝트 생성 및 템플릿 설정에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!