From 15defe4ce2055247f4a7890eb3a7dee02e6a6685 Mon Sep 17 00:00:00 2001 From: Steve Deitz Date: Thu, 22 Oct 2026 21:24:00 +0000 Subject: [PATCH] chore: remove deprecated Drupal 8 and Laravel samples --- appengine/flexible/drupal8/README.md | 95 ---- appengine/flexible/drupal8/app.yaml | 5 - appengine/flexible/drupal8/composer.json | 12 - appengine/flexible/drupal8/phpunit.xml.dist | 32 -- .../flexible/drupal8/test/DeployTest.php | 126 ---- appengine/flexible/laravel/README.md | 7 - .../flexible/laravel/app-dbsessions.yaml | 29 - appengine/flexible/laravel/app.yaml | 15 - .../laravel/app/Exceptions/Handler.php | 60 -- .../app/Logging/CreateCustomLogger.php | 25 - appengine/flexible/laravel/composer.json | 9 - appengine/flexible/laravel/config/logging.php | 76 --- appengine/flexible/laravel/phpunit.xml.dist | 32 -- appengine/flexible/laravel/routes/web.php | 25 - .../test/DeployDatabaseSessionTest.php | 116 ---- .../flexible/laravel/test/DeployTest.php | 188 ------ renovate.json | 3 +- run/README.md | 2 - run/laravel/.env.example | 22 - run/laravel/.gcloudignore | 2 - run/laravel/.gitignore | 17 - run/laravel/Procfile | 3 - run/laravel/README.md | 360 ------------ run/laravel/app/Console/Kernel.php | 32 -- run/laravel/app/Exceptions/Handler.php | 50 -- .../app/Http/Controllers/Controller.php | 15 - .../Http/Controllers/ProductController.php | 106 ---- run/laravel/app/Http/Kernel.php | 67 --- .../app/Http/Middleware/Authenticate.php | 21 - .../app/Http/Middleware/EncryptCookies.php | 17 - .../PreventRequestsDuringMaintenance.php | 17 - .../Middleware/RedirectIfAuthenticated.php | 32 -- .../app/Http/Middleware/TrimStrings.php | 19 - .../app/Http/Middleware/TrustHosts.php | 20 - .../app/Http/Middleware/TrustProxies.php | 28 - .../app/Http/Middleware/VerifyCsrfToken.php | 17 - run/laravel/app/Models/Product.php | 15 - run/laravel/app/Models/User.php | 45 -- .../app/Providers/AppServiceProvider.php | 30 - .../app/Providers/AuthServiceProvider.php | 29 - .../Providers/BroadcastServiceProvider.php | 21 - .../app/Providers/EventServiceProvider.php | 42 -- .../app/Providers/RouteServiceProvider.php | 52 -- run/laravel/artisan | 53 -- run/laravel/bootstrap/app.php | 64 --- run/laravel/bootstrap/cache/.gitignore | 2 - run/laravel/composer.json | 64 --- run/laravel/config/app.php | 215 ------- run/laravel/config/auth.php | 111 ---- run/laravel/config/broadcasting.php | 70 --- run/laravel/config/cache.php | 110 ---- run/laravel/config/cors.php | 34 -- run/laravel/config/database.php | 151 ----- run/laravel/config/filesystems.php | 76 --- run/laravel/config/hashing.php | 52 -- run/laravel/config/logging.php | 122 ---- run/laravel/config/mail.php | 118 ---- run/laravel/config/queue.php | 93 --- run/laravel/config/sanctum.php | 67 --- run/laravel/config/services.php | 34 -- run/laravel/config/session.php | 201 ------- run/laravel/config/view.php | 36 -- run/laravel/database/.gitignore | 1 - .../database/factories/ProductFactory.php | 24 - .../database/factories/UserFactory.php | 42 -- .../2014_10_12_000000_create_users_table.php | 35 -- ...12_100000_create_password_resets_table.php | 31 - ..._08_19_000000_create_failed_jobs_table.php | 35 -- ...01_create_personal_access_tokens_table.php | 35 -- ...022_07_01_000000_create_products_table.php | 32 -- .../database/seeders/DatabaseSeeder.php | 23 - .../database/seeders/ProductSeeder.php | 21 - run/laravel/index.php | 4 - run/laravel/lang/en/auth.php | 20 - run/laravel/lang/en/pagination.php | 19 - run/laravel/lang/en/passwords.php | 22 - run/laravel/lang/en/validation.php | 170 ------ run/laravel/laravel-demo-screenshot.png | Bin 117973 -> 0 bytes run/laravel/package.json | 16 - run/laravel/phpunit.xml | 29 - run/laravel/public/.htaccess | 21 - run/laravel/public/favicon.ico | 0 run/laravel/public/index.php | 55 -- run/laravel/public/robots.txt | 2 - run/laravel/resources/css/app.css | 19 - run/laravel/resources/js/app.js | 1 - run/laravel/resources/js/bootstrap.js | 34 -- .../resources/views/products/create.blade.php | 32 -- .../resources/views/products/edit.blade.php | 35 -- .../resources/views/products/index.blade.php | 45 -- .../resources/views/products/layout.blade.php | 40 -- .../resources/views/products/show.blade.php | 27 - run/laravel/resources/views/welcome.blade.php | 538 ------------------ run/laravel/routes/api.php | 19 - run/laravel/routes/channels.php | 18 - run/laravel/routes/console.php | 19 - run/laravel/routes/web.php | 45 -- run/laravel/storage/app/.gitignore | 3 - run/laravel/storage/app/public/.gitignore | 2 - run/laravel/storage/framework/.gitignore | 9 - .../storage/framework/cache/.gitignore | 3 - .../storage/framework/cache/data/.gitignore | 2 - .../storage/framework/sessions/.gitignore | 2 - .../storage/framework/testing/.gitignore | 2 - .../storage/framework/views/.gitignore | 2 - run/laravel/storage/logs/.gitignore | 2 - run/laravel/tests/CreatesApplication.php | 22 - run/laravel/tests/Feature/LandingPageTest.php | 15 - run/laravel/tests/Feature/ProductTest.php | 44 -- run/laravel/tests/TestCase.php | 10 - run/laravel/vite.config.js | 14 - 111 files changed, 1 insertion(+), 5249 deletions(-) delete mode 100644 appengine/flexible/drupal8/README.md delete mode 100644 appengine/flexible/drupal8/app.yaml delete mode 100644 appengine/flexible/drupal8/composer.json delete mode 100644 appengine/flexible/drupal8/phpunit.xml.dist delete mode 100644 appengine/flexible/drupal8/test/DeployTest.php delete mode 100644 appengine/flexible/laravel/README.md delete mode 100644 appengine/flexible/laravel/app-dbsessions.yaml delete mode 100644 appengine/flexible/laravel/app.yaml delete mode 100644 appengine/flexible/laravel/app/Exceptions/Handler.php delete mode 100644 appengine/flexible/laravel/app/Logging/CreateCustomLogger.php delete mode 100644 appengine/flexible/laravel/composer.json delete mode 100644 appengine/flexible/laravel/config/logging.php delete mode 100644 appengine/flexible/laravel/phpunit.xml.dist delete mode 100644 appengine/flexible/laravel/routes/web.php delete mode 100644 appengine/flexible/laravel/test/DeployDatabaseSessionTest.php delete mode 100644 appengine/flexible/laravel/test/DeployTest.php delete mode 100644 run/laravel/.env.example delete mode 100644 run/laravel/.gcloudignore delete mode 100644 run/laravel/.gitignore delete mode 100644 run/laravel/Procfile delete mode 100644 run/laravel/README.md delete mode 100644 run/laravel/app/Console/Kernel.php delete mode 100644 run/laravel/app/Exceptions/Handler.php delete mode 100644 run/laravel/app/Http/Controllers/Controller.php delete mode 100644 run/laravel/app/Http/Controllers/ProductController.php delete mode 100644 run/laravel/app/Http/Kernel.php delete mode 100644 run/laravel/app/Http/Middleware/Authenticate.php delete mode 100644 run/laravel/app/Http/Middleware/EncryptCookies.php delete mode 100644 run/laravel/app/Http/Middleware/PreventRequestsDuringMaintenance.php delete mode 100644 run/laravel/app/Http/Middleware/RedirectIfAuthenticated.php delete mode 100644 run/laravel/app/Http/Middleware/TrimStrings.php delete mode 100644 run/laravel/app/Http/Middleware/TrustHosts.php delete mode 100644 run/laravel/app/Http/Middleware/TrustProxies.php delete mode 100644 run/laravel/app/Http/Middleware/VerifyCsrfToken.php delete mode 100644 run/laravel/app/Models/Product.php delete mode 100644 run/laravel/app/Models/User.php delete mode 100644 run/laravel/app/Providers/AppServiceProvider.php delete mode 100644 run/laravel/app/Providers/AuthServiceProvider.php delete mode 100644 run/laravel/app/Providers/BroadcastServiceProvider.php delete mode 100644 run/laravel/app/Providers/EventServiceProvider.php delete mode 100644 run/laravel/app/Providers/RouteServiceProvider.php delete mode 100755 run/laravel/artisan delete mode 100644 run/laravel/bootstrap/app.php delete mode 100644 run/laravel/bootstrap/cache/.gitignore delete mode 100644 run/laravel/composer.json delete mode 100644 run/laravel/config/app.php delete mode 100644 run/laravel/config/auth.php delete mode 100644 run/laravel/config/broadcasting.php delete mode 100644 run/laravel/config/cache.php delete mode 100644 run/laravel/config/cors.php delete mode 100644 run/laravel/config/database.php delete mode 100644 run/laravel/config/filesystems.php delete mode 100644 run/laravel/config/hashing.php delete mode 100644 run/laravel/config/logging.php delete mode 100644 run/laravel/config/mail.php delete mode 100644 run/laravel/config/queue.php delete mode 100644 run/laravel/config/sanctum.php delete mode 100644 run/laravel/config/services.php delete mode 100644 run/laravel/config/session.php delete mode 100644 run/laravel/config/view.php delete mode 100644 run/laravel/database/.gitignore delete mode 100644 run/laravel/database/factories/ProductFactory.php delete mode 100644 run/laravel/database/factories/UserFactory.php delete mode 100644 run/laravel/database/migrations/2014_10_12_000000_create_users_table.php delete mode 100644 run/laravel/database/migrations/2014_10_12_100000_create_password_resets_table.php delete mode 100644 run/laravel/database/migrations/2019_08_19_000000_create_failed_jobs_table.php delete mode 100644 run/laravel/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php delete mode 100644 run/laravel/database/migrations/2022_07_01_000000_create_products_table.php delete mode 100644 run/laravel/database/seeders/DatabaseSeeder.php delete mode 100644 run/laravel/database/seeders/ProductSeeder.php delete mode 100644 run/laravel/index.php delete mode 100644 run/laravel/lang/en/auth.php delete mode 100644 run/laravel/lang/en/pagination.php delete mode 100644 run/laravel/lang/en/passwords.php delete mode 100644 run/laravel/lang/en/validation.php delete mode 100644 run/laravel/laravel-demo-screenshot.png delete mode 100644 run/laravel/package.json delete mode 100644 run/laravel/phpunit.xml delete mode 100644 run/laravel/public/.htaccess delete mode 100644 run/laravel/public/favicon.ico delete mode 100644 run/laravel/public/index.php delete mode 100644 run/laravel/public/robots.txt delete mode 100644 run/laravel/resources/css/app.css delete mode 100644 run/laravel/resources/js/app.js delete mode 100644 run/laravel/resources/js/bootstrap.js delete mode 100644 run/laravel/resources/views/products/create.blade.php delete mode 100644 run/laravel/resources/views/products/edit.blade.php delete mode 100644 run/laravel/resources/views/products/index.blade.php delete mode 100644 run/laravel/resources/views/products/layout.blade.php delete mode 100644 run/laravel/resources/views/products/show.blade.php delete mode 100644 run/laravel/resources/views/welcome.blade.php delete mode 100644 run/laravel/routes/api.php delete mode 100644 run/laravel/routes/channels.php delete mode 100644 run/laravel/routes/console.php delete mode 100644 run/laravel/routes/web.php delete mode 100644 run/laravel/storage/app/.gitignore delete mode 100644 run/laravel/storage/app/public/.gitignore delete mode 100644 run/laravel/storage/framework/.gitignore delete mode 100644 run/laravel/storage/framework/cache/.gitignore delete mode 100644 run/laravel/storage/framework/cache/data/.gitignore delete mode 100644 run/laravel/storage/framework/sessions/.gitignore delete mode 100644 run/laravel/storage/framework/testing/.gitignore delete mode 100644 run/laravel/storage/framework/views/.gitignore delete mode 100644 run/laravel/storage/logs/.gitignore delete mode 100644 run/laravel/tests/CreatesApplication.php delete mode 100644 run/laravel/tests/Feature/LandingPageTest.php delete mode 100644 run/laravel/tests/Feature/ProductTest.php delete mode 100644 run/laravel/tests/TestCase.php delete mode 100644 run/laravel/vite.config.js diff --git a/appengine/flexible/drupal8/README.md b/appengine/flexible/drupal8/README.md deleted file mode 100644 index f36a86861a..0000000000 --- a/appengine/flexible/drupal8/README.md +++ /dev/null @@ -1,95 +0,0 @@ -Drupal 8 on App Engine Flexible Environment -=========================================== - -## Overview - -This guide will help you deploy Drupal 8 on [App Engine Flexible][1] - -## Prerequisites - -Before setting up Drupal 8 on App Engine Flexible, you will need to complete the following: - - 1. Create a [Google Cloud Platform project][2]. Note your **Project ID**, as you will need it - later. - 1. Create a [Google Cloud SQL instance][3]. You will use this as your Drupal MySQL backend. - -## Install Drupal 8 - -### Download - -Use the [Drupal 8 Drush CLI][4] to install a drupal project. This can be installed locally -by running `composer install` in this directory: - -```sh -composer install -./vendor/bin/drush -``` - -Now you can run the command to download drupal: - -```sh -cd /path/to/drupal -/path/to/drush dl drupal -``` - -Alternatively, you can download a compressed file of Drupal 8 from the [Drupal Website][5]. - -### Installation - - 1. Set up your Drupal 8 instance using the web interface - ```sh - cd /path/to/drupal - php -S localhost:8080 - ``` - Open [http://localhost:8080](http://localhost:8080) in your browser after running these steps - - 1. You can also try setting up your Drupal 8 instance using [Drush][4] - ```sh - cd /path/to/drupal - /path/to/drush site-install \ - --locale=en \ - --db-path=mysql://user@pass:host/db_name \ - --site-name='My Drupal Site On Google' \ - --site-mail=you@example.com \ - --account-name admin \ - --account-mail you@example.com \ - --account-pass admin - ``` - -You will want to use the Cloud SQL credentials you created in the **Prerequisites** section as your -Drupal backend. - -## Add app.yaml - -Add a file `app.yaml` with the following contents to the root of your Drupal project: - -```yaml -runtime: php -env: flex -``` - -`app.yaml` is the App Engine configuration for your project. - -## Disable CSS and JS Cache - -For now, you need to disable the CSS and JS preprocessed caching that Drupal 8 enables by default. -To do this, go to `/admin/config/development/performance` and deselect the two -checkboxes (`Aggregate CSS files` and `Aggregate JS files`) under **Bandwidth Optimizations**. - -Alternatively, you can use [Drush][4] to change this config setting: - -```sh -# this command must be run inside the root directory of a drupal project -cd /path/to/drupal -/path/to/drush pm-enable config -y -/path/to/drush config-set system.performance css.preprocess 0 -/path/to/drush config-set system.performance js.preprocess 0 -``` - -This will change the values `preprocess` under `css` and `js` to `false`. - -[1]: https://cloud.google.com/appengine/docs/flexible/ -[2]: https://console.cloud.google.com -[3]: https://cloud.google.com/sql/docs/getting-started -[4]: http://docs.drush.org/en/master/install/ -[5]: https://www.drupal.org/8/download diff --git a/appengine/flexible/drupal8/app.yaml b/appengine/flexible/drupal8/app.yaml deleted file mode 100644 index 7ae9a2661c..0000000000 --- a/appengine/flexible/drupal8/app.yaml +++ /dev/null @@ -1,5 +0,0 @@ -runtime: php -env: flex - -runtime_config: - document_root: . diff --git a/appengine/flexible/drupal8/composer.json b/appengine/flexible/drupal8/composer.json deleted file mode 100644 index de9be9426d..0000000000 --- a/appengine/flexible/drupal8/composer.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "require": { - "drush/drush": "^10.0" - }, - "require-dev": { - "guzzlehttp/guzzle": "^6.3", - "monolog/monolog": "^1.19", - "symfony/console": " ^2.7", - "symfony/process": "^3.0", - "paragonie/random_compat": " ^9.0" - } -} diff --git a/appengine/flexible/drupal8/phpunit.xml.dist b/appengine/flexible/drupal8/phpunit.xml.dist deleted file mode 100644 index da7ad8da8e..0000000000 --- a/appengine/flexible/drupal8/phpunit.xml.dist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - test - test/DeployTest.php - - - - - ./web - - ./vendor - - - - diff --git a/appengine/flexible/drupal8/test/DeployTest.php b/appengine/flexible/drupal8/test/DeployTest.php deleted file mode 100644 index 73d113ab98..0000000000 --- a/appengine/flexible/drupal8/test/DeployTest.php +++ /dev/null @@ -1,126 +0,0 @@ -setDir($tmpDir); - } - - private static function verifyEnvironmentVariables() - { - $envVars = [ - 'GOOGLE_PROJECT_ID', - 'DRUPAL8_ADMIN_USERNAME', - 'DRUPAL8_ADMIN_PASSWORD', - 'DRUPAL8_DATABASE_HOST', - 'DRUPAL8_DATABASE_NAME', - 'DRUPAL8_DATABASE_USER', - 'DRUPAL8_DATABASE_PASS', - ]; - foreach ($envVars as $envVar) { - if (false === getenv($envVar)) { - self::markTestSkipped("Please set the {$envVar} environment variable"); - } - } - } - - private static function downloadAndInstallDrupal($targetDir) - { - $console = __DIR__ . '/../vendor/bin/drush'; - - $dbUrl = sprintf( - 'mysql://%s:%s@%s/%s', - getenv('DRUPAL8_DATABASE_USER'), - getenv('DRUPAL8_DATABASE_PASS'), - getenv('DRUPAL8_DATABASE_HOST'), - getenv('DRUPAL8_DATABASE_NAME') - ); - - // download - self::setWorkingDirectory(dirname($targetDir)); - $downloadCmd = sprintf( - '%s dl drupal --drupal-project-rename=%s', - $console, - basename($targetDir) - ); - self::execute($downloadCmd); - - // install - self::setWorkingDirectory($targetDir); - $installCmd = sprintf( - '%s site-install standard ' . - '--db-url=%s --account-name=%s --account-pass=%s -y', - $console, - $dbUrl, - getenv('DRUPAL8_ADMIN_USERNAME'), - getenv('DRUPAL8_ADMIN_PASSWORD') - ); - $process = self::createProcess($installCmd); - $process->setTimeout(null); - self::executeProcess($process); - - // this is to fix a PHP runtime bug - // @TODO - FIX THIS!! - self::execute('rm composer.*'); - - // move the code for the sample to the new drupal installation - $files = ['app.yaml']; - foreach ($files as $file) { - $source = sprintf('%s/../%s', __DIR__, $file); - $target = sprintf('%s/%s', $targetDir, $file); - copy($source, $target); - } - } - - public function testContacts() - { - // Access the blog top page - $resp = $this->client->get('/contact'); - $this->assertEquals( - '200', - $resp->getStatusCode(), - 'top page status code' - ); - $content = $resp->getBody()->getContents(); - $this->assertStringContainsString('Website feedback', $content); - $this->assertStringContainsString('Drupal', $content); - } -} diff --git a/appengine/flexible/laravel/README.md b/appengine/flexible/laravel/README.md deleted file mode 100644 index 79e327688d..0000000000 --- a/appengine/flexible/laravel/README.md +++ /dev/null @@ -1,7 +0,0 @@ -Laravel on App Engine Flexible Environment -========================================== - -**Code and tests for the Google Cloud Community article -[Run Laravel on Google App Engine Flexible Environment][5]** - -[5]: https://cloud.google.com/community/tutorials/run-laravel-on-appengine-flexible diff --git a/appengine/flexible/laravel/app-dbsessions.yaml b/appengine/flexible/laravel/app-dbsessions.yaml deleted file mode 100644 index 7c54770c24..0000000000 --- a/appengine/flexible/laravel/app-dbsessions.yaml +++ /dev/null @@ -1,29 +0,0 @@ -runtime: php -env: flex - -runtime_config: - document_root: public - -# Ensure we skip ".env", which is only for local development -skip_files: - - .env - -env_variables: - # Put production environment variables here. - APP_LOG: errorlog - APP_KEY: YOUR_APP_KEY - STORAGE_DIR: /tmp - CACHE_DRIVER: database - SESSION_DRIVER: database - ## Set these environment variables according to your CloudSQL configuration. - DB_HOST: localhost - DB_DATABASE: YOUR_DB_DATABASE - DB_USERNAME: YOUR_DB_USERNAME - DB_PASSWORD: YOUR_DB_PASSWORD - DB_SOCKET: "/cloudsql/YOUR_CLOUDSQL_CONNECTION_NAME" - -beta_settings: - # for Cloud SQL, uncomment and set this value to the Cloud SQL - # connection name, e.g. - # "project:region:cloudsql-instance" - cloud_sql_instances: "YOUR_CLOUDSQL_CONNECTION_NAME" diff --git a/appengine/flexible/laravel/app.yaml b/appengine/flexible/laravel/app.yaml deleted file mode 100644 index 8cb5301c90..0000000000 --- a/appengine/flexible/laravel/app.yaml +++ /dev/null @@ -1,15 +0,0 @@ -runtime: php -env: flex - -runtime_config: - document_root: public - enable_stackdriver_integration: true - -# Ensure we skip ".env", which is only for local development -skip_files: - - .env - -env_variables: - # Put production environment variables here. - LOG_CHANNEL: stackdriver - APP_KEY: YOUR_APP_KEY diff --git a/appengine/flexible/laravel/app/Exceptions/Handler.php b/appengine/flexible/laravel/app/Exceptions/Handler.php deleted file mode 100644 index 283cfd1f97..0000000000 --- a/appengine/flexible/laravel/app/Exceptions/Handler.php +++ /dev/null @@ -1,60 +0,0 @@ - env('LOG_CHANNEL', 'stack'), - - /* - |-------------------------------------------------------------------------- - | Log Channels - |-------------------------------------------------------------------------- - | - | Here you may configure the log channels for your application. Out of - | the box, Laravel uses the Monolog PHP logging library. This gives - | you a variety of powerful log handlers / formatters to utilize. - | - | Available Drivers: "single", "daily", "slack", "syslog", - | "errorlog", "custom", "stack" - | - */ - - 'channels' => [ - 'stack' => [ - 'driver' => 'stack', - 'channels' => ['single'], - ], - - 'single' => [ - 'driver' => 'single', - 'path' => storage_path('logs/laravel.log'), - 'level' => 'debug', - ], - - 'daily' => [ - 'driver' => 'daily', - 'path' => storage_path('logs/laravel.log'), - 'level' => 'debug', - 'days' => 7, - ], - - 'slack' => [ - 'driver' => 'slack', - 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => 'Laravel Log', - 'emoji' => ':boom:', - 'level' => 'critical', - ], - - 'syslog' => [ - 'driver' => 'syslog', - 'level' => 'debug', - ], - - 'errorlog' => [ - 'driver' => 'errorlog', - 'level' => 'debug', - ], - 'stackdriver' => [ - 'driver' => 'custom', - 'via' => App\Logging\CreateCustomLogger::class, - 'level' => 'debug', - ], - - ], - -]; diff --git a/appengine/flexible/laravel/phpunit.xml.dist b/appengine/flexible/laravel/phpunit.xml.dist deleted file mode 100644 index 74216aad61..0000000000 --- a/appengine/flexible/laravel/phpunit.xml.dist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - test - test/DeployTest.php - - - - - ./src - - ./vendor - - - - diff --git a/appengine/flexible/laravel/routes/web.php b/appengine/flexible/laravel/routes/web.php deleted file mode 100644 index 9e6d128db9..0000000000 --- a/appengine/flexible/laravel/routes/web.php +++ /dev/null @@ -1,25 +0,0 @@ -setDir($tmpDir); - chdir($tmpDir); - } - - private static function verifyEnvironmentVariables() - { - $envVars = [ - 'LARAVEL_CLOUDSQL_CONNECTION_NAME', - 'LARAVEL_DB_DATABASE', - 'LARAVEL_DB_USERNAME', - 'LARAVEL_DB_PASSWORD', - ]; - foreach ($envVars as $envVar) { - if (false === getenv($envVar)) { - self::fail("Please set the {$envVar} environment variable"); - } - } - } - - private static function createLaravelProject($targetDir) - { - // install - $laravelPackage = 'laravel/laravel'; - $cmd = sprintf('composer create-project --no-scripts %s %s', $laravelPackage, $targetDir); - $process = self::createProcess($cmd); - $process->setTimeout(300); // 5 minutes - self::executeProcess($process); - - // copy and set the proper env vars in app.yaml - $appYaml = str_replace([ - 'YOUR_APP_KEY', - 'YOUR_CLOUDSQL_CONNECTION_NAME', - 'YOUR_DB_DATABASE', - 'YOUR_DB_USERNAME', - 'YOUR_DB_PASSWORD', - ], [ - self::execute('php artisan key:generate --show --no-ansi'), - getenv('LARAVEL_CLOUDSQL_CONNECTION_NAME'), - getenv('LARAVEL_DB_DATABASE'), - getenv('LARAVEL_DB_USERNAME'), - getenv('LARAVEL_DB_PASSWORD'), - ], file_get_contents(__DIR__ . '/../app-dbsessions.yaml')); - file_put_contents($targetDir . '/app.yaml', $appYaml); - } - - private static function addPostDeployCommands($targetDir) - { - $contents = file_get_contents($targetDir . '/composer.json'); - $json = json_decode($contents, true); - $json['scripts']['post-install-cmd'] = [ - 'chmod -R 755 bootstrap\/cache', - 'php artisan cache:clear', - ]; - $newContents = json_encode($json, JSON_PRETTY_PRINT); - file_put_contents($targetDir . '/composer.json', $newContents); - } - - public function testHomepage() - { - // Access the blog top page - $resp = $this->client->get('/'); - $this->assertEquals( - '200', - $resp->getStatusCode(), - 'top page status code' - ); - $content = $resp->getBody()->getContents(); - $this->assertStringContainsString('Laravel', $content); - } -} diff --git a/appengine/flexible/laravel/test/DeployTest.php b/appengine/flexible/laravel/test/DeployTest.php deleted file mode 100644 index 2386bf380d..0000000000 --- a/appengine/flexible/laravel/test/DeployTest.php +++ /dev/null @@ -1,188 +0,0 @@ -setDir($tmpDir); - chdir($tmpDir); - } - - private static function createLaravelProject($targetDir) - { - // install - $laravelPackage = 'laravel/laravel'; - $cmd = sprintf('composer create-project --no-scripts %s %s', $laravelPackage, $targetDir); - $process = self::createProcess($cmd); - $process->setTimeout(300); // 5 minutes - self::executeProcess($process); - // add cloud libraries - $cmd = sprintf( - 'composer --working-dir=%s require google/cloud-logging ' - . 'google/cloud-error-reporting', - $targetDir - ); - $process = self::createProcess($cmd); - $process->setTimeout(300); // 5 minutes - self::executeProcess($process); - - // copy in the app.yaml and add the app key. - $appYaml = str_replace([ - 'YOUR_APP_KEY', - ], [ - self::execute('php artisan key:generate --show --no-ansi'), - ], file_get_contents(__DIR__ . '/../app.yaml')); - file_put_contents($targetDir . '/app.yaml', $appYaml); - // move the code for the sample to the new laravel installation - mkdir("$targetDir/app/Logging", 0700, true); - $files = [ - 'routes/web.php', - 'config/logging.php', - 'app/Exceptions/Handler.php', - 'app/Logging/CreateCustomLogger.php', - ]; - foreach ($files as $file) { - $source = sprintf('%s/../%s', __DIR__, $file); - $target = sprintf('%s/%s', $targetDir, $file); - copy($source, $target); - } - } - - private static function addPostDeployCommands($targetDir) - { - $contents = file_get_contents($targetDir . '/composer.json'); - $json = json_decode($contents, true); - $json['scripts']['post-install-cmd'] = [ - 'php artisan cache:clear', - ]; - $newContents = json_encode($json, JSON_PRETTY_PRINT); - file_put_contents($targetDir . '/composer.json', $newContents); - } - - public function testHomepage() - { - // Access the blog top page - $resp = $this->client->get('/'); - $this->assertEquals( - '200', - $resp->getStatusCode(), - 'top page status code' - ); - $content = $resp->getBody()->getContents(); - $this->assertStringContainsString('Laravel', $content); - } - - public function testNormalLog() - { - // Access a page erroring with 500 - $token = uniqid(); - // The routes are defined in routes/web.php - $path = "/log/$token"; - $resp = $this->client->request('GET', $path, ['http_errors' => false]); - $this->assertEquals( - '200', - $resp->getStatusCode(), - 'log page status code' - ); - $logging = new LoggingClient( - ['projectId' => getenv('GOOGLE_PROJECT_ID')] - ); - // 'app' is the default logname of our Stackdriver Logging - // integration. - $logger = $logging->logger('app'); - - $this->runEventuallyConsistentTest( - function () use ($logger, $token) { - $logs = $logger->entries([ - 'pageSize' => 100, - 'orderBy' => 'timestamp desc', - 'resultLimit' => 100 - ]); - $found = false; - foreach ($logs as $log) { - $info = $log->info(); - if (strpos("token: $token", $info['jsonPayload']['message']) !== 0) { - $found = true; - } - } - $this->assertTrue($found, 'The log entry was not found'); - }); - } - - public function testErrorLog() - { - // Access a page erroring with 500 - $token = uniqid(); - // The routes are defined in routes/web.php - $path = "/exception/$token"; - $resp = $this->client->request('GET', $path, ['http_errors' => false]); - $this->assertEquals( - '500', - $resp->getStatusCode(), - 'exception page status code' - ); - $logging = new LoggingClient( - ['projectId' => getenv('GOOGLE_PROJECT_ID')] - ); - // 'app-error' is the default logname of our Stackdriver Error - // Reporting integration. - $logger = $logging->logger('app-error'); - - $this->runEventuallyConsistentTest( - function () use ($logger, $token) { - $logs = $logger->entries([ - 'pageSize' => 100, - 'orderBy' => 'timestamp desc', - 'resultLimit' => 100 - ]); - $found = false; - foreach ($logs as $log) { - $info = $log->info(); - if (strpos("token: $token", $info['jsonPayload']['message']) !== 0) { - $found = true; - } - } - $this->assertTrue($found, 'The log entry was not found'); - }); - } -} diff --git a/renovate.json b/renovate.json index d99aa921b9..eb5971a17f 100644 --- a/renovate.json +++ b/renovate.json @@ -20,8 +20,7 @@ } ], "ignorePaths": [ - "appengine/flexible/", - "run/laravel/" + "appengine/flexible/" ], "branchPrefix": "renovate/", "additionalBranchPrefix": "{{parentDir}}-", diff --git a/run/README.md b/run/README.md index ed7e5fea4d..91b40177c2 100644 --- a/run/README.md +++ b/run/README.md @@ -9,7 +9,6 @@ | Sample | Description | Deploy | | --------------------------------------- | ------------------------ | ------------- | |[Hello World][helloworld] | Quickstart | [Run on Google Cloud][run_button_helloworld] | -|[Laravel][laravel] | Deploy Laravel on Cloud Run | -| |[Multi-container][multicontainer] | Multi-container samples (i.e nginx) | -| @@ -90,6 +89,5 @@ for more information. [run_build]: https://cloud.google.com/run/docs/building/containers [run_deploy]: https://cloud.google.com/run/docs/deploying [helloworld]: helloworld/ -[laravel]: laravel/ [multicontainer]: multi-container/ [run_button_helloworld]: https://deploy.cloud.run/?dir=run/helloworld diff --git a/run/laravel/.env.example b/run/laravel/.env.example deleted file mode 100644 index f6053d67aa..0000000000 --- a/run/laravel/.env.example +++ /dev/null @@ -1,22 +0,0 @@ -APP_NAME=MyApp -APP_ENV=local - -# this value will be generated -APP_KEY= - - -# Logging -LOG_CHANNEL=syslog -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -# Database -DB_CONNECTION=mysql -DB_SOCKET=/cloudsql/PROJECT_ID:REGION:INSTANCE -DB_DATABASE= -DB_USERNAME= -DB_PASSWORD= - -# Static (generate ASSET_URL from the bucket name) -ASSET_BUCKET=BUCKET_NAME -ASSET_URL=https://storage.googleapis.com/${ASSET_BUCKET} diff --git a/run/laravel/.gcloudignore b/run/laravel/.gcloudignore deleted file mode 100644 index 3ad0e6396c..0000000000 --- a/run/laravel/.gcloudignore +++ /dev/null @@ -1,2 +0,0 @@ -#!include:.gitignore -.git \ No newline at end of file diff --git a/run/laravel/.gitignore b/run/laravel/.gitignore deleted file mode 100644 index 258becb5cc..0000000000 --- a/run/laravel/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -/node_modules -/public/build -/public/hot -/public/storage -/storage/*.key -/vendor -.env -.env.backup -.phpunit.result.cache -Homestead.json -Homestead.yaml -auth.json -npm-debug.log -yarn-error.log -/.idea -/.vscode -package.lock diff --git a/run/laravel/Procfile b/run/laravel/Procfile deleted file mode 100644 index 12ee0a43ab..0000000000 --- a/run/laravel/Procfile +++ /dev/null @@ -1,3 +0,0 @@ -web: pid1 --nginxBinaryPath nginx --nginxConfigPath /layers/google.php.webconfig/webconfig/nginx.conf --serverConfigPath /layers/google.php.webconfig/webconfig/nginxserver.conf --nginxErrLogFilePath /var/log/nginx.log --customAppCmd "php-fpm -R --nodaemonize --fpm-config /layers/google.php.webconfig/webconfig/php-fpm.conf" --pid1LogFilePath /var/log/pid1.log --mimeTypesPath /layers/google.utils.nginx/nginx/conf/mime.types --customAppSocket /layers/google.php.webconfig/webconfig/app.sock -migrate: php artisan migrate -static: npm run update-static \ No newline at end of file diff --git a/run/laravel/README.md b/run/laravel/README.md deleted file mode 100644 index 214fc80030..0000000000 --- a/run/laravel/README.md +++ /dev/null @@ -1,360 +0,0 @@ -# Laravel on Cloud Run - -This sample shows you how to deploy Laravel on Cloud Run, connecting to a Cloud SQL database, and using Secret Manager for credential management. - -The deployed example will be a simple CRUD application listing products, and a customised Laravel welcome page showing the deployment information. - -![Laravel Demo Screenshot](laravel-demo-screenshot.png) - - -## Objectives - -In this tutorial, you will: - -* Create and connect a Cloud SQL database. -* Create and use Secret Manager secret values. -* Deploy a Laravel app to Cloud Run. -* Host static files on Cloud Storage. -* Use Cloud Build to automate deployment. -* Use Cloud Run Jobs to apply database migrations. - -## Costs - -This tutorial uses the following billable components of Google Cloud: - -* Cloud SQL -* Cloud Storage -* Cloud Run -* Cloud Build -* Artifact Registry -* Secret Manager - - -## Prerequisites - -* Create a [Google Cloud project](https://cloud.google.com/resource-manager/docs/creating-managing-projects) -* Ensure [Billing](https://cloud.google.com/billing/docs/how-to/verify-billing-enabled) is enabled. -* [Install](https://cloud.google.com/sdk/docs/install) and [initialize](https://cloud.google.com/sdk/docs/initializing) the Google Cloud CLI - * You can run the gcloud CLI in the Google Cloud console without installing the Google Cloud CLI. To run the gcloud CLI in the Google Cloud console, use [Cloud Shell](https://console.cloud.google.com/home/dashboard?cloudshell=true). -* [Enable the required APIs](https://console.cloud.google.com/flows/enableapi?apiid=run.googleapis.com,sql-component.googleapis.com,sqladmin.googleapis.com,compute.googleapis.com,cloudbuild.googleapis.com,secretmanager.googleapis.com,artifactregistry.googleapis.com) - ```bash - gcloud services enable \ - run.googleapis.com \ - sql-component.googleapis.com \ - sqladmin.googleapis.com \ - compute.googleapis.com \ - cloudbuild.googleapis.com \ - secretmanager.googleapis.com \ - artifactregistry.googleapis.com - ``` -* Ensure sufficient permissions are available to the account used for this tutorial - * Note: In cases where the [Owner](https://cloud.google.com/iam/docs/understanding-roles#basic) permissions role cannot be used, the following minimum roles are required to complete the tutorial: Cloud SQL Admin, Storage Admin, Cloud Run Admin, and Secret Manager Admin. - -## Prepare your environment - -* Clone a copy of the code into your local machine; - - ```bash - git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git - cd php-docs-samples/run/laravel/ - ``` - -## Confirm your PHP setup - -You will need PHP on your local system in order to run `php artisan` commands later. - -* Check you have PHP 8.1 or higher installed (or [install it](https://www.php.net/manual/en/install.php)): - - ```bash - php --version - ``` - -* Check you have `composer` installed (or [install it](https://getcomposer.org/download/)): - - ```bash - composer --version - ``` - -* Install the PHP dependencies: - - ```bash - composer install - ``` - -## Confirm your Node setup - -You will need Node on your local system in order to generate static assets later. - -* Check you have node and npm installed (or [install them](https://cloud.google.com/nodejs/docs/setup)): - - ```bash - node --version - npm --version - ``` - - -* Install the Node dependencies: - - ```bash - npm install - ``` - - -## Preparing backing services - -There are many variables in this tutorial. Set these early to help with copying code snippets: - -``` -export PROJECT_ID=$(gcloud config get-value project) -export PROJECTNUM=$(gcloud projects describe ${PROJECT_ID} --format='value(projectNumber)') -export REGION=us-central1 -export INSTANCE_NAME=myinstance -export DATABASE_NAME=mydatabase -export DATABASE_USERNAME=myuser -export DATABASE_PASSWORD=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 30 | head -n1) -export ASSET_BUCKET=${PROJECT_ID}-static -``` - -### Cloud SQL - -* Create a MySQL instance: - - ```bash - gcloud sql instances create ${INSTANCE_NAME} \ - --project ${PROJECT_ID} \ - --database-version MYSQL_8_0 \ - --tier db-f1-micro \ - --region ${REGION} - ``` - - Note: if this operation takes longer than 10 minutes to complete, run the suggested `gcloud beta sql operations wait` command to track ongoing progress. - -* Create a database in that MySQL instance: - - ```bash - gcloud sql databases create ${DATABASE_NAME} \ - --instance ${INSTANCE_NAME} - ``` - -* Create a user for the database: - - ```bash - gcloud sql users create ${DATABASE_USERNAME} \ - --instance ${INSTANCE_NAME} \ - --password ${DATABASE_PASSWORD} - ``` - -### Setup Cloud Storage - - -* Create a Cloud Storage bucket: - - ```bash - gcloud storage buckets create gs://${ASSET_BUCKET} - ``` - -### Setup Artifact Registry - -* Create an Artifact Registry: - - ```bash - gcloud artifacts repositories create containers \ - --repository-format=docker \ - --location=${REGION} - ``` - -* Determine the registry name for future operations: - - ```bash - export REGISTRY_NAME=${REGION}-docker.pkg.dev/${PROJECT_ID}/containers - ``` - -### Configuring the Laravel Application - - -* Copy the `.env.example` file into `.env` - ```bash - cp .env.example .env - ``` - -* Update the values in `.env` with your values. - - ⚠️ Replace `${}` with your values, don't use the literals. Get these values with e.g. `echo ${DATABASE_NAME}` - - * DB_CONNECTION: `mysql` - * DB_SOCKET: `/cloudsql/${PROJECT_ID}:${REGION}:${INSTANCE_NAME}` - * DB_DATABASE: `${DATABASE_NAME}` - * DB_USERNAME: `${DATABASE_USERNAME}` - * DB_PASSWORD: `${DATABASE_PASSWORD}` - * ASSET_BUCKET: `${ASSET_BUCKET}` - - Note: `ASSET_URL` is generated from `ASSET_BUCKET` and doesn't need to be hardcoded. - -* Update the `APP_KEY` by generating a new key: - ```bash - php artisan key:generate - ``` -* Confirm the `APP_KEY` value in `.env` has been updated. - - -### Store secret values in Secret Manager - -* Create a secret with the value of your `.env` file: - - ```bash - gcloud secrets create laravel_settings --data-file .env - ``` - -### Configure access to the secret - -* Allow Cloud Run access to the secret: - - ```bash - gcloud secrets add-iam-policy-binding laravel_settings \ - --member serviceAccount:${PROJECTNUM}-compute@developer.gserviceaccount.com \ - --role roles/secretmanager.secretAccessor - ``` - -## Build, Migrate, and Deploy - -### Build the app into a container - -* Using Cloud Build and Google Cloud Buildpacks, create the container image: - - ```bash - gcloud builds submit \ - --pack image=${REGISTRY_NAME}/laravel - ``` - -### Applying database migrations - -With Cloud Run Jobs, you can use the same container from your service to perform administration tasks, such as database migrations. - -The configuration is similar to the deployment to Cloud Run, requiring the database and secret values. - -1. Create a Cloud Run job to apply database migrations: - - ``` - gcloud run jobs create migrate \ - --image=${REGISTRY_NAME}/laravel \ - --region=${REGION} \ - --set-cloudsql-instances ${PROJECT_ID}:${REGION}:${INSTANCE_NAME} \ - --set-secrets /config/.env=laravel_settings:latest \ - --command launcher \ - --args "php artisan migrate" - ``` - -1. Execute the job: - - ``` - gcloud run jobs execute migrate --region ${REGION} --wait - ``` - -* Confirm the application of database migrations by clicking the "See logs for this execution" link. - - * You should see "INFO Running migrations." with multiple items labelled "DONE". - * You should also see "Container called exit(0).", where `0` is the exit code for success. - -### Upload static assets - -Using the custom `npm` command, you can use `vite` to compile and `gcloud storage` to copy the assets from your application to Cloud Storage. - -* Upload static assets: - - ```bash - npm run update-static - ``` - - This command uses the `update-static` script in `package.json`. - -* Confirm the output of this operation - - * You should see vite returning "N modules transformed", and gcloud storage returning "Operation completed over N objects" - -### Deploy the service to Cloud Run - -1. Deploy the service from the previously created image, specifying the database connection and secret configuration: - - ```bash - gcloud run deploy laravel \ - --image ${REGISTRY_NAME}/laravel \ - --region $REGION \ - --set-cloudsql-instances ${PROJECT_ID}:${REGION}:${INSTANCE_NAME} \ - --set-secrets /config/.env=laravel_settings:latest \ - --allow-unauthenticated - ``` - -### Confirm deployment success - -1. Go to the Service URL to view the website. - -1. Confirm the information in the lower right of the Laravel welcome screen. - - * You should see a variation of "Laravel v9... (PHP v8...)" (the exact version of Laravel and PHP may change) - * You should see the a variation of "Service: laravel. Revision laravel-00001-vid." (the revision name ends in three random characters, which will differ for every deployment) - * You should see "Project: (your project). Region (your region)." - -1. Click on the "demo products" link, and create some entries. - - * You should be able to see a styled page, confirming static assets are being served. -You should be able to write entries to the database, and read them back again, confirming database connectivity. - -## Updating the application - -While the initial provisioning and deployment steps were complex, making updates is a simpler process. - -To make changes: build the container (to capture any new application changes), then update the service to use this new container image: - - ```bash - gcloud builds submit \ - --pack image=${REGISTRY_NAME}/laravel - ``` - -To apply application code changes, update the Cloud Run service with this new container: - - ```bash - gcloud run services update laravel \ - --image ${REGISTRY_NAME}/laravel \ - --region ${REGION} - ``` - - Note: you do not have to re-assert the database or secret settings on future deployments, unless you want to change these values. - -To apply database migrations, run the Cloud Run job using the newly built container: - - ```bash - gcloud run jobs execute migrate --region ${REGION} - ``` - - Note: To generate new migrations to apply, you will need to run `php artisan make:migration` in a local development environment. - -To update static assets, run the custom npm command from earlier: - - ```bash - npm run update-static - ``` - - -## Understanding the Code - -### Database migrations - -This tutorial opts to use Cloud Run Jobs to process database applications in an environment where connections to Cloud SQL can be done in a safe and secure manner. - -This operation could be done on the user's local machine, which would require the installation and use of [Cloud SQL Auth Proxy](https://cloud.google.com/sql/docs/mysql/sql-proxy). Using Cloud Run Jobs removes that complexity. - -### Static compilation - -This tutorial opts to use the user's local machine for compiling and uploading static assets. While this could be done in Cloud Run Jobs, this would require building a container with both PHP and NodeJS runtimes. Because NodeJS isn't required for running the service, this isn't required to be in the container. - -### Secrets access - -`bootstrap/app.php` includes code to load the mounted secrets, if the folder has been mounted. This relates to the `--set-secrets` command used earlier. (Look for the `cloudrun_laravel_secret_manager_mount` tag.) - -### Environment information - -`routes/web.php` includes code to retrieve the service and revision information from Cloud Run environment variable, and from the\ Cloud Run metadata service (Look for the `cloudrun_laravel_get_metadata` tag.) - -## Learn more - -* [Getting started with PHP on Google Cloud](https://cloud.google.com/php/getting-started) diff --git a/run/laravel/app/Console/Kernel.php b/run/laravel/app/Console/Kernel.php deleted file mode 100644 index e1d9417be4..0000000000 --- a/run/laravel/app/Console/Kernel.php +++ /dev/null @@ -1,32 +0,0 @@ -command('inspire')->hourly(); - } - - /** - * Register the commands for the application. - * - * @return void - */ - protected function commands() - { - $this->load(__DIR__ . '/Commands'); - - require base_path('routes/console.php'); - } -} diff --git a/run/laravel/app/Exceptions/Handler.php b/run/laravel/app/Exceptions/Handler.php deleted file mode 100644 index 82a37e4008..0000000000 --- a/run/laravel/app/Exceptions/Handler.php +++ /dev/null @@ -1,50 +0,0 @@ -, \Psr\Log\LogLevel::*> - */ - protected $levels = [ - // - ]; - - /** - * A list of the exception types that are not reported. - * - * @var array> - */ - protected $dontReport = [ - // - ]; - - /** - * A list of the inputs that are never flashed to the session on validation exceptions. - * - * @var array - */ - protected $dontFlash = [ - 'current_password', - 'password', - 'password_confirmation', - ]; - - /** - * Register the exception handling callbacks for the application. - * - * @return void - */ - public function register() - { - $this->reportable(function (Throwable $e) { - // - }); - } -} diff --git a/run/laravel/app/Http/Controllers/Controller.php b/run/laravel/app/Http/Controllers/Controller.php deleted file mode 100644 index ce1176ddb2..0000000000 --- a/run/laravel/app/Http/Controllers/Controller.php +++ /dev/null @@ -1,15 +0,0 @@ -paginate(5); - - return view('products.index', compact('products')) - ->with('i', (request()->input('page', 1) - 1) * 5); - } - - /** - * Show the form for creating a new resource. - * - * @return \Illuminate\Http\Response - */ - public function create() - { - return view('products.create'); - } - - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) - { - $request->validate([ - 'name' => 'required', - 'description' => 'required', - ]); - - $product = Product::create($request->all()); - - return redirect()->route('products.index') - ->with('success', 'Product "' . $product->name . '" created successfully.'); - } - - /** - * Display the specified resource. - * - * @param \App\Models\Product $product - * @return \Illuminate\Http\Response - */ - public function show(Product $product) - { - return view('products.show', compact('product')); - } - - /** - * Show the form for editing the specified resource. - * - * @param \App\Models\Product $product - * @return \Illuminate\Http\Response - */ - public function edit(Product $product) - { - return view('products.edit', compact('product')); - } - - /** - * Update the specified resource in storage. - * - * @param \Illuminate\Http\Request $request - * @param \App\Models\Product $product - * @return \Illuminate\Http\Response - */ - public function update(Request $request, Product $product) - { - $request->validate([ - 'name' => 'required', - 'description' => 'required', - ]); - - $product->update($request->all()); - - return redirect()->route('products.index') - ->with('success', 'Product "' . $product->name . '" updated.'); - } - /** - * Remove the specified resource from storage. - * - * @param \App\Models\Product $product - * @return \Illuminate\Http\Response - */ - public function destroy(Product $product) - { - $product->delete(); - - return redirect()->route('products.index') - ->with('success', 'Product "' . $product->name . '" deleted.'); - } -} diff --git a/run/laravel/app/Http/Kernel.php b/run/laravel/app/Http/Kernel.php deleted file mode 100644 index c3be2544bd..0000000000 --- a/run/laravel/app/Http/Kernel.php +++ /dev/null @@ -1,67 +0,0 @@ - - */ - protected $middleware = [ - // \App\Http\Middleware\TrustHosts::class, - \App\Http\Middleware\TrustProxies::class, - \Illuminate\Http\Middleware\HandleCors::class, - \App\Http\Middleware\PreventRequestsDuringMaintenance::class, - \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, - \App\Http\Middleware\TrimStrings::class, - \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, - ]; - - /** - * The application's route middleware groups. - * - * @var array> - */ - protected $middlewareGroups = [ - 'web' => [ - \App\Http\Middleware\EncryptCookies::class, - \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, - \Illuminate\Session\Middleware\StartSession::class, - \Illuminate\View\Middleware\ShareErrorsFromSession::class, - \App\Http\Middleware\VerifyCsrfToken::class, - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - - 'api' => [ - // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, - 'throttle:api', - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - ]; - - /** - * The application's route middleware. - * - * These middleware may be assigned to groups or used individually. - * - * @var array - */ - protected $routeMiddleware = [ - 'auth' => \App\Http\Middleware\Authenticate::class, - 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, - 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, - 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, - 'can' => \Illuminate\Auth\Middleware\Authorize::class, - 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, - 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, - 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, - 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, - ]; -} diff --git a/run/laravel/app/Http/Middleware/Authenticate.php b/run/laravel/app/Http/Middleware/Authenticate.php deleted file mode 100644 index 704089a7fe..0000000000 --- a/run/laravel/app/Http/Middleware/Authenticate.php +++ /dev/null @@ -1,21 +0,0 @@ -expectsJson()) { - return route('login'); - } - } -} diff --git a/run/laravel/app/Http/Middleware/EncryptCookies.php b/run/laravel/app/Http/Middleware/EncryptCookies.php deleted file mode 100644 index 867695bdcf..0000000000 --- a/run/laravel/app/Http/Middleware/EncryptCookies.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ - protected $except = [ - // - ]; -} diff --git a/run/laravel/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/run/laravel/app/Http/Middleware/PreventRequestsDuringMaintenance.php deleted file mode 100644 index 74cbd9a9ea..0000000000 --- a/run/laravel/app/Http/Middleware/PreventRequestsDuringMaintenance.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ - protected $except = [ - // - ]; -} diff --git a/run/laravel/app/Http/Middleware/RedirectIfAuthenticated.php b/run/laravel/app/Http/Middleware/RedirectIfAuthenticated.php deleted file mode 100644 index a2813a0648..0000000000 --- a/run/laravel/app/Http/Middleware/RedirectIfAuthenticated.php +++ /dev/null @@ -1,32 +0,0 @@ -check()) { - return redirect(RouteServiceProvider::HOME); - } - } - - return $next($request); - } -} diff --git a/run/laravel/app/Http/Middleware/TrimStrings.php b/run/laravel/app/Http/Middleware/TrimStrings.php deleted file mode 100644 index 88cadcaaf2..0000000000 --- a/run/laravel/app/Http/Middleware/TrimStrings.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ - protected $except = [ - 'current_password', - 'password', - 'password_confirmation', - ]; -} diff --git a/run/laravel/app/Http/Middleware/TrustHosts.php b/run/laravel/app/Http/Middleware/TrustHosts.php deleted file mode 100644 index 7186414c65..0000000000 --- a/run/laravel/app/Http/Middleware/TrustHosts.php +++ /dev/null @@ -1,20 +0,0 @@ - - */ - public function hosts() - { - return [ - $this->allSubdomainsOfApplicationUrl(), - ]; - } -} diff --git a/run/laravel/app/Http/Middleware/TrustProxies.php b/run/laravel/app/Http/Middleware/TrustProxies.php deleted file mode 100644 index 3391630ecc..0000000000 --- a/run/laravel/app/Http/Middleware/TrustProxies.php +++ /dev/null @@ -1,28 +0,0 @@ -|string|null - */ - protected $proxies; - - /** - * The headers that should be used to detect proxies. - * - * @var int - */ - protected $headers = - Request::HEADER_X_FORWARDED_FOR | - Request::HEADER_X_FORWARDED_HOST | - Request::HEADER_X_FORWARDED_PORT | - Request::HEADER_X_FORWARDED_PROTO | - Request::HEADER_X_FORWARDED_AWS_ELB; -} diff --git a/run/laravel/app/Http/Middleware/VerifyCsrfToken.php b/run/laravel/app/Http/Middleware/VerifyCsrfToken.php deleted file mode 100644 index 9e86521722..0000000000 --- a/run/laravel/app/Http/Middleware/VerifyCsrfToken.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ - protected $except = [ - // - ]; -} diff --git a/run/laravel/app/Models/Product.php b/run/laravel/app/Models/Product.php deleted file mode 100644 index 1bd2675fae..0000000000 --- a/run/laravel/app/Models/Product.php +++ /dev/null @@ -1,15 +0,0 @@ - - */ - protected $fillable = [ - 'name', - 'email', - 'password', - ]; - - /** - * The attributes that should be hidden for serialization. - * - * @var array - */ - protected $hidden = [ - 'password', - 'remember_token', - ]; - - /** - * The attributes that should be cast. - * - * @var array - */ - protected $casts = [ - 'email_verified_at' => 'datetime', - ]; -} diff --git a/run/laravel/app/Providers/AppServiceProvider.php b/run/laravel/app/Providers/AppServiceProvider.php deleted file mode 100644 index b5a6523ede..0000000000 --- a/run/laravel/app/Providers/AppServiceProvider.php +++ /dev/null @@ -1,30 +0,0 @@ - - */ - protected $policies = [ - // 'App\Models\Model' => 'App\Policies\ModelPolicy', - ]; - - /** - * Register any authentication / authorization services. - * - * @return void - */ - public function boot() - { - $this->registerPolicies(); - - // - } -} diff --git a/run/laravel/app/Providers/BroadcastServiceProvider.php b/run/laravel/app/Providers/BroadcastServiceProvider.php deleted file mode 100644 index 395c518bc4..0000000000 --- a/run/laravel/app/Providers/BroadcastServiceProvider.php +++ /dev/null @@ -1,21 +0,0 @@ -> - */ - protected $listen = [ - Registered::class => [ - SendEmailVerificationNotification::class, - ], - ]; - - /** - * Register any events for your application. - * - * @return void - */ - public function boot() - { - // - } - - /** - * Determine if events and listeners should be automatically discovered. - * - * @return bool - */ - public function shouldDiscoverEvents() - { - return false; - } -} diff --git a/run/laravel/app/Providers/RouteServiceProvider.php b/run/laravel/app/Providers/RouteServiceProvider.php deleted file mode 100644 index 7ebb560cbb..0000000000 --- a/run/laravel/app/Providers/RouteServiceProvider.php +++ /dev/null @@ -1,52 +0,0 @@ -configureRateLimiting(); - - $this->routes(function () { - Route::middleware('api') - ->prefix('api') - ->group(base_path('routes/api.php')); - - Route::middleware('web') - ->group(base_path('routes/web.php')); - }); - } - - /** - * Configure the rate limiters for the application. - * - * @return void - */ - protected function configureRateLimiting() - { - RateLimiter::for('api', function (Request $request) { - return Limit::perMinute(60)->by($request->user()->id ?? $request->ip()); - }); - } -} diff --git a/run/laravel/artisan b/run/laravel/artisan deleted file mode 100755 index 67a3329b18..0000000000 --- a/run/laravel/artisan +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env php -make(Illuminate\Contracts\Console\Kernel::class); - -$status = $kernel->handle( - $input = new Symfony\Component\Console\Input\ArgvInput, - new Symfony\Component\Console\Output\ConsoleOutput -); - -/* -|-------------------------------------------------------------------------- -| Shutdown The Application -|-------------------------------------------------------------------------- -| -| Once Artisan has finished running, we will fire off the shutdown events -| so that any final work may be done by the application before we shut -| down the process. This is the last thing to happen to the request. -| -*/ - -$kernel->terminate($input, $status); - -exit($status); diff --git a/run/laravel/bootstrap/app.php b/run/laravel/bootstrap/app.php deleted file mode 100644 index 7b2203c017..0000000000 --- a/run/laravel/bootstrap/app.php +++ /dev/null @@ -1,64 +0,0 @@ -singleton( - Illuminate\Contracts\Http\Kernel::class, - App\Http\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Console\Kernel::class, - App\Console\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Debug\ExceptionHandler::class, - App\Exceptions\Handler::class -); - -// [START cloudrun_laravel_secret_manager_mount] -/* Load settings from a mounted volume, if available. */ -$settings_dir = $_ENV['APP_SETTINGS_DIR'] ?? '/config'; - -if (file_exists($settings_dir . '/.env')) { - $dotenv = Dotenv\Dotenv::createImmutable($settings_dir); - $dotenv->load(); -} -// [END cloudrun_laravel_secret_manager_mount] - -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ - -return $app; diff --git a/run/laravel/bootstrap/cache/.gitignore b/run/laravel/bootstrap/cache/.gitignore deleted file mode 100644 index d6b7ef32c8..0000000000 --- a/run/laravel/bootstrap/cache/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/run/laravel/composer.json b/run/laravel/composer.json deleted file mode 100644 index 9ec37e4b6b..0000000000 --- a/run/laravel/composer.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "laravel/laravel", - "type": "project", - "description": "The Laravel Framework.", - "keywords": ["framework", "laravel"], - "license": "MIT", - "require": { - "php": "^8.1", - "google/auth": "^1.24", - "google/cloud-core": "^1.46", - "guzzlehttp/guzzle": "^7.2", - "laravel/framework": "^9.19", - "laravel/sanctum": "^2.14.1", - "laravel/tinker": "^2.7", - "vlucas/phpdotenv": "^5.4" - }, - "require-dev": { - "fakerphp/faker": "^1.9.1", - "laravel/sail": "^1.0.1", - "mockery/mockery": "^1.4.4", - "nunomaduro/collision": "^6.1", - "phpunit/phpunit": "^9.5.10", - "spatie/laravel-ignition": "^1.0" - }, - "autoload": { - "psr-4": { - "App\\": "app/", - "Database\\Factories\\": "database/factories/", - "Database\\Seeders\\": "database/seeders/" - } - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - } - }, - "scripts": { - "post-autoload-dump": [ - "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", - "@php artisan package:discover --ansi" - ], - "post-update-cmd": [ - "@php artisan vendor:publish --tag=laravel-assets --ansi --force" - ], - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ], - "post-create-project-cmd": [ - "@php artisan key:generate --ansi" - ] - }, - "extra": { - "laravel": { - "dont-discover": [] - } - }, - "config": { - "optimize-autoloader": true, - "preferred-install": "dist", - "sort-packages": true - }, - "minimum-stability": "dev", - "prefer-stable": true -} \ No newline at end of file diff --git a/run/laravel/config/app.php b/run/laravel/config/app.php deleted file mode 100644 index ef76a7ed6a..0000000000 --- a/run/laravel/config/app.php +++ /dev/null @@ -1,215 +0,0 @@ - env('APP_NAME', 'Laravel'), - - /* - |-------------------------------------------------------------------------- - | Application Environment - |-------------------------------------------------------------------------- - | - | This value determines the "environment" your application is currently - | running in. This may determine how you prefer to configure various - | services the application utilizes. Set this in your ".env" file. - | - */ - - 'env' => env('APP_ENV', 'production'), - - /* - |-------------------------------------------------------------------------- - | Application Debug Mode - |-------------------------------------------------------------------------- - | - | When your application is in debug mode, detailed error messages with - | stack traces will be shown on every error that occurs within your - | application. If disabled, a simple generic error page is shown. - | - */ - - 'debug' => (bool) env('APP_DEBUG', false), - - /* - |-------------------------------------------------------------------------- - | Application URL - |-------------------------------------------------------------------------- - | - | This URL is used by the console to properly generate URLs when using - | the Artisan command line tool. You should set this to the root of - | your application so that it is used when running Artisan tasks. - | - */ - - 'url' => env('APP_URL', 'http://localhost'), - - 'asset_url' => env('ASSET_URL'), - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. We have gone - | ahead and set this to a sensible default for you out of the box. - | - */ - - 'timezone' => 'UTC', - - /* - |-------------------------------------------------------------------------- - | Application Locale Configuration - |-------------------------------------------------------------------------- - | - | The application locale determines the default locale that will be used - | by the translation service provider. You are free to set this value - | to any of the locales which will be supported by the application. - | - */ - - 'locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Application Fallback Locale - |-------------------------------------------------------------------------- - | - | The fallback locale determines the locale to use when the current one - | is not available. You may change the value to correspond to any of - | the language folders that are provided through your application. - | - */ - - 'fallback_locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Faker Locale - |-------------------------------------------------------------------------- - | - | This locale will be used by the Faker PHP library when generating fake - | data for your database seeds. For example, this will be used to get - | localized telephone numbers, street address information and more. - | - */ - - 'faker_locale' => 'en_US', - - /* - |-------------------------------------------------------------------------- - | Encryption Key - |-------------------------------------------------------------------------- - | - | This key is used by the Illuminate encrypter service and should be set - | to a random, 32 character string, otherwise these encrypted strings - | will not be safe. Please do this before deploying an application! - | - */ - - 'key' => env('APP_KEY'), - - 'cipher' => 'AES-256-CBC', - - /* - |-------------------------------------------------------------------------- - | Maintenance Mode Driver - |-------------------------------------------------------------------------- - | - | These configuration options determine the driver used to determine and - | manage Laravel's "maintenance mode" status. The "cache" driver will - | allow maintenance mode to be controlled across multiple machines. - | - | Supported drivers: "file", "cache" - | - */ - - 'maintenance' => [ - 'driver' => 'file', - // 'store' => 'redis', - ], - - /* - |-------------------------------------------------------------------------- - | Autoloaded Service Providers - |-------------------------------------------------------------------------- - | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. - | - */ - - 'providers' => [ - - /* - * Laravel Framework Service Providers... - */ - Illuminate\Auth\AuthServiceProvider::class, - Illuminate\Broadcasting\BroadcastServiceProvider::class, - Illuminate\Bus\BusServiceProvider::class, - Illuminate\Cache\CacheServiceProvider::class, - Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, - Illuminate\Cookie\CookieServiceProvider::class, - Illuminate\Database\DatabaseServiceProvider::class, - Illuminate\Encryption\EncryptionServiceProvider::class, - Illuminate\Filesystem\FilesystemServiceProvider::class, - Illuminate\Foundation\Providers\FoundationServiceProvider::class, - Illuminate\Hashing\HashServiceProvider::class, - Illuminate\Mail\MailServiceProvider::class, - Illuminate\Notifications\NotificationServiceProvider::class, - Illuminate\Pagination\PaginationServiceProvider::class, - Illuminate\Pipeline\PipelineServiceProvider::class, - Illuminate\Queue\QueueServiceProvider::class, - Illuminate\Redis\RedisServiceProvider::class, - Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, - Illuminate\Session\SessionServiceProvider::class, - Illuminate\Translation\TranslationServiceProvider::class, - Illuminate\Validation\ValidationServiceProvider::class, - Illuminate\View\ViewServiceProvider::class, - - /* - * Package Service Providers... - */ - - /* - * Application Service Providers... - */ - App\Providers\AppServiceProvider::class, - App\Providers\AuthServiceProvider::class, - // App\Providers\BroadcastServiceProvider::class, - App\Providers\EventServiceProvider::class, - App\Providers\RouteServiceProvider::class, - - ], - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. - | - */ - - 'aliases' => Facade::defaultAliases()->merge([ - // 'ExampleClass' => App\Example\ExampleClass::class, - ])->toArray(), - -]; diff --git a/run/laravel/config/auth.php b/run/laravel/config/auth.php deleted file mode 100644 index d8c6cee7c1..0000000000 --- a/run/laravel/config/auth.php +++ /dev/null @@ -1,111 +0,0 @@ - [ - 'guard' => 'web', - 'passwords' => 'users', - ], - - /* - |-------------------------------------------------------------------------- - | Authentication Guards - |-------------------------------------------------------------------------- - | - | Next, you may define every authentication guard for your application. - | Of course, a great default configuration has been defined for you - | here which uses session storage and the Eloquent user provider. - | - | All authentication drivers have a user provider. This defines how the - | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. - | - | Supported: "session" - | - */ - - 'guards' => [ - 'web' => [ - 'driver' => 'session', - 'provider' => 'users', - ], - ], - - /* - |-------------------------------------------------------------------------- - | User Providers - |-------------------------------------------------------------------------- - | - | All authentication drivers have a user provider. This defines how the - | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. - | - | If you have multiple user tables or models you may configure multiple - | sources which represent each model / table. These sources may then - | be assigned to any extra authentication guards you have defined. - | - | Supported: "database", "eloquent" - | - */ - - 'providers' => [ - 'users' => [ - 'driver' => 'eloquent', - 'model' => App\Models\User::class, - ], - - // 'users' => [ - // 'driver' => 'database', - // 'table' => 'users', - // ], - ], - - /* - |-------------------------------------------------------------------------- - | Resetting Passwords - |-------------------------------------------------------------------------- - | - | You may specify multiple password reset configurations if you have more - | than one user table or model in the application and you want to have - | separate password reset settings based on the specific user types. - | - | The expire time is the number of minutes that each reset token will be - | considered valid. This security feature keeps tokens short-lived so - | they have less time to be guessed. You may change this as needed. - | - */ - - 'passwords' => [ - 'users' => [ - 'provider' => 'users', - 'table' => 'password_resets', - 'expire' => 60, - 'throttle' => 60, - ], - ], - - /* - |-------------------------------------------------------------------------- - | Password Confirmation Timeout - |-------------------------------------------------------------------------- - | - | Here you may define the amount of seconds before a password confirmation - | times out and the user is prompted to re-enter their password via the - | confirmation screen. By default, the timeout lasts for three hours. - | - */ - - 'password_timeout' => 10800, - -]; diff --git a/run/laravel/config/broadcasting.php b/run/laravel/config/broadcasting.php deleted file mode 100644 index 3fe737e3e9..0000000000 --- a/run/laravel/config/broadcasting.php +++ /dev/null @@ -1,70 +0,0 @@ - env('BROADCAST_DRIVER', 'null'), - - /* - |-------------------------------------------------------------------------- - | Broadcast Connections - |-------------------------------------------------------------------------- - | - | Here you may define all of the broadcast connections that will be used - | to broadcast events to other systems or over websockets. Samples of - | each available type of connection are provided inside this array. - | - */ - - 'connections' => [ - - 'pusher' => [ - 'driver' => 'pusher', - 'key' => env('PUSHER_APP_KEY'), - 'secret' => env('PUSHER_APP_SECRET'), - 'app_id' => env('PUSHER_APP_ID'), - 'options' => [ - 'host' => env('PUSHER_HOST', 'api-' . env('PUSHER_APP_CLUSTER', 'mt1') . '.pusher.com') ?: 'api-' . env('PUSHER_APP_CLUSTER', 'mt1') . '.pusher.com', - 'port' => env('PUSHER_PORT', 443), - 'scheme' => env('PUSHER_SCHEME', 'https'), - 'encrypted' => true, - 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', - ], - 'client_options' => [ - // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html - ], - ], - - 'ably' => [ - 'driver' => 'ably', - 'key' => env('ABLY_KEY'), - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - ], - - 'log' => [ - 'driver' => 'log', - ], - - 'null' => [ - 'driver' => 'null', - ], - - ], - -]; diff --git a/run/laravel/config/cache.php b/run/laravel/config/cache.php deleted file mode 100644 index daf5e68be5..0000000000 --- a/run/laravel/config/cache.php +++ /dev/null @@ -1,110 +0,0 @@ - env('CACHE_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Cache Stores - |-------------------------------------------------------------------------- - | - | Here you may define all of the cache "stores" for your application as - | well as their drivers. You may even define multiple stores for the - | same cache driver to group types of items stored in your caches. - | - | Supported drivers: "apc", "array", "database", "file", - | "memcached", "redis", "dynamodb", "octane", "null" - | - */ - - 'stores' => [ - - 'apc' => [ - 'driver' => 'apc', - ], - - 'array' => [ - 'driver' => 'array', - 'serialize' => false, - ], - - 'database' => [ - 'driver' => 'database', - 'table' => 'cache', - 'connection' => null, - 'lock_connection' => null, - ], - - 'file' => [ - 'driver' => 'file', - 'path' => storage_path('framework/cache/data'), - ], - - 'memcached' => [ - 'driver' => 'memcached', - 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), - 'sasl' => [ - env('MEMCACHED_USERNAME'), - env('MEMCACHED_PASSWORD'), - ], - 'options' => [ - // Memcached::OPT_CONNECT_TIMEOUT => 2000, - ], - 'servers' => [ - [ - 'host' => env('MEMCACHED_HOST', '127.0.0.1'), - 'port' => env('MEMCACHED_PORT', 11211), - 'weight' => 100, - ], - ], - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'cache', - 'lock_connection' => 'default', - ], - - 'dynamodb' => [ - 'driver' => 'dynamodb', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), - 'endpoint' => env('DYNAMODB_ENDPOINT'), - ], - - 'octane' => [ - 'driver' => 'octane', - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Cache Key Prefix - |-------------------------------------------------------------------------- - | - | When utilizing the APC, database, memcached, Redis, or DynamoDB cache - | stores there might be other applications using the same cache. For - | that reason, you may prefix every cache key to avoid collisions. - | - */ - - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache_'), - -]; diff --git a/run/laravel/config/cors.php b/run/laravel/config/cors.php deleted file mode 100644 index 8a39e6daa6..0000000000 --- a/run/laravel/config/cors.php +++ /dev/null @@ -1,34 +0,0 @@ - ['api/*', 'sanctum/csrf-cookie'], - - 'allowed_methods' => ['*'], - - 'allowed_origins' => ['*'], - - 'allowed_origins_patterns' => [], - - 'allowed_headers' => ['*'], - - 'exposed_headers' => [], - - 'max_age' => 0, - - 'supports_credentials' => false, - -]; diff --git a/run/laravel/config/database.php b/run/laravel/config/database.php deleted file mode 100644 index 535cd52572..0000000000 --- a/run/laravel/config/database.php +++ /dev/null @@ -1,151 +0,0 @@ - env('DB_CONNECTION', 'mysql'), - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. - | - */ - - 'connections' => [ - - 'sqlite' => [ - 'driver' => 'sqlite', - 'url' => env('DATABASE_URL'), - 'database' => env('DB_DATABASE', database_path('database.sqlite')), - 'prefix' => '', - 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), - ], - - 'mysql' => [ - 'driver' => 'mysql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'pgsql' => [ - 'driver' => 'pgsql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'prefix' => '', - 'prefix_indexes' => true, - 'search_path' => 'public', - 'sslmode' => 'prefer', - ], - - 'sqlsrv' => [ - 'driver' => 'sqlsrv', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', 'localhost'), - 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'prefix' => '', - 'prefix_indexes' => true, - // 'encrypt' => env('DB_ENCRYPT', 'yes'), - // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - - 'migrations' => 'migrations', - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer body of commands than a typical key-value system - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => [ - - 'client' => env('REDIS_CLIENT', 'phpredis'), - - 'options' => [ - 'cluster' => env('REDIS_CLUSTER', 'redis'), - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'), - ], - - 'default' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'username' => env('REDIS_USERNAME'), - 'password' => env('REDIS_PASSWORD'), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_DB', '0'), - ], - - 'cache' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'username' => env('REDIS_USERNAME'), - 'password' => env('REDIS_PASSWORD'), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_CACHE_DB', '1'), - ], - - ], - -]; diff --git a/run/laravel/config/filesystems.php b/run/laravel/config/filesystems.php deleted file mode 100644 index 4afc1fc63a..0000000000 --- a/run/laravel/config/filesystems.php +++ /dev/null @@ -1,76 +0,0 @@ - env('FILESYSTEM_DISK', 'local'), - - /* - |-------------------------------------------------------------------------- - | Filesystem Disks - |-------------------------------------------------------------------------- - | - | Here you may configure as many filesystem "disks" as you wish, and you - | may even configure multiple disks of the same driver. Defaults have - | been set up for each driver as an example of the required values. - | - | Supported Drivers: "local", "ftp", "sftp", "s3" - | - */ - - 'disks' => [ - - 'local' => [ - 'driver' => 'local', - 'root' => storage_path('app'), - 'throw' => false, - ], - - 'public' => [ - 'driver' => 'local', - 'root' => storage_path('app/public'), - 'url' => env('APP_URL') . '/storage', - 'visibility' => 'public', - 'throw' => false, - ], - - 's3' => [ - 'driver' => 's3', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION'), - 'bucket' => env('AWS_BUCKET'), - 'url' => env('AWS_URL'), - 'endpoint' => env('AWS_ENDPOINT'), - 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), - 'throw' => false, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Symbolic Links - |-------------------------------------------------------------------------- - | - | Here you may configure the symbolic links that will be created when the - | `storage:link` Artisan command is executed. The array keys should be - | the locations of the links and the values should be their targets. - | - */ - - 'links' => [ - public_path('storage') => storage_path('app/public'), - ], - -]; diff --git a/run/laravel/config/hashing.php b/run/laravel/config/hashing.php deleted file mode 100644 index bcd3be4c28..0000000000 --- a/run/laravel/config/hashing.php +++ /dev/null @@ -1,52 +0,0 @@ - 'bcrypt', - - /* - |-------------------------------------------------------------------------- - | Bcrypt Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Bcrypt algorithm. This will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'bcrypt' => [ - 'rounds' => env('BCRYPT_ROUNDS', 10), - ], - - /* - |-------------------------------------------------------------------------- - | Argon Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Argon algorithm. These will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'argon' => [ - 'memory' => 65536, - 'threads' => 1, - 'time' => 4, - ], - -]; diff --git a/run/laravel/config/logging.php b/run/laravel/config/logging.php deleted file mode 100644 index 752af7110d..0000000000 --- a/run/laravel/config/logging.php +++ /dev/null @@ -1,122 +0,0 @@ - env('LOG_CHANNEL', 'stack'), - - /* - |-------------------------------------------------------------------------- - | Deprecations Log Channel - |-------------------------------------------------------------------------- - | - | This option controls the log channel that should be used to log warnings - | regarding deprecated PHP and library features. This allows you to get - | your application ready for upcoming major versions of dependencies. - | - */ - - 'deprecations' => [ - 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), - 'trace' => false, - ], - - /* - |-------------------------------------------------------------------------- - | Log Channels - |-------------------------------------------------------------------------- - | - | Here you may configure the log channels for your application. Out of - | the box, Laravel uses the Monolog PHP logging library. This gives - | you a variety of powerful log handlers / formatters to utilize. - | - | Available Drivers: "single", "daily", "slack", "syslog", - | "errorlog", "monolog", - | "custom", "stack" - | - */ - - 'channels' => [ - 'stack' => [ - 'driver' => 'stack', - 'channels' => ['single'], - 'ignore_exceptions' => false, - ], - - 'single' => [ - 'driver' => 'single', - 'path' => storage_path('logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'debug'), - ], - - 'daily' => [ - 'driver' => 'daily', - 'path' => storage_path('logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'debug'), - 'days' => 14, - ], - - 'slack' => [ - 'driver' => 'slack', - 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => 'Laravel Log', - 'emoji' => ':boom:', - 'level' => env('LOG_LEVEL', 'critical'), - ], - - 'papertrail' => [ - 'driver' => 'monolog', - 'level' => env('LOG_LEVEL', 'debug'), - 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), - 'handler_with' => [ - 'host' => env('PAPERTRAIL_URL'), - 'port' => env('PAPERTRAIL_PORT'), - 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'), - ], - ], - - 'stderr' => [ - 'driver' => 'monolog', - 'level' => env('LOG_LEVEL', 'debug'), - 'handler' => StreamHandler::class, - 'formatter' => env('LOG_STDERR_FORMATTER'), - 'with' => [ - 'stream' => 'php://stderr', - ], - ], - - 'syslog' => [ - 'driver' => 'syslog', - 'level' => env('LOG_LEVEL', 'debug'), - ], - - 'errorlog' => [ - 'driver' => 'errorlog', - 'level' => env('LOG_LEVEL', 'debug'), - ], - - 'null' => [ - 'driver' => 'monolog', - 'handler' => NullHandler::class, - ], - - 'emergency' => [ - 'path' => storage_path('logs/laravel.log'), - ], - ], - -]; diff --git a/run/laravel/config/mail.php b/run/laravel/config/mail.php deleted file mode 100644 index 534395a369..0000000000 --- a/run/laravel/config/mail.php +++ /dev/null @@ -1,118 +0,0 @@ - env('MAIL_MAILER', 'smtp'), - - /* - |-------------------------------------------------------------------------- - | Mailer Configurations - |-------------------------------------------------------------------------- - | - | Here you may configure all of the mailers used by your application plus - | their respective settings. Several examples have been configured for - | you and you are free to add your own as your application requires. - | - | Laravel supports a variety of mail "transport" drivers to be used while - | sending an e-mail. You will specify which one you are using for your - | mailers below. You are free to add additional mailers as required. - | - | Supported: "smtp", "sendmail", "mailgun", "ses", - | "postmark", "log", "array", "failover" - | - */ - - 'mailers' => [ - 'smtp' => [ - 'transport' => 'smtp', - 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), - 'port' => env('MAIL_PORT', 587), - 'encryption' => env('MAIL_ENCRYPTION', 'tls'), - 'username' => env('MAIL_USERNAME'), - 'password' => env('MAIL_PASSWORD'), - 'timeout' => null, - 'local_domain' => env('MAIL_EHLO_DOMAIN'), - ], - - 'ses' => [ - 'transport' => 'ses', - ], - - 'mailgun' => [ - 'transport' => 'mailgun', - ], - - 'postmark' => [ - 'transport' => 'postmark', - ], - - 'sendmail' => [ - 'transport' => 'sendmail', - 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), - ], - - 'log' => [ - 'transport' => 'log', - 'channel' => env('MAIL_LOG_CHANNEL'), - ], - - 'array' => [ - 'transport' => 'array', - ], - - 'failover' => [ - 'transport' => 'failover', - 'mailers' => [ - 'smtp', - 'log', - ], - ], - ], - - /* - |-------------------------------------------------------------------------- - | Global "From" Address - |-------------------------------------------------------------------------- - | - | You may wish for all e-mails sent by your application to be sent from - | the same address. Here, you may specify a name and address that is - | used globally for all e-mails that are sent by your application. - | - */ - - 'from' => [ - 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), - 'name' => env('MAIL_FROM_NAME', 'Example'), - ], - - /* - |-------------------------------------------------------------------------- - | Markdown Mail Settings - |-------------------------------------------------------------------------- - | - | If you are using Markdown based email rendering, you may configure your - | theme and component paths here, allowing you to customize the design - | of the emails. Or, you may simply stick with the Laravel defaults! - | - */ - - 'markdown' => [ - 'theme' => 'default', - - 'paths' => [ - resource_path('views/vendor/mail'), - ], - ], - -]; diff --git a/run/laravel/config/queue.php b/run/laravel/config/queue.php deleted file mode 100644 index 25ea5a8193..0000000000 --- a/run/laravel/config/queue.php +++ /dev/null @@ -1,93 +0,0 @@ - env('QUEUE_CONNECTION', 'sync'), - - /* - |-------------------------------------------------------------------------- - | Queue Connections - |-------------------------------------------------------------------------- - | - | Here you may configure the connection information for each server that - | is used by your application. A default configuration has been added - | for each back-end shipped with Laravel. You are free to add more. - | - | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" - | - */ - - 'connections' => [ - - 'sync' => [ - 'driver' => 'sync', - ], - - 'database' => [ - 'driver' => 'database', - 'table' => 'jobs', - 'queue' => 'default', - 'retry_after' => 90, - 'after_commit' => false, - ], - - 'beanstalkd' => [ - 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', - 'retry_after' => 90, - 'block_for' => 0, - 'after_commit' => false, - ], - - 'sqs' => [ - 'driver' => 'sqs', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), - 'queue' => env('SQS_QUEUE', 'default'), - 'suffix' => env('SQS_SUFFIX'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'after_commit' => false, - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - 'queue' => env('REDIS_QUEUE', 'default'), - 'retry_after' => 90, - 'block_for' => null, - 'after_commit' => false, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Failed Queue Jobs - |-------------------------------------------------------------------------- - | - | These options configure the behavior of failed queue job logging so you - | can control which database and table are used to store the jobs that - | have failed. You may change them to any database / table you wish. - | - */ - - 'failed' => [ - 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), - 'database' => env('DB_CONNECTION', 'mysql'), - 'table' => 'failed_jobs', - ], - -]; diff --git a/run/laravel/config/sanctum.php b/run/laravel/config/sanctum.php deleted file mode 100644 index 529cfdc991..0000000000 --- a/run/laravel/config/sanctum.php +++ /dev/null @@ -1,67 +0,0 @@ - explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( - '%s%s', - 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', - Sanctum::currentApplicationUrlWithPort() - ))), - - /* - |-------------------------------------------------------------------------- - | Sanctum Guards - |-------------------------------------------------------------------------- - | - | This array contains the authentication guards that will be checked when - | Sanctum is trying to authenticate a request. If none of these guards - | are able to authenticate the request, Sanctum will use the bearer - | token that's present on an incoming request for authentication. - | - */ - - 'guard' => ['web'], - - /* - |-------------------------------------------------------------------------- - | Expiration Minutes - |-------------------------------------------------------------------------- - | - | This value controls the number of minutes until an issued token will be - | considered expired. If this value is null, personal access tokens do - | not expire. This won't tweak the lifetime of first-party sessions. - | - */ - - 'expiration' => null, - - /* - |-------------------------------------------------------------------------- - | Sanctum Middleware - |-------------------------------------------------------------------------- - | - | When authenticating your first-party SPA with Sanctum you may need to - | customize some of the middleware Sanctum uses while processing the - | request. You may change the middleware listed below as required. - | - */ - - 'middleware' => [ - 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, - 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, - ], - -]; diff --git a/run/laravel/config/services.php b/run/laravel/config/services.php deleted file mode 100644 index 0ace530e8d..0000000000 --- a/run/laravel/config/services.php +++ /dev/null @@ -1,34 +0,0 @@ - [ - 'domain' => env('MAILGUN_DOMAIN'), - 'secret' => env('MAILGUN_SECRET'), - 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), - 'scheme' => 'https', - ], - - 'postmark' => [ - 'token' => env('POSTMARK_TOKEN'), - ], - - 'ses' => [ - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - ], - -]; diff --git a/run/laravel/config/session.php b/run/laravel/config/session.php deleted file mode 100644 index 1b99f221c6..0000000000 --- a/run/laravel/config/session.php +++ /dev/null @@ -1,201 +0,0 @@ - env('SESSION_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | Here you may specify the number of minutes that you wish the session - | to be allowed to remain idle before it expires. If you want them - | to immediately expire on the browser closing, set that option. - | - */ - - 'lifetime' => env('SESSION_LIFETIME', 120), - - 'expire_on_close' => false, - - /* - |-------------------------------------------------------------------------- - | Session Encryption - |-------------------------------------------------------------------------- - | - | This option allows you to easily specify that all of your session data - | should be encrypted before it is stored. All encryption will be run - | automatically by Laravel and you can use the Session like normal. - | - */ - - 'encrypt' => false, - - /* - |-------------------------------------------------------------------------- - | Session File Location - |-------------------------------------------------------------------------- - | - | When using the native session driver, we need a location where session - | files may be stored. A default has been set for you but a different - | location may be specified. This is only needed for file sessions. - | - */ - - 'files' => storage_path('framework/sessions'), - - /* - |-------------------------------------------------------------------------- - | Session Database Connection - |-------------------------------------------------------------------------- - | - | When using the "database" or "redis" session drivers, you may specify a - | connection that should be used to manage these sessions. This should - | correspond to a connection in your database configuration options. - | - */ - - 'connection' => env('SESSION_CONNECTION'), - - /* - |-------------------------------------------------------------------------- - | Session Database Table - |-------------------------------------------------------------------------- - | - | When using the "database" session driver, you may specify the table we - | should use to manage the sessions. Of course, a sensible default is - | provided for you; however, you are free to change this as needed. - | - */ - - 'table' => 'sessions', - - /* - |-------------------------------------------------------------------------- - | Session Cache Store - |-------------------------------------------------------------------------- - | - | While using one of the framework's cache driven session backends you may - | list a cache store that should be used for these sessions. This value - | must match with one of the application's configured cache "stores". - | - | Affects: "apc", "dynamodb", "memcached", "redis" - | - */ - - 'store' => env('SESSION_STORE'), - - /* - |-------------------------------------------------------------------------- - | Session Sweeping Lottery - |-------------------------------------------------------------------------- - | - | Some session drivers must manually sweep their storage location to get - | rid of old sessions from storage. Here are the chances that it will - | happen on a given request. By default, the odds are 2 out of 100. - | - */ - - 'lottery' => [2, 100], - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | Here you may change the name of the cookie used to identify a session - | instance by ID. The name specified here will get used every time a - | new session cookie is created by the framework for every driver. - | - */ - - 'cookie' => env( - 'SESSION_COOKIE', - Str::slug(env('APP_NAME', 'laravel'), '_') . '_session' - ), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The session cookie path determines the path for which the cookie will - | be regarded as available. Typically, this will be the root path of - | your application but you are free to change this when necessary. - | - */ - - 'path' => '/', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | Here you may change the domain of the cookie used to identify a session - | in your application. This will determine which domains the cookie is - | available to in your application. A sensible default has been set. - | - */ - - 'domain' => env('SESSION_DOMAIN'), - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Cookies - |-------------------------------------------------------------------------- - | - | By setting this option to true, session cookies will only be sent back - | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you when it can't be done securely. - | - */ - - 'secure' => env('SESSION_SECURE_COOKIE'), - - /* - |-------------------------------------------------------------------------- - | HTTP Access Only - |-------------------------------------------------------------------------- - | - | Setting this value to true will prevent JavaScript from accessing the - | value of the cookie and the cookie will only be accessible through - | the HTTP protocol. You are free to modify this option if needed. - | - */ - - 'http_only' => true, - - /* - |-------------------------------------------------------------------------- - | Same-Site Cookies - |-------------------------------------------------------------------------- - | - | This option determines how your cookies behave when cross-site requests - | take place, and can be used to mitigate CSRF attacks. By default, we - | will set this value to "lax" since this is a secure default value. - | - | Supported: "lax", "strict", "none", null - | - */ - - 'same_site' => 'lax', - -]; diff --git a/run/laravel/config/view.php b/run/laravel/config/view.php deleted file mode 100644 index 22b8a18d32..0000000000 --- a/run/laravel/config/view.php +++ /dev/null @@ -1,36 +0,0 @@ - [ - resource_path('views'), - ], - - /* - |-------------------------------------------------------------------------- - | Compiled View Path - |-------------------------------------------------------------------------- - | - | This option determines where all the compiled Blade templates will be - | stored for your application. Typically, this is within the storage - | directory. However, as usual, you are free to change this value. - | - */ - - 'compiled' => env( - 'VIEW_COMPILED_PATH', - realpath(storage_path('framework/views')) - ), - -]; diff --git a/run/laravel/database/.gitignore b/run/laravel/database/.gitignore deleted file mode 100644 index 9b19b93c9f..0000000000 --- a/run/laravel/database/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.sqlite* diff --git a/run/laravel/database/factories/ProductFactory.php b/run/laravel/database/factories/ProductFactory.php deleted file mode 100644 index 7156a72cd4..0000000000 --- a/run/laravel/database/factories/ProductFactory.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ -class ProductFactory extends Factory -{ - /** - * Define the model's default state. - * - * @return array - */ - public function definition() - { - return [ - 'name' => ucwords(fake()->safeColorName() . ' ' . fake()->word()), - 'description' => fake()->sentence() - ]; - } -} diff --git a/run/laravel/database/factories/UserFactory.php b/run/laravel/database/factories/UserFactory.php deleted file mode 100644 index 20b35322dd..0000000000 --- a/run/laravel/database/factories/UserFactory.php +++ /dev/null @@ -1,42 +0,0 @@ - - */ -class UserFactory extends Factory -{ - /** - * Define the model's default state. - * - * @return array - */ - public function definition() - { - return [ - 'name' => fake()->name(), - 'email' => fake()->safeEmail(), - 'email_verified_at' => now(), - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password - 'remember_token' => Str::random(10), - ]; - } - - /** - * Indicate that the model's email address should be unverified. - * - * @return static - */ - public function unverified() - { - return $this->state(function (array $attributes) { - return [ - 'email_verified_at' => null, - ]; - }); - } -} diff --git a/run/laravel/database/migrations/2014_10_12_000000_create_users_table.php b/run/laravel/database/migrations/2014_10_12_000000_create_users_table.php deleted file mode 100644 index 957b6ad8e2..0000000000 --- a/run/laravel/database/migrations/2014_10_12_000000_create_users_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('name'); - $table->string('email')->unique(); - $table->timestamp('email_verified_at')->nullable(); - $table->string('password'); - $table->rememberToken(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('users'); - } -}; diff --git a/run/laravel/database/migrations/2014_10_12_100000_create_password_resets_table.php b/run/laravel/database/migrations/2014_10_12_100000_create_password_resets_table.php deleted file mode 100644 index 47f5a296d3..0000000000 --- a/run/laravel/database/migrations/2014_10_12_100000_create_password_resets_table.php +++ /dev/null @@ -1,31 +0,0 @@ -string('email')->index(); - $table->string('token'); - $table->timestamp('created_at')->nullable(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('password_resets'); - } -}; diff --git a/run/laravel/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/run/laravel/database/migrations/2019_08_19_000000_create_failed_jobs_table.php deleted file mode 100644 index 5e9a296ed7..0000000000 --- a/run/laravel/database/migrations/2019_08_19_000000_create_failed_jobs_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->text('connection'); - $table->text('queue'); - $table->longText('payload'); - $table->longText('exception'); - $table->timestamp('failed_at')->useCurrent(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('failed_jobs'); - } -}; diff --git a/run/laravel/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/run/laravel/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php deleted file mode 100644 index e65413a581..0000000000 --- a/run/laravel/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->morphs('tokenable'); - $table->string('name'); - $table->string('token', 64)->unique(); - $table->text('abilities')->nullable(); - $table->timestamp('last_used_at')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('personal_access_tokens'); - } -}; diff --git a/run/laravel/database/migrations/2022_07_01_000000_create_products_table.php b/run/laravel/database/migrations/2022_07_01_000000_create_products_table.php deleted file mode 100644 index b2c753b697..0000000000 --- a/run/laravel/database/migrations/2022_07_01_000000_create_products_table.php +++ /dev/null @@ -1,32 +0,0 @@ -id(); - $table->string('name'); - $table->text('description'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('products'); - } -}; diff --git a/run/laravel/database/seeders/DatabaseSeeder.php b/run/laravel/database/seeders/DatabaseSeeder.php deleted file mode 100644 index cf8374da00..0000000000 --- a/run/laravel/database/seeders/DatabaseSeeder.php +++ /dev/null @@ -1,23 +0,0 @@ -create(); - - // \App\Models\User::factory()->create([ - // 'name' => 'Test User', - // 'email' => 'test@example.com', - // ]); - } -} diff --git a/run/laravel/database/seeders/ProductSeeder.php b/run/laravel/database/seeders/ProductSeeder.php deleted file mode 100644 index eee1bca2e8..0000000000 --- a/run/laravel/database/seeders/ProductSeeder.php +++ /dev/null @@ -1,21 +0,0 @@ -count(10) - ->create(); - } -} diff --git a/run/laravel/index.php b/run/laravel/index.php deleted file mode 100644 index 1dac2b2301..0000000000 --- a/run/laravel/index.php +++ /dev/null @@ -1,4 +0,0 @@ - 'These credentials do not match our records.', - 'password' => 'The provided password is incorrect.', - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - -]; diff --git a/run/laravel/lang/en/pagination.php b/run/laravel/lang/en/pagination.php deleted file mode 100644 index d481411877..0000000000 --- a/run/laravel/lang/en/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« Previous', - 'next' => 'Next »', - -]; diff --git a/run/laravel/lang/en/passwords.php b/run/laravel/lang/en/passwords.php deleted file mode 100644 index 2345a56b5a..0000000000 --- a/run/laravel/lang/en/passwords.php +++ /dev/null @@ -1,22 +0,0 @@ - 'Your password has been reset!', - 'sent' => 'We have emailed your password reset link!', - 'throttled' => 'Please wait before retrying.', - 'token' => 'This password reset token is invalid.', - 'user' => "We can't find a user with that email address.", - -]; diff --git a/run/laravel/lang/en/validation.php b/run/laravel/lang/en/validation.php deleted file mode 100644 index cef02f589e..0000000000 --- a/run/laravel/lang/en/validation.php +++ /dev/null @@ -1,170 +0,0 @@ - 'The :attribute must be accepted.', - 'accepted_if' => 'The :attribute must be accepted when :other is :value.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute must only contain letters.', - 'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.', - 'alpha_num' => 'The :attribute must only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'array' => 'The :attribute must have between :min and :max items.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'numeric' => 'The :attribute must be between :min and :max.', - 'string' => 'The :attribute must be between :min and :max characters.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'current_password' => 'The password is incorrect.', - 'date' => 'The :attribute is not a valid date.', - 'date_equals' => 'The :attribute must be a date equal to :date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'declined' => 'The :attribute must be declined.', - 'declined_if' => 'The :attribute must be declined when :other is :value.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'doesnt_start_with' => 'The :attribute may not start with one of the following: :values.', - 'email' => 'The :attribute must be a valid email address.', - 'ends_with' => 'The :attribute must end with one of the following: :values.', - 'enum' => 'The selected :attribute is invalid.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field must have a value.', - 'gt' => [ - 'array' => 'The :attribute must have more than :value items.', - 'file' => 'The :attribute must be greater than :value kilobytes.', - 'numeric' => 'The :attribute must be greater than :value.', - 'string' => 'The :attribute must be greater than :value characters.', - ], - 'gte' => [ - 'array' => 'The :attribute must have :value items or more.', - 'file' => 'The :attribute must be greater than or equal to :value kilobytes.', - 'numeric' => 'The :attribute must be greater than or equal to :value.', - 'string' => 'The :attribute must be greater than or equal to :value characters.', - ], - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'ipv4' => 'The :attribute must be a valid IPv4 address.', - 'ipv6' => 'The :attribute must be a valid IPv6 address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'lt' => [ - 'array' => 'The :attribute must have less than :value items.', - 'file' => 'The :attribute must be less than :value kilobytes.', - 'numeric' => 'The :attribute must be less than :value.', - 'string' => 'The :attribute must be less than :value characters.', - ], - 'lte' => [ - 'array' => 'The :attribute must not have more than :value items.', - 'file' => 'The :attribute must be less than or equal to :value kilobytes.', - 'numeric' => 'The :attribute must be less than or equal to :value.', - 'string' => 'The :attribute must be less than or equal to :value characters.', - ], - 'mac_address' => 'The :attribute must be a valid MAC address.', - 'max' => [ - 'array' => 'The :attribute must not have more than :max items.', - 'file' => 'The :attribute must not be greater than :max kilobytes.', - 'numeric' => 'The :attribute must not be greater than :max.', - 'string' => 'The :attribute must not be greater than :max characters.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'array' => 'The :attribute must have at least :min items.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'numeric' => 'The :attribute must be at least :min.', - 'string' => 'The :attribute must be at least :min characters.', - ], - 'multiple_of' => 'The :attribute must be a multiple of :value.', - 'not_in' => 'The selected :attribute is invalid.', - 'not_regex' => 'The :attribute format is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'password' => [ - 'letters' => 'The :attribute must contain at least one letter.', - 'mixed' => 'The :attribute must contain at least one uppercase and one lowercase letter.', - 'numbers' => 'The :attribute must contain at least one number.', - 'symbols' => 'The :attribute must contain at least one symbol.', - 'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.', - ], - 'present' => 'The :attribute field must be present.', - 'prohibited' => 'The :attribute field is prohibited.', - 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', - 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', - 'prohibits' => 'The :attribute field prohibits :other from being present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_array_keys' => 'The :attribute field must contain entries for: :values.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values are present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'array' => 'The :attribute must contain :size items.', - 'file' => 'The :attribute must be :size kilobytes.', - 'numeric' => 'The :attribute must be :size.', - 'string' => 'The :attribute must be :size characters.', - ], - 'starts_with' => 'The :attribute must start with one of the following: :values.', - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid timezone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute must be a valid URL.', - 'uuid' => 'The :attribute must be a valid UUID.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'custom' => [ - 'attribute-name' => [ - 'rule-name' => 'custom-message', - ], - ], - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap our attribute placeholder - | with something more reader friendly such as "E-Mail Address" instead - | of "email". This simply helps us make our message more expressive. - | - */ - - 'attributes' => [], - -]; diff --git a/run/laravel/laravel-demo-screenshot.png b/run/laravel/laravel-demo-screenshot.png deleted file mode 100644 index e817bea3dc3d92cd68a842375d71753359134af1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117973 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

