トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

CakePHP

インストールと設定

 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

<ifmodule mod_rewrite.c>  
RewriteEngine on  
RewriteBase /blog  
RewriteRule    ^$ app/webroot/    [L]  
RewriteRule    (.*) app/webroot/$1 [L]  
</ifmodule>  

/blog/app/.htaccess

<ifmodule mod_rewrite.c>  
RewriteEngine on  
RewriteBase /blog/app  
RewriteRule    ^$    webroot/    [L]  
RewriteRule    (.*) webroot/$1    [L]  
</ifmodule>  

/blog/app/webroot/.htaccess

<ifmodule mod_rewrite.c>  
RewriteEngine On  
RewriteBase /blog/app/webroot  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]  
</ifmodule>  

mod_rewriteが使えない場合

mod_rewriteが利用できない場合は、以下の3つの作業が必要になります。
?core.phpの修正

/cake /app /config /core.php

の以下のコメントを外してください。

<?php
/**
 * If you do not have mod rewrite on your system
 * or if you prefer to use CakePHP pretty urls.
 * uncomment the line below.
 * Note: If you do have mod rewrite but prefer the
 * CakePHP pretty urls, you also have to remove the
 * .htaccess files
 * release/.htaccess
 * release/app/.htaccess
 * release/app/webroot/.htaccess
 */
// define ('BASE_URL', env('SCRIPT_NAME'));  ← ここのコメントを外す

?.htaccessファイルの削除
上述した3つの.htaccessファイル

/cake /.htaccess
/cake /app /.htaccess
/cake /app /webroot /.htaccess

を削除してください。

?URLの変更
CakePHPで用いるURLが以下のように変わります。

http://設置URL /index.php /コントローラ名 /アクション名/

 nginxの場合

基本的に公式の通り。

 server {
   listen 81;
   root /var/www/cakephp/;
   
   # location ~ ^/subdir/(img|css|js|files)/(.+)$ {
     # root /home/centos/public_html/cakephp/app/webroot;
     # try_files /$1/$2 =404;
   # }
   
   location ~ ^/(subdir)/(.*)? {
     index  index.php;
     
     set $new_uri /$1/app/webroot/$2;
     try_files $new_uri $new_uri/ /$1/index.php?$args;
     
     
     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;
     }
   }    
 }

 Docker

Apacheを使う場合

ディレクトリ構成
.
├── docker-compose.yml
├── Dockerfile
├── cakephp.conf
├── php.ini.patch
└── src
    └── cakephp
docker-compose.yml
 version: '3'
 services:
   web:
     build:
       context: .
       dockerfile: Dockerfile
     volumes:
       - ./src:/var/www/html
     ports:
       - 1080:80
     depends_on:
       - mysql
     command:
        httpd -DFOREGROUND
   mysql:
     image: mysql:5.7
     environment:
       - MYSQL_ROOT_PASSWORD=root
     ports:
       - 3306:3306
     volumes:
       - dbdata:/var/lib/mysql
   phpmyadmin:
     image: phpmyadmin/phpmyadmin
     environment:
       - PMA_ARBITRARY=1
       - PMA_HOST=mysql
       - PMA_USER=root
       - PMA_PASSWORD=root
     depends_on:
       - mysql
     ports:
        - 1081:80
 
 volumes:
   dbdata:
Dockerfile
 From centos:7
 
 RUN echo "RUNはbuild時に実行"
 RUN yum -y install php
 RUN yum -y install php-pdo
 RUN yum -y install php-mysql
 RUN yum -y install patch
 
 COPY cakephp.conf /etc/httpd/conf.d
 
 COPY php.ini.patch /tmp
 RUN patch /etc/php.ini < /tmp/php.ini.patch
 
 CMD echo "CMDはrun時に実行"

cakephp.conf
<Directory /var/www/html/cakephp>
    AllowOverride FileInfo
</Directory>

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以降は

<?php echo $this->fetch('content'); ?>

とする。

METAタグの文字コード

<?php echo $this->Html->charset(); ?>

とすると、 /path/to/cakephp/app/Config/core.phpの

Configure::write('App.encoding', 'UTF-8');

の内容から

<meta http-equiv="Content-Type" content="text/html; charset=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<br>\n";
   print dirname(CACHE).DS.$subDir.DS."<br>\n";
   print CACHE."<br>\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 の

<?php
 処理
?>

のあとに無駄な改行があると、そのまま改行が出力されるので注意

古い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


[カテゴリ: プログラミング言語 > PHP]

[通知用URL]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2019年01月28日 22時06分37秒