web-dev-qa-db-ja.com

Symfony2-独自のベンダーバンドルの作成-プロジェクトとGit戦略

エンティティマッピング用の独自のcommonバンドルと、いくつかの個別のアプリ内で使用するサービスを作成することを検討しています。バンドルは、変更、実行、組み込み、テストが簡単でなければなりません。 バンドルを構築するためのベストプラクティス については知っていますが、開発に関してどのgit戦略を使用するのかわかりません。

commonバンドルをプロジェクト全体として作成し、リポジトリ全体をgitサーバーにコミットする必要がありますか、それともcommonバンドルのルートに対してのみソース管理を開始し、そのコンテンツのみをプッシュする方がよいでしょうか?このアプローチはgithubで利用可能なバンドルにありますが、そのようにバンドルを開発する簡単で快適な方法はわかりません。

77
ex3v

新しい空のsymfonyプロジェクトを作成します

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

新しいバンドルを生成する

(たとえば、src/Company/DemoBundle

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

src/Company/DemoBundleでgithubリポジトリを初期化します

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

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"
        }
    }
}

これで、バンドルの基本構造ができました。

別のプロジェクトで使用する

composer.json:

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

行う:

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

app/AppKernel:

new Company\DemoBundle\CompanyDemoBundle(),

それに取り組みます

  • DemoBundleをsrc/Companyフォルダーに複製してから、手動でインストールできます
  • シンボリックリンクを使用できます

結論

最初のプロジェクトでバンドルを開発およびテストし、2番目のプロジェクトでgithubおよびcomposerで使用できます。

174
VBee

知っておくべき重要な点は、/ vendorからリポジトリにコミットできることです。実際、composerは、作業コンテキストで作業できるように、パッケージのレポを参照する各バンドル(またはパッケージ)に対して「composer」と呼ばれる2番目のリモートを作成します。すべてのプロジェクトについてcomposer.jsonにパッケージを登録し、/vendor/MyCompany/MyBundle、任意のプロジェクトから。

証拠として、単にgit remote -vベンダーの任意のバンドルから。

悪い習慣は、バンドルを別のプロジェクトと見なし、それとシンボリックリンクを作成することです。これが悪い習慣である主な理由は、バンドルで依存関係を宣言できないことです。さらに、プロジェクトの展開には多少の困難が伴います。

16
flouflou2000

Symfony4では、generate:bundleコマンドは使用できなくなりました。代わりに、 このチュートリアル に従うことができます。

最初にプロジェクトを作成します:

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

次に、my-project/lib/AcmeFooBundle/srcディレクトリを作成します。こちらがバンドルのライブです。このディレクトリの名前空間はAcme\AcmeFooBundleになるため、lib/AcmeFooBundle/src/Service/Foo.phpでサービスクラスを作成すると、その名前空間はAcme\AcmeFooBundle\Serviceになります。

ここで、composer= autoloaderにその新しいディレクトリで新しいクラスを探すように指示する必要があるため、composer.jsonautoloadセクションを編集する必要があります。

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

composer dump-autoloadを実行します。

これで、バンドルクラスをconfig/bundles.phpに追加するだけで済みます。

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

バンドルから設定をロードするための依存性注入。

依存性注入を追加する前にサービスを確認する場合は、config/services.ymlでサービスを自動配線できます。

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

それで全部です。 ベストプラクティス に従って、コーディングを続けます。

PS: Symfonyの再利用可能なバンドルを開発するためのいくつかのヒント の投稿を公開しました。

3
Manolo