2016-07-14 109 views
1

我寫了一個「Helper」控制器,我想在其他控制器中使用,但是我做錯了什麼。 Lumen是我需要的服務嗎?然後,我只是不知道如何設置它。Lumen共享控制器

我的主類:

namespace App\Http\Controllers; 

use App\Http\Controllers\HelperController as Helper; 

class InitController extends Controller 
{ 
    public function work($hash, $type) 
    { 
     return response()->json([ 
      'answer' => Helper::makeCodeUrl() 
     ]); 
    } 
} 

輔助控制器:

namespace App\Http\Controllers; 

class HelperController extends Controller 
{ 
    public function makeCodeUrl($arr, $type){ 
     return str_random(32); 
    } 
} 

回答

3

記住,控制器負責處理路由邏輯。考慮到這一點,實際上沒有「助手控制器」這樣的東西,因爲沒有路線被映射到它,因此並不是傳統意義上的「控制器」。

你所描述的是所謂的「服務類」。任何合理複雜的應用程序都將使用服務類作爲一種手段,將控制器的所有業務邏輯抽象爲可重用的組件。

就你而言,服務類正是你所需要的。爲了建立你自己的,你需要做的幾件事情:

  1. 註冊一個ServiceProvider
  2. 添加實際的服務提供者類,並結合你的助手服務應用程序的IOC容器
  3. 創建助手服務
  4. Typehint的輔助服務在您的控制器的構造函數
  5. 運行composer dump-autoload

作爲概念的快速證明,這是它最終會看起來像:

引導/ app.php

/* 
|-------------------------------------------------------------------------- 
| Register Service Providers 
|-------------------------------------------------------------------------- 
| 
| Here we will register all of the application's service providers which 
| are used to bind services into the container. Service providers are 
| totally optional, so you are not required to uncomment this line. 
| 
*/ 

$app->register(App\Providers\HelperServiceProvider::class); 

應用/供應商/ HelperServiceProvider.php

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 
use App\Services\Helpers\HelperService; 

class HelperServiceProvider extends ServiceProvider 
{ 
    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->bind(HelperService::class, function(){ 
      return new HelperService; 
     }); 
    } 
} 

app/Services \ Helpers \ HelperService.php

namespace App\Services\Helpers; 

class HelperService 
{ 
    public function makeCodeUrl(){ 
     return str_random(32); 
    } 
} 

InitController.php

namespace App\Http\Controllers; 

use App\Services\Helpers\HelperService; 

class InitController extends Controller 
{ 
    protected $helperService; 

    public function __construct(HelperService $helperService) 
    { 
     $this->helperService = $helperService; 
    } 
    public function work($hash, $type) 
    { 
     return response()->json([ 
      'answer' => $this->helperService->makeCodeUrl() 
     ]); 
    } 
} 

雖然我可以理解,有一點與這個代碼特定模式的學習曲線,我會強烈建議閱讀儘可能多地瞭解服務提供商。它將被證明在將來變得非常有價值,並且將使您能夠將整個第三方庫引導到Laravel或Lumen安裝中。

+0

謝謝你這麼好的回答 – SLI