Генераторная структура для Ларавела построена на Ларавеле.
На Ларавеле 5.5:
composer require exfriend/laravel-recipeЧтобы генерировать любую сущность, вам в основном нужны две вещи: шаблон и фактические данные.
Рецепт использует лезвие Laravel в качестве шаблонного двигателя для заглушек, поэтому основное использование очень похоже на то, как вы возвращаете виды от контроллеров.
Давайте напишем наш первый рецепт, который генерирует любой класс.
resources/views/recipe папки:Ресурсы/Просмотр/Рецепт/Класс.blade.php
{!! ' < ' . ' ?php ' ! !}
@unless ( empty ( $namespace ) )
namespace {{ $namespace } } ;
@endunless
@unless ( empty ( $imports ) )
@foreach ( $imports as $import )
import {{ $import } } ;
@endforeach
@endunless
class {{ $class } } {{ isset ( $extends ) ? ' extends ' . $extends : ' ' } } {{ ! empty ( $implements ) ? ' implements ' . collect ( $implements ) -> implode ( ' , ' ) : ' ' } }
{
@unless ( empty ( $traits ) )
use {{ collect ( $traits ) -> implode ( ' , ' ) } } ;
@endunless
@isset ( $content )
{!! $content ! !}
@endisset
}
Тогда в любом месте вашего кода вы можете запустить:
$recipe = recipe()->usingView( 'recipes.class' )->with( [
'namespace' => 'App',
'class' => 'User',
'extends' => 'Authenticatable',
'imports' => [
'IlluminateFoundationAuthUser as Authenticatable',
'IlluminateNotificationsNotifiable',
'LaravelPassportHasApiTokens',
],
'traits' => [
'HasApiTokens',
'Notifiable',
],
// 'implements' => [ 'SomeInterface', 'OtherInterface' ],
] );
Получите скомпилированный код:
dd ( $ recipe -> build () )Сохранить в файл:
$ recipe -> build ( app_path ( ' User.php ' ) );Теперь давайте создадим выделенный класс для этого рецепта, чтобы облегчить его.
Приложение/Рецепты/ClassRecipe.php
<?php
namespace App Recipes ;
class ClassRecipe extends Exfriend Recipe Recipe
{
public $ props = [
' class ' => [
' rules ' => ' required ' ,
],
' content ' => [ ' default ' => '' , ],
' imports ' => [ ' default ' => [], ],
];
protected $ view_name = ' recipes.class ' ;
}
Здесь вы можете заметить, что мы жестко кодируем имя шаблона и определяем новую переменную $props , которая несколько похожа на то, что Vue использует в своих компонентах.
Здесь случаются две важные вещи:
Во -первых, мы добавили некоторый валидацию, сообщающий рецепт, что свойство class является обязательным в этом рецепте. Вы можете установить свойство «Правила так же», как обычно, в своем приложении Laravel - это то же самое.
Во -вторых, мы устанавливаем значения по умолчанию для content и import . Эти значения по умолчанию будут применены, если пользователь не предоставляет ничего в качестве ввода.
Итак, наше полученное использование теперь будет выглядеть так:
$ recipe = ( App Recipes ClassRecipe::class )-> with ( [
' namespace ' => ' App ' ,
' class ' => ' User ' ,
' extends ' => ' IlluminateFoundationAuthUser ' ,
] )
-> build ( app_path ( ' User.php ' ) );Важное примечание:
Из -за реквизита фактические данные, передаваемые в шаблон, будут немного отличаться от того, что мы прошли. Например, он будет иметь content и imports . Иногда вы хотели бы просто получить трансформированные данные, которые снимают весь шаблон (например, для вложенных рецептов, см. Ниже). Чтобы получить только скомпилированные данные, запустите:
$ recipe = ( App Recipes ClassRecipe::class )-> with ( [
...
] )
-> buildData ();Поскольку мы генерируем модель здесь, и модель - это то, что мы хотели бы часто генерировать, имеет смысл создавать выделенный рецепт модели на основе общего рецепта класса, который у нас уже есть. Давайте сделаем простой модельный рецепт:
Приложение/Рецепты/ModelRecipe.php
Вскоре.