现在您已经非常了解symfony了,ob娱乐下载您已经能够深入研究它的代码来理解它的核心设计并发现新的隐藏功能。但是在扩展symfony类以满足您自己的需求之前,ob娱乐下载您应该仔细查看一些配置文件。symfony中已经内置了许多特性,只需更改配置设置就可以激活它们。ob娱乐下载这意味着您可以在不重写其类的情况下调整symfony核心行为。ob娱乐下载本章将带您深入了解配置文件及其强大的功能。
的前端/ config / settings.yml文件包含的主要symfony配置ob娱乐下载前端应用程序。在前面的章节中,您已经看到了该文件中许多设置的功能,但让我们重新审视它们。
前端/ config / settings.yml
前端
正如在第5章中所解释的,这个文件是环境相关的,这意味着每个设置可以为每个环境取不同的值。方法可以从PHP代码中访问此文件中定义的每个参数sfConfig类。参数名是设置名的前缀sf_.的值缓存参数,您只需要调用sfConfig: get(“sf_cache”).
sfConfig
sf_
缓存
sfConfig: get(“sf_cache”)
ob娱乐下载Symfony为特殊情况提供了默认页面。路由错误时,symfony将执行ob娱乐下载默认的模块中存储的sfConfig: get (sf_ob娱乐下载symfony_lib_dir) /控制器/违约目录中。的settings.ymlFile根据错误定义执行哪个动作:
默认的
sfConfig: get (sf_ob娱乐下载symfony_lib_dir) /控制器/违约
settings.yml
error_404_module
error_404_action
sfError404Exception
默认的/那么error404
login_module
login_action
安全
security.yml
默认的/登录
secure_module
secure_action
默认的/安全
module_disabled_module
module_disabled_action
module.yml
默认的/禁用
在将应用程序部署到生产环境之前,您应该自定义这些操作,因为默认的模块模板包括页面上的symfony标志。ob娱乐下载如图19-1所示为其中一个页面的截图,即错误404页面。
图19-1 -默认的404错误页面
你可以用两种方式覆盖默认页面:
模块/
指数
那么error404
登录
禁用
indexSuccess.php
error404Success.php
loginSuccess.php
secureSuccess.php
disabledSuccess.php
另外两个页面具有symfony外观,在部署到生ob娱乐下载产环境之前也需要对它们进行定制。这些页不在默认的模块,因为它们在symfony不能正常运行时被调用。ob娱乐下载方法中可以找到这些默认页面sfConfig: get (sf_ob娱乐下载symfony_lib_dir) /异常/数据/目录:
sfConfig: get (sf_ob娱乐下载symfony_lib_dir) /异常/数据/
error.html.php
真正的
unavailable.php
项目:禁用
缓存:清晰
要定制这些页面,只需创建错误/ error.html.php而且unavailable.php在您的项目或应用程序中配置/目录中。ob娱乐下载Symfony将使用这些模板而不是自己的模板。
错误/ error.html.php
配置/
请注意
将请求重定向到unavailable.php页需要时,需要设置check_lock设置为真正的在应用中settings.yml.该检查在默认情况下是禁用的,因为它为每个请求增加了非常小的开销。
check_lock
的一些参数settings.yml文件控制可选的框架特性,可以启用或禁用。禁用未使用的特性会略微提高性能,因此在部署应用程序之前,请确保检查表19-1中列出的设置。
表19-1 -可选特性设置直通settings.yml
use_database
假
i18n
logging_enabled
escaping_strategy
cache.yml
sfCacheFilter
web_debug
check_ob娱乐下载symfony_version
sfConfig:获得(sf_symob娱乐下载fony_lib_dir) /异常/数据/ unavailable.php
压缩
ob娱乐下载的一些参数settings.yml更改内置功能(如表单验证、缓存和第三方模块)的行为。
输出转义设置控制变量在模板中的访问方式(参见第7章)settings.yml文件包含此功能的两个设置:
escaping_method
ESC_RAW
ESC_SPECIALCHARS
ESC_ENTITIES
ESC_JS
ESC_JS_NO_ENTITIES
路由设置(参见第9章)定义在factories.yml,在路由关键。清单19-1显示了缺省路由配置。
factories.yml
路由
清单19-1 - Routing Configuration Settings, in前端/ config / factories.yml
前端/ config / factories.yml
routing: class: sfPatternRouting参数:load_configuration: true后缀:。Default_module: default default_action: index variable_prefixes: [':'] segment_separators:['/', '。'] variable_regex: '[\w\d_]+' debug: %SF_DEBUG% logging: %SF_LOGGING_ENABLED% cache: class: sfFileCache param: automatic_cleaning_factor: 0 cache_dir: %SF_CONFIG_CACHE_DIR%/routing lifetime: 31556926 prefix: %SF_APP_DIR%
后缀
.
. html
模块
行动
default_module
default_action
:
$
variable_prefixes
segment_separators
-
调试
的设置sfPatternRouting类。您可以为应用程序路由使用另一个类,可以是您自己的类,也可以是symfony的路由工厂之一(ob娱乐下载sfNoRouting而且sfPathInfoRouting).使用这两个工厂中的任何一个,所有外部url看起来都像'module/action?key1=param1'。不可能进行定制,但速度很快。不同之处在于第一个使用PHP的得到,第二种用途PATH_INFO.主要用于后端接口。
sfPatternRouting
sfNoRouting
sfPathInfoRouting
得到
PATH_INFO
还有一个与路由相关的附加参数,但是这个参数存储在settings.yml:
no_script_name
自symfony 1.1以来,本节中描述的特性已弃用,并且仅在启用ob娱乐下载sfCompat10插件。
sfCompat10
控件输出错误消息的方式验证helper查看(参见第10章)。这些错误包括在< div >标签,他们使用validation_error_类设置为类属性和validation_error_id_prefix设置建立id属性。默认值为form_error而且error_for_,因此属性输出由调用form_error ()的输入foobar将类= " form_error " id = " error_for_foobar ".
验证
< div >
validation_error_类
类
validation_error_id_prefix
id
form_error
error_for_
form_error ()
foobar
类= " form_error " id = " error_for_foobar "
有两个设置决定了每个错误消息前面和后面的字符:validation_error_prefix而且validation_error_suffix.您可以将它们更改为一次定制所有错误消息。
validation_error_prefix
validation_error_suffix
中定义了缓存设置cache.yml大多数情况下,除了两个settings.yml:缓存启用模板缓存机制和etag在服务器端启用ETag处理(参见第15章)。您还可以指定用于两个所有缓存系统(视图缓存、路由缓存和i18n缓存)的存储factories.yml.清单19-2显示了默认的视图缓存工厂配置。
etag
清单19-2 - View Cache Configuration Settings, in前端/ config / factories.yml
view_cache: class: sfFileCache param: automatic_cleaning_factor: 0 cache_dir: %SF_TEMPLATE_CACHE_DIR% lifetime: 86400 prefix: %SF_APP_DIR%/template
的类可以是任何一个sfFileCache,sfAPCCache,sfEAcceleratorCache,sfXCacheCache,sfMemcacheCache,sfSQLiteCache.它也可以是您自己的自定义类,前提是它可以扩展sfCache并提供用于设置、检索和删除缓存中的键的相同通用方法。工厂参数取决于你选择的类,但有一些常量:
sfFileCache
sfAPCCache
sfEAcceleratorCache
sfXCacheCache
sfMemcacheCache
sfSQLiteCache
sfCache
一生
前缀
然后,对于每个特定的工厂,必须定义缓存存储的位置。
cache_dir
宿主
服务器
数据库
有关其他参数,请查看每个缓存类的API文档。欧宝官网下载app
视图并不是唯一能够使用缓存的组件。这两个路由和I18N工厂提供缓存参数,可以在其中设置任何缓存工厂,就像视图缓存一样。例如,清单19-1所示的路由在默认情况下使用文件缓存作为加速策略,但是您可以将其更改为您想要的任何方式。
I18N
两个日志记录设置(参见第16章)存储在settings.yml:
error_reporting
E_parse | e_compile_error | e_error | e_core_error | e_user_error
E_PARSE
E_COMPILE_ERROR
E_ERROR
E_CORE_ERROR
E_USER_ERROR
E_all | e_strict
的settings.yml文件还存储资源的路径。如果你想使用其他版本的资产,而不是与symfony捆绑的版本,你可以更改这些路径设置:ob娱乐下载
admin_web_dir
web_debug_web_dir
为每个模板加载的默认帮助程序在standard_helpers设置(参见第7章)。默认情况下,这些是部分而且缓存辅助组。如果在应用程序的所有模板中使用帮助器组,请将其名称添加到standard_helpers设置为您省去了声明它的麻烦use_helper ()在每个模板上。
standard_helpers
部分
use_helper ()
插件或symfony核心中的激活模块在ob娱乐下载enabled_modules参数。即使一个插件捆绑了一个模块,用户也不能请求这个模块,除非在enabled_modules.的默认的模块,它提供默认的symfony页面(恭喜,页面未找到,等等),是默认ob娱乐下载情况下唯一启用的模块。
enabled_modules
响应的字符集是应用程序的一般设置,因为框架的许多组件(模板、输出捕获器、帮助程序等等)都使用它。定义在字符集设置时,其默认(和建议)值为utf - 8.
字符集
utf - 8
侧边栏
添加应用程序设置
的settings.yml文件为应用程序定义symfob娱乐下载ony设置。如第5章所述,当你想添加新参数时,最好的位置是在前端/ config / app.yml文件。该文件也是环境相关的,它定义的设置可以通过sfConfig类的app_前缀。
前端/ config / app.yml
app_
所有:信用卡:假:假# app_creditcards_假签证:真# app_creditcards_visa美国运通:真# app_creditcards_americanexpress
你也可以写一个app.yml文件,这提供了一种定义自定义项目设置的方法。配置级联也适用于此文件,因此应用程序中定义的设置app.yml文件覆盖在项目级别定义的那些。
app.yml
第2章简要介绍了自动加载特性,如果类位于特定的目录中,则无需在代码中使用它们。这意味着您可以让框架为您完成工作,只允许它在适当的时间加载必要的类,并且只在需要时加载。
的autoload.ymlFile列出了存储自动加载类的路径。第一次处理这个配置文件时,symfony解析文件中引用的所有目录。ob娱乐下载每次文件都以. php,则此文件中的文件路径和类名将被添加到自动加载类的内部列表中。这个列表保存在缓存中,在一个名为配置/ config_autoload.yml.php.然后,在运行时,当使用一个类时,symfony将在此列表中查找类路径并包含ob娱乐下载. php自动文件。
autoload.yml
. php
配置/ config_autoload.yml.php
自动加载工作为所有. php包含类和/或接口的文件。
默认情况下,项目中存储在以下目录中的类受益于自动加载:
myproject / lib /
myproject / lib /模型
前端/ lib / myproject /应用程序
myproject /应用程序/前端/模块/ mymodule里/ lib
没有autoload.yml文件的默认应用程序配置目录。如果您想修改框架设置——例如,自动加载存储在文件结构其他地方的类——创建一个emptyautoload.yml的设置sfConfig: get (sf_ob娱乐下载symfony_lib_dir) / config / config / autoload.yml或者添加你自己的。
sfConfig: get (sf_ob娱乐下载symfony_lib_dir) / config / config / autoload.yml
的autoload.yml文件必须以自动装载:输入并列出symfony应该查找类的位置。ob娱乐下载每个位置都需要一个标签;这使您能够覆盖symfony的条目。ob娱乐下载对于每个位置,提供一个的名字(它将作为注释出现在config_autoload.yml.php)和绝对路径.然后定义是否必须进行搜索递归,它指示symfony在所有子目ob娱乐下载录中查找. php文件,排除您需要的子目录。清单19-3显示了默认使用的位置和文件语法。
自动装载:
的名字
config_autoload.yml.php
路径
递归
排除
清单19-3 -默认的自动加载配置,在sfConfig: get (sf_ob娱乐下载symfony_lib_dir) / config / config / autoload.yml
自动加载:# plugins plugins_lib: name: plugins lib路径:%SF_PLUGINS_DIR%/*/lib递归:true plugins_module_lib: name: plugins模块lib路径:%SF_PLUGINS_DIR%/*/modules/*/lib前缀:2递归:true #工程项目:名称:工程路径:%SF_LIB_DIR%递归:true排除:[model, symfony] project_model:名称:工程模型路径:%SF_LIB_DIR%/模型递归:true #应用程序应用程序:名称:应用程序路径:%SF_APP_ob娱乐下载LIB_DIR%递归:true模块:名称:模块路径:%%SF_APP_DIR%/modules/*/lib prefix: 1递归:true
规则路径可以包含通配符,并使用配置类中定义的文件路径参数(请参阅下一节)。如果在配置文件中使用这些参数,它们必须以大写字母出现,并且以%.
%
编辑自己的autoload.yml将为symfony的自动加载添加新的位置,但您可能希ob娱乐下载望扩展此机制并将自己的自动加载处理程序添加到symfony的处理程序中。因为sob娱乐下载ymfony使用标准spl_autoload_register ()函数来管理类的自动加载,你可以在应用程序配置类中注册更多的回调:
spl_autoload_register ()
类frontendConfiguration扩展sfApplicationConfiguration{公共函数初始化(){父::初始化();//先加载symob娱乐下载fony自动加载//在这里插入你自己的自动加载调用spl_autoload_register(数组(“myToolkit”,自动装载的));}}
当PHP自动加载系统遇到一个新类时,它将首先尝试symfony自动加载方法(并使用中定义的位置ob娱乐下载autoload.yml).如果它没有找到类定义,则注册的所有其他可调用对象spl_autoload_register ()将被调用,直到找到该类。所以你可以添加任意多的自动加载机制——例如,提供一个到其他框架组件的桥(参见第17章)。
每当框架使用一个路径来查找某些东西(从核心类到模板、插件、配置等等)时,它都会使用一个路径变量而不是实际的路径。通过改变这些变量,您可以完全改变symfony项目的目录结构,并适应任何客户端的文件组织需求。ob娱乐下载
谨慎
定制symfony项目的目录结构是可行的,但不一定是个好主意。ob娱乐下载symfony这样的框架的优点之一是,任何web开发人员都可以看到用它构建的项目,ob娱乐下载并感到自在,因为它尊重约定。在决定使用自己的目录结构之前,一定要考虑这个问题。
路径变量定义在sfProjectConfiguration而且sfApplicationConfiguration类,并存储在sfConfig对象。清单19-4显示了路径变量及其引用的目录。
sfProjectConfiguration
sfApplicationConfiguration
清单19-4 -默认文件结构变量,定义于sfProjectConfiguration而且sfApplicationConfiguration
sf_root_dir # myproject / sf_apps_dir #应用/ sf_app_dir #前端/ sf_app_config_dir # # lib / config / sf_app_i18n_dir # i18n / sf_app_lib_dir sf_app_module_dir #模块/ sf_app_template_dir #模板/ sf_cache_dir #缓存/ sf_app_base_cache_dir #前端/ sf_app_cache_dir #刺激/ sf_template_cache_dir #模板/ sf_i18n_cache_dir # i18n /配置/ sf_test_cache_dir sf_config_cache_dir # #测试/ sf_module_cache_dir #模块/ sf_config_dir #配置/ sf_data_dir #数据/ sf_lib_dir # lib /Sf_log_dir # log/ sf_test_dir # test/ sf_plugins_dir # plugins/ sf_web_dir # web/ sf_upload_dir # uploads/
密钥目录的每个路径都由以结尾的参数确定_dir.始终使用路径变量而不是实际(相对或绝对)文件路径,以便在必要时以后能够更改它们。例如,当您希望将文件移动到上传/目录在一个应用程序中,您应该使用sfConfig: get(“sf_upload_dir”)对于路径而不是sfConfig: get (sf_root_dir)。“/ web /上传/”.
_dir
上传/
sfConfig: get(“sf_upload_dir”)
sfConfig: get (sf_root_dir)。“/ web /上传/”
如果您为客户端开发应用程序,而客户端已经定义了目录结构,并且不愿意更改目录结构以符合symfony逻辑,那么您可能需要修改默认的项目文件结构。ob娱乐下载通过重写sf_XXX_dir变量与sfConfig,您可以使symfony工作于ob娱乐下载与默认结构完全不同的目录结构。执行此操作的最佳位置是在应用程序中ProjectConfiguration类用于项目目录,或者XXXConfiguration类用于应用程序目录。
sf_XXX_dir
ProjectConfiguration
XXXConfiguration
例如,如果您希望所有应用程序共享模板布局的公共目录,请将此行添加到设置()方法ProjectConfiguration类来重写sf_app_template_dir设置:
设置()
sf_app_template_dir
sfConfig::集(“sf_app_template_dir”, sfConfig::得到(“sf_root_dir”).DIRECTORY_SEPARATOR。“模板”);
即使您可以通过调用更改项目目录结构sfConfig::设置(),如果可能的话,最好使用项目和应用程序配置类定义的专用方法,因为它们负责更改所有相关的路径。例如,setCacheDir ()方法更改以下常量:sf_cache_dir,sf_app_base_cache_dir,sf_app_cache_dir,sf_template_cache_dir,sf_i18n_cache_dir,sf_config_cache_dir,sf_test_cache_dir,sf_module_cache_dir.
sfConfig::设置()
setCacheDir ()
sf_cache_dir
sf_app_base_cache_dir
sf_app_cache_dir
sf_template_cache_dir
sf_i18n_cache_dir
sf_config_cache_dir
sf_test_cache_dir
sf_module_cache_dir
配置类中构建的所有路径都依赖于项目根目录,该目录由ProjectConfiguration文件包含在前端控制器。通常,根目录高于web /目录,但是您可以使用不同的结构。假设主目录结构由两个目录组成,一个是公共目录,一个是私有目录,如清单19-5所示。这通常发生在在共享主机上托管项目时。
web /
清单19-5 -共享主机自定义目录结构示例
ob娱乐下载symfony/ #私有区域apps/ config/…www/ #公共区域图片/ css/ js/ index.php
在本例中,根目录是ob娱乐下载symfony /目录中。因此,index . php前端控制器只需包含配置/ ProjectConfiguration.class.php申请文件如下:
ob娱乐下载symfony /
index . php
配置/ ProjectConfiguration.class.php
require_once(目录名(__FILE__).“/ . ob娱乐下载. / symfony / config / ProjectConfiguration.class.php”);
此外,使用setWebDir ()方法改变公共区域从通常web /来www /,详情如下:
setWebDir ()
www /
类ProjectConfiguration扩展sfProjectConfiguration{公共函数设置(){/ /……这个美元->setWebDir(这个美元->getRootDir().“/ . . / www”);}}
每个配置文件都有一个处理程序。配置处理程序的任务是管理配置级联,并在运行时在配置文件和优化的PHP可执行代码之间进行转换。
默认处理程序配置存储在sfConfig: get (sf_ob娱乐下载symfony_lib_dir) / config / config / config_handlers.yml.该文件根据文件路径将处理程序链接到配置文件。清单19-6显示了该文件的摘要。
sfConfig: get (sf_ob娱乐下载symfony_lib_dir) / config / config / config_handlers.yml
清单19-6 -的提取sfConfig: get (sf_ob娱乐下载symfony_lib_dir) / config / config / config_handlers.yml
配置/设置。yml: class: sfDefineEnvironmentConfigHandler参数:prefix: sf_ config/app. yml: class: sfDefineEnvironmentConfigHandleryml: class: sfDefineEnvironmentConfigHandler参数:prefix: app_ config/filters。class: sfFilterConfigHandler modules/*/config/module. yml: class: sfFilterConfigHandler modules/*/config/module. yml:yml: class: sfDefineEnvironmentConfigHandler param: prefix: mod_ module: yes
对于每个配置文件(config_handlers.yml通过文件路径和通配符标识每个文件),则处理程序类在类关键。
config_handlers.yml
处理的配置文件的设置sfDefineEnvironmentConfigHandler可以直接在代码中通过sfConfig类,并且参数键包含前缀值。
sfDefineEnvironmentConfigHandler
您可以添加或修改用于处理每个配置文件的处理程序——例如,使用INI或XML文件而不是YAML文件。
的配置处理程序config_handlers.yml文件是sfRootConfigHandler很明显,这是无法改变的。
sfRootConfigHandler
如果您需要修改配置的解析方式,请创建一个空的config_handlers.yml在您的应用程序的文件配置/文件夹并重写类与您所编写的类的行。
使用处理程序处理配置文件提供了两个重要的好处:
类中框架使用的结构示例,如果您想编写自己的配置处理程序,请遵循sfConfig:: (sf_symob娱乐下载fony_lib_dir) / config /目录中。
sfConfig:: (sf_symob娱乐下载fony_lib_dir) / config /
让我们假设您的应用程序包含myMapAPI类,它为交付地图的第三方web服务提供接口。该类需要用URL和用户名初始化,如清单19-7所示。
myMapAPI
清单19-7 -实例的初始化myMapAPI类
mapApi美元=新myMapAPI();mapApi美元->setUrl($ url);mapApi美元->setUser($ user);
您可能希望将这两个参数存储在名为map.yml,位于应用程序中配置/目录中。该配置文件可能包含以下内容:
map.yml
Api: url: map.api.example.com用户:foobar
为了将这些设置转换为与清单19-7相同的代码,必须构建一个配置处理程序。每个配置处理程序都必须扩展sfConfigHandler并提供execute ()方法,该方法期望将配置文件的文件路径数组作为参数,并且必须返回要写入缓存文件的数据。YAML文件的处理程序应该扩展sfYamlConfigHandler类,它为YAML解析提供了额外的功能。为map.yml文件,典型的配置处理程序可以像清单19-8所示的那样编写。
sfConfigHandler
execute ()
sfYamlConfigHandler
清单19-8 -自定义配置处理程序,在前端/ lib / myMapConfigHandler.class.php
前端/ lib / myMapConfigHandler.class.php
<?php类myMapConfigHandler扩展sfYamlConfigHandler{公共函数执行(configfile美元){//解析yaml美元配置=这个美元->parseYamls(configfile美元);元数据=“< ?php\ n";元数据.="美元\mapApi = new myMapAPI();\ n";如果(收取(美元配置[“api”][“url”]){元数据.=sprintf("美元\mapApi - > setUrl (' % s ');\ n",美元配置[“api”][“url”]);}如果(收取(美元配置[“api”][“用户”]){元数据.=sprintf("美元\mapApi - > setUser (' % s ');\ n",美元配置[“api”][“用户”]);}返回元数据;}}
的configfile美元对象的数组ob娱乐下载execute ()方法将包含指向所有map.yml在配置/文件夹。的parseYamls ()方法将处理配置级联。
configfile美元
parseYamls ()
以便将这个新处理程序与map.yml文件中,必须创建一个config_handlers.yml配置文件,内容如下:
配置/地图。yml:类:myMapConfigHandler
的类必须要么自动加载(这是这里的情况)或定义在文件的路径写在文件参数下的参数关键。
文件
参数
与许多其他symfony配置文件一样,ob娱乐下载您也可以直接在PHP代码中注册配置处理程序:
sfContext:: getInstance () - > getConfigCache()——> registerConfigHandler (' config /地图。yml', 'myMapConfigHandler', array());
当您需要的代码基于map.yml文件生成myMapConfigHandler在你的应用程序中,调用下面的行:
myMapConfigHandler
包括sfContext::getInstance()->getConfigCache()->checkConfig(“配置/ map.yml”);
当致电checkConfig ()方法,symfoob娱乐下载ny寻找现有的map.yml类中指定的处理程序处理这些文件config_handlers.yml文件,如果map.yml.php缓存中不存在,或者map.yml文件比缓存更新。
checkConfig ()
map.yml.php
提示
如果希望在YAML配置文件中处理环境,则处理程序可以扩展sfDefineEnvironmentConfigHandler类而不是sfYamlConfigHandler.而不是调用parseYaml ()方法来检索配置,则应调用getConfiguration ()方法:$config = $this->getConfiguration($configFiles).
parseYaml ()
getConfiguration ()
$config = $this->getConfiguration($configFiles)
使用现有配置处理程序
如果您只需要允许用户通过sfConfig,你可以使用sfDefineEnvironmentConfigHandler配置处理程序类。例如,拥有url而且用户可用参数为sfConfig: get(“map_url”)而且sfConfig: get(“map_user”),定义你的处理程序如下:
url
用户
sfConfig: get(“map_url”)
sfConfig: get(“map_user”)
配置/地图。yml:类:sfDefineEnvironmentConfigHandler参数:前缀:map_ . yml:类:sfDefineEnvironmentConfigHandler
注意不要选择已被其他处理程序使用的前缀。现有前缀包括sf_,app_,的mod_.
的mod_
配置文件可以极大地修改框架的工作方式。因为symfonob娱乐下载y甚至对于其核心功能和文件加载都依赖于配置,所以它可以适应更多的环境,而不仅仅是标准的专用主机。这种出色的可配置性是symfony的主要优势之一。ob娱乐下载尽管它有时会吓到新手(他们在配置文件中看到许多需要学习的约定),但它允许symfony应用程序与非常多的平台和环境兼容。ob娱乐下载一旦您精通symfony的配置,就没有服务器会拒绝运行您ob娱乐下载的应用程序了!
本作品在GFDL许可下获得许可。