parent
c66a8dc226
commit
dff116af30
@ -1,10 +1,13 @@
|
||||
# Uncomment to ignore Symfony project
|
||||
#/app/*
|
||||
/app/.yarncache
|
||||
!/app/.keep
|
||||
|
||||
# Uncomment to ignore Database datas
|
||||
/data/*
|
||||
!/data/.keep
|
||||
data
|
||||
|
||||
# yarn
|
||||
/app/.yarncache
|
||||
|
||||
|
||||
# phpstorm
|
||||
.idea
|
||||
|
@ -1,52 +1,86 @@
|
||||
Environnement de développement Docker pour démarrer un nouveau projet Symfony5
|
||||
==================================
|
||||
|
||||
# Présentation
|
||||
On repart de 1_docker_ready, et la procédure d'installation s'adapte comme ceci:
|
||||
|
||||
L'objectif de ce dépôt est de proposer et de faire évoluer une configuration de départ pour démarrer très simplement un nouveau projet Symfony dans des conteneurs Docker.
|
||||
# Adaptations de la procédure d'installation
|
||||
|
||||
En suivant pas-à-pas les instructions à partir du chapitre "Installation", on peut démarrer en quelques minutes un nouveau projet.
|
||||
## 1. se mettre sur la bonne branche
|
||||
|
||||
Le dépôt propose plusieurs branches qui peuvent être utilisées selon le point de départ recherché:
|
||||
```bash
|
||||
$ git co -b 1_docker_ready origin/1_docker_ready
|
||||
```
|
||||
|
||||
## 1_docker_ready
|
||||
## 2. builder le projet
|
||||
|
||||
La branche `1_docker_ready` fournit juste le docker-compose.yml et les Dockerfile qui permettent de construire les conteneurs.
|
||||
```bash
|
||||
$ docker-compose build
|
||||
$ docker-compose up
|
||||
.. 221001_test3_db_1 exited with code 1
|
||||
```
|
||||
|
||||
* `$ cd my-project-dir`
|
||||
* `$ docker-compose build`
|
||||
* `$ docker-compose up -d`
|
||||
* `$ docker-compose exec -u 1000 php bash`
|
||||
## 3. parce que 'db' ne se lance pas:
|
||||
|
||||
A ce stade les commandes `composer` et `symfony` sont disponibles pour lancer la création du projet.
|
||||
Après ça on choisira dans le fichier `app/.env` le type de base de donnée. Un conteneur est prévu pour utiliser postgresql.
|
||||
```bash
|
||||
$ docker-compose rm db
|
||||
$ sudo rm -rf ./data
|
||||
$ docker-compose up db
|
||||
```
|
||||
|
||||
## 2_symfony_demo
|
||||
## 4. entrer dans php
|
||||
|
||||
* commandes exécutées:
|
||||
* `$ symfony new --demo demo`
|
||||
* `$ mv demo/* . && mv demo/.* . && rmdir demo`
|
||||
```bash
|
||||
$ docker-compose exec -u 1000 php bash
|
||||
```
|
||||
|
||||
Cette branche démarre d'une installation toute prête de la demo Symfony. La db est enregistrée dans le repo dans un simple fichier sqlite (`app/data/database.sqlite`). Le conteneur docker postgresql est donc désactivé.
|
||||
## 5. create project
|
||||
|
||||
## 3_start_new_project
|
||||
```bash
|
||||
$ symfony new tadaam
|
||||
$ mv tadaam/* . && mv tadaam/.* . && rmdir tadaam
|
||||
```
|
||||
|
||||
* commandes exécutées:
|
||||
* `$ symfony new myproject`
|
||||
* `$ mv myproject/* . && mv myproject/.* . && rmdir myproject`
|
||||
* `composer require annotations twig orm form form validator maker-bundle security-csrf \
|
||||
&& composer require --dev profiler`
|
||||
* Adapt querystring in `./app/.env`:
|
||||
```
|
||||
--- DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8"
|
||||
+++ DATABASE_URL="postgresql://postgres:secret@db:5432/postgres?serverVersion=12&charset=utf8"
|
||||
```
|
||||
* Create database schema: `bin/console doctrine:schema:create`
|
||||
* `$ composer require symfony/webpack-encore-bundle` and `$ yarn install --force`
|
||||
* `$ yarn add sass sass-loader`
|
||||
* `$ composer require --dev symfony/debug-bundle symfony/var-dumper`
|
||||
## 6. composer require la base
|
||||
|
||||
## 4_start_with_vue
|
||||
```bash
|
||||
$ composer require doctrine/annotations twig/twig doctrine/orm symfony/orm-pack symfony/form symfony/maker-bundle symfony/security-csrf
|
||||
```
|
||||
|
||||
Pour démarrer un projet avec des composants vues
|
||||
## 7. connexion postgresql
|
||||
|
||||
modifier DATABASE_URL dans app/.env :
|
||||
```bash
|
||||
+++ DATABASE_URL="postgresql://postgres:secret@db:5432/postgres?serverVersion=12&charset=utf8"
|
||||
```
|
||||
|
||||
et dans le conteneur php :
|
||||
```bash
|
||||
$ bin/console doctrine:schema:create
|
||||
```
|
||||
|
||||
## 8. composer require, la suite..
|
||||
|
||||
```bash
|
||||
$ composer require symfony/yaml symfony/twig-bridge symfony/validator
|
||||
|
||||
$ composer require symfony/asset symfony/expression-language symfony/security-http symfony/translation symfony/web-link egulias/email-validator symfony/expression-language symfony/intl symfony/translation
|
||||
|
||||
$ composer require --dev symfony/profiler-pack symfony/debug-bundle symfony/var-dumper
|
||||
```
|
||||
|
||||
## 9. Yarn
|
||||
|
||||
```bash
|
||||
$ composer require symfony/webpack-encore-bundle
|
||||
```
|
||||
|
||||
mettre en place le script qui lance docker node, le lancer pour entrer dans le conteneur node:
|
||||
```bash
|
||||
$ yarn install --force
|
||||
$ yarn add sass sass-loader
|
||||
$ yarn encore dev-server
|
||||
```
|
||||
|
||||
## 10. c'est fait
|
||||
|
||||
le site est disponible sur http://localhost:8000
|
||||
|
@ -1,26 +0,0 @@
|
||||
<template>
|
||||
<div id="app">
|
||||
<!-- la balise contacts corresponds au composant contacts passé ci-dessous -->
|
||||
<contacts></contacts>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// importe dans contacts les datas d'une requête rest GET en json
|
||||
import contacts from './Contacts.vue'
|
||||
|
||||
export default {
|
||||
name: 'app',
|
||||
components: {
|
||||
// passe l'objet contacts comme composant
|
||||
contacts,
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#app {}
|
||||
.container {}
|
||||
.componentItem{}
|
||||
</style>
|
||||
|
@ -1,57 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<table>
|
||||
<tr v-for="contact in contacts">
|
||||
<td>{{contact.firstname}}</td>
|
||||
<td>{{contact.lastname}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
<button @click="addContact">Add</button>
|
||||
<label>#contacts {{counter}}</label>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script> // la balise script dans ce fichier vue, est un peu comme une classe Contacts
|
||||
// namespace test1/Contacts
|
||||
import Vue from 'vue'
|
||||
import VueResource from 'vue-resource'
|
||||
|
||||
// injection de dépendance pour dealer du REST json
|
||||
Vue.use(VueResource)
|
||||
|
||||
export default{
|
||||
// initialise les données
|
||||
data () {
|
||||
return { // constructeur du tableau-objet vide 'contacts' qui est passé à App.vue
|
||||
contacts: []
|
||||
}
|
||||
},
|
||||
// Rest GET json
|
||||
http: {
|
||||
root: 'http://localhost:3000'
|
||||
},
|
||||
// méthodes
|
||||
methods: {
|
||||
addContact(){
|
||||
this.contacts.push({"firstname":"Lisa", "lastname":"Simpson", "age":"10"})
|
||||
}
|
||||
},
|
||||
// traitements
|
||||
computed:{
|
||||
counter(){
|
||||
return this.contacts.length
|
||||
}
|
||||
},
|
||||
// on dirait un setter
|
||||
mounted() {
|
||||
this.$resource('contacts').get().then((response) => {
|
||||
this.contacts = response.data
|
||||
}, (response) => {
|
||||
console.log('erreur', response);
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
@ -1,8 +0,0 @@
|
||||
import Vue from 'vue'
|
||||
import App from './components/App.vue'
|
||||
|
||||
new Vue({
|
||||
el: '#app',
|
||||
render: h => h(App)
|
||||
})
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,3 +0,0 @@
|
||||
framework:
|
||||
assets:
|
||||
json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'
|
@ -0,0 +1,5 @@
|
||||
when@dev:
|
||||
debug:
|
||||
# Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser.
|
||||
# See the "server:dump" command to start a new server.
|
||||
dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%"
|
@ -1,4 +0,0 @@
|
||||
debug:
|
||||
# Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser.
|
||||
# See the "server:dump" command to start a new server.
|
||||
dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%"
|
@ -1,6 +0,0 @@
|
||||
web_profiler:
|
||||
toolbar: true
|
||||
intercept_redirects: false
|
||||
|
||||
framework:
|
||||
profiler: { only_exceptions: false }
|
@ -1,20 +0,0 @@
|
||||
doctrine:
|
||||
orm:
|
||||
auto_generate_proxy_classes: false
|
||||
metadata_cache_driver:
|
||||
type: pool
|
||||
pool: doctrine.system_cache_pool
|
||||
query_cache_driver:
|
||||
type: pool
|
||||
pool: doctrine.system_cache_pool
|
||||
result_cache_driver:
|
||||
type: pool
|
||||
pool: doctrine.result_cache_pool
|
||||
|
||||
framework:
|
||||
cache:
|
||||
pools:
|
||||
doctrine.result_cache_pool:
|
||||
adapter: cache.app
|
||||
doctrine.system_cache_pool:
|
||||
adapter: cache.system
|
@ -1,3 +0,0 @@
|
||||
framework:
|
||||
router:
|
||||
strict_requirements: null
|
@ -1,4 +0,0 @@
|
||||
#webpack_encore:
|
||||
# Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)
|
||||
# Available in version 1.2
|
||||
#cache: true
|
@ -1,3 +0,0 @@
|
||||
sensio_framework_extra:
|
||||
router:
|
||||
annotations: false
|
@ -1,7 +0,0 @@
|
||||
#doctrine:
|
||||
# dbal:
|
||||
# # Overrides the database name in the test environment only
|
||||
# # "host", "port", "user", & "password" can also be set to override their respective url parts
|
||||
# #
|
||||
# # If you're using ParaTest, "TEST_TOKEN" is set by ParaTest otherwise nothing is appended to the database name.
|
||||
# dbname: main_test%env(default::TEST_TOKEN)%
|
@ -1,4 +0,0 @@
|
||||
framework:
|
||||
test: true
|
||||
session:
|
||||
storage_id: session.storage.mock_file
|
@ -1,2 +0,0 @@
|
||||
twig:
|
||||
strict_variables: true
|
@ -1,3 +0,0 @@
|
||||
framework:
|
||||
validation:
|
||||
not_compromised_password: false
|
@ -1,6 +0,0 @@
|
||||
web_profiler:
|
||||
toolbar: false
|
||||
intercept_redirects: false
|
||||
|
||||
framework:
|
||||
profiler: { collect: false }
|
@ -1,2 +0,0 @@
|
||||
#webpack_encore:
|
||||
# strict_mode: false
|
@ -0,0 +1,13 @@
|
||||
framework:
|
||||
default_locale: en
|
||||
translator:
|
||||
default_path: '%kernel.project_dir%/translations'
|
||||
fallbacks:
|
||||
- en
|
||||
# providers:
|
||||
# crowdin:
|
||||
# dsn: '%env(CROWDIN_DSN)%'
|
||||
# loco:
|
||||
# dsn: '%env(LOCO_DSN)%'
|
||||
# lokalise:
|
||||
# dsn: '%env(LOKALISE_DSN)%'
|
@ -1,2 +1,6 @@
|
||||
twig:
|
||||
default_path: '%kernel.project_dir%/templates'
|
||||
|
||||
when@test:
|
||||
twig:
|
||||
strict_variables: true
|
||||
|
@ -0,0 +1,15 @@
|
||||
when@dev:
|
||||
web_profiler:
|
||||
toolbar: true
|
||||
intercept_redirects: false
|
||||
|
||||
framework:
|
||||
profiler: { only_exceptions: false }
|
||||
|
||||
when@test:
|
||||
web_profiler:
|
||||
toolbar: false
|
||||
intercept_redirects: false
|
||||
|
||||
framework:
|
||||
profiler: { collect: false }
|
@ -1,3 +0,0 @@
|
||||
_errors:
|
||||
resource: '@FrameworkBundle/Resources/config/routing/errors.xml'
|
||||
prefix: /_error
|
@ -1,7 +0,0 @@
|
||||
web_profiler_wdt:
|
||||
resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'
|
||||
prefix: /_wdt
|
||||
|
||||
web_profiler_profiler:
|
||||
resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'
|
||||
prefix: /_profiler
|
@ -0,0 +1,4 @@
|
||||
when@dev:
|
||||
_errors:
|
||||
resource: '@FrameworkBundle/Resources/config/routing/errors.xml'
|
||||
prefix: /_error
|
@ -0,0 +1,8 @@
|
||||
when@dev:
|
||||
web_profiler_wdt:
|
||||
resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'
|
||||
prefix: /_wdt
|
||||
|
||||
web_profiler_profiler:
|
||||
resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'
|
||||
prefix: /_profiler
|
@ -0,0 +1,8 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
###> doctrine/doctrine-bundle ###
|
||||
database:
|
||||
ports:
|
||||
- "5432"
|
||||
###< doctrine/doctrine-bundle ###
|
@ -0,0 +1,21 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
###> doctrine/doctrine-bundle ###
|
||||
database:
|
||||
image: postgres:${POSTGRES_VERSION:-14}-alpine
|
||||
environment:
|
||||
POSTGRES_DB: ${POSTGRES_DB:-app}
|
||||
# You should definitely change the password in production
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!}
|
||||
POSTGRES_USER: ${POSTGRES_USER:-app}
|
||||
volumes:
|
||||
- db-data:/var/lib/postgresql/data:rw
|
||||
# You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data!
|
||||
# - ./docker/db/data:/var/lib/postgresql/data:rw
|
||||
###< doctrine/doctrine-bundle ###
|
||||
|
||||
volumes:
|
||||
###> doctrine/doctrine-bundle ###
|
||||
db-data:
|
||||
###< doctrine/doctrine-bundle ###
|
@ -1,22 +1,9 @@
|
||||
<?php
|
||||
|
||||
use App\Kernel;
|
||||
use Symfony\Component\Dotenv\Dotenv;
|
||||
use Symfony\Component\ErrorHandler\Debug;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
require dirname(__DIR__).'/vendor/autoload.php';
|
||||
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
|
||||
|
||||
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env');
|
||||
|
||||
if ($_SERVER['APP_DEBUG']) {
|
||||
umask(0000);
|
||||
|
||||
Debug::enable();
|
||||
}
|
||||
|
||||
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
|
||||
$request = Request::createFromGlobals();
|
||||
$response = $kernel->handle($request);
|
||||
$response->send();
|
||||
$kernel->terminate($request, $response);
|
||||
return function (array $context) {
|
||||
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
|
||||
};
|
||||
|
@ -1,26 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controller;
|
||||
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
|
||||
/**
|
||||
* Class DefaultController
|
||||
*
|
||||
* @package App\Controller
|
||||
*/
|
||||
class DefaultController extends AbstractController
|
||||
{
|
||||
/**
|
||||
* This render test template that uses vueJS
|
||||
*
|
||||
* @Route("/default", name="default")
|
||||
*/
|
||||
public function app(): Response
|
||||
{
|
||||
return $this->render('default/app.html.twig');
|
||||
}
|
||||
}
|
||||
|
@ -1,19 +0,0 @@
|
||||
{% extends 'base.html.twig' %}
|
||||
|
||||
{% block title %}{{'My VueJS template'}}{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div class="container">
|
||||
<h1>{{'My VueJS template'}}</h1>
|
||||
|
||||
block vue
|
||||
{% verbatim %}
|
||||
<div id="app" data-name="{{ app.user.username }}"></div>
|
||||
{% endverbatim %}
|
||||
end
|
||||
|
||||
{{ encore_entry_script_tags('app') }}
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue