web-dev-qa-db-fra.com

Symfony2 - création de son propre bundle - stratégie de projet et git

Nous envisageons de créer notre propre ensemble common pour le mappage des entités et des services à utiliser dans quelques applications distinctes. Un paquet doit être facile à modifier, exécuter, inclure et tester. Je connais Meilleures pratiques pour la structuration des ensembles , mais je ne sais pas quelle stratégie git utiliser pour le développement.

Devrions-nous créer common bundle en tant que projet entier et valider le référentiel entier sur notre serveur git, ou vaut-il mieux démarrer le contrôle de code source uniquement pour la racine de common bundle et afficher uniquement son contenu? Je vois cette approche dans les bundles disponibles sur github, mais je ne connais pas le moyen facile et confortable de développer des bundles de cette façon.

77
ex3v

Créer un nouveau projet symfony vide

php composer.phar create-project symfony/framework-standard-edition demo/ 2.4.1
cd demo

Générer un nouveau paquet

(par exemple src/Company/DemoBundle)

php app/console generate:bundle
cd src/Company/DemoBundle/

Lancez votre dépôt github dans src/Company/DemoBundle

git init
touch README.md
git add .
git commit -m "initial commit"
git remote add Origin https://github.com/YourAccount/DemoBundle.git
git Push -u Origin master

Ajouter un fichier composer.json

src/Company/DemoBundle/composer.json:

{
    "name" : "company/demobundle",
    "description" : "A demo bundle",
    "type" : "symfony-bundle",
    "authors" : [{
        "name" : "demo",
        "email" : "[email protected]"
    }],
    "keywords" : [
        "demo bundle"
    ],
    "license" : [
        "MIT"
    ],
    "require" : {
    },
    "autoload" : {
        "psr-0" : {
            "Company\\DemoBundle" : ""
        }
    },
    "target-dir" : "Company/DemoBundle",
    "repositories" : [{
    }],
    "extra" : {
    "branch-alias" : {
            "dev-master" : "some_version-dev"
        }
    }
}

Maintenant vous avez la structure de base de votre paquet

Utilisez-le dans un autre projet

composer.json:

    [...]
    "require" : {
        [...]
        "company/demobundle" : "dev-master"
    },
    "repositories" : [{
        "type" : "vcs",
        "url" : "https://github.com/Company/DemoBundle.git"
    }],
    [...]

Faire:

curl -sS https://getcomposer.org/installer | php
php composer.phar update company/demobundle

app/AppKernel:

new Company\DemoBundle\CompanyDemoBundle(),

Travailler dessus

  • Vous pouvez cloner votre DemoBundle dans le src/Company dossier, puis installez-le manuellement
  • Vous pouvez utiliser un lien symbolique

Conclusion

Vous pouvez développer et tester votre bundle dans votre premier projet et l'utiliser avec github et composer dans votre second projet.

174
VBee

Un point important à savoir est que vous pouvez vous engager dans votre référentiel à partir du répertoire/vendor. En effet, composer crée une deuxième télécommande appelée "composeur" pour chaque bundle (ou package) qui fait référence au référentiel du package, afin que vous puissiez travailler dessus dans un contexte de travail. La pratique consiste à enregistrer votre paquet dans votre composer.json pour tous vos projets et à valider à partir de votre /vendor/MyCompany/MyBundle, de tout projet.

Pour preuve, lancez git remote -v de n’importe quel lot chez votre fournisseur.

La mauvaise pratique serait de considérer votre bundle comme un projet séparé et d’avoir des liens symboliques avec celui-ci. La principale raison pour laquelle il s’agit d’une mauvaise pratique est que vous ne pourrez pas déclarer de dépendances avec votre bundle. De plus, vous aurez des difficultés avec le déploiement de vos projets.

16
flouflou2000

Dans Symfony4, la commande generate:bundle N'est plus disponible. Au lieu de cela, vous pouvez suivre ce tutoriel .

Commencez par créer un projet avec:

composer create-project symfony/website-skeleton my-project

Ensuite, créez un répertoire my-project/lib/AcmeFooBundle/src. Ici vivra votre paquet. L'espace de noms pour ce répertoire sera Acme\AcmeFooBundle. Ainsi, si vous créez une classe de service à lib/AcmeFooBundle/src/Service/Foo.php, Son espace de noms sera Acme\AcmeFooBundle\Service.

Maintenant, nous devons dire à composer l'autoloader de rechercher de nouvelles classes dans ce nouveau répertoire. Nous devons donc éditer composer.json _ autoload section:

"autoload": {
    "psr-4": {
        "Acme\\AcmeFooBundle\\": "lib/AcmeFooBundle/src/",
    }
}, 

et lancez composer dump-autoload.

Il ne vous reste plus qu'à ajouter votre classe d'ensembles à config/bundles.php:

return [
    ...
    Acme\AcmeFooBundle\AcmeFooBundle::class => ['all' => true],
];

et injection de dépendance pour charger la configuration à partir de votre bundle.

Si vous souhaitez vérifier vos services avant d'ajouter l'injection de dépendance, vous pouvez simplement les autoriser via config/services.yml:

services:
    ...
    Acme\AcmeFooBundle\Services\Foo: ~

C'est tout. Suivez meilleures pratiques et continuez à coder.

PS: J'ai publié un article avec quelques astuces pour développer des bundles réutilisables Symfony .

3
Manolo