Laravel Typer错误:传递给的参数1必须是一个实例。字符串

时间:2018-03-28 15:29:53

标签: php laravel repository-pattern

我正在尝试更新客户电话号码的值,客户有很多电话,但当我尝试更新电话号码时,我收到此错误:

  

类型错误:参数1传递给   应用程序\库\后端\ Cliente \ ClienteRepository :: updateTelefono()   必须是App \ Models \ Cliente \ Cliente的一个实例,给出字符串,   呼唤   /Applications/MAMP/htdocs/sgc18/app/Http/Controllers/Backend/Cliente/ClienteController.php   在第159行

在我的ClienteRepository上我有这段代码:

public function updateTelefono(Cliente $cliente, Telefono $telefono, array $data) : Telefono
{
    return DB::transaction(function () use ($cliente, $telefono, $data) {
        if ($telefono->update([
            'telefono' => $data['telefono'],
            'tipo_telefono_id' => $data['tipo_telefono_id'],
            'comentario' => $data['comentario']
        ])) {
            event(new ClienteTelefonoUpdated($telefono));

            return $telefono;
        }

        throw new GeneralException(__('Hubo un problema al actualizar el teléfono. Intentelo de nuevo.'));
    });
}

在我的ClienteController中我有这段代码:

public function updateTelefono(ClienteRequest $request, $cliente_id, $telefono_id)
{
    $cliente = Cliente::findOrfail($cliente_id);
    $telefono = Telefono::findOrFail($telefono_id);
    $this->clienteRepository->updateTelefono($cliente, $telefono, $request->only(
        'telefono',
        'tipo_telefono_id',
        'comentario'
    ));

    return redirect()->to(route('admin.clientes.show', $cliente_id) . '#telefonos')->withFlashSuccess(__('Teléfono actualizado correctamente.'));
}

这是更新的路线:

Route::patch('{id}/telefono/{tid}/update', 'ClienteController@updateTelefono')->name('telefono.update');

admin / clientes / {id} / telefono / {tid} / update | admin.clientes.telefono.update | App \ Http \ Controllers \ Backend \ Cliente \ ClienteController @ updateTelefono

这是我的编辑视图:

@extends('backend.layouts.app')

@section('title', __('Administración de Clientes') . ' | ' . __('Editando Teléfono de Cliente') . ' ' . $cliente->nombre_completo . ' | ' . app_name())

@section('breadcrumb-links')
    @include('backend.clientes.includes.breadcrumb-links')
@endsection

@section('content')
<div class="card">
    <div class="card-body">
        <div class="row">
            <div class="col">
                <h4 class="card-title mb-0">
                    {{ __('Administración de Clientes') }}
                    <small class="text-muted">({{ __('Editando Teléfono de Cliente') }} <b>{{ $cliente->nombre_completo }}</b>)</small>
                </h4>
            </div>
        </div>

        <hr />

        {{ html()->modelForm($tel, 'PATCH', route('admin.clientes.telefono.update', [$cliente->id, $tel->id]))->open() }}
        <div class="row mt-4 mb-4">
            <div class="col">
                {{ html()->label(__('Número de Teléfono'))->for('telefono') }}

                {{ html()->text('telefono')
                ->class('form-control')
                ->attribute('maxlength', 191) }}
            </div>
        </div>

        <div class="row mt-4 mb-4">
            <div class="col">
                {{ html()->label(__('Tipo Teléfono'))->for('tipo_telefono_id') }}
                {{ html()->hidden('cliente_id')->value($cliente->id) }}
                <select class="form-control tipoTelefono" name="tipo_telefono_id">
                    @if(isset($tipo_telefonos) && $tipo_telefonos->count() > 0)
                        @foreach($tipo_telefonos as $i)
                            <option value="{{ $i->id }}" @if($i->id == old('tipo_telefono_id', $tel->tipo_telefono_id)) selected @endif>{{ $i->descripcion }}</option>
                        @endforeach
                    @endif
                </select>
            </div>
        </div>

        <div class="row mt-4 mb-4">
            <div class="col">
                {{ html()->label(__('Comentario'))->for('comentario') }}

                {{ html()->textarea('comentario')->class('form-control')->attribute('rows', 4)->attribute('noresize') }}
            </div>
        </div>
    </div>

    <div class="card-footer">
        <div class="row">
            <div class="col">
                {{ form_cancel(route('admin.clientes.show', $cliente->id) . '#telefonos', __('Cancelar')) }}
            </div><!--col-->

            <div class="col text-right">
                {{ form_submit(__('Actualizar')) }}
            </div><!--row-->
        </div><!--row-->
    </div><!--card-footer-->
</div>
{{ html()->closeModelForm() }}
@endsection

@push('after-scripts')
    <script type="text/javascript">
        $(document).ready(function(){
            $('.tipoTelefono').select2();
        });
    </script>
@endpush

1 个答案:

答案 0 :(得分:2)

您似乎将$cliente_id作为客户端的ID而不是客户端的实例传递。

首先尝试找到客户端:

public function updateTelefono(ClienteRequest $request, $cliente_id, $telefono_id)
{
    $cliente = \App\Models\Cliente\Cliente::find($cliente_id);
    $telefono = \App\Models\Cliente\Telefono::find($telefono_id);
    $this->clienteRepository->updateTelefono($cliente, $telefono, $request->only(
        'telefono',
        'tipo_telefono_id',
        'comentario'
    ));

    return redirect()->to(route('admin.clientes.show', $cliente_id) . '#telefonos')->withFlashSuccess(__('Teléfono actualizado correctamente.'));
}