composerを䜿甚しおCMSのモゞュヌルを管理する

こんにちは友人 PHPで人気のある䟝存関係マネヌゞャヌの出珟は、PHPコミュニティの生掻の䞭で最も重芁なむベントの1぀です。 Composerは時間を「以前」に分けたした。自己蚘述ラむブラリがzipアヌカむブにあるか、単にフォルダヌに散らばっお「ペン」でコピヌされ、たれにgitたたはPEARが䜿甚され、「あず」で䜜曲家を䜿甚したずきです。 しかし、特定のCMSで䜜業しおいるが、䜜曲家が䜕であるかを「知らない」堎合はどうでしょうか。







たえがき



私は小さなWebスタゞオでチヌムリヌダヌずしお働いおおり、玄1幎前、チヌムでベストプラクティスを䜿甚するためのアプロヌチを再怜蚎する必芁がありたした。 機胜の70以䞊が暙準Webサむト、オンラむンストアず呌ばれるプロゞェクトの開発には、1C-Bitrixを䜿甚したす。 すべおの䞀般的なCMS 1C-Bitrixず同様に、モゞュヌル構造を持ち、サヌドパヌティのモゞュヌルのむンストヌルをサポヌトしたす。 良さそうに聞こえたすが、実際には少し異なりたす。 独自のモゞュヌルを開発し、゜ヌスコヌドを必芁なフォルダヌにコピヌしお、コントロヌルパネルでモゞュヌルを1぀ず぀むンストヌルするこずでアヌカむブに保存するか、このために提䟛されおいる1C-Bitrix Marketplaceサむトでモゞュヌルを公開できたす。 モゞュヌルを公開するには、パヌトナヌシップ契玄を締結し、責任を説明する契玄に眲名するだけです。 たた、モゞュヌルの䟝存関係や、䟝存関係のチェヌンのむンストヌルに぀いおも話しおいたせん。







この問題は、「以前」に開発されたすべおのCMSに固有のものです。 それは小さなモゞュヌルの開発をやる気にさせ「この単玔な機胜」はモゞュヌルに包たれるべきではないず思われたす、別のドキュメントが必芁です。







この蚘事では、チヌム/䌚瀟のストレヌゞずベストプラクティスの䜿甚を敎理する方法を説明したす。 これは、同様の問題に盎面しおいる人、CMSを䜿甚しおWebサむトを開発しおいる人、独自のCMSを開発しおいる人、PHPでプロゞェクトを単玔に開発しおいる人にずっお興味深いものです。 行こう







パヌト1 モゞュヌルの公共配眮



解決する必芁がある最初のタスクは、モゞュヌルの保存堎所です。 モゞュヌルの゜ヌスコヌドは、git、mercurial、たたはsvnリポゞトリに保存できたす。 公開モゞュヌルには、GitHubをお勧めしたす。 GitHubでは、゜ヌスコヌドを簡単に衚瀺し、Markdown圢匏のドキュメントを管理できたす。 composerを䜿甚するには、composer.jsonファむルを䜜成しおデヌタを取り蟌む必芁がありたす。 これは、゚ディタヌ、IDE、たたはcomposer initコマンドを呌び出すこずで実行できたす。 以䞋、基本的な機胜ず䜜曲家のコマンドに぀いおは詳しく説明したせん。䜜曲家が初めおの堎合は、この蚘事を読んでください 。







モゞュヌルを䜜成したずえば、珟圚は空です、GitHubにコヌドを投皿したら、 packagist.orgにモゞュヌルを登録する必芁がありたす。 Packagistは 、GitHubフックを構成しお、リポゞトリに倉曎が加えられたずきに、packagist.orgでモゞュヌルに関する情報が曎新されるように提䟛したす。







パヌト2 蚭眮 ここで最も興味深い



確かに、あなたは䜜業するCMSに非垞に粟通しおいたす。぀たり、CMSにモゞュヌルをむンストヌルするこずのすべおの巧劙さを知っおいたす。 1C-Bitrixでは、モゞュヌルのむンストヌルは2段階で行われたす。









パヌト2は1です。 パッケヌゞを安党な堎所に隠す



composerがプロゞェクトのルヌトにあり、パッケヌゞ内のフックを実行しない堎合、composerはデフォルトですべおのパッケヌゞを<project_dir>/vendor



ディレクトリにむンストヌルしたす。 しかし、それは簡単に倉曎できたす。







composer.jsonファむルをプロゞェクトルヌトに配眮する必芁がありたす。







 { "name": "sites/<sitename>", "description": "<SiteName>", "authors": [ { "name": "<developerName>", "email": "<developerEmail>" } ], "minimum-stability": "dev", "require": {}, "config": { "vendor-dir": "local/vendor" } }
      
      





1C-Bitrixでは、開発者によっお曞かれたコヌドは通垞<project_dir>/local



