トップ 一覧 置換 検索 ヘルプ 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


{{category2 プログラミング言語,PHP}}