无法解析依赖项 [参数 #0

Unable to resolve dependency [Parameter #0

我有一个 livewire 组件 class 和一个 livewire blade 组件。在 livewire blade 组件中,我有一个提交按钮,单击该按钮时应调用 updatedCity 方法来更新城市。

然而,当点击 livewire 组件上的提交按钮时,出现错误

Unable to resolve dependency [Parameter #0 [ $city ]] in class App\Http\Livewire\WeatherInfo

谢谢

class WeatherInfo extends Component 
{ 
    public $city; 
    private $currentWeatherRes; 
    private $forecastWeatherRes;
    private $unit;
    
    public function mount()
    {
        $this->city = auth()->user()->city ?? '';
        $this->apiKey = config('services.openweather.key');
        $this->getWeatherByCity();
    }
    
    public function test($city)
    {
        $this->city = $city;
        $this->apiKey = config('services.openweather.key');
    
        $this->getWeatherByCity();
    }
    
    protected function getWeatherByCity()
    {
    
        $this->currentWeatherResp = Http::get(
            "http://api.weatherapi.com/v1/current.json?&q={$this->city}&key={$this->apiKey}")->json();
    
        $this->forecastWeatherResp = Http::get(
            "http://api.weatherapi.com/v1/forecast.json?key={$this->apiKey}&q={$this->city}&days=7")->json();
    
    
    }
    
    public function render()
    {
        return view('livewire.weather-info', [
            'currentWeatherResp' => $this->currentWeatherResp,
            'forecastWeatherResp' => $this->forecastWeatherResp,
        ]);
    }
}

blade 组件是这样的:

<div>
    @guest
        <h1>Please login/register</h1>
    @else
        <h1>Weather in
            <b>{{ $forecastWeatherResp['city']['name'] }}</b></h1>
    
        <main>
    
            <div>
                <div class="flex items-center justify-between rounded-md">
                    <form wire:submit.prevent="test">
                        <input wire:model.defer="city"
                            type="text" name="city">
                        <div>
                            <x-form.button>Submit</x-form.button>
                        </div>
                    </form>
                </div>
            </div>
    
            <div x-data="{ openedIndex: -1  }">
                <div
                    @click="openedIndex == 0 ? openedIndex = -1 : openedIndex = 0">
    
                    <div>
                        <img
                            src="http://openweathermap.org/img/wn/{{ $forecastWeatherResp['current']['condition']['icon'] }}.png"
                            alt="weather icon">
                        <span>
                    {{ round($forecastWeatherResp['current']['temp_c']) }}º
                </span>
                    </div>
    
                    <div>
                <span>
                    Today
                </span>
                        <span>
                    {{ ucwords($forecastWeatherResp['current']['condition']['text']) }}
                </span>
                    </div>
    
                    <svg style="display: none;"
                         x-show.transition.duration.500ms="openedIndex != 0"
                         xmlns="http://www.w3.org/2000/svg"
                         class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
                        <path fill-rule="evenodd"
                              d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
                              clip-rule="evenodd"/>
                    </svg>
                    <svg
                        x-show.transition.duration.500ms="openedIndex == 0"
                        xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
                        <path fill-rule="evenodd"
                              d="M14.707 12.707a1 1 0 01-1.414 0L10 9.414l-3.293 3.293a1 1 0 01-1.414-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 010 1.414z"
                              clip-rule="evenodd"/>
                    </svg>
                </div>
                <div
                    x-show="openedIndex == 0"
                    class="w-full border " style="display: none;">
                    <div class="border-t border-gray-200">
                        <dl>
    
                            <div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
                                <dt class="text-sm font-medium text-gray-500">
                                    Feels Like
                                </dt>
                                <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
                                    {{ round($forecastWeatherResp['current']['temp_c']) }}º
                                </dd>
                            </div>
                            ....
                        </dl>
                    </div>
    
                </div>
    
                @foreach($forecastWeatherResp['forecast']['forecastday'] as $weather)
                    <ul>
                        <li
                            @click="openedIndex == {{ $loop->iteration }} ? openedIndex = -1 : openedIndex = {{$loop->iteration}}"
                            class="w-full">
                            <div>
                                <div>
                                    <img src="http://openweathermap.org/img/wn/{{ $weather['day']['condition']['icon'] }}"
                                         alt="weather icon">
                                </div>
                                ....
    
                            </div>
    
                            <div
                                x-show="openedIndex == {{ $loop->iteration }}">
                                <div>
                                    <dl>
    
                                        <div>
                                            <dt>
                                                Feels Like
                                            </dt>
                                            <dd>
                                                {{ round($weather['day']['avgtemp_c']) }}º
                                            </dd>
                                        </div>
                                        .....
                                    </dl>
                                </div>
    
                            </div>
    
                        </li>
    
                    </ul>
    
                @endforeach
            </div>
        </main>
    
    @endguest
</div>

您需要像这样将 $city 参数传递给 test 函数

<form wire:submit.prevent="test('the city you want')">

您无需向 test() 方法传递任何内容,$city 参数已通过 wire:model="city"

设置
public function test()
{
    $this->apiKey = config('services.openweather.key');

    $this->getWeatherByCity();
}

API 键也不会在请求之间改变,这意味着在 test() 方法中设置 $this->apiKey = config('services.openweather.key'); 也是多余的,因为它在 [=17] 中设置=].

这意味着您实际上可以完全删除 test() 方法,使 getWeatherByCity() 成为 public 方法(而不是受保护的方法),然后执行

<form wire:submit.prevent="getWeatherByCity">