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 }