4

バックエンドとして CakePHP を使用し、フロントエンド フレームワークとして AngularJS を使用してアプリを構築しています。

必要な JSON を提供できるように、フロントエンド コードと同じサーバーに CakePHP を配置する必要があります。

通常、CakePHP には webroot フォルダーがあり、js/css/less/* の他に、CakePHP にフックする index.php があります。ただし、AngularJS を追加すると、index.html も必要になるため、複雑さが増します。

これが私が望む制御フローです:

  • ユーザーが domain.com/ にアクセスすると、index.html が表示されます (ただし、ルートは「*.com/」のままです!)
  • ユーザーが domain.com/#/home にアクセスした場合、index.html を表示し、Angular にハッシュ ルートを処理させます。
  • ユーザーが domain.com/about にアクセスした場合 (about ページ、html などすべてが CakePHP によって提供されていると仮定します)、index.php に送信します。
  • domain.com/users/list.json で AJAX 呼び出しを行う場合、CakePHP が JSON を提供できるように index.php を使用します。

したがって、.htaccess ルールでこれを処理できると考えました。しかし、何を書いたらよいのかよくわかりません。

今私は持っています:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d #if it's not an existing directory
    RewriteCond %{REQUEST_FILENAME} !-f #if it's not an existing file
    RewriteRule ^(.*)$ index.php?/$1 [QSA,L] #everything else, send to CakePHP
</IfModule>

何か案は?

のような最後の条件の後に行を追加するのと同じくらい簡単でしょうRewriteRule / index.html [L]か?

また、CakePHP と AngularJS を使用した別のセットアップを提案してください。

ありがとう!


EDIT:AngularJSに使用しているビルドシステムと、「home.ctp」ビューから提供するだけで問題が発生する理由について詳しく説明したいと思います。

テスト、連結、醜化、および index.html へのスクリプトのインクルードに使用してng-boilerplateいます。karmagrunt

モジュール構造を維持できるので、ビルドシステムは本当に美しいと思います。

ng-boilerplate典型的なフロントエンドのディレクトリ構造は次のとおりです。

ng-boilerplate/
  |- build/                    # Development build
  |  | index.html
  |  | assets/
  |  | 
  |  |- angular/
  |- grunt-tasks/
  |- karma/
  |- src/                      # Actual source code I'm editing
  |  |- app/
  |  |  |- <app logic>
  |  |- assets/
  |  |  |- <static files>
  |  |- common/
  |  |  |- <reusable code>
  |  |- less/
  |  |  |- main.less
  |- vendor/
  |  |- angular-bootstrap/
  |  |- bootstrap/
  |  |- placeholders/
  |- build.config.js           # Build configuration specific to app
  |- Gruntfile.js
  |- module.prefix
  |- module.suffix
  |- package.json

(これらのディレクトリとフォルダーの詳細については、こちら: https://github.com/joshdmiller/ng-boilerplate )

home.ctpindex.html を編集するたびに、最新の「ビルド」(開発中) を取得し、手動で index.html ファイルを配置する必要があるため、これは難しいワークフローになります。

これが、私の頭が最初に .htaccess に向かった理由です。ただし、AngularJS を使用するのではなく、CakePHP から直接ページを提供したい場合、このアイデアには独自の制限があることを理解しています。

おそらく、CakePHP のhome.ctpビューに index.html を配置するようにビルド システムを構成できます。このソリューションに関するアイデアはありますか?

4

2 に答える 2

9

複雑にしないでおく

Cake の主な原則の 1 つはKISS ("Keep it Simple (Stupid)") です。

/URL の応答が index.html ファイルのものである場合、書き換えルールを変更する必要はありません。

つまり、これと同等のことを行います:

cd app
mv webroot/index.html View/Pages/home.ctp
<edit View/Pages/home.ctp>

ビューファイルの先頭に次を配置した場合:

<?php $this->layout = false; ?>

コンテンツを完全な生の html ファイルのままにしておくこともできます。

これを行うと、変更の必要がなくなります.htaccess

箇条書きの 1 つに関する具体的なメモ:

ユーザーが domain.com/#/home にアクセスした場合、index.html を表示し、Angular にハッシュ ルートを処理させます。

URLフラグメントはブラウザからリクエストで送信されないため、何もする必要はありません。サーバーで受信したURLはdomain.com/.

でもどうしてもやりたいのならmodの書き換えだけで

次に必要なのは、URL のルールを追加すること/だけです。これは唯一の例外です。

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule  ^$ /index.html [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

.htaccess古いバージョンの書き換えルールを新しいバージョンの Cake で使用すると、奇妙な動作を引き起こす可能性があるため、使用している Cake の正確なバージョンのルールを必ず使用してください。

directory-exclusion 条件は必須ではなく、おそらく望ましくないことに注意してください (これにより、たとえば でディレクトリを一覧表示できます/css)。

于 2013-07-08T08:32:09.520 に答える