Laravel 5の新機胜





数か月前、私が働いおいるスタゞオで、チヌム党䜓がLaravelに移るこずを決めたした。 過去数幎間で、このフレヌムワヌクの人気はたゆたぬ力で成長し、結局のずころ、無駄ではありたせんでした



私は自分自身をPHPずフレヌムワヌクの第䞀人者ずは考えおいたせん。 その前に、私は最初ず2番目のれンドである䞍滅のbitrixで数回働き、YiiずSymfonyに出䌚い、自分で自転車を発明したしたが、そのたびに挠然ずした䞍満を感じおいたした。



たずえば、Zend Frameworkを䜿甚するこずで、タスクをすぐに完了し、悪倢のようなこずを忘れたくなりたした。 このフレヌムワヌクの支持者は確かに私に同意したせんし、決しお圌らの遞択を批刀したくありたせん。 それぞれに。 Zend Frameworkのおかげで、コヌドは人によっお䜜られたものではなく、人のために曞かれたものではないずい぀も感じおいたした。



同じタスクをより簡単か぀゚レガントに解決できるずい぀も思っおいたした。 私が曞きたいフレヌムワヌクを芋぀けたかった。 手の甲のように孊び、プログラミング、新しい䜕かの䜜成など、自分がやりたいこずをするこずができたした。 私はすべおの倧工が奜きなハンマヌを持っおいるず思いたす、そしおプログラマヌに察するそのような欲求は非垞に自然です。 PHPで曞いおいる私たちの倚くは、RubyのRailsやPythonのDjangoをうらやたしく芋おいたせん。



最埌のストロヌは、PhpStorm 8 Bladeテンプレヌトの新しいバヌゞョンずSourceTestディレクトリのサポヌトの拡匵に぀いおのJetBrainsからの投皿でした。 このIDEでは、Laravelで最初のプロゞェクトを䜜成したした。



Laravelず仕事をした埌、私は自分が探しおいたものを芋぀けたこずに気付きたした。 おそらくそれが、「あなたが到着したした」ずいうスロヌガンがララノェルのシンボルになった理由です。



初日から、ドキュメンテヌションやコミュニティから心地よく驚かされるこずはありたせんこの蚘事を曞いおいるずきに問題に遭遇したずき、コミュニティのオンラむンチャットに行き、問題を説明し、個人的に答えたしたプロゞェクトをサヌバヌに配眮した埌に䜿甚できる、たたは䜿甚する必芁のあるさたざたな利点。



しかし、私の蚘事はそれに぀いおではありたせん。 Laravelの長所に぀いおは十分に曞かれおいたす。



この蚘事では、11月に公匏にリリヌスされるLaravelの新しいバヌゞョンに぀いお曞きたいず思いたすが、Composerから今すぐダりンロヌドしお詊すこずができたす。



圓初、バヌゞョンは4.3ず呌ばれおいたしたが、新しいディレクトリ構造ずコヌドのいく぀かの重芁な倉曎により、䜜成者はバヌゞョン5.0を発衚するこずにしたした。



これらの倉曎があなたにずっおどれほど深刻であるかを刀断したす。 それでは、実際にLaravel 5が私たちに準備しおいるものを芋おみたしょう。



蚭眮



新しいバヌゞョンのむンストヌルは、基本的に叀いバヌゞョンず倉わりたせん。 開始するには、composer.jsonファむルに行を远加しおLaravel 5をダりンロヌドしたす



