github.com/ddev/ddev@v1.23.2-0.20240519125000-d824ffe36ff3/pkg/ddevapp/cakephp.go (about)

     1  package ddevapp
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/ddev/ddev/pkg/fileutil"
     6  	"github.com/ddev/ddev/pkg/nodeps"
     7  	"github.com/ddev/ddev/pkg/util"
     8  	"os"
     9  	"path/filepath"
    10  	"strings"
    11  )
    12  
    13  // isCakephpApp returns true if the app is of type cakephp
    14  func isCakephpApp(app *DdevApp) bool {
    15  	return fileutil.FileExists(filepath.Join(app.AppRoot, "bin/cake.php"))
    16  }
    17  
    18  func cakephpPostStartAction(app *DdevApp) error {
    19  	// We won't touch env if disable_settings_management: true
    20  	if app.DisableSettingsManagement {
    21  		return nil
    22  	}
    23  	envFileName := "config/.env"
    24  	envFilePath := filepath.Join(app.AppRoot, envFileName)
    25  	_, _, err := ReadProjectEnvFile(envFilePath)
    26  	if err != nil && !os.IsNotExist(err) {
    27  		return fmt.Errorf("unable to read .env file in config folder: %v", err)
    28  	}
    29  	if err == nil {
    30  		envFileName = "config/.env.ddev"
    31  		envFilePath = filepath.Join(app.AppRoot, envFileName)
    32  		_, _, err = ReadProjectEnvFile(envFilePath)
    33  		if err == nil {
    34  			util.Warning("CakePHP: .env.ddev file exists already. Replacing it. You can rename it or copy settings to your .env file.")
    35  		} else {
    36  			util.Warning("CakePHP: .env file exists already. Creating .env.ddev. You can rename it or copy settings to your .env file.")
    37  		}
    38  	} else {
    39  		util.Success("CakePHP: Creating .env file to store your config settings.")
    40  	}
    41  	err = fileutil.CopyFile(filepath.Join(app.AppRoot, "config/.env.example"), envFilePath)
    42  	if err != nil {
    43  		util.Debug("CakePHP: .env.example does not exist yet in config folder, not trying to process it")
    44  		return nil
    45  	}
    46  	_, envText, err := ReadProjectEnvFile(envFilePath)
    47  	if err != nil {
    48  		return err
    49  	}
    50  	port := "3306"
    51  	dbConnection := "mysql"
    52  	if app.Database.Type == nodeps.Postgres {
    53  		dbConnection = "pgsql"
    54  		port = "5432"
    55  	}
    56  	envMap := map[string]string{
    57  		"export APP_NAME":                    app.GetName(),
    58  		"export DEBUG":                       "true",
    59  		"export APP_ENCODING":                "UTF-8",
    60  		"export APP_DEFAULT_LOCALE":          "en_US",
    61  		"export DATABASE_URL":                dbConnection + "://db:db@db:" + port + "/db",
    62  		"export EMAIL_TRANSPORT_DEFAULT_URL": "smtp://localhost:1025",
    63  		"export SECURITY_SALT":               util.HashSalt(app.GetName()),
    64  		"export DEBUG_KIT_SAFE_TLD":          "site",
    65  	}
    66  	err = WriteProjectEnvFile(envFilePath, envMap, envText)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	err = enableDotEnvLoading(app)
    71  	if err != nil {
    72  		return err
    73  	}
    74  	return nil
    75  }
    76  
    77  // cakephpConfigOverrideAction overrides php_version for CakePHP, requires PHP8.1
    78  func cakephpConfigOverrideAction(app *DdevApp) error {
    79  	app.PHPVersion = nodeps.PHP83
    80  	app.DisableUploadDirsWarning = true
    81  	return nil
    82  }
    83  
    84  func enableDotEnvLoading(app *DdevApp) error {
    85  	bootstrapFileName := "config/bootstrap.php"
    86  	bootstrapFilePath := filepath.Join(app.AppRoot, bootstrapFileName)
    87  	envFunction := "// if (!env('APP_NAME') && file_exists(CONFIG . '.env')) {\n//     $dotenv = new \\josegonzalez\\Dotenv\\Loader([CONFIG . '.env']);\n//     $dotenv->parse()\n//         ->putenv()\n//         ->toEnv()\n//         ->toServer();\n// }\n"
    88  	err := fileutil.ReplaceStringInFile(envFunction, strings.ReplaceAll(envFunction, "// ", ""), bootstrapFilePath, bootstrapFilePath)
    89  	if err != nil {
    90  		return err
    91  	}
    92  
    93  	return nil
    94  }