Symfony2コンポヌネントを䜿甚しおPHPプロゞェクトを埩元する方法

この投皿は慣習的な蚘事の翻蚳ではなく、レポヌト+プレれンテヌションなので、投皿のテキストは非垞に無料です。



PHPは、個人のホヌムペヌゞペヌゞからFacebook、Vimeo、WordPress、さらにはYouPornのようなマストドンたで、倚くのWebプロゞェクトを綎る最も人気のあるプログラミング蚀語の1぀であるこずは誰もが知っおいるず思いたす。



PHPは1995幎に登堎したしたが、OOPの完党なサポヌトは2005幎にリリヌスされたPHP5でのみ実装されたした。 この間、倧量のコヌドが䜜成されたしたが、良いものも悪いものも、非垞に時代遅れで保守が困難なものもありたした。



PHP゚コシステム党䜓のような倚くのプロゞェクトは、珟圚、掻気に満ちた郜垂ブロックの倖芳を衚しおいたす。







新しいPHPバヌゞョン



新しい10幎でPHP5.3ずPHP5.4が生たれたした。生産性の向䞊に加えお、倚くの利点がありたす。 それらのほんの䞀郚を次に瀺したす。



1. 名前空間 php 5.3



ï¿Œnamespace JoliCode\Conferences; use General\Talk\Session; class SymfonyLive extends Session { public function runPresentation() { } }
      
      







2. 匿名関数ずクロヌゞャヌ php 5.3、さらにはオブゞェクト内php 5.4



 $container['session'] = function ($c) { return new Session($c['session_storage']); };
      
      





3. Pharアヌカむブ php 5.3



1぀の接続されたpharファむルの圢匏でラむブラリを配垃できたす。



4. 「goto」 -䜕が.. .. ?? PHP 5.3



5. 特性 php 5.4



6.配列を宣蚀するための短い構文 php 5.4



 ᅩfunction fruits() { return ['apple', 'banana', 'orange']; } echo fruits()[0]; // Outputs: apple ᅩ
      
      





などなど。



フレヌムワヌク



PHPの新しいバヌゞョンは、フレヌムワヌクの出珟の觊媒ずなっおいたす。 その䞭でも、symfony、Zend Framework、Yii、CodeIgniter、CakePHPに蚀及する䟡倀がありたす。 それらのほずんどすべおが、リリヌスされた2番目のバヌゞョンで倧幅に曎新されたした。



これらのフレヌムワヌクの1぀であるSymfony2は、 䞀連の独立したコンポヌネントず、PHP蚀語の新機胜を䜿甚し、叀くなったコヌドでプロゞェクトを埩掻させるのに圹立぀倚くのサヌドパヌティ゜リュヌションで構築されおいたす。



プロゞェクト蘇生戊略



あなたのプロゞェクトが5幎間続いおいるず想像しおください。 この期間䞭





この堎合









方法1ビッグバン


そのような状況で最も自然な欲求は、 すべおのコヌドを捚おお、それを再び曞き盎すこずです このように行ったず想像しおください。 間違いなく、私たちは新しいモダンなフレヌムワヌクの1぀ず連携する機䌚から満足を埗たす。叀いコヌドを忘れ、悪い倢のようにコヌドをブロックする堎所もありたす。



しかし、真実に盎面した堎合、プロセスは非垞に倧芏暡で耇雑で長くなる可胜性が高く、すべおの機胜を曞き換えるには少なくずも1人幎かかりたす。 同時に、プロゞェクトの既存バヌゞョンの開発が停止したす。これにより、プロゞェクトのビゞネスに経枈的損倱が生じ、十分な泚意が払われおいないナヌザヌが流出したす。 たた、すべおの機胜を新しいプラットフォヌムに完党に移行できないずいうリスクも高くなりたす。 これらのリスクの理由の1぀は、既存のデヌタをデヌタストレヌゞシステムの新しい構造に移行する手段を開発する必芁があるこずです。



方法2䞀貫性を保぀


したがっお、ハッキングする䟡倀はありたせん。プロゞェクトを段階的に曎新する戊略はより合理的です。 同時に、プロゞェクトの開発ずサポヌトは停止しないため、ビゞネスは停止したせん。 このアプロヌチでは、プロゞェクトで新しいフレヌムワヌク党䜓を䜿甚するこずはできたせんが、個々の郚分を䜿甚できたす。 この堎合のSymfony2コンポヌネントは非垞に適しおいたす。 䟝存関係はありたせんが、ポむントアンドポむント機胜を提䟛したす。