"require": { //... "laravel/framework": "5.0.*@dev" //... }
      
      







その埌、composer updateを実行するず、操䜜の最埌に最新バヌゞョンがむンストヌルされたす。







構造



Laravel 4ずLaravel 5の構造を芋るず、すぐに違いに気付くこずができたす。 たず、Config、Tests、Storage、およびDatabaseフォルダヌがAppフォルダヌからルヌトに移動されたした。 新しいリ゜ヌスディレクトリが登堎したした。







論理的な疑問が生じたす。Appフォルダヌには䜕が残っおいたすか



これで、Appフォルダヌには、アプリケヌション自䜓のロゞックのみが保存されたす。 したがっお、開発者はほずんどのLaravel開発者が以前に行ったこずを合法化したした。モデルフォルダヌを削陀し、この特定のプロゞェクトの開発に関連するすべおモデル、チヌム、むベントなどに個別のディレクトリを䜜成したす。 たず第䞀に、これにより、フレヌムワヌク自䜓のコヌドず開発者が蚘述するコヌドの間に明確に線を匕くこずができたす。



Appフォルダには、デフォルトで3぀の新しいディレクトリがありたす。 Consoleディレクトリはコン゜ヌルコマンドのクラスを察象ずしおおり、Service Providersフォルダヌにはサヌビスプロバむダヌのクラスが含たれ、Httpフォルダヌにはコントロヌラヌ、フィルタヌ、ルヌティングに関連するすべおが含たれたす。







次に、Httpディレクトリには3぀のフォルダヌがありたす。アプリケヌションコントロヌラヌ甚のコントロヌラヌ、個別のクラスずしお䜜成されるルヌトフィルタヌ甚のフィルタヌ、および以䞋で詳现に説明する芁求フォルダヌです。

Viewフォルダヌは、Langロヌカラむズフォルダヌず共にResourcesディレクトリヌに移動したした。

新しい構造は珍しいように芋えるかもしれたせんが、数日埌にははるかに䟿利であるこずに気付くでしょう。



構造の倉曎に関連しお最初に発生する可胜性のある疑問は、名前空間ずクラスのオヌトロヌドに䜕が起こったのかずいうこずです。



名前空間


Laravel 5は公匏にpsr-4暙準を公匏に䜿甚しおいたす。これは、正しい名前空間を持぀Appフォルダヌ内のすべおのクラスがオヌトロヌダヌで䜿甚できるこずを意味したす。

したがっお、このフォルダヌ内のすべおのクラスがApp \ *ディレクトリ名で始たるこずを確認し、ファむルのアップロヌドの問題を氞久に忘れおください。



䞀方、psr-4を䜿甚するず、ファサヌドぞのアクセスには、グロヌバル名前空間\ Auth :: * method name *たたは\ Events :: * method name *などからのアクセスが必芁になりたす。

この点に関しお、ファむルの先頭でuse \ front-nameコマンドたずえば、\ Viewを䜿甚しおファサヌドをむンポヌトするか、バックスラッシュ経由でアクセスする必芁がありたす。



さらに、コントロヌラヌの名前空間を指定する必芁がありたす。 すべおのコントロヌラヌに文字列が含たれおいるこずを確認しおください

 namespace App\Http\Controllers;
      
      





抜象コントロヌラヌ名前空間を䜿甚したす

 use Illuminate\Routing\Controller;
      
      







BaseControllerをすべおのコントロヌラヌの芪クラスずしお䜿甚する堎合は、最埌の行をそこに配眮しお、すべおのコントロヌラヌがこの名前空間にアクセスできるようにしたす。



アプリケヌションルヌトフォルダヌ

アプリケヌションのメむンフォルダヌにアプリずしおアクセスしたくない堎合はどうなりたすか Laravel 4の倚くがそうであったように、アプリケヌションロゞックが栌玍されおいるディレクトリにアプリケヌション自䜓の名前で名前を付けた堎合はどうでしょうか。



開発者もこれを提䟛しおいたす。 コマンドラむンで$ php artisan appnameずアプリケヌションの垌望する名前を曞くだけです。 Laravelは、必芁なファむルの名前空間ず構成ファむルの蚭定を個別に倉曎したす。



サブディレクトリを䜿甚する堎合は、次のように2぀のバックスラッシュを䜿甚したす
 $ php artisan app:name MyAppName\\HabrProject
      
      







ずころで、新しいファむルnamespaces.phpがConfigフォルダヌに珟れたした。このフォルダヌには、アプリケヌション党䜓の名前空間ずファむルぞのパスが登録されおいたす。 起動に問題がある堎合に䟿利です



メ゜ッドパラメヌタの実装


Laravel 5のもう1぀の匷力な革新は、メ゜ッドパラメヌタヌの導入でしたメ゜ッドパラメヌタヌむンゞェクションたたは単にメ゜ッドむンゞェクション。

以前は、コントロヌラなどのモデルクラスリポゞトリなどが必芁な堎合、IOC Container Dependency Injectionを䜿甚できたした。぀たり、クラス名をコントロヌラコンストラクタヌに枡し、オブゞェクトプロパティに割り圓おたした。

Iocコンテナヌはこのクラスのむンスタンスを独自に䜜成し、アクセスしたコントロヌラヌプロパティに戻りたした。 そしおそれはクヌルでした。



たずえば、次のように



  class FeedController extends BaseController { protected $feedbackRepository; /** * @param FeedbackRepository $feedbackRepository */ public function __construct(FeedbackRepository $feedbackRepository) { $this->feedbackRepository = $feedbackRepository; } public function index($id) { $feed = $this->feedbackRepository->getFeed($id); return View::make('feed.index', compact('feed')); }
      
      





ただし、1぀のメ゜ッドのみでオブゞェクトが必芁な堎合はどうでしょうか メ゜ッドの1぀だけで䜿甚される堎合、コントロヌラヌ党䜓のコンストラクタヌでオブゞェクトのむンスタンスを䜜成するのはなぜですか

そのため、Laravel 5では、メ゜ッドパラメヌタヌの導入が登堎したした

これで、任意のコントロヌラヌメ゜ッドでクラスを指定でき、Iocコンテナヌを介しおそのメ゜ッドに自動的にアクセスできるようになりたす。 䟋は次のようになりたす。



  class FeedController extends BaseController { public function index(FeedbackRepository $feedRepo, $id){ $feed = $feedRepo->getFeed($id); Return view('feed.index', compact('feed') } }
      
      





そしおそれだけです 魔法のように、Iocコンテナ自䜓がリポゞトリを芋぀けお接続したす。



しかし、このむノベヌションの真の力は、別の新機胜ず䜵せお感じるこずができたす。



リク゚ストずフォヌムリク゚ストFormRequests


App \ HttpディレクトリのRequestsフォルダに぀いお話しおいたこずを芚えおいたすか それでようやく圌女に着きたした。

Laravel 4.2でフォヌムを送信するずきにナヌザヌ入力を怜蚌した方法を思い出しおください。



Laravelで働いおいれば、Validatorの倖芳を知っおいるはずです。

ナヌザヌから受け取ったデヌタを怜蚌するための匷力な機胜を提䟛したす。 ただし、開発者ごずに䜿甚方法が異なりたす。 誰かがコントロヌラヌでバリデヌタヌを䜿甚し、

誰かがモデル内の怜蚌ルヌル配列ルヌル[]を曞き留め、isValidメ゜ッドを䜿甚したした。



忘れおしたいたす。Laravelは、フォヌムリク゚ストを凊理するための独立した抜象化レベルを提䟛したす。

仕組みを芋おみたしょう。

コマンドラむンで「php artisan makerequest MyRequest」ず入力するず、フレヌムワヌクがフォヌムリク゚スト甚のテンプレヌトを生成したす。



FormRequestクラスを継承するこのクラスには、authorizeずrulesずいう2぀のメ゜ッドのみが含たれおいたす。

ルヌルは、Laravel 4ず同様に、フォヌムの怜蚌ルヌルを蚘述できる配列を返したす。

authorizeメ゜ッドはデフォルトでfalseを返したす。

このクラスに関連付けられたフォヌムを送信しようずするず、ブラりザヌで犁止ペヌゞ犁止が取埗されたす。



したがっお、authorizeメ゜ッドは、フォヌムにアクセスするナヌザヌにフォヌムを送信する暩利があるかどうかを確認したす。 たずえば、ナヌザヌは自分が曞いおいない蚘事を線集する暩利を持っおいたすか ログむンしおいない堎合はコメントを投皿したすか ここで、チェックを配眮する必芁がありたす。



ナヌザヌのりォヌルにステヌタスを公開するフォヌムがあるずしたす。 ステヌタスフィヌルド通垞の入力タむプ= 'テキスト'名= 'ステヌタス'が必芁で、たずえば20文字含たれおいる必芁がありたす。 たた、ナヌザヌが自分のりォヌルにステヌタスを公開しおいるこず、぀たり、ナヌザヌのペヌゞのIDが投皿の䜜成者のIDず䞀臎しおいるこずも確認する必芁がありたす。

この䟋では、バリデヌタクラスは次のようになりたす。



 namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use \Auth; class AddFeedRequest extends FormRequest { public function rules() { return [ 'status' => 'required|min:20', ]; } public function authorize() { return Auth::id() == $this->route->parameter('id'); }
      
      





さお、䞊蚘で説明したメ゜ッドパラメヌタヌの導入で、フォヌムの送信を担圓するコントロヌラヌメ゜ッドのパラメヌタヌでクラス名を指定するだけで十分です。

RESTコントロヌラヌを䜿甚する堎合、これがストアメ゜ッドになりたす。



  public function store(MyRequest $request) { //   }
      
      





そしおそれだけです 他に䜕もする必芁はありたせん Laravel自䜓がフォヌムを怜蚌し、怜蚌が成功するずコントロヌラヌメ゜ッドに含たれるコヌドを実行したす。 繰り返したすが、フォヌムの怜蚌に倱敗した堎合、storeメ゜ッドからのコヌドは1行も実行されたせん。 私の意芋では、これはめちゃくちゃクヌルです



発電機


コマンドラむンでphp artisanず入力するず、makeずいうたったく新しいセクションが衚瀺されたす。

myRequestクラスを生成するためにすでにそれらの1぀を䜿甚しおいたす。 さらに、makeコマンドは、コントロヌラヌ、コン゜ヌルコマンド、

フィルタヌ、移行、サヌビスプロバむダヌ。



特にphp artisan makeauthコマンドを匷調したいず思いたす。 このゞェネレヌタヌは、各新芏プロゞェクトナヌザヌ認蚌システムで繰り返し行ったこずを行いたす。



ここで実行するず、Laravelが2぀のコントロヌラヌを䜜成するこずがわかりたす。1぀は承認を担圓し、もう1぀はパスワヌドの回埩、パスワヌドリセットの移行、ログむンおよび登録芁求の2぀の怜蚌クラスを担圓したす。 1぀のコマンドず認可テンプレヌトが準備できたした



ルヌトキャッシング


ルヌトチヌムもセクション党䜓に成長したした。 ルヌトのリストを衚瀺するには、php artisan routelistず入力する必芁がありたす。

ここで、新しいルヌトであるcacheコマンドに気付かないのは難しいこずです。 非垞に簡単なこずを行いたす-ルヌトをキャッシュしたす。

このコマンドを実行するず、routes.phpファむルがstorage / metaフォルダヌに衚瀺されるこずがわかりたす。 ルヌトのキャッシュが含たれおいたす。 これで、Laravelはたずメむンのhttp / routes.phpファむルではなく、それにアクセスしたす。



これは開発䞭にはほずんど圹に立ちたせん。少なくずもそのような状況を想像するのは難しいですが、展開䞭、プロゞェクトが既に曞かれおおり、新しいルヌトがほずんど远加されない堎合、これは非垞に圹立ちたす。



契玄


Laravel 5のすべおのコンポヌネントは、珟圚、light / contractsフォルダヌからのこのむンタヌフェヌスを実装しおいたす。 したがっお、開発者は、アプリケヌションをより柔軟にし、Laravel自䜓ぞの䟝存を少なくしようずしたした。



Laravel 4には、タむプヒントむンタヌフェヌスに関する問題がしばしばありたした。 メ゜ッドのパラメヌタヌで特定のむンタヌフェむスを実装するオブゞェクトのむンスタンスを指定した堎合、IOCコンテナヌはそれを䟝存性泚入ず芋なし、クラスのむンスタンスを䜜成しようずしたため、゚ラヌが発生したした。



この問題を解決するには、app :: bindを䜿甚しお、むンタヌフェむスをむンタヌフェむスの特定の実装クラスに盎接バむンドする必芁がありたした。 ただし、これは、たずえば単䜓テスト䞭など、䟝然ずしおいく぀かの問題を匕き起こしたした。

Laravel 5では、ファむルの先頭で䜿甚しおむンタヌフェヌスを䜿甚するだけで十分ですたずえば、Illuminate \ Contracts \ Mailerを䜿甚したす。タむプヒンティングは正垞に機胜したす。



これにより、特定の実装クラスに瞛られるこずなく、より柔軟なアプリケヌションを䜜成できたす。



将来、暙準のLaravelモゞュヌルずは異なる別の認蚌モゞュヌルを接続する堎合はどうなりたすか 別のキャッシングモゞュヌル 手玙を送る コントラクトフォルダヌからむンタヌフェむスを実装しおいるこずを確認し、型ヒントむンタヌフェむスに基づいおコヌドを蚘述したす。



新機胜アシスタント


プロゞェクトで䜕床も䜿甚する些现なこずビュヌファむルをアタッチするこずは、ビュヌ関数「ビュヌ名」で利甚できるようになりたした。 叀いView :: makeメ゜ッドも機胜したすが、今、䞊で述べたように、バックスラッシュを介しおアクセスする必芁がありたす。



同じ運呜がリダむレクト::ぞ-リダむレクト 'ルヌト'を曞くこずができるようになりたした。



通垞の䜜業ツヌルにおける他の倉曎の䞭でも、HTMLおよびFormのファサヌドが暙準のLaravelパッケヌゞに含たれなくなったこずに蚀及する䟡倀がありたす。 あなたがそれらに慣れおいるなら、恐れないでください、あなたは䜜曲家を通しお簡単にそれらを接続するこずができたす。



瀟亀界


Laravel 5には、Twitter、Facebook、GitHubなどのサヌドパヌティサヌビスを認蚌するために蚭蚈されたSocialite Betaモゞュヌルがありたす。 さたざたな゜ヌシャルネットワヌクで承認甚のプラグむンを远加する必芁が頻繁にありたした。他のフレヌムワヌクに同様のツヌルがあれば玠晎らしいこずです。 プラグむンはオプションであり、䟝存関係を远加しお远加するだけです。 自分で刀断するず、プロバむダヌ構成を䜜成するだけで、その埌、必芁なすべおのメ゜ッドがフォヌムで利甚可胜になりたす。



 $this->socialite->driver('twitter')->user();
      
      





必芁なこずは、ファむルの先頭に適切なクラスを接続するこずだけです。

Laravel \ Socialite \ Contracts \ FactoryをSocialiteFactoryずしお䜿甚したす。

近い将来、vkの承認も远加する予定です。



刃


Bladeの倉曎のうち、重芁な倉曎が1぀ありたす。これは、過去数日間でコミュニティが同様の質問を倚数䜜成したためです。 これで、{{link_to_route 'login_path'}}タグず{{{link_to_route 'login_path'}}}タグの䞡方が゚スケヌプされ、コヌドむンゞェクションのリスクを枛らすためにテキストずしお衚瀺されたす。



代わりに、コンストラクトを䜿甚する必芁がありたす
  {!! link_to_route('login_path') !!}
      
      





ずころで、Bladeの新しいバヌゞョンぞの移行を容易にするために、タグを叀いものに眮き換えるこずができたす。

ブレヌド:: setRawTags$ openTag、$ closeTag;

その埌、すべおのアむデアを曞き盎す必芁はありたせん。







たずめ



5番目のバヌゞョンは、この゚キサむティングな瞬間をただ延期しおいる堎合に、Laravelに粟通し始めるべきバヌゞョンです。 プラグむンの倧郚分はすでにフレヌムワヌクの新しいバヌゞョンをサポヌトしおおり、網矅的なドキュメントはリリヌスの準備ができおいたす。 私の意芋では、Laravelは、近幎のphpコミュニティで最も興味深く、有望なプロゞェクトです。 圌が毎日たすたす倚くの支持者を匕き付ける方法を芋るのは玠晎らしいこずです。



Laravelの詳现に぀いおは、次の圹立぀リ゜ヌスをご芧ください。



• laravel.com

• laravel.io

• laracasts.com



たぶん私は䜕かを逃し、それから個人的に曞いお、それを修正したす。 ご枅聎ありがずうございたした 蚘事がお圹に立おば幞いです。



All Articles