【问题标题】:Laravel Typer error: Argument 1 passed to must be an instance of . string givenLaravel Typer 错误:传递给的参数 1 必须是 .给定的字符串
【发布时间】:2018-03-28 15:29:52
【问题描述】:

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

类型错误:参数 1 传递给 App\Repositories\Backend\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

【问题讨论】:

    标签: php laravel repository-pattern


    【解决方案1】:

    您似乎将 $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.'));
    }
    

    【讨论】:

    • 首先找到客户端我得到类型错误:传递给 App\Repositories\Backend\Cliente\ClienteRepository::updateTelefono() 的参数 2 必须是 App\Models\Cliente\Telefono 的实例,字符串给定,在第 160 行的 /Applications/MAMP/htdocs/sgc18/app/Http/Controllers/Backend/Cliente/ClienteController.php 中调用
    • 感谢 Nerea!它也找不到 telefono_id,我编辑了 OP,现在它正在工作,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2017-06-12
    • 1970-01-01
    • 2014-04-18
    • 2020-01-06
    • 1970-01-01
    相关资源
    最近更新 更多