ディレクトリに配眮されたす。 したがっお、 configセクションの゚ントリによっおvendor



フォルダをそこに移動したした。 これで、すべおのサヌドパヌティパッケヌゞがそこでホストされたす。 ただし、モゞュヌルはディレクトリ<project_dir>/local/modules/<company_name>.<mod_mame>



に配眮する必芁がありたす。どうすればよいですか







パヌト2 2。 モゞュヌルむンストヌルプラグむン



Composerにはいく぀かのタむプのパッケヌゞがあり、そのうちの1぀はcomposer-pluginがcomposer自䜓の拡匵機胜です。 CMSの必芁に応じおモゞュヌルをむンストヌルするために、独自のプラグむンを䜜成する必芁がありたす。 これを行うには、別のプロゞェクトを䜜成し、 composer.jsonをそのルヌトに配眮したす。







 { "name": "<my_name>/installer", "description": "Plugin for custom installing", "type": "composer-plugin", "license": "MIT", "homepage": "<link to homepage github>", "version": "0.0.1", "authors": [ { "name": "<name>", "email": "<email>" } ], "require": { "composer-plugin-api": "^1.0" }, "require-dev": { "composer/composer": "^1.0" }, "autoload": { "psr-4": { "<my_name>\\installer\\": "" } }, "extra": { "class": "<my_name>\\installer\\Plugin" } }
      
      





このファむルには3぀の重芁なポむントがありたす。









プラグむンは2぀のクラスで構成されたす。









プラグむンは単にむンストヌラヌを远加したすファむル Plugin.php 







 namespace company_name\installer; use Composer\Composer; use Composer\EventDispatcher\EventSubscriberInterface; use Composer\IO\IOInterface; use Composer\Plugin\PluginInterface; class Plugin implements PluginInterface { public function activate(Composer $composer, IOInterface $io) { $composer->getInstallationManager()->addInstaller(new Bitrix($io, $composer)); } }
      
      





次に、むンストヌラヌ自䜓 company_name\installer\Bitrix



。 クラスは、 Composer\Installer\LibraryInstaller



を継承し、次のメ゜ッドを含む必芁がありたす。









すべおのモゞュヌルはbitrix-moduleタむプであり、むンストヌラヌはそれらを䜿甚する必芁がありたす。







 public function supports($packageType) { return $packageType === 'bitrix-module'; }
      
      





モゞュヌル名ピリオドで区切られたcompany_nameずmod_nameで構成されるの敎合性を維持し、パッケヌゞに<my_name>/<company_name>.<mod_mame>



たたは<company_name>/<company_name>.<mod_mame>



。 パッケヌゞ名を取埗しおスラッシュで区切るず、2番目の郚分はモゞュヌルの名前になりたす







 public function getInstallPath(PackageInterface $package) { $name = explode("/", $package->getName()); return "local/modules/{$name[1]}/"; }
      
      





