!!!インストールと設定 !!apacheの場合 http://doruby.kbmj.com/hanafubuki_on_rails/20080227/Rails_CakePHP_ !必要な環境 ・PHP4.3.2以上、あるいはPHP5以上が動作するサーバ !インストール ダウンロードして解凍するだけ !URLとmod_rewiteの設定 mod_rewriteの設定は、 /cake /.htaccess /cake /app /.htaccess /cake /app /webroot /.htaccess の3つの.htaccessファイルで行われています。 そして、mod_rewriteを利用できる環境では、以下のようなURLが用いられます。 http://設置URL / コントローラ / メソッド / パラメータ1 / パラメータ2 /... 例えば、 http://doruby.kbmj.com / members / regist / 3 というURLの場合、 members_controller.php の中のregist() メソッドに引数「3」を入れて実行する という意味になり、実際に呼び出されるファイルは、 コントローラ: /cake /app /controllers /members_controller.php テンプレート: /cake /app /views /regist.thtml となります。 環境によっては.htaccess に RewriteBase を追加しないと動かない。 /blog/.htaccess RewriteEngine on RewriteBase /blog RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] /blog/app/.htaccess RewriteEngine on RewriteBase /blog/app RewriteRule ^$ webroot/ [L] RewriteRule (.*) webroot/$1 [L] /blog/app/webroot/.htaccess RewriteEngine On RewriteBase /blog/app/webroot RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] !mod_rewriteが使えない場合 mod_rewriteが利用できない場合は、以下の3つの作業が必要になります。 ��core.phpの修正 /cake /app /config /core.php の以下のコメントを外してください。 AllowOverride FileInfo :php.ini.patch: 878c878 < ;date.timezone = --- > date.timezone = "Asia/Tokyo" !Nginxを使う場合 :ディレクトリ構成: . ├── docker-compose.yml ├── Dockerfile ├── cakephp.conf ├── nginx.repo ├── php.ini.patch ├── www.conf.patch └── src    └── cakephp <- CakePHP本体 :docker-compose.yml: version: '3' services: web: build: context: . dockerfile: Dockerfile # user: "1000:1000" volumes: - ./src:/var/www/html ports: - 1080:80 command: bash -c "php-fpm & /usr/sbin/nginx -g 'daemon off;'" :Dockerfile: From centos:7 RUN echo "RUNはbuild時に実行" COPY nginx.repo /etc/yum.repos.d/ RUN yum -y install php RUN yum -y install nginx RUN yum -y install php-fpm RUN yum -y install patch RUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf_back COPY cakephp.conf /etc/nginx/conf.d/ COPY www.conf.patch /tmp RUN patch /etc/php-fpm.d/www.conf < /tmp/www.conf.patch COPY php.ini.patch /tmp RUN patch /etc/php.ini < /tmp/php.ini.patch COPY php-fpm.conf.patch /tmp RUN patch /etc/php-fpm.conf < /tmp/php-fpm.conf.patch COPY docker.conf /etc/php-fpm.d CMD echo "CMDはrun時に実行" :cakephp.conf (nginxの設定ファイル): server { listen 80; root /var/www/html/; error_log /dev/stdout info; access_log /dev/stdout; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } :nginx.repo: [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 :php.ini.patch: 878c878 < ;date.timezone = --- > date.timezone = "Asia/Tokyo" :www.conf.patch: 39c39 < user = apache --- > user = nginx 41c41 < group = apache --- > group = nginx :php-fpm.conf.patch: 24c24 < error_log = /var/log/php-fpm/error.log --- > ; error_log = /var/log/php-fpm/error.log :docker.conf: [global] error_log = /proc/self/fd/2 [www] ; if we send this to /proc/self/fd/1, it never appears access.log = /proc/self/fd/2 clear_env = no ; Ensure worker stdout and stderr are sent to the main error log. catch_workers_output = yes !!!cakephp 2.3 以降の注意点 !!default.ctp !コンテンツ表示 レイアウトの default.ctp の書き方が変わっているので注意。 コンテンツを表示するには、2.3以前では $content_for_layout と書いていたが、2.3以降は fetch('content'); ?> とする。 !METAタグの文字コード Html->charset(); ?> とすると、 /path/to/cakephp/app/Config/core.phpの Configure::write('App.encoding', 'UTF-8'); の内容から と表示してくれる。 !!!ViewやControllersのディレクトリを階層化する Config/bootstrap.php App::build(array( 'Controller' => array( ROOT.DS.APP_DIR.DS.'Controller'.DS.'app1'.DS, ROOT.DS.APP_DIR.DS.'Controller'.DS, ) )); App::build(array( 'View' => array( ROOT.DS.APP_DIR.DS.'View'.DS.'app1'.DS, ROOT.DS.APP_DIR.DS.'View'.DS, ) )); などのように書くと、コントローラやビューを探しに行ってくれる。 アクセスする際のURLは、階層化しない。 http://www.test/hoge/コントローラ/メソッド ではなく、 http://www.test/コントローラ/メソッド のままなので注意。 !!!ViewやControllerに加えてURLを階層化する。(その1) URLの階層化したい場合、上記設定に加えて、routes.phpに以下の設定を加える。 Router::connect('/app1/:controller/:action/*', array()); Router::connect('/app1/:controller/*', array('action' => 'index')); http://xxxxx/app1/controller/action でアクセスがあった際に、bootstrap.phpで指定された箇所からControllerを探す。 注意としては、Controllerを探した際に同じ名前のControllerがあった場合は、先に見つけた方を使う。 !!!ViewやControllerに加えてURLを階層化する。(その2) http://taka.at/blog/1234436530.html http://blog.elkc.net/?p=515 https://liginc.co.jp/programmer/archives/1331 一つのCakePHPの下に複数のアプリケーションを含めたい場合、 ControllerやView、URLを階層化したい。 上記の方法では、同じ名前のControllerやViewが使えない。 同じ名前のControllerやViewを使えるようにするにはbootstrap.phpを書き換える必要がある。 ・アプリ1 http://hoge/Sub1/Hoge/action ・アプリ2 http://hoge/Sub2/Hoge/action 各アプリケーションで同じ名前のControllerやViewを使う。 !Config/bootstrap.php $base = $_SERVER["SCRIPT_NAME"]; $indexUrl = "app/webroot/index.php"; $base = mb_substr($base, 0, mb_strlen($base) - mb_strlen($indexUrl)); $subDir = mb_substr($_SERVER["REQUEST_URI"], mb_strlen($base)); $sepPos = mb_strpos($subDir, DS); if ($sepPos !== false) { $subDir = mb_substr($subDir, 0, $sepPos); } $isSubDir = false; if ($subDir === "Sub1" || $subDir === "Sub2") { $isSubDir = true; } if ($isSubDir) { App::build(array( 'Controller' => array( ROOT.DS.APP_DIR.DS.'Controller'.DS.$subDir.DS, ROOT.DS.APP_DIR.DS.'Controller'.DS, ) )); App::build(array( 'View' => array( ROOT.DS.APP_DIR.DS.'View'.DS.$subDir.DS, ROOT.DS.APP_DIR.DS.'View'.DS, ) )); } !Config/routes.php Router::connect('/Sub1/:controller/:action/*', array()); Router::connect('/Sub1/:controller/*', array('action' => 'index')); Router::connect('/Sub2/:controller/:action/*', array()); Router::connect('/Sub2/:controller/*', array('action' => 'index')); !Config/core.php Cache::config('_cake_core_'.... の引数を条件によって変更する。 Sub1やSub2の場合はキャッシュ先を変更する $subApps = array("Sub1", "Sub2"); $base = $_SERVER["SCRIPT_NAME"]; $indexUrl = "app/webroot/index.php"; $base = mb_substr($base, 0, mb_strlen($base) - mb_strlen($indexUrl)); $subDir = mb_substr($_SERVER["REQUEST_URI"], mb_strlen($base)); $sepPos = mb_strpos($subDir, DS); if ($sepPos !== false) { $subDir = mb_substr($subDir, 0, $sepPos); } if (array_search($subDir, $subApps) !== false) { print "hoge
\n"; print dirname(CACHE).DS.$subDir.DS."
\n"; print CACHE."
\n"; Cache::config('_cake_core_', array( 'engine' => $engine, 'prefix' => $prefix . 'cake_core_', 'path' => CACHE . 'persistent' . DS.$subDir.DS, 'serialize' => ($engine === 'File'), 'duration' => $duration )); } else { Cache::config('_cake_core_', array( 'engine' => $engine, 'prefix' => $prefix . 'cake_core_', 'path' => CACHE . 'persistent' . DS, 'serialize' => ($engine === 'File'), 'duration' => $duration )); } !!!テーマの利用 !ディレクトリ構成 app以下のViewディレクトリに Themed を作成する。 各テーマ以下はwebrootと同じ構成にする。 各テーマのディレクトリ名は大文字ではじめること。 View `-- Themed `-- HelloTheme `-- webroot `-- css |-- cake.hello.css !テーマの利用 コントローラで $this->theme = 'helloTheme'; とすれば、テーマが適用される。 !!!注意点 !無駄な改行について Controller の のあとに無駄な改行があると、そのまま改行が出力されるので注意 !古いcakeと新しいPHPの組み合わせ エラーの種類として ・E_NOTICE ・E_DEPRECATED が追加されているPHPで、古いcakeを動かすとメッセージが大漁に表示される。 cake 内の error_reporting を == E_ALL & ~E_NOTICE & ~E_DEPRECATED== E_ALL & ~E_STRICT & ~E_DEPRECATED するとメッセージが消える。 !出力の最後の埋め込まれる実行時間について cakephp のバージョンによっては、実行時間がソースに吐き出されることがある。 邪魔な場合は /app/webroot/index.php にある ・・・・・・s --> が書かれている行を消す !!!モデルを複合キーに対応させる CakePHP 3.X からはモデルが複合キーに対応できるようになるようだが 2.Xでは、複合キーに対応していない。 http://piyopiyocs.blog115.fc2.com/blog-entry-358.html を参考に複合キーに対応したモデルを作成すると良い。 !!!Oracleなどに接続する際に文字コードを指定する 大きく2つの方法がある。 どちらの方法でも良い。状況によって使い分ける。 !!接続時に文字コードを指定する public $default = array( 'datasource' => 'hogehoge', ............... 'charset' => 'AL32UTF8', ); !!環境変数に文字コードを指定する 具体的にはapacheが実行される際に設定される環境変数に NLS_LANG を設定する。 /etc/sysconfig/httpd export NLS_LANG=Japanese_Japan.UTF8 {{category2 プログラミング言語,PHP}}