github.com/goravel/framework@v1.13.9/http/console/controller_make_command.go (about)

     1  package console
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  
     9  	"github.com/gookit/color"
    10  
    11  	"github.com/goravel/framework/contracts/console"
    12  	"github.com/goravel/framework/contracts/console/command"
    13  	"github.com/goravel/framework/support/file"
    14  	"github.com/goravel/framework/support/str"
    15  )
    16  
    17  type ControllerMakeCommand struct {
    18  }
    19  
    20  // Signature The name and signature of the console command.
    21  func (receiver *ControllerMakeCommand) Signature() string {
    22  	return "make:controller"
    23  }
    24  
    25  // Description The console command description.
    26  func (receiver *ControllerMakeCommand) Description() string {
    27  	return "Create a new controller class"
    28  }
    29  
    30  // Extend The console command extend.
    31  func (receiver *ControllerMakeCommand) Extend() command.Extend {
    32  	return command.Extend{
    33  		Category: "make",
    34  		Flags: []command.Flag{
    35  			&command.BoolFlag{
    36  				Name:  "resource",
    37  				Value: false,
    38  				Usage: "resourceful controller",
    39  			},
    40  		},
    41  	}
    42  }
    43  
    44  // Handle Execute the console command.
    45  func (receiver *ControllerMakeCommand) Handle(ctx console.Context) error {
    46  	name := ctx.Argument(0)
    47  	if name == "" {
    48  		return errors.New("Not enough arguments (missing: name) ")
    49  	}
    50  
    51  	stub := receiver.getStub()
    52  	if ctx.OptionBool("resource") {
    53  		stub = receiver.getResourceStub()
    54  	}
    55  
    56  	if err := file.Create(receiver.getPath(name), receiver.populateStub(stub, name)); err != nil {
    57  		return err
    58  	}
    59  
    60  	color.Greenln("Controller created successfully")
    61  
    62  	return nil
    63  }
    64  
    65  func (receiver *ControllerMakeCommand) getStub() string {
    66  	return Stubs{}.Controller()
    67  }
    68  
    69  func (receiver *ControllerMakeCommand) getResourceStub() string {
    70  	return Stubs{}.ResourceController()
    71  }
    72  
    73  // populateStub Populate the place-holders in the command stub.
    74  func (receiver *ControllerMakeCommand) populateStub(stub string, name string) string {
    75  	controllerName, packageName, _ := receiver.parseName(name)
    76  
    77  	stub = strings.ReplaceAll(stub, "DummyController", str.Case2Camel(controllerName))
    78  	stub = strings.ReplaceAll(stub, "DummyPackage", packageName)
    79  
    80  	return stub
    81  }
    82  
    83  // getPath Get the full path to the command.
    84  func (receiver *ControllerMakeCommand) getPath(name string) string {
    85  	pwd, _ := os.Getwd()
    86  
    87  	controllerName, _, folderPath := receiver.parseName(name)
    88  
    89  	return filepath.Join(pwd, "app", "http", "controllers", folderPath, str.Camel2Case(controllerName)+".go")
    90  }
    91  
    92  // parseName Parse the name to get the controller name, package name and folder path.
    93  func (receiver *ControllerMakeCommand) parseName(name string) (string, string, string) {
    94  	name = strings.TrimSuffix(name, ".go")
    95  
    96  	segments := strings.Split(name, "/")
    97  
    98  	controllerName := segments[len(segments)-1]
    99  
   100  	packageName := "controllers"
   101  	folderPath := ""
   102  
   103  	if len(segments) > 1 {
   104  		folderPath = filepath.Join(segments[:len(segments)-1]...)
   105  		packageName = segments[len(segments)-2]
   106  	}
   107  
   108  	return controllerName, packageName, folderPath
   109  }