&`ReKQ3(!@b$w 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

&0`RElO@p9M6VVM9L#7cNb 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 diff --git a/run/laravel/package.json b/run/laravel/package.json deleted file mode 100644 index eaf1feecb7..0000000000 --- a/run/laravel/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "private": true, - "scripts": { - "dev": "vite", - "build": "vite build", - "update-static": "vite build && gcloud storage cp --recursive public/* gs://${ASSET_BUCKET}" - - }, - "devDependencies": { - "axios": "^0.25", - "laravel-vite-plugin": "^0.4.0", - "lodash": "^4.17.19", - "postcss": "^8.1.14", - "vite": "^2.9.11" - } -} \ No newline at end of file diff --git a/run/laravel/phpunit.xml b/run/laravel/phpunit.xml deleted file mode 100644 index fe977132e1..0000000000 --- a/run/laravel/phpunit.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - tests/Feature - - - - - ./app - - - - - - - - - - - - - - - diff --git a/run/laravel/public/.htaccess b/run/laravel/public/.htaccess deleted file mode 100644 index 3aec5e27e5..0000000000 --- a/run/laravel/public/.htaccess +++ /dev/null @@ -1,21 +0,0 @@ - - - Options -MultiViews -Indexes - - - RewriteEngine On - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] - - # Send Requests To Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - diff --git a/run/laravel/public/favicon.ico b/run/laravel/public/favicon.ico deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/run/laravel/public/index.php b/run/laravel/public/index.php deleted file mode 100644 index f3c2ebcd37..0000000000 --- a/run/laravel/public/index.php +++ /dev/null @@ -1,55 +0,0 @@ -make(Kernel::class); - -$response = $kernel->handle( - $request = Request::capture() -)->send(); - -$kernel->terminate($request, $response); diff --git a/run/laravel/public/robots.txt b/run/laravel/public/robots.txt deleted file mode 100644 index eb0536286f..0000000000 --- a/run/laravel/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: diff --git a/run/laravel/resources/css/app.css b/run/laravel/resources/css/app.css deleted file mode 100644 index d8dccfd77c..0000000000 --- a/run/laravel/resources/css/app.css +++ /dev/null @@ -1,19 +0,0 @@ -.wide { - /* col-xs-12 col-sm-12 col-md-12 */ - flex: 0 0 auto; - width: 100%; -} - -.action { - /* pt-3 text-center */ - padding-top: 1rem!important; - text-align: center!important; -} - -.col-form-label { - font-weight: bold; -} - -.display-data { - padding-top: calc(0.375rem + 1px); -} \ No newline at end of file diff --git a/run/laravel/resources/js/app.js b/run/laravel/resources/js/app.js deleted file mode 100644 index e59d6a0adf..0000000000 --- a/run/laravel/resources/js/app.js +++ /dev/null @@ -1 +0,0 @@ -import './bootstrap'; diff --git a/run/laravel/resources/js/bootstrap.js b/run/laravel/resources/js/bootstrap.js deleted file mode 100644 index d21a8c0f28..0000000000 --- a/run/laravel/resources/js/bootstrap.js +++ /dev/null @@ -1,34 +0,0 @@ -import _ from 'lodash'; -window._ = _; - -/** - * We'll load the axios HTTP library which allows us to easily issue requests - * to our Laravel back-end. This library automatically handles sending the - * CSRF token as a header based on the value of the "XSRF" token cookie. - */ - -import axios from 'axios'; -window.axios = axios; - -window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; - -/** - * Echo exposes an expressive API for subscribing to channels and listening - * for events that are broadcast by Laravel. Echo and event broadcasting - * allows your team to easily build robust real-time web applications. - */ - -// import Echo from 'laravel-echo'; - -// import Pusher from 'pusher-js'; -// window.Pusher = Pusher; - -// window.Echo = new Echo({ -// broadcaster: 'pusher', -// key: import.meta.env.VITE_PUSHER_APP_KEY, -// wsHost: import.meta.env.VITE_PUSHER_HOST ?? `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, -// wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, -// wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, -// forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', -// enabledTransports: ['ws', 'wss'], -// }); diff --git a/run/laravel/resources/views/products/create.blade.php b/run/laravel/resources/views/products/create.blade.php deleted file mode 100644 index 3d71cb69d1..0000000000 --- a/run/laravel/resources/views/products/create.blade.php +++ /dev/null @@ -1,32 +0,0 @@ -@extends('products.layout') - -@section('title') -Create New Product -@endsection - -@section('content') - -

