在开发和生产中将Ext JS 4.1 MVC应用程序集成到重写URL(mod_rewrite)中

时间:2012-07-29 10:38:59

标签: extjs extjs4 extjs4.1 extjs-mvc

根据Sencha MVC Application Architecture guide中的文件结构部分创建一个新的Ext JS 4.1.1应用程序我最终得到了这个结构:

/wwwroot
    /myapplication
        /app
            /controller
            /view
        app.js
    /extjs-4.1.1

app.js文件包含:

Ext.Loader.setConfig({
    enabled: true
});

Ext.application({
    appFolder: '/myapplication/app',
    autoCreateViewport: true,
    name: 'MyApplication',
    controllers: [
        ...
    ]
});

一切都很好。然后我将app.js包含在我的服务器端 MVC应用程序中输出(不要与客户端 Ext JS MVC结构混淆)。使用的语言和服务器端应用程序的结构对于这个问题并不重要,但输出的结果是。在开发中,应用程序的URL是:

http://servername/someidentifier1/someidentifier2

与许多应用程序一样,mod_rewrite用于赋予标识符含义并将URL映射到服务器端代码。这些标识符映射到“物理”目录。此URL的输出为:

<!DOCTYPE html>
<html>
<head>
<title>MyApplication</title>
<link href="/extjs-4.1.1/resources/css/ext-all-debug.css" media="screen" rel="stylesheet" type="text/css" >
<script type="text/javascript" src="/extjs-4.1.1/ext-debug.js"></script>
<script type="text/javascript" src="/myapplication/app.js"></script>
</head>
<body>
</body>
</html>

Ext JS不在默认的推荐位置,即/wwwroot/myapplication/extjs-4.1.1,而是一个级别,因为它在多个应用程序之间共享。如果您回顾上面的app.js,您还会注意到需要设置的appFolder设置,以便使用“不存在”的URL。

这一切在开发中都可以正常工作,但下一步是使用Sencha SDK Tools生成代码的“构建”(问题基于适用于Windows的2.0.0 Beta 3版本)。 这是它出错的地方。我采取了以下步骤:

  1. 命令行我进入/ wwwroot / myapplication目录。
  2. 我执行sencha create jsb -a http://servername/someidentifier1/someidentifier2 -p myapplication.jsb3生成jsb3文件。
  3. 我执行sencha build -p myapplication.jsb3 -d .
  4. 构建失败。在这种情况下,因为它试图找到例如自定义代码。路径c:\ ... \ myapplication \ myapplication \ app \ controller中的控制器:当前路径+ appFolder设置。你会假设运行它一级更高会更好,但它找不到(共享)extjs-4.1.1目录。

    我猜想时间会使Ext JS MVC结构和SDK工具更加灵活,并且不建议稍微偏离默认结构。一切都可以接受,但另一方面:将Ext JS 4.x(以MVC方式使用Ext JS)与URL重写(mod_rewrite)集成也必须是一种非常普遍的做法吗?

    任何建议的工作设置/结构都将受到高度赞赏。

    目标应该是:

    • 无需手动编辑jsb3文件。
    • 保持顶层的extjs-4.1.1目录在应用程序之间共享。
    • 没有app.html文件,因为它从未在服务器端MVC应用程序中使用,否则需要手动更新。
    • 一个很好的额外功能是将app.js的内容放在服务器端生成的HTML中,因为它可以接收动态生成的参数。

3 个答案:

答案 0 :(得分:0)

夫妻俩。

首先 - 您不需要为ExtJs库和加载器中的应用指定绝对路径。

...
appFolder: 'app' // should be enough
...

第二 - 关于构建和生产之间的差异 - 我最终得到了两个.html文件 - index.html和index-dev.html。这些文件不会被更改(一旦你设置它们)所以保持它们同步不是问题。

您可以将index-dev.html用于开发需求,调试以及构建过程。基本上,此文件是为本地开发环境配置的。

index.html只使用app.js的组合和缩小版本并配置用于生产部署。

答案 1 :(得分:0)

使用mod重写,您可以使用Symfony

稍加修改的.htaccess文件
<IfModule mod_rewrite.c>
    RewriteEngine On

    #<IfModule mod_vhost_alias.c>
    #    RewriteBase /
    #</IfModule>

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>

此文件可以

  • 从服务器获取资源,如果它们是真实文件(css,js,图像等)
  • 如果服务器文件系统上没有匹配项,则将url部分转换为查询参数。

这应该适用于您的设置,只需将app.php行更改为您的应用程序入口点

即可

对于目录设置,你的很好,只有几件事:

  • 您的SDK工具已过时,因为您可以下载: http://www.sencha.com/products/sencha-cmd/download/(v3.0.0)

  • http://docs.sencha.com/ext-js/4-1/#!/guide/command的文档之后,您可以获得所需类的“构建”,但最后还是在开发/生产javascript文件之间手动切换,或者使用环境中的环境变量进行切换代码

  • 实际上我认为您可以在构建目录中使用“假”index.html通过构建工具进行修改,然后在生产代码中,您可以模仿sencha构建生成的代码。

答案 2 :(得分:0)

创建index.html文件以生成项目文件将是一种方法。我还发现sencha架构师非常严格且难以使用。最烦人的是我不能使用外部编辑器来编辑生成的代码。一切都必须在设计师中完成,如果设计师能够提供我需要的所有功能,那就很好。但它不能。