2024_Hello_World
@2024_Hello_World

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Laravel】インターフェイスの実装ができません

Q&A

Closed

解決したいこと

MyServiceInterfaceインターフェイスを実装したMyServiceクラスのsayメソッドとalldataメソッドをを呼び出したいです。
/helloにアクセスして下記の画像のように表示させたいです。

スクリーンショット 2024-04-01 133906.png
現状エラーが出ています。
コードに間違いがあれば教えていただきたいです。

発生している問題・エラー

Unresolvable dependency resolving [Parameter #0 [ <required> int $id ]] in class App\MyClasses\MyService

スクリーンショット 2024-04-01 152626.png

該当するソースコード

web.php
<?php

use App\Http\Controllers\HelloController;
use Illuminate\Support\Facades\Route;

Route::get('hello',[HelloController::class,'index']);
HelloController.php
<?php

namespace App\Http\Controllers;
use App\MyClasses\MyServiceInterface;

class HelloController extends Controller
{
    function __construct()
    {
    }

    public function index(MyServiceInterface $myservice, int $id = -1)
    {
        $myservice->setId($id);
        $data = [
            'msg'  => $myservice->say(),
            'data' => $myservice->alldata(),
        ];
        return view('hello.index', $data);
    }
}
MyServiceInterface.php
<?php
namespace App\MyClasses;

interface MyServiceInterface
{
    public function setId(int $id);
    public function say();
    public function allData();
    public function data(int $id);
}
MyService.php
<?php
namespace App\MyClasses;

class MyService implements MyServiceInterface
{
    private $serial;
    private $id = -1;
    private $msg = 'no id...';
    private $data = ['Hello', 'Welcome', 'Bye'];

    function __construct(int $id)
    {
        $this->setId($id);
        $this->serial = rand();
        echo "「" . $this->serial . "」";
    }

    public function setId($id)
    {
        $this->id = $id;
        if ($id >= 0 && $id < count($this->data))
        {
            $this->msg = "select id:" . $id . ', data:' . $this->data[$id] . '"';
        }
    }

    public function say()
    {
        return $this->msg;
    }

    public function data(int $id)
    {
        return $this->data[$id];
    }

    public function alldata()
    {
        return $this->data;
    }
}
AppServiceProvider.php
<?php

namespace App\Providers;

use App\MyClasses\MyService;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        app()->bind('App\MyClasses\MyServiceInterface', 'App\Classes\MyService');
    }
}

index.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>Index</title>
</head>
<body>
    <h1>Hello/Index</h1>
    <p>{!!$msg!!}</p>
    <ul>
        @foreach ($data as $item)
            <li>{!!$item!!}</li>
        @endforeach
    </ul>
</body>
</html>

自分で試したこと

教材のサンプルコードと間違っていないか確認した。
キャッシュのクリアを行った。

php artisan view:clear
0

1Answer

MyService.phpの名前空間がApp\MyClassesとなっているので、App\Classes\MyServiceの部分はClassesではなくMyClassesではないでしょうか。

AppServiceProvider.phpより
    public function boot(): void
    {
        app()->bind('App\MyClasses\MyServiceInterface', 'App\Classes\MyService');
    }
1Like

Comments

  1. ご回答ありがとうございます!
    MyClassesに直しました。
    また別のエラーが出ました。
    Unresolvable dependency resolving [Parameter #0 [ int $id ]] in class App\MyClasses\MyService
    原因もし心当たりがあれば教えていただきたいです💦

  2. MyServiceクラスのコンストラクタの引数を削除したら解決できました

Your answer might help someone💌