exfriend/laravel-recipe

Laravel的生成器框架。

0.3.0 2017-08-31 10:48 UTC

This package is auto-updated.

Last update: 2024-09-21 20:33:51 UTC


README

Laravel的生成器框架,基于Laravel构建。

安装

在Laravel 5.5上

    composer require exfriend/laravel-recipe

基本用法

为了生成任何实体,你基本上需要两样东西:一个模板和实际数据。

Recipe使用Laravel的Blade作为模板引擎,因此基本用法与从控制器返回视图的方式非常相似。

让我们编写第一个会生成任何类的食谱。

  1. resources/views/recipe文件夹中创建一个新的视图

resources/views/recipe/class.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' => [
            'Illuminate\Foundation\Auth\User as Authenticatable',
            'Illuminate\Notifications\Notifiable',
            'Laravel\Passport\HasApiTokens',
        ],

        'traits' => [
            'HasApiTokens',
            'Notifiable',
        ],
//            'implements' => [ 'SomeInterface', 'OtherInterface' ],
    ] );
    

获取编译后的代码

    dd( $recipe->build() )

保存到文件

    $recipe->build( app_path('User.php') );

现在让我们为这个食谱创建一个专门的类,以便更容易操作。

app/Recipes/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在它的组件中使用的方式类似。

这里发生了两件重要的事情

首先,我们添加了一些验证,告诉Recipe在这个食谱中class属性是必需的。你可以像在Laravel应用程序中一样设置规则属性——这就是一回事。

其次,我们为contentimport设置了默认值。如果用户没有提供任何输入,这些默认值将被应用。

所以,我们的最终使用现在看起来像这样

    $recipe = ( \App\Recipes\ClassRecipe::class )->with( [
        'namespace' => 'App',
        'class' => 'User',
        'extends' => 'Illuminate\Foundation\Auth\User',
    ] )
    ->build( app_path('User.php') );

重要提示

由于props,传递给模板的实际数据将与我们传递的数据略有不同。例如,它将包含contentimports。有时你可能只想获取转换后的数据而无需编译整个模板(例如,对于嵌套食谱,请参见下文)。要仅获取编译后的数据,请运行

    $recipe = ( \App\Recipes\ClassRecipe::class )->with( [
        ...
    ] )
    ->buildData();

由于我们在这里生成的是一个模型,而模型是我们经常需要生成的,因此创建一个基于我们已有的通用类食谱的专用模型食谱是有意义的。让我们创建一个简单的模型食谱

app/Recipes/ModelRecipe.php


高级用法

即将推出。