- @csrf - -
- -
- -
-
- -
- -
- -
-
-
- - Back -
- - - -@endsection \ No newline at end of file diff --git a/run/laravel/resources/views/products/edit.blade.php b/run/laravel/resources/views/products/edit.blade.php deleted file mode 100644 index 40e0a424df..0000000000 --- a/run/laravel/resources/views/products/edit.blade.php +++ /dev/null @@ -1,35 +0,0 @@ -@extends('products.layout') - -@section('title') -Edit Product #{{$product->id}} -@endsection - -@section('actions') -Back -@endsection - -@section('content') - -
- @csrf - @method('PUT') - -
- -
- -
-
- -
- -
- -
-
-
- -
- -
-@endsection \ No newline at end of file diff --git a/run/laravel/resources/views/products/index.blade.php b/run/laravel/resources/views/products/index.blade.php deleted file mode 100644 index 6e028fc4e6..0000000000 --- a/run/laravel/resources/views/products/index.blade.php +++ /dev/null @@ -1,45 +0,0 @@ -@extends('products.layout') - -@section('title') -Products -@endsection - -@section('actions') - Create New Product -@endsection - -@section('content') -@if (count($products) > 0) - - - - - - - - @foreach ($products as $product) - - - - - - - @endforeach -
IDNameDescriptionActions
{{ $product->id }}{{ $product->name }}{{ $product->description }} -
- - Edit - - @csrf - @method('DELETE') - - -
-
-@else -