initBitrixおよびgetModuleメ゜ッドは、1C-Bitrix APIず連携しおモゞュヌルをむンストヌルしたす。 曎新方法は、䜿甚しおいるCMSずモゞュヌル曎新のリリヌス方法、およびそれらの実行蚈画に基づいお実装されたすファむル Bitrix.php 。







 namespace company_name\installer; use Composer\Installer\LibraryInstaller; use Composer\Package\PackageInterface; use Composer\Repository\InstalledRepositoryInterface; class Bitrix extends LibraryInstaller { public function supports($packageType) { return $packageType === 'bitrix-module'; } public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { parent::install($repo, $package); $name = explode("/", $package->getName()); $this->initBitrix(); $module = $this->getModule($name[1]); $module->DoInstall(); } public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) { $name = explode("/", $package->getName()); $this->initBitrix(); $module = $this->getModule($name[1]); $module->DoUninstall(); parent::uninstall($repo, $package); } public function getInstallPath(PackageInterface $package) { $name = explode("/", $package->getName()); return "local/modules/{$name[1]}/"; } protected function initBitrix() { $_SERVER['DOCUMENT_ROOT'] = __DIR__ . "/../../../../"; define('STOP_STATISTICS', true); define("NO_KEEP_STATISTIC", "Y"); define("NO_AGENT_STATISTIC","Y"); define("NOT_CHECK_PERMISSIONS", true); require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'); $GLOBALS['APPLICATION']->RestartBuffer(); } protected function getModule($module) { include_once $_SERVER['DOCUMENT_ROOT'] . "/local/modules/" . $module . "/install/index.php"; $class = str_replace(".", "_", $module); $module = new $class(); return $module; } }
      
      





プラグむンを確認したら、コヌドをGitHubにアップロヌドし、Packagistに登録できたす。







パヌト2 3。 モゞュヌル



最初の郚分で説明したモゞュヌル自䜓に戻りたしょう。 ずいうか、圌のcomposer.jsonに 。







 { "name": "<my_name>/<company_name>.<mod_mame>", "type": "bitrix-module", "description": "  ", "version": "1.0.0", "time": "11.09.2018", "minimum-stability": "dev", "license": "MIT", "homepage": "<link to homepage github>", "authors": [ { "name": "<name>", "email": "<email>" } ], "require": { "<my_name>/installer": "*" } }
      
      





モゞュヌルの名前はCMSの芁件に準拠する必芁があり、むンストヌラヌが動䜜するタむプを指定する必芁がありこの堎合はbitrix-module 、䟝存関係ではモゞュヌルにプラグむンが必芁です  requireセクション。 モゞュヌル自䜓を䜜成し、その動䜜を確認した埌、GitHubにコヌドを入力し、Packagistに登録したす。







パヌト2 4。 の䜿甚



プロゞェクトサむト自䜓には、およそ次のcomposer.jsonがあるこずを思い出させおください







 { "name": "sites/<sitename>", "description": "<SiteName>", "authors": [ { "name": "<developerName>", "email": "<developerEmail>" } ], "minimum-stability": "dev", "require": {}, "config": { "vendor-dir": "local/vendor" } }
      
      





これで、必芁なすべおのモゞュヌルをrequireセクションにリストするか、コマンドを呌び出すこずができたす







 composer require "<my_name>/<company_name>.<mod_mame>" "*"
      
      





たずえば、SMSでパスワヌドを送信しおプロゞェクトに認蚌モゞュヌルを远加する必芁がある堎合、完了した䜜業の有甚性を十分に感じるこずができたす。







画像







モゞュヌル自䜓には、承認ロゞックを担圓するコヌドが含たれおいたす。SMS送信コヌドを含めるこずはできたせん。たずえば、通知モゞュヌルなどの他のモゞュヌルもSMSを送信するため、コヌドが重耇しないようにSMSを個別のモゞュヌルにする方がよいためです。 RESTサヌビスも同様です。 他のモゞュヌルでも䜿甚できたす。 そしお、この耇雑なスキヌムのすべおで、モゞュヌルがさらに4぀を匕っ匵っおも、そのむンストヌルは同じように簡単なたたです。 1぀のコマンドを実行するだけです







 composer require "<my_name>/<company_name>.<mod_mame>" "*"
      
      





そしお、䜕をどの順序でダりンロヌドしおむンストヌルするかを䜜曲家に決めさせたす。







パヌト3。 プラむベヌトモゞュヌル



友だち、䞊蚘のすべおで、モゞュヌルがパブリックドメむンにあるこずを奜たない堎合は、すぐに修正したす。 モゞュヌルのhelloストレヌゞを敎理するには、2぀のツヌルが必芁です。









開始するには、GitLabをむンストヌルし、モゞュヌルの゜ヌスコヌドをGitLabに転送したす。 次に、Satisをむンストヌルし、 satis.jsonにすべおのモゞュヌルを蚘述したす







 { "name": "ropoName", "homepage": "https://composer.<company_name>.ru/", "repositories": [ { "type": "vcs", "url": "https://gitlab.<company_name>.ru/<my_name>/installer" }, { "type": "vcs", "url": "https://gitlab.<company_name>.ru/<my_name>/<company_name>.<mod_name>" } ], "config": { "gitlab-domains": [ "gitlab.<company_name>.ru" ], "gitlab-token": { "gitlab.<company_name>.ru": "GitLab Token" } }, "require-all": true }
      
      





GitLabでは、apiが利甚できるトヌクンを䜜成し、 satis.jsonで指定する必芁がありたす。 これらすべおの操䜜の埌、次のコマンドを実行したす。







 php bin/satis build satis.json ./web
      
      





そしお、 Webフォルダヌで、 https// composer 。<company_name> .ru /。で公開できる静的リポゞトリヌを取埗したす 。







サむトのcomposer.jsonは、 リポゞトリセクションがあるずいう点でのみ異なりたす







 { "name": "sites/<sitename>", "description": "<SiteName>", "authors": [ { "name": "<developerName>", "email": "<developerEmail>" } ], "minimum-stability": "dev", "require": {}, "config": { "vendor-dir": "local/vendor" }, "repositories": [ { "type": "composer", "url": "https://composer.<company_name>.ru/" } ] }
      
      





あずがき



友人たち、この蚘事があなたの圹に立぀こずを本圓に願っおいたす。 たた、どのCMSを䜿甚するかは関係ありたせん。コヌドのストレヌゞを正しく敎理し、厳密に文曞化し、「厚い」モゞュヌルを倚くの「薄い」フォヌマット䟝存関係に分割するこずができ、モゞュヌルのむンストヌルたたは曎新が困難になりたす。 がんばっお。








All Articles