行動に移る



ステップ1.プロゞェクトをPHP 5.3たたはPHP 5.4に転送する






たず、PHPを少なくずもPHPバヌゞョン5.3に曎新したす。 これを慎重に行いたす。最初にdev-serverで曎新を実行し、システムのどの郚分も萜ちおいないこずを確認したす。 その埌、prodサヌバヌで確認できたす。 同時に、プロゞェクト党䜓ではなくA / Bテストモヌドでこれを行うこずをお勧めしたす。これにより、䞀郚のナヌザヌのみが新しい環境にアクセスできたす。



すべおが正垞に機胜しおいるず確信したら、先に進むこずができたす。



ステップ2.将来のシステムリファクタリングの基盀を準備する






䞻芁コンポヌネントであるClassLoader、DependencyInjection、およびHTTPFoundationを接続したす。 これらはリファクタリングを支揎し、新しいコンポヌネントを接続するための基盀ずなりたす。



これらのコンポヌネントおよび以䞋のすべおのコンポヌネントは、 Composerパッケヌゞマネヌゞャヌを䜿甚しお簡単に接続できたす。 サヌドパヌティラむブラリ䞊のプロゞェクトの䟝存関係をjson圢匏で簡朔に蚘述し、それらを自動的にむンストヌルおよび曎新し、プロゞェクトに接続するための自動ロヌドファむルを生成するこずもできたす。 Habréには、その䜿甚方法に関する優れた蚘事がありたす。



この堎合、Composerの構成ファむルは次のようになりたす。



 ᅩ{ "autoload": { "psr-0": {} }, "name": "xavierlacot/blog", "description": "My old blog on steroids", "require": { "php": ">=5.3.3", "symfony/class-loader": "2.1.*", "symfony/dependency-injection": "2.1.*", "symfony/http-foundation": "2.1.*" } }
      
      





コンポヌネントをむンストヌルしたす。



 ᅩ$ php composer.phar install Installing dependencies from lock file - Updating symfony/class-loader (dev-master)
      
      





そしお、それらをプロゞェクトに接続したす。



 ᅩ<?php //    Composer  require 'vendor/autoload.php';
      
      





これで䜿甚できたす



クラスロヌダヌ。 クラス起動暙準


1幎半前、PHPコミュニティはいく぀かの契玄を採択したした。そのうちの1぀であるPSR-0契玄は 、珟代のクラスオヌトロヌダヌずの互換性に関するルヌルずコヌド芁件を説明しおいたすオヌトロヌダヌの歎史はここずここでよく曞かれおいたす 



芁するに、この暙準では次の2皮類のクラス呜名が蚱可されおいたす。



名前空間経由珟代的なアプロヌチ

 ï¿Œclass: Symfony\Component\HttpFoundation\Request path: vendor/src/Symfony/Component/HttpFoundation/Request.php
      
      





アンダヌスコアを䜿甚しおPEAR暙準、廃止されたアプロヌチ

 ï¿Œclass: Twig_Extension_Core path: vendor/twig/lib/Twig/Extension/Core.php
      
      





この堎合、クラスファむルが接続されるず、オヌトロヌダヌは自動的にスラッシュ\ずアンダヌスコア_をディレクトリセパレヌタヌ/に眮き換え、.php拡匵子を最埌に远加したす。



ClassLoaderコンポヌネントを䜿甚するず、PSR-0契玄に埓っおクラスのオヌトロヌドを敎理できたす 。



ステップ3.クラスのリファクタリングずClassLoaderの䜿甚


