[英]Implementing GeocodableBehavior in Symfony 1.4 (using Propel)
我正在尝试在我正在处理的Symfony 1.4 (使用Propel 1.6 )项目上实施GeocodableBehavior ,但直到现在它还是一个彻底的失败。 我试过搜索其他人,但我没有找到任何东西,就像我是唯一遇到麻烦的人一样。
所以,也许我遗漏了一些非常非常容易的东西,但是按照GeocodableBehavior上给出的说明只会导致错误,而且我无法弄清楚问题出在哪里。
我遵循了GeocodableBehavior的说明(此处 -> http://www.propelorm.org/cookbook/geocodable-behavior.html )
这似乎有效,因为我正在获取在我的 model 上创建的纬度/经度列。在那之前,它工作正常。
事情变得有点复杂的地方是,当尝试使用 GeocodableBehavior 保存 object 时,Geocoder class 出现问题。
(此处的文档 -> https://github.com/willdurand/Geocoder )
我的 class 是Point ,指的是一个地理定位点,一个地址。 使用sf admin generator创建点时,应该使用某些字段(街道、postal_code、国家等)查询 GoogleMaps api 的行为,只是无法使用 Geocoder class。
Fatal error: Class 'Geocoder\Geocoder' not found in /var/www/vhosts/www._________.local/lib/model/om/BasePoint.php on line 3717
我将 Geocoder class 放在lib/vendor/geocoder
geocoder 文件夹中,我尝试使用 autoload.yml 文件加载它,但没有任何变化......
autoload:
geocoder:
name: geocoder
path: %SF_LIB_DIR%/vendor/geocoder
recursive: on
在如何将这些类加载到我的 sf 项目中,我缺少一些东西,我找不到什么。 Geocoder package 有一个 autoload.php 文件,但我没能成功“加载”它...
提前致谢。
我知道它有点放弃自动加载器,但您可以在/config/ProjectConfiguration.class.php
中建立一个寄存器 function。 唯一的缺点是您需要在使用 Geocoder 的任何块之前添加对 function 的调用。
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();
任何你需要 class 的地方。这比让自动加载器工作更烦人,但它至少是可靠的。
您是否检查过自动加载缓存以查看是否存在与 Geocoder 相关的内容?
/cache/[apps_name]/dev/config/config_autoload.yml.ph
p/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';
使用内置的自动加载器应该是一个可行的选择,但您也可以将 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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.