1つのcakePHPで複数のサイトを作成する方法

このQ&Aのポイント
  • 1つのアプリ(cakePHP)で、複数のサイトが入っている物を作成する方法を紹介します。
  • URLを使って各サイトを個別にアクセスできるようにするために、ルーティングやフォルダ分けの方法を説明します。
  • URLがかっこ悪くならないようにするために、ファイル名やクラス名を複雑にする方法も提案します。
回答を見る
  • ベストアンサー

1つのcakePHPで複数のサイトを作成したい

1つのアプリ(cakePHP)で、複数のサイトが入っている物を作成したいです。 URLであらわすと下記のように、みかんコンテンツとりんごコンテンツが1つのサイトの中に別々にある感じです。 http://ドメイン/mikan/top/index/ http://ドメイン/ringo/top/index/ (http://ドメイン/コンテンツ名/コントローラー名/ファンクション名/) また、ファイル数が膨大になるため、下記のようにフォルダ分けをしたいです。 ●controllersフォルダ controllers   └mikan     └top_controoler.php   └ringo     └top_controller.php ●viewsフォルダ views   └mikan     └top      └index.html   └ringo     └top      └index.html ※controllerとview以外のファイルは共通で使いたい こうしたいのですが、ルーティングなどをいじっても上手くいかず、現在は下記のようにしています。 http://ドメイン/mikan_top/index/ http://ドメイン/ringo_top/index/ (http://ドメイン/コントローラー名/ファンクション名/) ●controllersフォルダ controllers   └mikan     └mikan_top_controoler.php   └ringo     └ringo_top_controller.php しかし、これだとURLがかっこ悪いので、最初に示したURLでアクセスできるようにしたいのです。 何かいい方法は無いでしょうか? controllerやviewのファイル名、クラス名などは複雑になっても構いません。 宜しくお願いします。

  • PHP
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

やり方は色々あると思いますが、私が試した方法に関しまして。 ・mikan_appと、ringo_appと、「parent_app」という物を別でつくっておく で、config値とかそういうものを全部parent_appの中から参照しちゃおうという手です。 mikan_appと、ringo_appの中にある、bootstrap.phpとか、database.phpの中身を、 bootstrap.php-------------------------- <?php require_once ROOT . DS . 'parent_app' . DS . 'config' . DS . 'bootstrap.php'; ?> みたいなものだけにしてしまう。 そうすれば、parent_appの中のbootstrap.phpを読めます。 そして、parent_appのbootstrap.phpの中を、 <?php App::build(array( 'plugins' => array( APP . 'plugins' . DS, ROOT . DS . 'parent_app' . DS . 'plugins' . DS, ), 'models' => array( APP . 'models' . DS, ROOT . DS . 'parent_app' . DS . 'models' . DS, ), 'views' => array( APP . 'views' . DS, ROOT. DS . 'parent_app' . DS . 'views' . DS, ), 'controllers' => array( APP . 'controllers' . DS, ROOT . DS . 'parent_app' . 'controllers' . DS, ), 'datasources' => array( APP . 'models' . DS . 'datasources' . DS, ROOT . DS . 'parent_app' . DS . 'models' . DS . 'datasources' . DS, ), 'behaviors' => array( APP . 'models' . DS . 'behaviors' . DS, ROOT . DS . 'parent_app' . DS . 'models' . DS . 'behaviors' . DS, ), 'components' => array( APP . 'controllers' . DS . 'components' . DS, ROOT . DS . 'parent_app' . DS . 'controllers' . DS . 'components' . DS, ), 'helpers' => array( APP . 'views' . DS . 'helpers' . DS, ROOT. DS . 'parent_app' . DS . 'views' . DS . 'helpers' . DS, ), 'vendors' => array( APP . 'vendors' . DS, ROOT . DS . 'parent_app' . DS . 'vendors' . DS, ), 'shells' => array( APP . 'shells' . DS, ROOT . DS . 'parent_app' . DS . 'shells' . DS, ), 'locales' => array( APP . 'locales' . DS, ROOT . DS . 'parent_app' . DS . 'locales' . DS, ) )); ?> としてやれば、アクセスしてきた、mikan/ringoのディレクトリの中のファイルを参照した後なければ、parent_appの中のファイルを参照しに行きます。 後は、mikan/ringoの共通で使うヘルパなんかは、parent_appの中の該当ディレクトリにおいて それぞれが単独で使うようなものは、それぞれの、mikan_app/ringo_appの中につくる

xtamanegix
質問者

お礼

教えていただいた方法を参考に作成する事ができました! ありがとうございました。

