【问题标题】:Laravel - Error: App\Exports\View must be compatible with Maatwebsite\Excel\Concerns\FromView::view(): Illuminate\Contracts\View\ViewLaravel - 错误:App\Exports\View 必须与 Maatwebsite\Excel\Concerns\FromView::view() 兼容:Illuminate\Contracts\View\View
【发布时间】:2019-12-06 13:25:14
【问题描述】:

我正在尝试使用 PHP 7、Laravel 5.8、Maatwebsite Excel 3.1 导出到 excel。我成功显示在视图刀片上并执行了过滤器。

型号: 使用 App\UserResponse;

控制器

public function userresponseReport(Request $request,$export=false)
{
    $data['title'] = 'User Response';

    $userresponses = DB::table('user_response as g')
        ->select(
        //DB::raw('DATE(g.created_at) as created_date'),
            DB::raw('g.created_at as created_date'),
            'g.msisdn',
            'g.game_code',
            'g.answer',
            'g.answer_code',
            'g.Amount_charged',
            'g.payment_ref',
            'g.status',
            'g.user_channel'
        )
        ->orderByRaw('g.created_at DESC');

    $start_date = $request->start_date;
    $end_date = $request->end_date;

    $render=[];
    if(isset($request->start_date) && isset($request->end_date))
    {
        $userresponses=$userresponses->whereBetween('created_at',[$start_date.' 00:00:00',$end_date.' 23:59:59']);
        $render['start_date']=$request->start_date;
        $render['end_date']=$request->end_date;
    }elseif(isset($request->start_date))
    {
        $userresponses=$userresponses->where('created_at',$request->start_date);
        $render['start_date']=$request->start_date;
    }
    if(isset($request->msisdn))
    {
        $userresponses=$userresponses->where('msisdn','like','%'.$request->msisdn.'%');
        $render['msisdn']=$request->msisdn;
    }
    if(isset($request->game_code))
    {
        $userresponses=$userresponses->where('game_code','like','%'.$request->game_code.'%');
        $render['game_code']=$request->game_code;
    }
    if(isset($request->user_channel))
    {
        $userresponses=$userresponses->where('user_channel','like','%'.$request->user_channel.'%');
        $render['user_channel']=$request->user_channel;
    }

    if(!empty($export))
    {
        return Excel::download(new UserresponseExport($userresponses->get()), 'userresponse.xlsx');
    }
    $userresponses= $userresponses->orderBy('created_at','DESC');
    $userresponses= $userresponses->paginate(15);
    $userresponses= $userresponses->appends($render);
    $data['userresponses'] = $userresponses;

    return view('report.userresponseReport',$data);
}

然后,视图刀片:

userresponseReport.blade.php

    <div class="row" style="margin-bottom: 10px">
        {{ Form::model(request(),['method'=>'get']) }}
        <div class="col-sm-2">
             {{ Form::text('msisdn',null,['class'=>'form-control','placeholder'=>'MSISDN']) }}
        </div>
        <div class="col-sm-2">
             {{ Form::text('game_code',null,['class'=>'form-control','placeholder'=>'Game Code']) }}
        </div>   
        <div class="col-sm-2">
             {{ Form::text('user_channel',null,['class'=>'form-control','placeholder'=>'Channel']) }}
        </div>          
        <div class="col-sm-2">
            {{ Form::date('start_date',null,['class'=>'form-control','placeholder'=>'Date']) }}
        </div>
        <div class="col-sm-2">
            {{ Form::date('end_date',null,['class'=>'form-control','placeholder'=>'Date']) }}
        </div>          
        <div class="col-xs-2">
            {{ Form::submit('Search',['class'=>'btn btn-warning']) }}
            <a href="{{ route('userresponseReport',['export']) }}" class="btn btn-primary"><i class="fa fa-file-excel-o"></i> Excel</a>
        </div>
        {{ Form::close() }}
    </div>


<div class="box box-primary">
        <div class="box-header with-border">
<table class="table table-bordered table-hover table-striped table-condesed" id="commenter_info_table">
    <caption></caption>
    <thead>
        <tr>
            <td>#</td>
            <td>Date</td>
            <td>MSISDN</td>
            <td>Game Code</td>
            <td>Game Name</td>
            <td>Answer</td>
            <td>Channel</td>
        </tr>
    </thead>
    <tbody>
        @foreach($userresponses as $key => $userresponse)
            <tr>
                <td>{{ ++$key }}</td>
