Могу ли я изменить стиль / формат созданных Artisan файлов Laravel? [Дубликат]

Различные подходы, обсуждаемые в вышеприведенных ответах, основаны на предположении, что либо пользователь знает индексы столбцов, чтобы их отбрасывать, либо подмножество, или пользователь хочет подмножить фрейм данных с использованием диапазона столбцов (например, между 'C': ' E '). pandas.DataFrame.drop (), безусловно, является возможностью подмножества данных на основе списка столбцов, определенных пользователем (хотя вы должны быть осторожны, чтобы всегда использовать копию данных и параметры inplace не должны быть True !!) [/ ​​g2]

Другой вариант - использовать pandas.columns.difference (), который задает разницу в именах столбцов и возвращает индексный тип массива, содержащий требуемые столбцы. Ниже приведено решение:

df = pd.DataFrame([[2,3,4],[3,4,5]],columns=['a','b','c'],index=[1,2])
columns_for_differencing = ['a']
df1 = df.copy()[df.columns.difference(columns_for_differencing)]
print(df1)

Выход будет: b c 1 3 4 2 4 5

9
задан Laurence 19 May 2014 в 13:00
поделиться

4 ответа

Я не думаю, что вы можете, потому что Laravel берет миграции из папки vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs, и вы не можете изменить это, но у вас есть некоторые опции:

1) Создайте собственную команду artisan migrate:makemyown .

2) Используйте генераторы Laravel 4 Джеффри Пута . Они позволяют создавать ваши миграции, делая:

php artisan generate:migration create_posts_table --fields="title:string, description:text"

Если у вас есть только некоторые поля, которые вам нужно начинать, а не что-то более конкретное, это работает отлично.

3) Редактируйте заглушки Laravel, но проблема в том, что как только вы composer update, они могут быть перезаписаны композитором.

5
ответ дан Antonio Carlos Ribeiro 26 August 2018 в 07:46
поделиться

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

Сначала вам нужно создать команду Generator app/Console/Commands/Generator.php:

<?php namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Symfony\Component\Console\Input\InputArgument;

class Generator extends Command
{

  /**
   * Command name
   *
   * @var string
   */
  protected $name = 'generate';

  /**
   * Command description
   *
   * @var string
   */
  protected $description = 'Custom object generator';

  /**
   * An array with all available generator classes
   *
   * @var array
   */
  protected $types = ['request', 'model', 'middleware'];

  /**
   * Execute command
   *
   * @return mixed
   */
  public function handle()
  {
      $type = $this->argument('type');
      if (!in_array($type, $this->types)) {
          return $this->error('Type must be one of: '.implode(', ', $this->types));
      }

      // Create new instance
      $generatorClass = 'App\Console\Commands\Generators\\'.ucfirst($type);
      $generator = new $generatorClass(new Filesystem());

      // Each generator has "fire" method
      $this->comment($generator->setClassName($this->argument('name'))->fire());
  }

  /**
   * @return array
   */
  public function getArguments()
  {
      return [
          ['type', InputArgument::REQUIRED, 'Type of class to generate: '.implode(', ', $this->types)],
          ['name', InputArgument::REQUIRED, 'Name of class to generate'],
      ];
  }

}

. Затем вам нужно создать абстрактный класс для всех классов Generators app/Console/Commands/Generators/Generator.php:

<?php namespace App\Console\Commands\Generators;

use Illuminate\Console\GeneratorCommand;

abstract class Generator extends GeneratorCommand
{
  // Directory name with whole application (by default app)
  const APP_PATH = 'app';

  /*
   * Name and description of command wont be used
   * Generators Commands are not loaded via Kernel
   * Name and description property has been put just to avoid Exception thrown by Symfony Command class
   */
  protected $name = 'fake';
  protected $description = 'fake';

  /**
   * Class name to generate
   *
   * @var string
   */
  protected $className;

  /**
   * Returns class name to generate
   *
   * @return string
   */
  protected function getNameInput()
  {
      return $this->className;
  }

  /**
   * Returns path under which class should be generated
   *
   * @param string $name
   * @return string
   */
  protected function getPath($name)
  {
      $name = str_replace($this->getAppNamespace(), '', $name);

      return self::APP_PATH.'/'.str_replace('\\', '/', $name).'.php';
  }

