ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

Fatal error: Cannot redeclare class pager in ... vendor/pear/HTML/Pager/Pager.php on line 53

Akelosはデフォでvendor/以下にPEARやADODBなどのライブラリファイルを保持してます。
まぁ、これがシステム側に入っているのと干渉・衝突すると、お題のようなエラーが発生します。
例えばうっかり

require_once('Pager.php');

とかしちゃうと、システムのPEARに入っているのが取られちゃったりして、しかもその後、Akelosのpagenation_helper()ではAkelosの保持するPagerがrequireされちゃうので、ディレクトリの位置が異なるためrequire_once()の効果もなくなります。

っつーか、いくらメジャーバージョンが上がったとはいえディレクトリ位置を移すPEARのPagerもどうかとは思いますが。

じゃぁどうするか?AK_APP_VENDOR_DIRを使ってフルパス指定すればよいのか?
否。
例えばPager.phpそれ自体の中では、フルパス指定でなく、include_pathを前提としてrequireしている「かも」しれないからです。Pager.phpでなくとも他のライブラリではあり得るかもしれません。
include_pathからシステムのPEARを外すのも良いですが・・・。
なんかむかつくので、Controllerに $helpers_not_use というメンバ変数を追加して、使用したくないヘルパを記述。今回であればpagenate_helper.phpなのでこんな感じで。
app/application_controller.php :

<?php
class ApplicationController extends AkActionController 
{
    ...
    var $helpers_not_use = "pagination";
    ...
}

そしてAkActionControllerをQuickHack.

    function getDefaultHelpers()
    {
        if($this->helpers == 'default'){
            $available_helpers = Ak::dir(AK_LIB_DIR.DS.'AkActionView'.DS.'helpers',array('dirs'=>false));
            $helper_names = array();
+           if (isset($this->helpers_not_use)) {
+               $not_use_helpers = Ak::toArray($this->helpers_not_use);
+           }
            foreach ($available_helpers as $available_helper){
+               $_name = str_replace('_helper.php', '', $available_helper);
+               if (in_array($_name, $not_use_helpers)) {
+                   continue;
+               }
                $helper_names[$available_helper] = AkInflector::classify(substr($available_helper,0,-10));
            }
            return $helper_names;
        }elseif (is_string($this->helpers)){
            return Ak::stringToArray($this->helpers);
        }
        return $this->helpers;
    }

以上。