2017-01-29 23 views
0

私はZend Frameworkを長年開発しており、Laravelを学んでいます。Laravelアプリケーションにサービスレイヤーを追加することの効果

私の以前のアプリケーションでは、通常、コントローラによって呼び出されるサービスレイヤがあります。サービスレイヤーはMapperとDomain Modelの上部にあり、アプリケーションロジック、イベントの発生、入力フィルタリングなどを担当します。

Laravelにサービスレイヤーを実装しない理由はありますか?これまで見てきた例では、コントローラはドメインオブジェクト(またはより正確にはアクティブなレコード)で直接動作します。

私のLaravelコントローラが私のサービスレイヤーを呼び出した場合、Laravelの利点は失われますか? (私が見る限り、私はまだRoute/Modelバインディングを使用できます)。

第2の質問として、私のサービスレイヤーを実装する最良の方法は何ですか?サービスプロバイダの集まりとして、おそらく?

答えて

2

私もZendから来たLaravelに切り替えてサービスを見逃しました。私自身のために、名前空間App \ ServicesにあるService名前空間を実装しました。そこに私はすべてのモデル/検証ハンドリングをしています。私は機能や何かを失ったことはありません。

私のコントローラのレイアウトの例:

<?php 
namespace App\Http\Controllers; 

use App\Services\Contact as ContactService; 
use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Lang; 

class IndexController extends Controller 
{ 

    /** 
    * Create a new controller instance. 
    * 
    * @param Request $request 
    * @return void 
    */ 
    public function __construct(Request $request) 
    { 
     $this->_request = $request; 
    } 

    /** 
    * Standard contact page 
    * 
    * @return contact page 
    */ 
    public function contact(ContactService $contactService) 
    { 
     $errors = null; 
     $success = false; 
     if ($this->_request->isMethod('post')) { 
      $validator   = $contactService->validator($this->_request->all()); 
      if ($validator->fails()) { 
       $errors = $validator->errors(); 
      } else { 
       $contactService->create($validator->getData()); 
       $success = true; 
      } 
     } 
     return view('pages/contact', ['errors' => $errors, 'success' => $success]); 
    } 
} 

はサービスは基本的に私は私のZendのプロジェクトでそれを持っていただけのように私のコントローラに表示したくないすべてを行う、crudsを扱う、バリデータを返します。サービスの

例:

<?php 
namespace App\Services; 

use Validator; 
use Mail; 
use App\Models\Contact as ContactModel; 

class Contact 
{ 

    /** 
    * Get a validator for a contact. 
    * 
    * @param array $data 
    * @return \Illuminate\Contracts\Validation\Validator 
    */ 
    public function validator(array $data) 
    { 
     return Validator::make($data, [ 
       'email'  => 'required|email|max:255', 
       'phone'  => 'max:255', 
       'firstName' => 'required|max:255', 
       'lastName' => 'required|max:255', 
       'message' => 'required' 
     ]); 
    } 

    /** 
    * Create a new contact instance after a valid form. 
    * 
    * @param array $data 
    * @return ContactModel 
    */ 
    public function create(array $data) 
    { 
     $data = [ 
      'email'  => $data['email'], 
      'firstName' => $data['firstName'], 
      'lastName' => $data['lastName'], 
      'language' => $data['language'], 
      'phone'  => $data['phone'], 
      'message' => $data['message'] 
     ]; 

     // Send an email 
     Mail::send('emails.contact', ['data' => $data], function ($m) use ($data) { 
      $m->from(config('mail.from.address'), config('mail.from.name')); 
      $m->to(env('MAIL_TO', '[email protected]'), env('MAIL_TO'))->subject('Contact form entry from: ' . $data['firstName']); 
     }); 

     return ContactModel::create($data); 
    } 
} 
関連する問題