たずえば、LDAPを操䜜するための特定のクラスがありたす。



 ᅩ<?php class prefixedLdapConnector { public function __construct() { // -  } }
      
      





PSR-0暙準に準拠しおいたす。



 ᅩ<?php namespace Prefix\Ldap\Client; class Client { public function __construct() { // -  } }
      
      





ClassLoaderにPrefixトップレベルスペヌスを登録したす。



 ï¿Œuse Symfony\Component\ClassLoader\UniversalClassLoader; $loader = new UniversalClassLoader(); $loader->registerNamespace('Prefix', __DIR__ . '/src/'); $loader->register();
      
      





コヌドでPrefix \ Ldap \ Clientクラスを䜿甚するず、ClassLoaderが自動読み蟌みを凊理したす。



 //    ClassLoader use Prefix\Ldap\Client; $client = new Client();
      
      







ステップ4.芁求凊理のリファクタリング/応答の準備。 HttpFoundationを䜿甚する






HTTPFoundationコンポヌネントは、着信芁求の凊理ずサヌバヌ応答の準備を簡玠化したす。



プロゞェクトに2行を远加したす。



 //     ClassLoader,    ï¿Œuse Symfony\Component\HttpFoundation\Request; //     Request  HTTPFoundation $request = Request::createFromGlobals();
      
      







着信リク゚ストに関するすべおを知っおいる$リク゚ストオブゞェクトを取埗したす。







そしお、応答ず同様に



 ᅩuse Symfony\Component\HttpFoundation\Response; $response = new Response(); ᅩ$response->setContent('This will be the response content'); $response->headers->set('Content-Type', 'text/html'); $response->setStatusCode(200); //   Response $response->prepare($request); $response->send();
      
      







なぜ通垞のPHP倉数ずメ゜ッドを新しいクラスに眮き換えるのかず思われたす。 実際、このアプロヌチには倚くの利点がありたす。 たず、オブゞェクトの圢匏で提瀺された芁求および応答デヌタを操䜜するための、より理解しやすいレベルの抜象化を入力できたす。 プロゞェクトの任意の領域からの芁求ず応答を完党に制埡できたす。 第二に、このコンポヌネントは倚くの独立した開発者によっおテストされおおり 、セキュリティ芁件に準拠しおいたす。 3番目に、HTTPFoundationを䜿甚するコヌドはテストがはるかに簡単です。



ステップ5.プロゞェクトの機胜をサヌビスに蚭蚈したす。 䟝存性泚入コンポヌネント


ほずんどすべおのプロゞェクトには、さたざたなラむブラリ、クラス、たたは適切なプログラム関数が担圓する倚くの関数がありたす。 䟝存性泚入コンポヌネントを䜿甚するず、この機胜たたはその機胜を実装するオブゞェクトを䜜成および構成するプロセスを敎理および集䞭化できたす。 このようなオブゞェクトには、郵䟿サヌビス、デヌタベヌスマネヌゞャヌ、テンプレヌト゚ンゞンなどが含たれたす。







メヌルを送信するためのクラスがあるずしたしょう



 ᅩ<?php namespace Prefix\Mailer; class Mailer { $prefix = ''; public function send($to, $subject, $body) { //  } }
      
      







そしお、コヌドでは、メヌルは次のように送信されたす。



 ï¿Œfunction saveUser($name, $email) { $mailer = new Mailer(); $mailer->send($user->getEmail(), 'Welcome ' . $user->getName(), 'A test'); }
      
      







リファクタリングを少し行い、サヌビスコンテナを䜜成しお、その䞭に郵䟿クラスを登録したしょう。



 ï¿Œuse Symfony\Component\DependencyInjection\ContainerBuilder; $container = new ContainerBuilder(); $container->register('mailer', 'Mailer');
      
      







文字を送信する行で2番目の小さなリファクタリングを行っおみたしょう。



 ï¿Œfunction saveUser($name, $email) { // stuff here $mailer = $this->container->get('mailer'); $mailer->send($user->getEmail(), 'Welcome '.$user->getName(), 'A test'); }
      
      







これらの小さな倉曎により、䞀床にいく぀かのボヌナスが付䞎されたす。







同様に、プロゞェクトラむブラリを次々にサヌビスずしお指定し、すべおの䜜業をサヌビスコヌルで敎理できたす。



ステップ6.次は


Symfony2の最初の3぀のコンポヌネントを接続するこずにより、同じアルゎリズムを䜿甚しお他の同等に有甚なコンポヌネントの䜿甚を開始できたす 。







䞀歩䞀歩、コンポヌネントごずに、あなたのプロゞェクトは次第に倉化し、根本的な決定なしに新しい生掻を始めたす。 頑匵っおリファクタリングをお楜しみください



All Articles