  /**
   * Sets class name to generate
   *
   * @param string $name
   * @return $this
   */
  public function setClassName($name)
  {
      $this->className = $name;
      return $this;
  }

  /**
   * Execute command
   *
   * @return string
   */
  public function fire()
  {
      $name = $this->parseName($this->getNameInput());

      if ($this->files->exists($path = $this->getPath($name)))
      {
          return $this->type.' already exists!';
      }

      $this->makeDirectory($path);

      $this->files->put($path, $this->buildClass($name));

      return $this->type.' '.$this->className.' created successfully.';
  }

}

В конце вы можете создать свой первый класс Generator! app/Console/Commands/Generators/Request.php

<?php namespace App\Console\Commands\Generators;

class Request extends Generator
{

  /**
   * Class type to generate
   *
   * @var string
   */
  protected $type = 'Request';

  /**
   * Returns default namespace for objects being generated
   *
   * @param string $rootNamespace
   * @return string
   */
  protected function getDefaultNamespace($rootNamespace)
  {
      return $rootNamespace.'\Http\Requests';
  }

  /**
   * Returns path to custom stub
   *
   * @return string
   */
  public function getStub()
  {
      return base_path('resources').'/stubs/request.stub';
  }

}

Не забудьте добавить свою команду генерации в Kernel app/Console/Kernel.php:

<?php namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel {

  /**
   * The Artisan commands provided by your application.
   *
   * @var array
   */
  protected $commands = [
    ...
    'App\Console\Commands\Generator',
    ...
  ];

Поместите свои заглушки в каталог resources/stubs. Давайте создадим первый для генератора запросов resources/stubs/request.stub:

<?php namespace {{namespace}};

class {{class}} extends Request
{

  /**
   * @return bool
   */
  public function authorize()
  {
    // CUSTOM LOGIC

    return false;
  }

  /**
   * @return array
   */
  public function rules()
  {
    $rules = [];

    // CUSTOM LOGIC

    return $rules;
  }

}

Затем вызовите с помощью php artisan generate request MyRequest.

Вы можете создать свои собственные генераторы Model, Middleware, Controller и т. Д., Это очень просто - вам нужно создать новый класс генератора под app/Commands/Console/Generators - посмотрите на генератор Request.php, чтобы посмотреть, как он работает!

3
ответ дан Mateusz Sieprawski 26 August 2018 в 07:46
поделиться

Для Laravel 5 вы отредактируете один из файлов .stub в:

vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs

Нет причин, по которым вы не можете редактировать эти файлы.

Поиск в vendor/laravel/framework/src/ для файлов .stub, чтобы найти все другие заглушки (шаблоны), используемые мастером.

-3
ответ дан serenesat 26 August 2018 в 07:46
поделиться

Это выполнимо довольно логично, по крайней мере, в Laravel 5

Подкласс MigrationCreator и переопределить getStubPath(), просто скопировав функцию из исходного класса (он будет использовать ваш подкласс __DIR__)

<?php

namespace App\Database;

use Illuminate\Database\Migrations\MigrationCreator;

class AppMigrationCreator extends MigrationCreator
{
    public function getStubPath()
    {
        return __DIR__.'/stubs';
    }
}

Записать поставщика услуг для переопределения migration.creator с вашим собственным подклассом (он должен быть отложенным поставщиком услуг, потому что вы не можете переопределить отложенную привязку с нетерпением):

<?php

namespace App\Database;

use Illuminate\Support\ServiceProvider;

class AppMigrationServiceProvider extends ServiceProvider
{
    protected $defer = true;

    public function register()
    {
        $this->app->singleton('migration.creator', function ($app) {
            return new AppMigrationCreator($app['files']);
        });
    }

    public function provides()
    {
        return ['migration.creator'];
    }
}

Добавьте своего поставщика услуг в config/app.php по умолчанию.

Наконец, скопируйте vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs рядом с подклассом MigrationCreator (в этом примере он станет app/Database/stubs) и отредактирует шаблоны для ваших нужд.

Сохраните имена DummyClass и DummyTable, поскольку они будут заменены на str_replace(), чтобы создать фактические файлы миграции.

8
ответ дан Tobia 26 August 2018 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: