如何在 Laravel 中的 2 类 之间传递变量

how to pass variable between 2 classes in Laravel

我有 class 定义从 xlsx 文件导入数据库的新闻 table。 App\Imports\NewsImport.php

<?php
namespace App\Imports;

use App\News;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class NewsImport implements ToCollection, WithHeadingRow
{
    public function collection(Collection $rows)
    {
        News::truncate();
        foreach ($rows as $row) 
        { 
            News::create([
               'title'      => $row['title'], 
               'fulltext'   => $row['fulltext'], 
            ]);
        }
      return $newsimported = $rows->count();
    }
}

然后在 SeedController 中管理导入 App\Admin\Controllers\SeedController.php

<?php
namespace App\Admin\Controllers;

use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\Dashboard;
use Encore\Admin\Layout\Column;
use Encore\Admin\Layout\Content;
use Encore\Admin\Layout\Row;
use App\Imports\NewsImport;
use Maatwebsite\Excel\Facades\Excel;

class SeedController extends Controller
{
    public function index(Content $content)
    {
        Excel::import(new NewsImport,       'import/news.xlsm');
        return $content
            ->title('Import & Export')
            ->description('Laravel excel');
    }

}

我在进入种子页面时启动导入

$router->get('seed', 'SeedController@index')->name('admin.home');

代码运行正常,但我想在种子页面上显示已导入了多少新闻。 但我不知道如何使 $newsimported 在 SeedController 索引函数中可用。 有什么想法吗?

在不查看 Excel 库的实现细节的情况下,您可以尝试向您创建的导入 class 添加一个成员变量,然后在 Excel::import(...) 具有 运行:

class NewsImport implements ToCollection, WithHeadingRow
{
    public $rowCount = null;

    public function collection(Collection $rows)
    {
        News::truncate();
        foreach ($rows as $row) 
        { 
            News::create([
               'title'      => $row['title'], 
               'fulltext'   => $row['fulltext'], 
            ]);
        }

        $this->rowCount = $rows->count();
    }
}

那你在哪里运行Excel::import(...):

public function index(Content $content)
{
    Excel::import($import = new NewsImport, 'import/news.xlsm');

    $rowCount = $import->rowCount;

    ...    
}