Maison >développement back-end >tutoriel php >Explication détaillée de la création de projets et de la configuration de modèles dans le framework Symfony2
Cet article présente principalement la méthode de création de projets et de paramètres de modèle dans le framework Symfony2, et analyse en détail les étapes spécifiques et le code d'implémentation détaillé du framework Symfony2 sous forme d'exemples. Les amis dans le besoin peuvent s'y référer. J'espère que cela sera utile à tout le monde.
Préparation et aperçu de l'environnement
Habitué à utiliser l'éditeur Netbean dans Windows et le système Virtual Centos VirtualBox, nginx+php-fpm+mysql préinstallé, de bien sûr, Apache est également un bon choix. Utilisez http://symfony comme nom de domaine de développement sur Windows et Centos.
1. Paramètres de téléchargement et d'environnement
1. Comment établir un environnement de développement sur centos ne sera pas décrit en détail. Bien entendu, l'environnement de développement peut également l'être. établi sur les fenêtres.
2. Concernant l'utilisation de symfony au lieu de 127.0.0.1, modifiez le fichier /etc/hosts dans le système Liunx et modifiez le fichier C:WindowsSystem32driversetchost dans le système Win7 (doit être ouvert avec les privilèges d'administrateur)
Ajouter similaire Entrez simplement le contenu de l'alias IP 1 et de l'alias 2, tel que :# /etc/hosts 127.0.0.1 symblog dev symfony3. Téléchargez manuellement symfony2. La seule chose à noter est la suivante : les répertoires app/cache et app/logs doivent être définis sur 777 autorisations. Ce problème ne devrait pas exister dans l'environnement de développement Windows. 4. Modifiez le nom de domaine symfony du fichier de configuration Apache ou Nginx pour pointer vers le répertoire Web du fichier symfony téléchargé. À ce stade, vous devriez pouvoir accéder à la page par défaut de symfony via http://symfony/app_dev.php. Il existe plusieurs démos auxquelles vous pouvez vous référer et dont vous pouvez apprendre. app_dev.php charge par défaut une barre d'outils de développement ci-dessous, qui affiche des informations sur la page actuelle, ce qui facilite grandement le débogage du programme. Uniquement lorsque la variable d'environnement est dev. affiché. 5. Lorsque vous utilisez Composer pour l'installation, vous serez invité à afficher MySQL et d'autres informations associées. Si vous devez modifier ces informations ou télécharger directement le fichier, vous pouvez accéder à la page "Configurer". paramètres pertinents. Les bundles (peut-être appelés packages, bundles, assemblys ou projets, utilisons l'anglais) sont l'élément de base de symfony, des packages de code réutilisables partagés un par un, même symfony lui-même. Il est exécuté comme un bundle. Y compris des contrôleurs, des modules, des modèles et même des images, des feuilles de style js, css et d'autres ressources. C'est une chose très compliquée. Différents bundles utilisent l'espace de noms après php5.3. La plupart des hôtes virtuels cpenal et da semblent n'avoir que la version php5.2, et symfony2 ne peut pas être exécuté.
2. Créer un bundle
Dans l'exemple suivant, un blog sera créé. Symfony fournit un grand nombre d'outils pour créer rapidement des projets. Par exemple, nous pouvons l'utiliser pour créer rapidement un bundle de base pour un blogphp app/console generate:bundle –namespace=Blogger/BlogBundle –format=ymlUtilisez simplement tous les paramètres par défaut après l'avoir exécuté. Nous pouvons facilement créer les contrôleurs, modules et modèles de base dont nous avons besoin. Contient le comportement suivant :
Enregistrer les bundles
Tous les bundles utilisés dans symfony doivent d'abord être enregistrés. Certains bundles ne seront utilisés que dans des environnements de développement et de test (dev. ou test), comme mentionné ci-dessus dans la barre d'outils de développement. L'extrait de code ci-dessous montre comment la commande de création de bundle enregistre le bundle BloggerBlogBundle.// app/AppKernel.php class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // .. new Blogger\BlogBundle\BloggerBlogBundle(), ); // .. return $bundles; } // .. } }
routage
<.>En tant que framework, la fonction de routage est créée dans app/config/routing.yml par le créateur du bundler Symfony utilise le format yml pour enregistrer les informations de configuration.
# app/config/routing.yml BloggerBlogBundle: resource: "@BloggerBlogBundle/Resources/config/routing.yml" prefix: /Fichier
En plus des fichiers de configuration ci-dessus, la plupart des autres fichiers sont générés dans le répertoire src, comme la plupart des frameworks mvc. Le répertoire Blogger est généré sous src et il existe un sous-répertoire BlogBundle qui stocke divers éléments connexes. La différence est qu'un répertoire similaire à blogger correspond à l'espace de noms PHP.
Le générateur Bundle génère le contrôleur par défaut sous src. Un simple bonjour peut être vu en visitant : http://symfony/app_dev.php/hello/world. Concernant la façon dont cette page est générée :
routageest toujours un routage. La différence est que le routage précédent est enregistré et utilisé dans l'ensemble du programme. Le routage ici contrôle. la page spécifique. Utilisez src/Blogger/BlogBundle/Resources/config/routing.yml pour contrôler BloggerBlogBundle, y compris les fragments de programme suivants :
Paramètres : effectuez la détection d'URL, toute valeur conforme à la page spécifique. /hello/{name} structure Sera attribué à la méthode {name},# src/Blogger/BlogBundle/Resources/config/routing.yml BloggerBlogBundle_homepage: pattern: /hello/{name} defaults: { _controller: BloggerBlogBundle:Default:index }: Il n'y a aucune restriction sur le formulaire, en théorie, toutes les opérations de put, get, post et delete peuvent être effectuées.
Suivi : si les deux éléments ci-dessus sont remplis, alors {name} sera transféré vers un fichier spécifique et le comportement d'index ci-dessus du contrôleur par défaut dans le fichier src/Blogger/BlogBundle/Controller/DefaultController.php sera utilisé.
Dans le bundle de production par défaut, le comportement du contrôleur est assez simple, le paramètre {name} est transmis et transmis au fichier modèle :
BloggerBlogBundle:Default:index.html.twig utilisera le fichier modèle index.html.twig sous le dossier Default dans le dossier des vues BloggerBlogBundle.// 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)); } }Fichier modèle
Ouvrez le fichier modèle ci-dessus, un code très simple :
{# 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
相关推荐:
Explication détaillée de l'utilisation des variables de raccourci du modèle Symfony
Brève description des classes principales de Symfony
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!