この記事では、Symfony2 フレームワークのプロジェクトとテンプレート設定の作成方法を主に紹介し、Symfony2 フレームワークの具体的な手順と詳細な実装コードをサンプルの形式で詳細に分析します。困っている友達が参考になれば幸いです。
環境の準備と概要
私は Windows の Netbean エディターと virtualbox 仮想 centos システム、プリインストールされた 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 symfony2 を手動でダウンロードします。
注意する必要がある唯一のことは、app/cache ディレクトリと app/logs ディレクトリが 777 権限に設定されている必要があることです。この問題は Windows 開発環境では存在しないはずです。
4. ダウンロードした symfony ファイルの Web ディレクトリを指すように、Apache または nginx 設定ファイルの symfony ドメイン名を変更します。
この時点で、http://symfony/app_dev.php から symfony のデフォルトのページにアクセスできるようになります。参照して学ぶことができるデモがいくつかあります。
app_dev.php には、デフォルトで以下にロードされる開発ツールバーがあり、現在のページに関する情報が表示され、プログラムのデバッグが非常に容易になります。環境変数が dev の場合にのみ表示されます。
5. Composer を使用してインストールする場合、mysql およびその他の関連情報を出力するように求められます。この情報を変更するか、ファイルを直接ダウンロードする必要がある場合は、「設定」ページに入って関連する設定を行うことができます。
バンドル (パッケージ、バンドル、アセンブリ、プロジェクトなどと呼ばれるかもしれません。英語を使いましょう) は symfony の基本的なもので、1 つずつ共有される再利用可能なコード パッケージであり、symfony 自体も進行中のバンドルとして使用されます。コントローラー、モジュール、テンプレート、さらには画像、js、css スタイル シート、その他のリソースが含まれます。これは非常に厄介で、php5.3 以降の名前空間をさまざまなバンドルが使用しています。ほとんどの cpenal および da 仮想ホストには php5.2 バージョンしかなく、symfony2 は実行できません。
2. バンドルを作成する
次の例では、Symfony はプロジェクトを迅速に作成するための多数のツールを提供します。 たとえば、これを使用して基本的なブログ バンドルを簡単に作成できます
php app/console generate:bundle –namespace=Blogger/BlogBundle –format=yml
実行後はすべてデフォルト設定を使用するだけです。 必要な基本的なコントローラー、モジュール、テンプレートを簡単に作成できます。 以下の動作が含まれます:
バンドルの登録
symfony で使用されるすべてのバンドルは、最初に登録する必要があります。一部のバンドルは、上記の開発ツールバーなど、開発およびテスト環境 (dev または test) でのみ使用されます。以下のコード スニペットは、バンドル作成コマンドが 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: /
prefix オプションを使用すると、ブログ、ニュースなどのサブディレクトリに配置できます。
ファイル
上記の構成ファイルに加えて、ほとんどの mvc フレームワークと同様に、他のほとんどのファイルが src ディレクトリに生成されます。 Blogger ディレクトリは src の下に生成され、さまざまな関連情報を保存する BlogBundle サブディレクトリがあります。違いは、blogger と同様のディレクトリが PHP 名前空間に対応することです。
デフォルト コントローラー
バンドル ジェネレーターは、src の下にデフォルト コントローラーを生成します。 簡単な hello は、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 などのすべての操作を実行できます。
フォローアップ: 上記の 2 つの項目が満たされる場合、{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. 简洁:想想看要打bb9bd6d87db7f8730c53cb084e6b4d2d, 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 中国語 Web サイトの他の関連記事を参照してください。