No products. Create one. - @endif - - {!! $products->links() !!} - - @endsection \ No newline at end of file diff --git a/run/laravel/resources/views/products/layout.blade.php b/run/laravel/resources/views/products/layout.blade.php deleted file mode 100644 index e4dc6bb556..0000000000 --- a/run/laravel/resources/views/products/layout.blade.php +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Laravel Demo App Products - - - - - - -

-
-
-
-

@yield('title')

-
-
- @yield('actions') -
-
-
- - @if ($errors->any()) -
- Uh-oh! There was an error:

-
    - @foreach ($errors->all() as $error) -
  • {{ $error }}
  • - @endforeach -
-
- @endif - - @yield('content') -
- - - - \ No newline at end of file diff --git a/run/laravel/resources/views/products/show.blade.php b/run/laravel/resources/views/products/show.blade.php deleted file mode 100644 index cbfbba84c3..0000000000 --- a/run/laravel/resources/views/products/show.blade.php +++ /dev/null @@ -1,27 +0,0 @@ -@extends('products.layout') - -@section('title') -Product #{{$product->id}} -@endsection - -@section('actions') -Back -Edit -@endsection - -@section('content') -
- -
- {{ $product->name }} -
-
- -
- -
- - {{ $product->description }} -
-
-@endsection \ No newline at end of file diff --git a/run/laravel/resources/views/welcome.blade.php b/run/laravel/resources/views/welcome.blade.php deleted file mode 100644 index f53aa43040..0000000000 --- a/run/laravel/resources/views/welcome.blade.php +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - - - Laravel - - - - - - - - - - - -
- @if (Route::has('login')) - - @endif - -
-
- - - - - -
- ➡️ View the demo products page.
- ⬇️ View the system information. -
- -
- - - -
-
-
-
- - - - -
- -
-
- Laravel has wonderful, thorough documentation covering every aspect of the framework. Whether you are new to the framework or have previous experience with Laravel, we recommend reading all of the documentation from beginning to end. -
-
-
- -
-
- - - - - -
- -
-
- Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process. -
-
-
- -
-
- - - - -
- -
-
- Laravel News is a community driven portal and newsletter aggregating all of the latest and most important news in the Laravel ecosystem, including new package releases and tutorials. -
-
-
- -
-
- - - -
Vibrant Ecosystem
-
- -
-
- Laravel's robust library of first-party tools and libraries, such as Forge, Vapor, Nova, and Envoyer help you take your projects to the next level. Pair them with powerful open source libraries like Cashier, Dusk, Echo, Horizon, Sanctum, Telescope, and more. -
-
-
-
-
- -
-
-
- - - - - - Shop - - - - - - - - Sponsor - -
-
- -
- - - Laravel v{{ Illuminate\Foundation\Application::VERSION }} (PHP v{{ PHP_VERSION }}) -
Service: {{ $service }}. Revision {{ $revision }}. -
Project: {{ $project }}. Region {{ $region }}. - -
-
-
-
- - - \ No newline at end of file diff --git a/run/laravel/routes/api.php b/run/laravel/routes/api.php deleted file mode 100644 index eb6fa48c25..0000000000 --- a/run/laravel/routes/api.php +++ /dev/null @@ -1,19 +0,0 @@ -get('/user', function (Request $request) { - return $request->user(); -}); diff --git a/run/laravel/routes/channels.php b/run/laravel/routes/channels.php deleted file mode 100644 index 5d451e1fae..0000000000 --- a/run/laravel/routes/channels.php +++ /dev/null @@ -1,18 +0,0 @@ -id === (int) $id; -}); diff --git a/run/laravel/routes/console.php b/run/laravel/routes/console.php deleted file mode 100644 index e05f4c9a1b..0000000000 --- a/run/laravel/routes/console.php +++ /dev/null @@ -1,19 +0,0 @@ -comment(Inspiring::quote()); -})->purpose('Display an inspiring quote'); diff --git a/run/laravel/routes/web.php b/run/laravel/routes/web.php deleted file mode 100644 index 51c1dbf0b7..0000000000 --- a/run/laravel/routes/web.php +++ /dev/null @@ -1,45 +0,0 @@ - 'Unknown', - 'revision' => 'Unknown', - 'project' => 'Unknown', - 'region' => 'Unknown' - ]); - } - // [START cloudrun_laravel_display_metadata] - $metadata = new Google\Cloud\Core\Compute\Metadata(); - $longRegion = explode('/', $metadata->get('instance/region')); - - return view('welcome', [ - 'service' => env('K_SERVICE'), - 'revision' => env('K_REVISION'), - 'project' => $metadata->get('project/project-id'), - 'region' => end($longRegion), - ]); - // [END cloudrun_laravel_display_metadata] -}); - -// A basic CRUD example -Route::resource('products', ProductController::class); diff --git a/run/laravel/storage/app/.gitignore b/run/laravel/storage/app/.gitignore deleted file mode 100644 index 8f4803c056..0000000000 --- a/run/laravel/storage/app/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!public/ -!.gitignore diff --git a/run/laravel/storage/app/public/.gitignore b/run/laravel/storage/app/public/.gitignore deleted file mode 100644 index d6b7ef32c8..0000000000 --- a/run/laravel/storage/app/public/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/run/laravel/storage/framework/.gitignore b/run/laravel/storage/framework/.gitignore deleted file mode 100644 index 05c4471f2b..0000000000 --- a/run/laravel/storage/framework/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -compiled.php -config.php -down -events.scanned.php -maintenance.php -routes.php -routes.scanned.php -schedule-* -services.json diff --git a/run/laravel/storage/framework/cache/.gitignore b/run/laravel/storage/framework/cache/.gitignore deleted file mode 100644 index 01e4a6cda9..0000000000 --- a/run/laravel/storage/framework/cache/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!data/ -!.gitignore diff --git a/run/laravel/storage/framework/cache/data/.gitignore b/run/laravel/storage/framework/cache/data/.gitignore deleted file mode 100644 index d6b7ef32c8..0000000000 --- a/run/laravel/storage/framework/cache/data/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/run/laravel/storage/framework/sessions/.gitignore b/run/laravel/storage/framework/sessions/.gitignore deleted file mode 100644 index d6b7ef32c8..0000000000 --- a/run/laravel/storage/framework/sessions/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/run/laravel/storage/framework/testing/.gitignore b/run/laravel/storage/framework/testing/.gitignore deleted file mode 100644 index d6b7ef32c8..0000000000 --- a/run/laravel/storage/framework/testing/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/run/laravel/storage/framework/views/.gitignore b/run/laravel/storage/framework/views/.gitignore deleted file mode 100644 index d6b7ef32c8..0000000000 --- a/run/laravel/storage/framework/views/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/run/laravel/storage/logs/.gitignore b/run/laravel/storage/logs/.gitignore deleted file mode 100644 index d6b7ef32c8..0000000000 --- a/run/laravel/storage/logs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/run/laravel/tests/CreatesApplication.php b/run/laravel/tests/CreatesApplication.php deleted file mode 100644 index ab92402550..0000000000 --- a/run/laravel/tests/CreatesApplication.php +++ /dev/null @@ -1,22 +0,0 @@ -make(Kernel::class)->bootstrap(); - - return $app; - } -} diff --git a/run/laravel/tests/Feature/LandingPageTest.php b/run/laravel/tests/Feature/LandingPageTest.php deleted file mode 100644 index cb5ec2fcba..0000000000 --- a/run/laravel/tests/Feature/LandingPageTest.php +++ /dev/null @@ -1,15 +0,0 @@ -get('/'); - - $response->assertStatus(200); - } -} diff --git a/run/laravel/tests/Feature/ProductTest.php b/run/laravel/tests/Feature/ProductTest.php deleted file mode 100644 index b4a25f7433..0000000000 --- a/run/laravel/tests/Feature/ProductTest.php +++ /dev/null @@ -1,44 +0,0 @@ -get('/products'); - - $response->assertStatus(200); - } - - public function test_product_create_page() - { - $response = $this->get('/products/create'); - - $response->assertStatus(200); - } - - public function test_create_product() - { - $response = $this->followingRedirects()->post('/products', [ - 'name' => 'Test Product', - 'description' => 'Test Description' - ]); - - $response->assertSuccessful(); - - $this->assertDatabaseCount('products', 1); - } - - public function test_database_seed() - { - $this->artisan('db:seed'); - - $response = $this->get('/products'); - $response->assertStatus(200); - } -} diff --git a/run/laravel/tests/TestCase.php b/run/laravel/tests/TestCase.php deleted file mode 100644 index 2932d4a69d..0000000000 --- a/run/laravel/tests/TestCase.php +++ /dev/null @@ -1,10 +0,0 @@ -