Можно ли изменить шаблоны, созданные командой перенаправления ремесленника?

Я создал базовый класс для своих миграций. На данный момент я запускаю команду migisment artisan и создает новую миграцию, которая расширяет файл Migrations, однако я хочу включить мой BaseMigration и расширить его оттуда. Я делаю эти изменения ручными, но я чувствую, что я повторяю себя излишне.

Любые советы о том, как создавать новые миграции, автоматически расширяют и загружают мою базовую миграцию?

Solutions Collecting From Web of "Можно ли изменить шаблоны, созданные командой перенаправления ремесленника?"

Я не думаю, что вы можете, потому что 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 они могут быть перезаписаны Composer.

Это выполнимо довольно логично, по крайней мере, в 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() чтобы создать фактические файлы миграции.

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

Сначала вам нужно создать команду Generator command 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'], ]; } } 

Затем вам нужно создать абстрактный класс для всех ваших классов генераторов 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'; } } 

Не забудьте добавить команду генерации в app/Console/Kernel.php 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 генератора запросов 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 чтобы увидеть, как он работает!

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

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

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

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