65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Symfony 框架创建 Web 项目

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2015年2月1日

CPOL

8分钟阅读

viewsIcon

19637

提供丰富、交互式的体验将增加访客回访您的网站。Symfony,作为一种稳定且强大的开发环境,可用于创建各种 Web 项目。在此,我们提供 Symfony 的介绍和入门指南。

引言

Symfony 的第一个版本发布于 2007 年 1 月。自那时以来,Symfony 代码经历了多次修改。它的应用范围广泛,从小型的网站到企业级应用。Symfony 组件甚至被用作许多其他框架的基础(例如:Drupal、phpBB、Laravel,以及更多)。该框架已成为稳定开发环境的世界标准,并由拥有 13 年软件开发经验的 SensioLabs 赞助。

Symfony 基于六个原则

  1. 最大限度地缩短开发时间和应用程序支持时间,以及最大限度地减少开发过程中的重复操作。
  2. 无限的应用灵活性:事件分发器和依赖注入允许您对代码进行令人难以置信的操作。
  3. 可扩展性:应用程序的所有组件都以易于插入的 Bundle(提供额外功能的重用块)的形式呈现。
  4. 稳定性:SensioLabs 保证主要版本支持三年。
  5. 开发满意度:框架提供了非常方便的结构(调试栏、分析器等),让开发者的生活更轻松。
  6. 大量的文档帮助初学者理解代码。

在创建 Symfony Web 项目时,使用可靠且强大的 Web 托管提供商非常重要,例如 1&1 Internet

项目创建

要创建一个项目,您需要下载 symfony.phar 文件。对于 Linux 用户是

$ curl -LsS https://symfony.com.cn/installer > symfony.phar
$ sudo mv symfony.phar /usr/local/bin/symfony
$ chmod a+x /usr/local/bin/symfony

对于 Windows 用户

c:\> php -r "readfile('https://symfony.com.cn/installer');" > symfony.phar

然后将 symfony.phar 文件复制到存储项目的文件夹中。

要创建一个新应用程序,只需键入包含项目名称的命令。在此示例中,我们将项目命名为“blog”。

# Linux, Mac OS X
$ cd projects/
$ symfony new blog

# Windows
c:\> cd projects/
c:\projects\> php symfony.phar new blog

应用程序和 Bundle 的默认配置可以快速轻松地创建。现在您可以开始开发了。

项目配置

所有配置文件都在 app/config 中,它们由四种类型的文件组成

  1. Config:此处存储特定于安装的应用程序设置。
  2. Parameters:有关基础架构(数据库、邮件)的设置。
  3. Security:安全设置,包括所有授权和身份验证要求。
  4. Routing:路由设置,允许灵活地自定义 URL 映射并轻松更改。

通过使用 parameters.yml 文件使项目可配置始终是个好主意。从 2.3 版本开始,Symfony 包含 parameters.yml.dist 文件,该文件可用作此目的的模板。将所有参数添加到此模板和主参数文件中(以及新参数),以便在将代码移植到生产服务器时保留其设置。

Symfony 支持的文件配置格式包括:yml、xml、php 数组和注释。通过简单的 Google 搜索可以找到许多配置示例。为了将必要的服务配置转换为新格式,您可以使用类似 http://converter.rosstuck.com/ 的服务。

代码组织

AppBundle 是开发所有应用程序的绝佳资源。如果您的应用程序很小,它会特别方便。如果您有很多不同的逻辑,只需将其分成几个 Bundle,以便更容易理解代码。

要创建新 Bundle,请使用

php app/console generate:bundle

更多详细信息可在以下网址找到:https://symfony.com.cn/doc/current/bundles/SensioGeneratorBundle/commands/generate_bundle.html

控制器

为了使您的代码易于阅读和理解,在开发控制器时最好遵循“瘦控制器”原则。理想情况下,控制器必须执行四项操作

  1. 获取请求
  2. 处理表单(如果存在)
  3. 调用服务中的方法,这些方法包含您应用程序的业务逻辑
  4. 返回响应

详细信息:https://symfony.com.cn/doc/current/best_practices/controllers.html

路由

通过拥有几个入口点,您可以使用注解中的路由设置 - 否则,最好在您的 Bundle 设置中使用单独的 routing.yml 文件。请记住将其添加到 app/cofig/routing.yml

有关路由的更多信息:https://symfony.com.cn/doc/current/book/routing.html

模板

建议使用一种名为 Twig 的语言编写 Symfony 模板。它是一种灵活、快速且强大的模板处理方式。

将布局模板放在 app/views/... 文件夹中,并将 Bundle 模板放在 src/YourBundle/Resources/views/ControllerName/templateName.html.twig 中非常方便。

在 Twig 中,有三种特殊语法(根据 Symfony.com 定义)

{{ ... }}

"输出内容":将变量或表达式的结果打印到模板。

{% ... %}

"执行操作":一个控制模板逻辑的标签;例如,用于执行 for 循环等语句。

{# ... #}

"注释内容":相当于 PHP 的 /* comment */ 语法。用于添加单行或多行注释。注释内容不包含在渲染的页面中。

Twig 通过允许您使用条件、循环、过滤器等来简化模板开发过程。详细信息:https://symfony.com.cn/doc/current/book/templating.htmlhttp://twig.sensiolabs.org/

表单

表单是最大的组件之一,它们的用法可能与开发人员预期的不同,因为它们很难处理。幸运的是,Symfony 有一个表单组件可以简化此过程。

始终尝试在单独的类中创建表单。类表单示例

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class PostType extends AbstractType
{
     public function buildForm(FormBuilderInterface $builder, array $options)
    {
           $builder
		->add('title')
		->add('summary', 'textarea')
		->add('content', 'textarea')
		->add('authorEmail', 'email')
		->add('publishedAt', 'datetime');
    }
    
    public function setDefaultOptions(OptionsResolverInterface $resolver)
   {
          $resolver->setDefaults(array(
		'data_class' => 'AppBundle\Entity\Post'
          ));
   }

    public function getName()
   {
          return 'post';
    }
}

此外,尝试将表单与实体绑定 — 这将允许自动从实体配置中提取验证和字段类型。

最好在模板中添加表单提交按钮。通常,‘form submit’的实现方式如下

public function newAction(Request $request)
{
	// build the form ...
	$form->handleRequest($request);
	if ($form->isValid()) {
		$em = $this->getDoctrine()->getManager();
		$em->persist($post);
		$em->flush();
		return $this->redirect($this->generateUrl(
			'admin_post_show',
			array('id' => $post->getId())
		));
	}
	// render the template
}

在电子书《Symfony 最佳实践》中

if ($form->isValid()) { …. }

看起来像

if ($form->isSubmitted() && $form->isValid()) {….}

$form->isSubmitted() 不是必需的,因为 $form->isValid() 中也进行了相同的检查。

有关表单的更多信息:https://symfony.com.cn/doc/current/book/forms.html

国际化

国际化和本地化将应用程序及其内容调整为用户特定的区域或语言。使用 Symfony,这是一项选择加入的功能,在使用前需要启用。为此,请取消注释以下翻译器配置选项并设置您的应用程序区域设置

# app/config/config.yml
   framework:
	# ...
	translator: { fallback: "%locale%" }

# app/config/parameters.yml
   parameters:
	# ...
	locale: en

尽可能使用翻译键,而不是需要翻译的文本行。最方便的实现方式是为翻译使用 yaml 文件。通常建议使用 xliff 格式进行翻译文件,但有时该格式会使事情变得不必要地复杂。

将您的翻译文件存储在对应的 Bundle 中,位于 src/YourBundle/Resources/translations/someTranslation.yml

安全

安全设置通常被认为是 Symfony 最复杂的方面之一。在这里,我们将尝试简化一些最佳实践。

安全设置存储在 app/config/security.yml 中,其中大部分在防火墙中。提醒一下:安全组件可防止对当前用户禁止的资源进行访问。安全设置包括身份验证(验证身份)和授权(提供权限)的设置。

对于大多数情况,只需要一个防火墙。有时(例如,当您有 Web 部分和 API 时)您需要配置两个防火墙。

这是一个 security.yml 的示例,它提供了一个登录表单以从数据库获取用户。

security:
    encoders:
        AppBundle\Entity\User: bcrypt

    providers:
        database_users:
            entity: { class: AppBundle:User, property: username }

    firewalls:
        secured_area:
            pattern: ^/
            anonymous: true
            form_login:
                check_path: security_login_check
                login_path: security_login_form

            logout:
                path: security_logout
                target: homepage

# ... access_control exists, but is not shown here

Symfony 提供了多种授权用户的方式

  1. 在 security.yml 文件中的 access_control 键中 — 用于 URL 模板中的安全。
  2. @Security 注解是一种非常方便的方法(在大多数情况下首选)。
  3. 服务 security.authorization_checker 的使用 — 在极少数情况下。

@Security 注解的使用示例。

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
// ...
/**
* @Security("has_role('ROLE_ADMIN')")
*/
public function newAction()
{
	// ...
}

只有具有 ROLE_ADMIN 角色的用户才能访问给定的操作。

您将在以下网址找到有关安全设置的更多信息:https://symfony.com.cn/doc/current/book/security.html

资产

为了方便处理 js/css/images,请使用 Assetic 组件。您必须将资源存储在 src/YourBundle/Resources/public 中。

仅仅创建 css 和 js 文件并将其包含在模板文件中是不够的。您必须压缩和最小化它们,然后使用较小的版本来加速客户端的加载时间。Assetic 是实现此目的的绝佳工具。一些简单的命令将有助于收集和最小化文件。此命令将在您的 Web 项目文件夹中查找并传输所有资产。

php app/console assets:install

以下命令将模板中包含的所有 js 和 css 组合收集到单独的文件中,以便在客户端快速加载。

php app/console assetic:dump --no-debug

记住通过 --env 参数指定您的环境。

您可以在模板中像这样包含文件

{% stylesheets
	'css/bootstrap.min.css'
	'css/main.css'
	filter='cssrewrite' output='css/compiled/all.css' %}
	<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
{# ... #}
{% javascripts
	'js/jquery.min.js'
	'js/bootstrap.min.js'
	output='js/compiled/all.js' %}
	<script src="{{ asset_url }}"></script>
{% endjavascripts %}

您可以在这里找到有关此组件的更多信息:https://symfony.com.cn/doc/current/cookbook/assetic/asset_management.html

您肯定需要的一些 Bundle

Symfony 由一个庞大的开发社区支持,该社区不断致力于改进和增强。已有超过 2400 个 Bundle 被开发出来,以满足广泛的需求。在众多选项中,您可以考虑以下高质量的 Bundle:

FOSUserBundle - 允许灵活地管理数据库中的用户。

SonataAdminBundle – 协助创建管理面板。

SonataUserBundle - 将 FOSUserBundle 集成到 SonataAdminBundle 中。

KnpMenuBundle - 帮助处理菜单。

SensioFrameworkExtraBundle - 一套工具,通过允许您使用注解配置控制器,为您的代码增添优雅和简洁。该组件添加了以下注解:@Route, @Cache@Template, @ParamConverter,@Method,以及@Security

结论

Symfony 可用于创建各种规模的 Web 项目。本文提供了 Symfony 框架的介绍以及开始第一个项目的技巧。Symfony 提供了一本精彩的《最佳实践》电子书,其中提供了更深入的信息。

提供积极的用户体验对于在线成功至关重要。确保您的Web 托管套餐能够满足您 Web 项目的性能需求非常重要。选择一个超出您日常需求的解决方案可以确保您网站的可用性和性能。1&1 的 Web 托管为即使是资源密集型 Web 项目也提供了方便而强大的环境。

有关如何实现在线成功的更多技巧和建议,无论对于初学者还是高级用户,请访问1&1 社区1&1 博客

© . All rights reserved.