0

私が取り組んでいるSymfony 1.4 ( Propel 1.6を使用) プロジェクトにGeocodableBehaviorを実装しようとしていますが、今のところ完全に失敗しています。他の人を検索しようとしましたが、これに問題を抱えているのは私だけであるかのように、何も見つかりませんでした.

したがって、非常に簡単なものが欠けている可能性がありますが、GeocodableBehaviorで指定された指示に従うと、エラーしか発生せず、どこに問題があるのか​​ わかりません。

GeocodableBehavior の指示に従いました(こちら -> http://www.propelorm.org/cookbook/geocodable-behavior.html )

モデルで作成された緯度/経度の列を取得しているため、これは機能しているようです。それまでは、問題なく動作します。

もう少し複雑になるのは、GeocodableBehavior でオブジェクトを保存しようとするときです。Geocoder クラスに問題があります。

(ドキュメントはこちら -> https://github.com/willdurand/Geocoder )

私のクラスはPointで、地理的に位置付けられたポイント、住所を指します。sf admin generatorを使用してPointを作成する場合、いくつかのフィールド (street、postal_code、country など) を使用して GoogleMaps API をクエリするはずの動作が、Geocoder クラスの使用に失敗します。

Fatal error: Class 'Geocoder\Geocoder' not found in /var/www/vhosts/www._________.local/lib/model/om/BasePoint.php on line 3717

Geocoder クラスをlib/vendor/geocoderフォルダーに配置し、autoload.yml ファイルを使用してロードしようとしましたが、何も変わりません...

autoload:
  geocoder:
    name:       geocoder
    path:       %SF_LIB_DIR%/vendor/geocoder
    recursive:  on

私の sf プロジェクトでこれらのクラスをロードする方法に欠けているものがあり、何が見つかりません。Geocoder パッケージには autoload.php ファイルがありますが、うまく「ロード」できませんでした...

前もって感謝します。

4

3 に答える 3

4

オートローダーをちょっとあきらめていることは知っていますが、 でレジスタ機能を確立できます/config/ProjectConfiguration.class.php。唯一の欠点は、Geocoder を使用するブロックの前に関数の呼び出しを追加する必要があることです。

class ProjectConfiguration extends sfProjectConfiguration
{
    static protected $geocoderLoaded = false;

    static public function registerGeocoder()
    {
        if (self::$geocoderLoaded) {
            return;
        }

        require_once sfConfig::get('sf_lib_dir') . '/vendor/geocoder/autoload.php';

        self::$geocoderLoaded = true;
    }
    ...
}

次にProjectConfiguration::registerGeocoder();、クラスが必要な場所で実行します。オートローダーを動作させるより面倒ですが、少なくとも信頼できるものです。

于 2012-04-04T20:25:48.883 に答える
1

autoload キャッシュをチェックして、Geocoder に関連するものがあることを確認しましたか?

  • /cache/[apps_name]/dev/config/config_autoload.yml.php
  • /cache/project_autoload.cache

おそらく、自動ロードを次のように手動で追加し/config/ProjectConfiguration.class.phpます。

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    require_once sfConfig::get('sf_lib_dir').'/vendor/geocoder/src/autoload.php';
于 2012-04-04T09:16:46.113 に答える
1

組み込みのオートローダーを使用することは有効なオプションですが、symfony のオートローダーを「PSR-0 対応」のオートローダーと組み合わせることもできます。基本的に、これは次の実装に要約されます。

public function setup()
{
  // plugin stuff here

  // register the new autoloader
  spl_autoload_register(array($this, 'autoloadNamespace'));
}

public function autoloadNamespace($className)
{
  $className = ltrim($className, '\\');
  $fileName = ''; 
  $namespace = ''; 
  if ($lastNsPos = strripos($className, '\\'))
  {   
    $namespace = substr($className, 0, $lastNsPos);
    $className = substr($className, $lastNsPos + 1); 
    $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
  }   

  // make sure that the path to Geocoder is correct
  foreach(array(
    sfConfig::get('sf_lib_dir').'/vendor/Geocoder/src' . DIRECTORY_SEPARATOR . $fileName . $className . '.php', 
    ) as $fileName)
  {   
    if (file_exists($fileName))
    {   
      require $fileName;
      return true;
    }   
  }   
  return false;
}

この追加のオートローダーを使用すると、アプリケーションで Geocoder を使用できるようになります。

于 2012-04-10T09:20:54.423 に答える