Создайте ремесленную команду для создания пользовательских классов или файлов.

Каков наилучший способ (или, может быть, так, как это делается на самом деле) создать ремесленную команду для создания пользовательских классов или файлов? Как и сам php artisan make:console, который создает класс php для нашей новой команды artisan.

Насколько я понимаю, у нас есть два варианта:

  • Добавьте шаблон для этого нового файла, используя php heredoc (или любую строку внутри файла класса новой команды, если на то пошло), что действительно беспорядочно.

  • Поместите куда-нибудь файл шаблона, прочитайте его, замените то, что необходимо, а затем создайте новый файл. Но я не знаю, куда лучше положить файл шаблона.

Итак, есть ли лучший способ справиться с этой ситуацией в Laravel? Я погуглил, но там были только статьи и документация по созданию простых ремесленных команд.


person Milad.Nozari    schedule 21.01.2016    source источник


Ответы (2)


Laravel использует файлы .stub в качестве шаблонов и заменяет токены внутри шаблона.

Поскольку вы упомянули команду make:console, для справки вы можете взглянуть на следующие файлы:

  • vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/console.stub
    (на github)
    Это шаблон для создания новых консольных команд.
  • vendor/laravel/framework/src/Illuminate/Foundation/Console/ConsoleMakeCommand.php
    (на github )
    Это код, который выполняется при запуске команды php artisan make:console.

Если вы хотите взглянуть на пакеты, которые сделали это, хорошим примером является generators, созданный Джеффри Уэем из Laracasts.

person patricus    schedule 21.01.2016
comment
Хорошая работа @patricus. Я тоже посмотрел в вендоре, но думаю, что был недостаточно тщательным :-). так что я положу мю-заглушки в app\Console\Commands\stubs. Спасибо чувак - person Milad.Nozari; 21.01.2016
comment
Это спасатель! Спасибо - person Player1; 07.07.2021

Обновление 04/2020: в Laravel 7 есть возможность редактировать заглушки по умолчанию, чтобы внести в них изменения, и Laravel подберет эти изменения. Если вы хотите создать совершенно другую заглушку для публикации совершенно другого файла, нижеприведенный процесс подходит, в противном случае просмотрите документы по ссылке ниже. https://laravel.com/docs/7.x/artisan#stub-customization


Я знаю, что этот вопрос немного устарел, но это довольно просто, если вы просто хотите создать аналогичный файл, который уже делает Laravel. (Я хотел создать задание с некоторыми пользовательскими чертами, добавленными при создании)

Итак, сначала взгляните на заглушки Laravel поставляется с здесь, на github< /а>.

Затем выберите заглушку нужного типа класса (я скопировал заготовка из очереди заданий) и вставьте ее в доступное для вас место в приложении. Я поместил свой внутри App\Console\Stubs, так как имеет смысл, что команды будут использовать заглушки.

После этого создайте свою ремесленную команду с помощью php artisan make:command commandName.

Внутри созданной команды используйте этот файл Illuminate\Console\GeneratorCommand. Теперь сделайте так, чтобы ваша команда расширяла этот класс вместо Command; Этот класс — это класс, который Laravel использует для создания классов, и он сам расширяет Command.

Внутри вашей команды создайте несколько свойств и методов следующим образом:

protected $name = 'make:custom-file'; The name of your command. This replaces $signature

protected $description = 'Command description.';

protected $type = 'Job'; Type of class to make

//location of your custom stub
protected function getStub()
{
    return  app_path().'/Console/Stubs/custom-job.stub';
}

//The root location the file should be written to
protected function getDefaultNamespace($rootNamespace)
{
    return $rootNamespace.'\Jobs';
}

//option flags if any see this for how it works
protected function getOptions()
{
    return [];
}

Полный пример того, как должен выглядеть класс, выглядит так:

<?php

namespace App\Console\Commands;

use Illuminate\Console\GeneratorCommand;

class CustomJob extends GeneratorCommand
{

    /**
    * The name and signature of the console command.
    *
    * @var string
    */
    protected $name = 'make:custom';

    /**
    * The console command description.
    *
    * @var string
    */
    protected $description = 'Create a custom job.';

    /**
    * The type of class being generated.
    *
    * @var string
    */
    protected $type = 'Job';

    /**
    * Get the stub file for the generator.
    *
    * @return string
    */
    protected function getStub()
    {
        return  app_path().'/Console/Stubs/custom-job.stub';
    }

    /**
    * Get the default namespace for the class.
    *
    * @param  string  $rootNamespace
    * @return string
    */
    protected function getDefaultNamespace($rootNamespace)
    {
        return $rootNamespace.'\Jobs';
    }

    /**
    * Get the console command options.
    *
    * @return array
    */
    protected function getOptions()
    {
        return [];
    }
}

Как только вы запустите свою пользовательскую команду artisan, она запишет вашу пользовательскую заглушку туда, куда вы укажете.

person abetwothree    schedule 20.07.2018
comment
Очень хорошо! Спасибо за то, что поделился этим! Отлично +1 - person Alexey Shabramov; 16.02.2019
comment
Спасибо за этот информативный пост. У меня есть связанный с этим вопрос, на который я не смог найти хороший ответ: как я могу создать команду для создания блейд-файла в папке представлений? - person Lamar; 13.01.2021
comment
@Lamar, вы просто создадите заглушку для использования в качестве шаблона и установите путь getDefaultNamespace для публикации в папке представлений. В Laravel 7 и выше теперь есть возможность создавать компоненты из командной строки laravel.com/docs /8.x/blade#компоненты - person abetwothree; 13.01.2021