<!--                <td>{{ $userresponse->created_date }}</td>-->
                <td>{{ date('Y-m-d h:i:s A', strtotime($userresponse->created_date)) }}</td>
                <td>{{ $userresponse->msisdn }}</td>
                <td>{{ $userresponse->game_code }}</td>
                <td> 
                    @if($userresponse->game_code=='101')
                       Trivia
                    @elseif($userresponse->game_code=='102')
                       Predict and Win 
                    @elseif($userresponse->game_code=='103')
                       Party With the BBN 
                    @elseif($userresponse->game_code=='104')
                       Grand Prize  
                    @elseif($userresponse->game_code=='105')
                       Happy Hour    
                    @elseif($userresponse->game_code=='106')
                       Power Boost                         
                    @endif                       
                </td>                
                <td>{{ $userresponse->answer }}</td>
                <td>{{ $userresponse->user_channel }}</td>                                    
            </tr>          
        @endforeach
            <tr>
            <td colspan="14">
                {{ $userresponses->links() }}
            </td>
            </tr>         
    </tbody>

</table>   

然后是导出

用户响应导出


class UserresponseExport implements FromView, WithHeadings, ShouldAutoSize, WithEvents, WithMapping
{
    protected $userresponses;

    public function __construct($userresponses = null)
    {
        $this->userresponses = $userresponses;
    }

    public function view(): View
    {
        return view('report.userresponseReport', [
            'userresponses' => $this->userresponses ?: DB::table('user_response as g')
                ->select(
                    DB::raw('g.created_at as created_date'),
                    'g.msisdn',
                    'g.game_code',
                    'g.answer',
                    'g.answer_code',
                    'g.Amount_charged',
                    'g.payment_ref',
                    'g.status',
                    'g.user_channel'
                )
                ->orderByRaw('g.created_at DESC')
        ]);
    }

    private $headings = [
        'Date Created',
        'MSISDN',
        'game_code',
        'Answer',
        'Channel'
    ];
    public function headings(): array
    {
        return $this->headings;
    }


    public function registerEvents(): array
    {
        return [
            AfterSheet::class    => function(AfterSheet $event) {
                $cellRange = 'A1:E1'; // All headers
                $event->sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize(14);

            },


        ];
    }

}

路线

Route::get('/report/userresponse-report/{export?}', ['as' => 'userresponseReport', 'uses' => 'ReportController@userresponseReport']);

在视图刀片上,当我单击搜索时,一切正常。但是当我点击导出时,我得到了这个错误:

Symfony\Component\Debug\Exception\FatalErrorException (E_UNKNOWN) App\Exports\UserresponseExport::view() 声明:App\Exports\View 必须兼容 Maatwebsite\Excel\Concerns\FromView::view(): Illuminate\Contracts\View\View

  1. 可能是什么原因导致了此错误?
  2. 我该如何解决?

【问题讨论】:

    标签: laravel maatwebsite-excel


    【解决方案1】:

    这个错误表明你的类App\Exports\UserresponseExport没有正确地遵循接口。

    通过错误,我们可以看到您需要有一个名为 view 的方法,但您的方法已键入提示 App\Exports\View 作为返回类型,而不是 Illuminate\Contracts\View\View

    要解决此问题,只需将您的 view 方法返回类型更改为 Illuminate\Contracts\View\View


    你现在的代码很可能会说

    public function view(): View 
    {
      ...
    }
    

    但是由于您在 import 语句中缺少 use Illuminate\Contracts\View\View;View 正在解析为您的类的当前命名空间 + 您尝试输入提示的类,这将导致 App\Exports\View

    因此,另一种解决方案是在你的类中导入Illuminate\Contracts\View\View,而不是在文件顶部添加use Illuminate\Contracts\View\View;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 2014-12-19
      • 2018-01-30
      • 2016-07-13
      • 2019-11-12
      • 2018-12-20
      • 2014-04-20
      • 2016-09-23
      相关资源
      最近更新 更多