Ошибка Содержимое ответа должно быть строкой или объектом, реализующим __toString(), объект, указанный при привязке в поставщике услуг.

Я пытаюсь разрешить конкретный класс через интерфейс, привязанный к сервисному контейнеру Laravel5.

Мой бетонный класс

namespace App\Services;

use App\Services\FileMakerInterface;

class SSCSimpleFM implements FileMakerInterface {

    protected $username;
    protected $password;
    protected $host;
    protected $database;

    public function __construct($config){
        $this->username = $config['username'];
        $this->password = $config['password'];
        $this->host     = $config['host'];
        $this->database = $config['database'];
    } 
}

Мой интерфейс

namespace App\Services;

interface FileMakerInterface {

} 

Мой поставщик услуг

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\SSCSimpleFM;

class FileMakerServiceProvider extends ServiceProvider
{

    public function register()
    {
        $this->app->bind('App\Services\FileMakerInterface', function ($app){
            $username = env('FM_USERNAME');
            $password = env('FM_PASSWORD');
            $host     = env('FM_HOST');
            $database = env('FM_DATABASE');
            return new SSCSimpleFM(compact('username', 'password', 'host', 'database'));
        });
    }
}

Сама привязка работает. Если dd в конструкторе конкретного класса, я вижу его в браузере, но когда я пытаюсь использовать интерфейс в своем тестовом контроллере:

use App\Services\FileMakerInterface;

class DevController extends Controller
{
    public function testFmConnect(FileMakerInterface $fm){
        return $fm;
    }
}

Я получаю сообщение об ошибке «Содержимое ответа должно быть строкой или объектом, реализующим __toString(), указанный объект».

введите здесь описание изображения

Я просмотрел другие примеры такой привязки и не вижу ничего, что я делаю неправильно.

Любые идеи?


person Chris Schmitz    schedule 06.08.2015    source источник


Ответы (1)


Проблема в вашем действии контроллера testFmConnect(). Вы возвращаете реализацию FileMakerInterface напрямую, но методы контроллера должны возвращать объект ответа.

Если вы просто хотите проверить, что возвращает метод, вы можете использовать функцию dd() в своем действии контроллера:

class DevController extends Controller
{
    public function testFmConnect(FileMakerInterface $fm)
    {
        dd($fm);
    }
}
person Martin Bean    schedule 06.08.2015
comment
facepalm, именно это я и собирался сделать! Забавно, как можно какое-то время смотреть на кусок кода и не замечать очевидного недостатка. Спасибо за вашу помощь в этом вопросе и вопросе интерфейса привязки. Это определенно ценится! - person Chris Schmitz; 06.08.2015
comment
@ChrisSchmitz Нет проблем. Надеюсь, вам нравится Laravel! - person Martin Bean; 06.08.2015
comment
Абсолютно люблю это. Даже с этими небольшими препятствиями/пробелами в моем понимании все еще очень весело работать и учиться. - person Chris Schmitz; 06.08.2015
comment
@ChrisSchmitz Приятно слышать! :) - person Martin Bean; 06.08.2015