Php 模拟土工编码器水平仪
我正在使用Laravel应用程序中的Google Maps API处理查找位置的操作。我希望能够模拟facade,以便在测试中它不会实际查询GoogleMapsAPI,因此我将它注入控制器,但这样做会破坏控制器。以下是控制器的相关部分:Php 模拟土工编码器水平仪,php,google-maps,laravel,laravel-5.1,geocode,Php,Google Maps,Laravel,Laravel 5.1,Geocode,我正在使用Laravel应用程序中的Google Maps API处理查找位置的操作。我希望能够模拟facade,以便在测试中它不会实际查询GoogleMapsAPI,因此我将它注入控制器,但这样做会破坏控制器。以下是控制器的相关部分: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; u
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Location;
use Geocoder;
class LocationController extends Controller
{
protected $geocoder;
public function __construct(Geocoder $geocoder)
{
$this->geocoder = $geocoder;
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
// Get location
$location = $request->input('location');
try {
// Look up location
$result = $this->geocoder->geocode($location);
// Return response
return response()->json($result->toArray(), 200);
} catch (\Exception $e) {
$data = [
'message' => $e->getMessage()
];
return response()->json($data, 400);
}
}
}
使用PsySh在调用断点之前插入断点,看起来确实定义了
geocode()
方法,但我不确定为什么。有人能解释一下我哪里出了问题吗?你不能那样注入外观。没有geocode
方法
门面的特殊之处在于,它们只提供通往拉雷维尔国际奥委会的通道,而不像普通的教室。它们与依赖注入是正交的
如果服务提供商创建了别名,则可以插入realGeocoder\Geocoder
类,但必须以这种方式进行设置
我认为您无法正常使用facade,比如Geocoder::geocode(…)
然而。。。检查Laravel在测试期间如何模拟外观:
这将允许您测试您的控制器,模拟facade调用,这样它就不会真正影响Google
更新:
我创建了一个拉取请求,以使此DI友好:
如果将该请求合并到中,您将能够在控制器方法中插入
\Geocoder\Geocoder
,这是我非常喜欢的 不确定您是否收到关于我更新答案的通知,但我已经创建了一个请求,以使这个包对DI友好。希望你能很快在这里注射@谢谢你。我已经找到了另一种方法,因此解决了这个问题,但将其添加到存储库似乎是一个好主意,因为这似乎是一个微不足道的更改。
PHP Fatal error: Call to undefined method Toin0u\Geocoder\Facade\Geocoder::geocode()