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创建时,应该使用某些字段(街道、邮政编码、国家/地区等)来查询 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

您是否检查了您的自动加载缓存以查看与 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 回答