Estoy construyendo una aplicación de Lumen. Estoy tratando de usar la interfaz para mis repositorios. Toda mi lógica está envuelta en un paquete composer.
Aquí está mi proveedor/paquete/src/app/Providers/PackageServiceProvider.php:
<?php namespace Vendor\Package\App\Providers; use Illuminate\Support\ServiceProvider; class SmsBackendCoreServiceProvider extends ServiceProvider { protected $defer = false; public function register() { $this->app->bind( 'Vendor\Package\App\Repositories\Contracts\SmsService', 'Vendor\Package\App\Repositories\Services\SmsJson' ); } public function boot() { $this->app->group( ['namespace' => 'Vendor\Package\App\Http\Controllers'], function ($app) { require __DIR__.'/../../routes/web.php'; } ); } }Aquí está mi proveedor/paquete/src/routes/web.php:
<?php $app->get('/sms/send.json', 'JsonController@send');Aquí está mi proveedor/paquete/src/app/Http/Controllers/JsonController.php:
<?php namespace Vendor\Package\App\Http\Controllers; use Vendor\Package\App\Http\Controllers\BaseController; use Vendor\Package\App\Repositories\Contracts\SmsService; class JsonController extends BaseController { public $service; public function __construct(SmsService $service) { $this->service = $service; } public function send() { $response = $this->service->sendSms(1, 2, 3); return $response; } }Aquí está mi proveedor/paquete/src/app/Repositories/Contracts/SmsService.php:
<?php namespace Vendor\Package\App\Repositories\Contracts; class SmsService { public function sendSMS($from, $to, $text); }Finalmente, aquí está mi proveedor/paquete/src/app/Repositories/Services/SmsJson.php:
<?php namespace Vendor\Package\App\Repositories\Services; use Vendor\Package\App\Repositories\Contracts\SmsService; class SmsJson implements SmsService { public function sendSMS($from, $to, $text) { echo 'success'; } }Cuando intento acceder a http://mydomain.dev/sms/send.json , aparece este error:
FatalErrorException en SmsService.php línea 7: el método no abstracto Mitto\SmsBackendCore\App\Repositories\Contracts\SmsService::sendSMS() debe contener cuerpo
¿Qué hice mal?
Su contrato se declara como una clase, debe ser una interfaz.