Повторное использование кода в командах, т. Е. Создание BaseCommand для повторного использования операторов «use», аргументов и общих переменных - PullRequest
0 голосов
/ 21 января 2020

Я пишу много команд импорта в Laravel 5.8, которые все принимают один и тот же аргумент и импортируют часть данных. Например, у меня есть ImportUsersCommand.php, ImportFilesCommand.php и ImportNotesCommand.php, все из которых принимают аргумент location_id (есть намного больше команд, но я пытаюсь сделать этот пример простым). Все сценарии подключаются к внешней базе данных сервера MS SQL, указывающей c в это местоположение, а затем запускают некоторый код для импорта данных в базу данных MySQL.

Я заметил, что я многократное повторение одного и того же, и я хотел бы изменить его на что-то вроде BaseImportCommand.php.

Пример команды - ImportUsersCommand. php (что у меня сейчас есть)

<?php

namespace App\Console\Commands\Imports;

use Illuminate\Console\Command;

// Models
use App\Models\Location;
use App\Models\Files;
use App\Models\Notes;
use App\Models\User;
// ... and the list continues with many more models!

use DB;
use Hash;
use Schema;
use Carbon\Carbon;
// ... and the list continues with many more!    

class ImportUsers extends Command
{
    protected $signature = 'import:users {location_id}';
    protected $description = 'Import users from another data source';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $this->info($this->description);
        ini_set('memory_limit', '4000M');            
        $location = Location::findOrFail($this->argument('location_id'));
        Config::set("database.connections.chirotouch", [
            'driver' => env('SQLSERVER_DB_CONNECTION'),
            'host' => env('SQLSERVER_DB_HOST'),
            'port' => env('SQLSERVER_DB_PORT'),
            'database' => 'location_'.$location->id,
            'username' => env('SQLSERVER_DB_USERNAME'),
            'password' => env('SQLSERVER_DB_PASSWORD'),
        ]);
        // ... and the code continues just for setting up the command...

        // Only after about 100 lines of code do we actually get to the 
        // specifics of what this particular command does.

        foreach ($location->users as $user) {
            // Do what I need to do
        }
    }
}

Что бы я хотел, чтобы ImportUsersCommand. php выглядел как

<?php

namespace App\Console\Commands\Imports;

use App\Console\Commands\Imports\BaseImportCommand;

class ImportUsers extends BaseImportCommand
{
    protected $signature = 'import:users {location_id}';
    protected $description = 'Import users from another data source';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        foreach ($location->users as $user) {
            // Do what I need to do
        }
    }
}

Но у меня возникают проблемы при составлении моего BaseImportCommand.php. Как извлечь операторы use, соединение с внешней БД, операторы $this-info(), параметры конфигурации, такие как увеличение лимита памяти, и присвоение переменной $location другому файлу, который можно использовать повторно для каждая команда импорта?

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 21 января 2020

У вас это в значительной степени есть.

Ваша пользовательская команда расширяет вашу общую BaseImportCommand, которая расширяет команду Laravel.

Вы можете настроить все ваши общие операторы использования в вашем BaseImportCommand файл. И любой общий код, который нужен вашим командам для настройки, может быть в __construct() внутри BaseImportCommand, который у вас уже есть, но он просто пустой.

...