Laravel 5プロジェクト構造分析と中国語ドキュメントの読み方まとめ
HTTPルーティング
ミドルウェア
コントローラー
HTTPリクエスト
http サービスプロバイダー
*
Laravel Elixir*
暗号化
ファイルシステム/クラウドストレージ
ハッシュ
補助メソッド
ローカリゼーション*
メール*
拡張パック開発*
ページネーション*
キュー*
セッション
ブレードテンプレート
単体テスト*
データ検証
データベースの使い方の基本
クエリコンストラクター
構造ジェネレーター
移行とデータ入力
雄弁なORM
HTTPルーティング
基本ルーティング
定義さまざまな
Http Method のルート (例:
Route::get('/', function(){
Route: :post) ('foo/bar', function(){
Route::match(['get', 'post'], '/', function(){ # 複数のメソッド
Route::any('foo', function(){ # すべてのメソッド
はurlメソッドを使用して URLを生成します: $url = url('foo');
CSRF
保護 Laravelは、各ユーザーのセッションにランダムなトークンを自動的に配置します。 VerifyCsrfTokenミドルウェアは、sessionに保存されたリクエストと入力tokenを組み合わせて、tokenを検証します。 CSRF トークン を「POST」パラメータとして検索することに加えて、ミドルウェアは X-XSRF-TOKEN リクエスト ヘッダーもチェックします。 CSRFトークンをフォームに挿入します: csrf_token() ?>"> を使用したBladeテンプレートエンジン: < input type="hidden" name=" _token" value="{{ csrf_token()}}"> が X-XSRF-TOKEN リクエスト ヘッダー に追加されました: csrf_token()}}" /> $.ajaxSetup ({ ヘッダー: { } ... こうして、すべてのajax リクエストには次のヘッダー情報が含まれます: $.ajax({ }) メソッドチート } ) ;}); サブドメインルーティング Route::group(['domain' => ' {アカウント}。 myapp.com'], function() { {
Route::get('user/{id}', function($account 、$id) { // ); }); 'prefix' => 'admin'], function() { Route::get('users', function() { // "/admin/users" URL }); }); はルーティング プレフィックス Parameters で定義されていますRoute::group(['prefix' => 'accounts/ '], function() { ルート::get('詳細', function( ) ルートモデルバインディング モデル バインディングは、モデル エンティティをルートに注入する便利な方法 を提供します ユーザー ID を注入する代わりに、 を注入することを選択できます指定された ID に一致する User クラスのエンティティ。 RouteServiceProvider::bootメソッドでモデルバインディングを定義します: public function boot(Router $router){ 親::ブート($router ; {user} パラメータルート: Route::get('profile/{user} AppUser $user){ ) / / }); profile/1へのリクエストは、1 のIDを挿入しますエンティティユーザー 。エンティティが存在しない場合は、404をスローします。クロージャを 3 番目のパラメータとして渡して、クロージャが見つからない場合の動作を定義できます。 404 エラーをスローします 2 つのメソッド: ort (404); # 基本的に SymfonyComponentHttpKernelExceptionHttpException をスローします 特定のステータス コード付き。 または: HttpException を手動でスローします新しいミドルウェアphp職人が作る: middleware OldMiddleware # 新しいミドルウェアを作成します
ミドルウェアの主な機能はhandle()メソッドに実装されています: class OldMiddleware { 公共関数handle($request, Closure $next){ if (xxx){ redirect('xx'); 戻る $next ($request); } その構造を分析すると、基本的には、判断を下し、リダイレクトまたは先に進むという実行であることがわかります。 グローバルミドルウェア HTTP リクエストによってミドルウェアを実行したい場合は、ミドルウェアクラスを app/Http/ に追加するだけです カーネル.php $middleware プロパティ リスト。 ミドルウェアをルーティングに割り当てます 新しいミドルウェアを作成したら、app/Http/Kernel.phpに移動します ファイルキー名とクラス名の間のマッピング関係。このキー名をルーティングで使用してルートを割り当てることができます: Route::get('admin/profile', ['middleware' = > 'auth', function(){ Terminableミドルウェア
TerminableミドルウェアはTerminableMiddlewareから継承する必要があります そして terminate()を実装しますメソッド。その目的は、 HTTP 応答がクライアントに送信された後に実行することです。Terminable ミドルウェアを app/Http/ Kernel.php のグローバル ミドルウェア リストに追加する必要があります。 コントローラー 基本コントローラー すべてのコントローラーは基本コントローラークラスを拡張する必要があります AppHttpControllers コントローラーを使用します。 クラス UserController Controllerを拡張 { # 継承Controller public function showProfile($id ) # Action { は次のように定義されます: namespace BorogadiHttpControllers; IlluminateFoundationBusDispatchesJobsを使用します; use IlluminateRoutingController IlluminateFoundationValidationValidatesRequests を使用する BaseController { 最終的にはIlluminateRoutingControllerクラスから継承されていることがわかります。 # 名前付きコントローラールート Route::get('foo', ['uses' => 'FooController@method', ]); # コントローラーを指すURL $url = アクション ( 'AppHttpControllersFooController@ メソッド') ;または: URL::setRootControllerNamespace('AppHttpControllers'); $url アクション ('FooController@ コントローラーミドルウェア 2つの方法があり、1つはコントローラールートで指定する方法です: :get('プロフィール', [ 'ミドルウェア' => 'auth', 'Uses' => 'UserController@showProfile' ]); class UserController extends Controller { public function __construct(){ $this->miドルウェア (' 認証'); $this->ミドルウェア('log', ['only' => ['fooAction', 'barAction']]); 暗黙的コントローラー 暗黙的コントローラーの実装は、コントローラー内の各動作を処理する単一のルートを定義します: ルートを定義します: ルート::コントローラー( 'users', 'UserController'); コントローラー クラスの実装を定義します: class UserController extends BaseController { パブリック関数 getIndex(){ # user public function postProfile(){ # post way への応答 user/profile パブリック関数 anyLogin( ){ user/login のすべてのメソッドへの応答 "-" を使用することで、マルチワード コントローラーの動作をサポートできます。 public function getAdminProfile() {} # users/admin-profile への応答user/adminprofileではありません。アクション名で使用されているキャメルケースの命名方法に注意してください
RESTfulリソースコントローラー は、実際には暗黙的コントローラーの特定のアプリケーションです。
ルートキャッシュ アプリケーションでコントローラールーティングのみが使用されている場合、ルートキャッシュを使用してパフォーマンスを向上させることができます。 php職人ルート:キャッシュ キャッシュルートファイルはapp/Http/routes.phpファイルの代わりに使用されます 2 つの方法でリクエストを取得します 1 つは Request ファサード を使用する方法です: $name = Request::input('name'); 、または依存関係注入経由: コンストラクターまたはコントローラーのメソッドのクラス で型ヒント を使用します。 。現在リクエストされているインスタンスは、サービス コンテナによって自動的に挿入されます : use IlluminateHttpRequest; IlluminateRoutingControllerを使用します; class UserController は、Controller { パブリック関数ストア( $request){ を拡張します$name $name $name リクエスト、 ; ){ 入力データを取得$name = Request:: ('name') ; # 特定の入力を取得データ $name = Request::input('name', 'Sally'); 特定の入力データを取得し、そうでない場合はデフォルト値を取得します if (Request::) has('name')){ # 入力データがあるか確認 $input = Request::all(); # 入力データを全て取得 $input = Request::only('username', 'password'); # 入力データを取得します $input = Request:: Except('credit_card'); # 部分入力データ除外メソッドを取得 $input = Request::input('products.0.name'); # データを取得配列形式で 古い入力データRequest::flash (); # 現在の入力データを保存しますセッション中 Request::flashOnly('username', 'email') # セッションにデータを保存します リクエスト::flashExcept ('password'); # セッション、削除メソッドreturn redirect('form')-> withInput(); 現在の入力データを session にリダイレクトしてキャッシュします return redirect('form')->withInput(Request::Except('password')); # 現在の入力データの一部をsessionにリダイレクトしてキャッシュします。 old('username'); # 1回限りのセッションを取得します # bladetemplateに古い入力データを表示しています Cookies L cookie aravel 作成 暗号化して認証マークを追加します。 Request::cookie('name') # Cookievalueを取得します # Cookies$response = new IlluminateHttpResponse('Hello World'); $response-> withCookie(cookie('name', 「価値」 , $ minutes)); $response-> (cookie()->forever('name', 'value')); # 追加永続的なCookie # キューモードで Cookieを追加します。つまり、実際に応答を送信する前にCookieを設定します Cookie::キュー# アップロードされたファイルが有効かどうかを確認します Request::file('photo')->move($destinationPath); # アップロードされたファイルを移動 Request::file( 'photo')->move($destinationPath, $fileName); # アップロードしたファイルを移動し、名前を変更します その他のリクエスト情報 $uri = Request::path( ); # リクエストを取得する if (Request::ajax()) リクエストが AJAX を使用するかどうかを判断する if (Request:: isMethod(' post')) # リクエストパスが特定の形式を満たしているか確認します $url = Request::url(); リクエストの取得URL HTTPレスポンス ルート::get(' /', function(){ # return string return 'Hello World'; # Responses 例としては、 2 つのメソッド return オブジェクト: use IlluminateHttpResponse; return (new ) 応答($content, $status)) - -> header('Content-Type', $value); または 補助メソッドを使用します: return response($content, $status)->header('Content-Type', $value);
# ビューに戻る return response()->view('hello')-> header('Content-Type', $type); return response($content); (cookie('name', 'value')); リダイレクト ('ユーザー/ログイン'); redirectリダイレクトメソッドを使用します return redirect ('user/login')->with('message', 'Login Failed'); # 現在のデータを Session にリダイレクトして保存しますreturn redirect()-> back() ; # 前の場所にリダイレクトします リダイレクトを返す( )->route('login'); # 特定のルートにリダイレクト # パラメータを使用して特定のルートにリダイレクト return redirect()->route('profile', [1]); # routed URI は: profile/{id} return redirect()- >route('profile', ['user' => 1]); # ルーティングされた URI は: profile/{user} # コントローラーアクションに基づいてリダイレクトreturn redirect()-> ('AppHttpControllersHomeController@index'); return redirect()->action('App HttpControllerUserController @profile', ['user' => 1]); # パラメーター付き その他の回答 # return ジソン return response()-> ; (['name' => 'アビゲイル', 'state' => 'CA']); json([' name' => 'アビゲイル', '州' => 'CA']) - ->setCallback($request->input('callback')); ファイルダウンロードreturn response()->download($pathToFile, $name, $headers); レスポンスマクロ レスポンス マクロを定義します。通常は Provider メソッドで定義されます Response::macro ( , function($value) ($response){ # PHP デフォルトでは、匿名関数は、それが配置されているコード ブロックのコンテキスト変数を呼び出すことはできませんが、use キーワードを使用する必要があります。 useは変数のコピーをクロージャにコピーし、 use ( &$rmb ) return $response->make などの参照形式もサポートします。 (strtoupper( $value));}); # 応答マクロを呼び出すreturn response() &g t;キャップ(' foo'); View # ビュー定義 ファイルパスとファイル名: resources/views/greeting.php
<本体> # 呼び出しを見る Route::get('/', function() { return view( 'greeting', [ 'name' => 'James']); # }); # resources/views/admin/profile。 php return view(' admin.profile ', $data); # データをビューに渡すその他の方法 $view =ビュー( 'greeting')->with ( 'name', 'Victoria'); # 伝統的な方法 $view = view('greeting')->withName ('Victoria'); # メソッド $view = view('greetings', $data); # は配列ですキーと値のペア # すべてのビューにデータを共有 プロバイダをカスタマイズするか、 のブート メソッドAppServiceProvider: view( )->share('data', [1, 2, 3]); または: 表示: :share
# ビューが存在するか確認 if (view()-> exists # ファイルパスからビューを生成 return view()-> ファイル
View コンポーネント View コンポーネントは、ビューがレンダリングされる前に呼び出されるクロージャまたはクラス メソッドです。 # ビューコンポーネントを定義する Viewを使用します。 IlluminateSupportServiceProviderを使用します; view :: ( 'profile'、 'apphttpviewcomposersprofilecomposer'); ... という名前のメソッドビューがレンダリングされる前に、指定されたクラスの compose が呼び出されます。上の例のように、 クラスは次のように定義されます: IlluminateContractsViewViewを使用します; UserRepositoryとしてIlluminateUsersRepositoryを使用します; class ProfileComposer { protected $users; public function __construct(UserRepository $users){ # サービス コンテナ は必要なパラメータを自動的に解析します パブリック関数 compose(View $view){ # compose メソッドには View のインスタンスが渡され、パラメータは View $ view->with('count', $this->users->count に渡すことができます) ()); } } # View::composer('* ', function($view){ # は、すべてのビューに対して定義することと同等です #
View::composer(['profile', 'dashboard'], 'AppHttpViewComposersMyViewComposer'); #
View: :作曲家([ 'AppHttpViewComposersUserComposer' => 'AppHttpViewComposersProductComposer' => 'product' ]); 各カスタム プロバイダ IlluminateSupportServiceProviderから継承 config/app.php の Providers 配列 に登録されます。カスタム Provider は、登録時の動作を定義するために使用される register() メソッド を定義する必要があります。さらに、2 つのオプションのメソッドとオプションの属性があります。 boot() メソッド は、すべての Provider がロードされるまで呼び出されず、 provides() メソッド $defer オプション属性 と組み合わせて使用され、 バッファリング 機能を提供します。 サービスプロバイダーを通じてサービスを提供するというアイデア: 実際の作業を完了するクラスを実装し、Providerを定義し、のregister()メソッドで使用します。 Provider 実際のワーククラスをシステムコンテナに登録し、実際のワーククラスインスタンスを取得するメソッド。次に、このプロバイダーをアプリケーション構成に登録します。このようにして、アプリケーションの初期化時にすべての Provider の register() メソッドが呼び出され、実際のワーキング クラス インスタンスを取得する方法を間接的に登録します。 # 基本的なプロバイダーを定義する RiakConnectionを使用する; IlluminateSupportServiceProviderを使用する) # ,,,,,,,,,,,,,,,,,, , 新しい接続を返す($app ['config' ]['riak']); サービスコンテナ で 内では、$this->app 依存関係を登録するには、コールバック インターフェイス メソッドとバインディング インスタンス インターフェイスの 2 つの主な方法があります。 # クロージャーコールバックの方法 $this->app->bind('FooBar', function($app){ });
# シングルトンとして登録され、後続の呼び出しは同じインスタンスを返します $this->app->singleton('FooBar', function($app){ return new FooBar($app['SomethingElse']); });
# 既存のインスタンスにバインド $fooBar = new FooBar(new SomethingElse); $this ->アプリ- >instance('FooBar', $fooBar);
コンテナからインスタンスを解決するには 2 つの方法があります: $fooBar = $this-> ;app- >make('FooBar'); # メソッドを使用して $fooBar = $this->app['FooBar']; # コンテナは インターフェースを実装しているため、配列アクセスフォームを使用できます 登録情報と解析情報を定義した後、それをコンストラクターで直接使用できますクラス type-hint を介して必要な依存関係を指定すると、 コンテナは必要な依存関係をすべて自動的に挿入します 。 UserRepositoryとしてAppUsersRepositoryを使用します; クラス UserController は、Controller {を拡張します protected $users; public function __construct( UserRepository $users){ # type-hint $users; } public function show($id){ } } バインディングインターフェース インターフェース EventPusher { パブリック関数push($event, array $data); } クラス PusherEventPusher 実装 EventPusher {... } PusherEventPusher EventPusherを実装しているため $this->app->bind('AppContractsEventPusher', 'AppServicesPusherEventPusher ');
Whenクラスには EventPusher が必要です
インターフェースでは、コンテナにPusherEventPusher を注入する必要があることを伝えます。
コンテキストバインディング
$this->app->when('AppHandlersCommandsCreateOrderHandler')
tPusher');
tag
$this->app->bind('SpeedReport', function(){
});
$this->app->bind ('MemoryReport', function (){
}); それらを適切に解析します:
$this->app->bind('ReportAggregator', function($app){
) return new ReportAggregator($app->タグ付き
(' reports'));
});コンテナイベント
コンテナは各オブジェクトを解析するときにイベントをトリガーします。 resolve メソッドを使用して、このイベントをリッスンできます (解析されたオブジェクトはクロージャ メソッドに渡されます):
$this->app->resolve(function($object, $ app){#コンテナがあらゆる種類の依存関係を解決したときにコレートします...
}); ;resolve(function(FooBar $fooBar, $app){ # コンテナがタイプ
'FooBar'
... タイプの依存関係を解決するときに呼び出されます。
});
ContractsContractsは、すべての
Laravelメインコンポーネントの実装で使用されるインターフェースです。 契約
の下で確認できますディレクトリ ディレクトリ構造はIlluminateと同じです。
Contractsはインターフェース定義であり、Illuminateは特定の実装です。
/laravel
/framework
/src
/イルミネーション /認証/放送
/バス
...
/契約
/認証
/放送
/バス
...
ファサード基本的な使用法ファサード
は、アプリケーションのサービスコンテナでアクセスできるクラスに静的インターフェースを提供します。 (デザインパターンにおける「装飾モード」のアプリケーションは、主に class_alias を使用してカテゴリー名を作成し、また
__callStatic()を使用して静的プロキシを提供し、最終的にはモックオブジェクト PHP を使用してシミュレートされます。 オブジェクトを呼び出し、オブジェクトのメソッドを呼び出します)
Laravelのファサードとあなたが作成するカスタムファサードは基本クラスFacadeを継承し、実装する必要があるメソッドは1つだけです: getFacadeAccessor ()。
Cache など、この facade は次のように呼ばれます: Cache:: get( 'キー');
クラスの実装を見てください:class
Cache extends Facade {
protected static functiongetFacadeAccessor () { 'キャッシュ' を返す } ; # This このメソッドの機能は、ユーザーが Cache の ファサード で静的メソッドを実行したとき、サービス コンテナ バインディングの名前を返すことです
}
、Laravel はサービスコンテナからバインドされたキャッシュを解決し、リクエストされたメソッド(この例ではget)を実行します そのオブジェクトでは、すべての ファサード
がグローバル名前空間に存在します。ネストされた名前空間で使用する場合は、facade
クラスを名前空間にインポートする必要があります:キャッシュを使用します;
#Importキャッシュファサード
class PhotosController はコントローラー { public関数インデックス(){
$ photos = Cache::get('photos');
}
}