php - 如何构建这个 Symfony 网络项目?

标签 php symfony1

我是 Symfony 的新手,不确定如何最好地构建我的 Web 项目。该解决方案必须适应 3 个用例:

  1. 公开访问 www.mydomain.com 以供一般使用
  2. 仅限成员(member)访问 member.mydomain.com
  3. admin.mydomain.com 的管理员访问权限

所有三个虚拟主机都指向 Symfony/web 目录

问题:

这是我的 Symfony 项目中的 3 个独立应用程序(例如“前端”、“后端”和“管理员”或“公共(public)”、“成员”、“管理员”)?

  • 如果存在一些重复代码(例如,生成成员列表在所有 3 个应用程序中都是通用的,但呈现方式不同),这是否是一个好方法?
  • 当用户访问 *.mydomain.com 时,我如何根据子域路由到各种应用程序?这个路由逻辑应该放在 Symfony 的什么地方?

或者,这个应用程序是否包含适用于上述每个用例的模块?

编辑:我无权访问 apache 中的 httpd.conf 以指定虚拟主机的默认页面。我只能使用主机提供商的 cPanel 为每个子域指定一个目录。

最佳答案

如果不了解每个域/应用程序/其他内容的实际职责,就很难说。这是您必须根据项目要求回答的问题……没有可以为每个用例推荐的单一策略。

话虽如此,我认为您最多拥有两个应用程序的基础 - 一个将用作前端,还包括“成员”功能。我认为这些 tow ar 可能是一个单一应用程序的原因是,你会想要从另一个应用程序生成一个链接(如果它们是单独的应用程序,这是非常难以做到的) - 即。每个人都可以访问主页并说出常见问题解答,但只有成员(member)才能访问下载或其他内容,但它们仍然是同一个站点。

另一个应用程序将用于后端并具有管理功能。无论有多少应用程序可以共享同一个网络目录,只需创建一个符号链接(symbolic link),然后适本地指向 apache,例如:

cd htdocs
ln -s SF_ROOT_DIR/web frontend
ln -s SF_ROOT_DIR/web backend

现在您可以将您的 cpanel 设置指向 htdocs/frontend for domain.com 和 members.domain.com 并指向 admin.domain.comhtdocs/backend

然后你可以改变你的 .htaccess 看起来像这样:

Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>
  RewriteEngine On

  # we check if the .html version is here (caching)
  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f

  # no, so we redirect to our front web controller

  # if subdomain is admin.* then use backend.php application
  RewriteCond %{SERVER_NAME} ^admin\..*$
  RewriteRule ^(.*)$ backend.php [QSA,L]

  # not admin so we use the frontend app
  RewriteRule ^(.*)$ index.php [QSA,L]

</IfModule>

这样您就可以在这两个应用程序中使用 no_script_name

做同样事情的另一种方法是将 index.php 修改为如下所示:

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

if(0 === strpos($_SERVER['SERVER_NAME'], 'admin'){
  $app = 'backend';
}
else
{
  $app = 'frontend';
}


$configuration = ProjectConfiguration::getApplicationConfiguration($app, 'prod', false);
sfContext::createInstance($configuration)->dispatch();

您可以随意修改应用名称检测,但您明白了。

使用这两种方法,您都可以根据子域进行一些基本的确定,并且无论我们讨论的应用数量有多少,无论您只使用我推荐的 2 个还是使用 3 个,您都可以应用此策略。

替代方案是创建一个本地应用程序。假设每个应用程序实际上只是整个应用程序的一个方面,我喜欢走这条路。但是,我认为成员、非成员和管理员对于模块的定义过于宽泛。

如果您那样做,您可能最终会在 Controller 中执行大量疯狂的操作。相反,我会为实际问题制作单独的模块。此外,没有真正的理由在这里使用子域 - 仅使用 url 的一部分(即/admin 或/members)来使用特定模块要容易得多。

例如让用户...通常会有一个管理区域,因此我们可以使用管理生成器来实现该功能并调用模块 UserAdmin 或类似的东西。然后对于 userland 的东西,我们可能只有 User 模块,它可以处理公开的个人资料查看和列表、用户的个人资料编辑等等。然后对于实际登录,我们可能有模块 UserAuth,它严格处理诸如登录/注销和忘记密码请求之类的事情。您可以将任何 url 路由到这些模块中的任何一个,因此您的路由可能看起来像这样:

user_login:
  url: /login
  params: {module: UserAuth, action: login}

user_logout:
  url: /logout
  params: {module: UserAuth, action: logout}

user_password:
  url: /forgot-password
  params: {module: UserAuth, action: recoverPassword}

user_reset:
  url: /password/reset/:token
  params: {module: UserAuth, action: resetPassword}

user_profile:
  url: /members/:username
  params: {module: user, action: showProfile}

user_index:
  url: /members
  params: {module: User, action: index}

user_default:
  url: /members/:action
  params: {module: User}

admin_user:
  class:   sfDoctrineRouteCollection
  options:
    Module: UserAdmin
    model: User
    prefix_path: /admin/user

以这种方式做事的最后一步是确保您使用 security.yml 中的适当凭据要求保护适当的模块和操作,并且您还适本地分配了凭据。

关于php - 如何构建这个 Symfony 网络项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702414/

相关文章:

php - MySQL php - 如何获取最后 3 行但不计算重复项

php - 检测程序是否通过 HipHop 或常规 CLI/mod_php 运行

php - 在 PHP 中将字符串拆分为 Unicode 字符数组的最佳方法是什么?

symfony1 - symfony - 500 错误页面自定义问题

sql - 质疑 Doctrine 1

php - mysql如何统计同一列中的不同值?

php - 使用php脚本转换文件的结束行

php - Symfony 左连接查询

在 Symfony 1 中 PHP 警告 "Warning: ob_start(): function ' '未找到或无效的函数名称?

mysql - 如何在 CLI 中编辑 php.ini