その他の回答 (2)

回答No.3

連投で、ごめんなさい。少しだけ書ききれなかった。 最後に、フロントのindex.phpは、それぞれ物理的にディレクトリを、 mikan/index.php ringo/index.php と二つ用意して、APP_DIRだけ、書き換えればよいかと。

回答No.1

こんばんは。 >現在は下記のようにしています。 これは上手く動いているんですかね? 一番手っ取り早いのは、mod_rewriteを使う・・・。 RewriteEngine On RewriteRile ^/([^/]+)/([^/]+)/([^/]+)$ /$1_$2/$3 [L] インチキっぽいですが、せっかく動いているので・・・。

関連するQ&A

  • CakePHPでのログイン画面生成について。

    CakePHPでのログイン画面生成について。 参考URLは以下です。 http://h2o-space.com/blog/1950 以上の記事の通り設定・アップロードをし、 add.phpにアクセスすると Missing Method in ViewsController Error: The action add.php is not defined in controller ViewsController Error: Create ViewsController::add.php() in file: app/controllers/views_controller.php. <?php class ViewsController extends AppController { var $name = 'Views'; function add.php() { } } ?> とのエラーが出ます。 <?php class ViewsController extends AppController { var $name = 'Views'; function add.php() { } } ?> をviews_controller.phpに書き込むと Parse error: syntax error, unexpected '.', expecting '(' in /home/rslitefc2/users/アカウント/public_html/login/app/controllers/views_controller.php on line 7 と、エラーが出ます。 7行目の記述はfunction add.php() {です。 どうしたらログイン画面を正しく生成することが出来るでしょうか? どなたかお教えいただければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • CakePHPでディレクトリ分けをしたい

    CakePHP2.3.4、サーバーはロリポップにて開発を行っております。 やりたいことは、コントローラーのディレクトリ分けです。 以下のようなディレクトリ構造にして、 app  |_Controller  |   |_admin  |    |    |_LoginController.php  ※メソッドはindex()のみと仮定  |    |    |_・・・.php  |    |  |    |_ListController.php  ※メソッドはindex()のみと仮定  |  |_View ※Viewも分けますが、今は省略しています。 アプリケーション「LoginCntroller.php」にアクセスする場合は http://○○.ne.jp/admin/login/index アプリケーション「ListController.php」にアクセスする場合は http://○○.ne.jp/list/index でアクセスしたいです。 自分なりに調べて、「bootstrap.php」に以下追加、 App::build(array(  'Controller' => array(ROOT.DS.APP_DIR.DS.'Controllers'.DS.'Admin'.DS,) )); 「route.php」に以下追加、 Router::connect('/admin/login', array('controller' => 'login', 'action' => 'index')); などと行ってみてはいるのですが、結果、以下のエラーになってしまいます。 Missing Controller Error: AdminController could not be found. Error: Create the class AdminController below in file: app/Controller/AdminController.php <?php class AdminController extends AppController { } Controller直下に配置したアプリケーションに関しては問題なく実行されます。 何が悪いのか見当もつかず困っております。 よろしければご教授いただけませんでしょうか。

    • 締切済み
    • PHP
  • CakePHPのコントローラの作成

    PHP初心者です。 CakePHPをインストールし試しにTestControlerを作成したのですが、ページが開きません。 PageNotFoundになります。 考えられる原因が分かれば教えて下さい。 【やったこと】 ・ [CakePHP root]\app\Controller に TestController.php を作成。 <?php App::uses('AppController', 'Controller'); class TestController extends AppController { } ・ URLにアクセス http://[CakePHP root]/Test ⇒ Not Found http://[CakePHP root]/test ⇒ Not Found http://[CakePHP root]/app/webroot/index.php?url=test ⇒ CakePHPのindex.phpが表示される。 http://[CakePHP root]/app/webroot/index.php?url=Test ⇒CakePHPのindex.phpが表示される。 以下のサイトを参考にしました。mod_rewriteが動いていない可能性がある ということなので、URL直接指定もしてみましたがダメでした。 http://codezine.jp/article/detail/768?p=2 よろしくお願いします。

    • ベストアンサー
    • PHP
  • cakephpの命名規則について

    cakephp初心者です。 cakephpはテーブル名、モデル名、コントローラ名、ビュー名、が規則によって付けられますが、 複数人で開発する場合、 同じテーブルを参照しようとすると、同じ名前のビューフォルダなどが出来てしまうのではないですか? テーブル名:users モデル名:User コントローラ名:UsersController ビューフォルダ:Users   ビューファイル:index.ctp usersテーブルを参照する場合、みんな同じコントローラ名、そして、ビューフォルダ名になると思うのですが、 どうやって別々のページを作っていくのですか? 上手く質問出来ていませんし、勉強不足だとは承知しています。 どうしてもCakePHPに苦戦しています。 開発の進め方を出来るだけ分かりやすく説明して頂けると嬉しいです。

    • ベストアンサー
    • PHP
  • cakePHPのrouteについて

    現在、cakePHPを使って、プログラムを行っているのですが、 その場合単純に'/'とする場合のみ、routeで実行できるのですが、 formからsubmitボタンが押されたとき、route.phpの名前を見て処理を実行させることができません。 formは、 <form action="<?php echo h($html->url('/blog/view')) ?>" method="post" style="margin-bottom:1em"> <p><?php echo $html->input('Task/content') ?> <?php echo $form->submit("TEst", array("action" => "sample", "type" => "post")) ?> </form> として記述しています。 route.phpには、 Router::connect('/blog/:action', array('controller' => 'top', 'action' => 'cake', 'home')); と記述しています。 考え方'/blog/:action'が、blog(コントローラー名)、actionがfunction action名() {} なので、formから、blogコントローラーのviewアクションを実行するように指示を出し、 本来ならその手順に従い画面が表示される。 なのですが、 Object not found! 要求された URL は本サーバでは見つかりませんでした。 もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。 サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。 Error 404 と表示される。 この場合の対策はどうすべきなのでしょうか? つまり、formアクションで渡された引数をroute.phpのroute:connect()の指示の通りに実行し、画面を表示させたい。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • cakephp コントローラにドメインでアクセス

    cakephp2.6.4、サーバはamazon aws ec2(linux)を使用しております。 /home/test/lib/test1/controllers/test_controller.php のindexアクションに対して、取得したドメインでアクセスしたいと思っております。 現在、サーバのバーチャルホストの設定で、 ドキュメントルートにコントローラのパスを指定しておりますが、 Internal Server Errorと表示されてしまいます。 以下、設定内容です。 ※取得したドメインは、仮にhogehoge.comとさせていただきます。 <VirtualHost *:80> DocumentRoot /home/test/lib/test1/controllers/test_controller.php ServerName hogehoge.com </VirtualHost> 今回のような場合、どのようにしたらよいかお分かりの方いらっしゃいましたら、 ご教授のほどよろしくお願い致します。

    • ベストアンサー
    • PHP
  • CakePHPの .htaccess設定について

    CakePHPをVPSで構築したサーバー(Linux)にインストールしました。 .htaccess(mod_rewrite)の設定がうまくいっていないようなので対処の方法を教えてください。 [環境] PHP 5.3.3 Apache 2.3.3 CakePHP 1.3.15 mod_rewriteが動いてるのはチェック用のプログラムで確認しました。 controllerとViewファイルを作り、文字の表示は成功しています。 フォームの実験を行った時にフォーム送信後のURL表示がうまくいっていません。(get/post共に) [書籍を参考にしたプログラム] Sampleコントローラーを作り、Viewの中にSampleディレクトリを作りその中にindex.ctpファイルを設置。フォームにテキストを入力して送信ボタンを押すと、テキストが表示されるプログラムです。 [コントローラー]sample_controller.php class HelloController extends AppController { public $name = 'Hello'; public $uses = null; public $layout = "hello"; function index(){} function sendForm(){ ~フォームで送られたテキストを表示(プログラムは省略)~ } } [index.ctp]のフォームのHTML <form method="post" action="./sendForm"> ~省略~ <input type="submit" /> </form> http://www.example.com/sampleでフォームを開きテキストを入力して送信ボタンを押すと http://www/example.com/sample/sendForm というURLになるはずなのですが、 http://www.example.com/sendForm となってしまいます。 試しにブラウザから「http://www/example.com/sample/sendForm」というURLを入力してみますと、フォームで入力したデータは表示されませんが、ページ自体は表示されます。 もう一つ、index.ctpの<form method="post" action="./sendForm">のアクションのパスを /sample/sendForm に変更してみますとデータも表示され、求めた結果になります。 以前、別の環境でこのプログラムを動かしたときは、<form method="post" action="./sendForm">のままでうまくいったので、.htaccessのファイルの設定に問題があると予想されます。 下記にcakePHPの設定情報を記載しますので、間違っている部分を指摘していただければと思います。 ※ディレクトリの構成は下記のページの「3.4.3. 高度なセットアップ:その他のインストール方法」を参考にしています。 http://cakephp.jp/old_doc/ch03s04.html [アプリケーションディレクトリ] /home ____/me ________/mysite ____________/config ____________/controllers ____________/models ____________/plugins ____________/tmp ____________/vendors ____________/views ____________index.php ____________.htaccess→「htaccessファイル1」● [公開ディレクトリ] /var ____/www ________/html ____________/example.com→ドキュメントルート _______________/css _______________/files _______________/img _______________/js _______________.htaccess→「htaccessファイル2」● _______________css.php _______________favicon.ico _______________index.php [コアファイルディレクトリ] /usr ____/lib ________/cake ____________/cake ________________/config ________________/docs ________________/libs ________________/scripts ________________app_controller.php ________________app_model.php ________________basics.php ________________bootstrap.php ________________dispatcher.php ____________/vendors ____________/plugins ____________index.php ____________.htaccess→「htaccessファイル3」● 「htaccessファイル1」(アプリケーション) -------------------------------------------------- <IfModule mod_rewrite.c> RewriteEngine on   RewriteBase /cake/app→■追加  RewriteRule ^$ webroot/ [L] RewriteRule (.*) webroot/$1 [L] </IfModule> ------------------------------------------------- 「htaccessファイル2」(公開) -------------------------------------------------- <IfModule mod_rewrite.c> RewriteEngine On   RewriteBase / →■追加  RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule> -------------------------------------------------- 「htaccessファイル3」(コア) -------------------------------------------------- <IfModule mod_rewrite.c> RewriteEngine on   RewriteBase /cake→■追加 RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule> -------------------------------------------------- 疑問点は下記のようになっています。 (1)追加した部分のRewriteBaseはこれで良いのか? (2)RewriteRule ^$ webroot/ [L] RewriteRule (.*) webroot/$1 [L] の部分はこのままで良いのか?webroot部分の変更は必要か? (3)RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]の部分はこのままで良いのか?

    • ベストアンサー
    • PHP
  • cakephp エラーハンドリングができません

    cakephpを利用しているシステムで、2種類のエラーを作っておいてcontrollersの呼び出しで振り分けたいと思いますがうまくできません。 マニュアルページ(http://book.cakephp.org/ja/view/154/Error-Handling)を参考に、 app/app_error.phpを以下のように作成しました。 ((1)エラー:error(2)エラー:errorsta) ----------------------------------------------------------------- <?php class AppError extends ErrorHandler{ function error(){ $this->controller->viewPath = 'errors'; $this->__outputMessage('error'); } function errorsta(){ $this->controller->viewPath = 'errors'; $this->__outputMessage('errorsta'); } } ?> ----------------------------------------------------------------- 上記内容で、メソッドerrorは実行できるのですが、errorstaが一向に動いてくれず、404扱いになってしまいます。 app/app_error.php以外にも設定が必要なものがあるのでしょうか?

    • 締切済み
    • PHP
  • 1つのサーバで複数のドメイン管理

    AWS EC2を使ってウェブサーバを構築し、CakePHPをインストールしてウェブサイトを実装しております。 すでにドメインを2つ取得しており、それぞれのドメインでアクセスした際に、同じディレクトリにある2つのコントローラをそれぞれ実行させてページを表示させたいと思っております。 ドメイン(例) hoge.com fuga.com コントローラ(例) /lib/app/controllers/hoge_controller.php /lib/app/controllers/fuga_controller.php hoge.comに対しては、 routes.phpで Router::connect('/', array('controller' => 'hoge', 'action' => 'index')); と設定して hoge.comでアクセスした際にhogeコントローラのindexアクションが実行されるようにできましたが、この状態を維持しつつfuga.comでアクセスした際にfugaコントローラのindexアクションが実行されるようにできればと思っております。 cakephpやサーバの設定等は自由に行える環境ですので、cakephpのrouterやサーバのバーチャルホストの設定等で実現できますでしょうか。 お分かりいただける方いらっしゃいましたら、ご教授いただけますと幸いです。 以上、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • CakePHPでヘルパーが使えません

    CakePHPを使用して開発を行っています。 app/views/helpers/common_lib.php に、class CommonLibHelper extends AppHelper としてヘルパークラスを作り、コントローラーの$helpersにarray('CommonLib')を記述しました。 ビューファイルにて、$common_lib->function() として、ヘルパーで定義したメソッドを呼ぶと、 undefined variable: common_libと言われてしまいます。どうしてか教えていただけませんか? クラス名やファイル名は合っていると思うのですが・・・。 CakePHPのバージョンは、1.3.6です。

    • ベストアンサー
    • PHP

専門家に質問してみよう