數天後,研究和思考了很多關於這個最好的方法,使用Laravel我終於解決了最後解決。
我不得不說,這是特別困難的Laravel 5.2
,因爲在這個版本中會議中間件僅在路由使用的控制器上執行,這意味着,如果由於某種原因,我用了一個控制器(不鏈接對於死記硬背),並嘗試訪問會議,這是不可能的。
所以,因爲我不能使用會話,我決定使用URL參數,在這裏你有解決方案,我希望你們中的一些人認爲它有用。
所以,你有一個接口:
interface Service
{
public function execute();
}
然後一對夫婦的接口實現:
服務之一:
class ServiceOne implements Service
{
public function execute()
{
.......
}
}
服務兩項。
class ServiceTwo implements Service
{
public function execute()
{
.......
}
}
現在最有趣的部分:有一個包含了與服務接口的相關性功能的控制器,但我需要dinamically解決它基於在使用輸入ServiceOne或ServiceTwo。所以:
控制器
class MyController extends Controller
{
public function index(Service $service, ServiceRequest $request)
{
$service->execute();
.......
}
}
請注意,ServiceRequest,驗證了請求中已經存在,我們需要解決的依賴參數(稱之爲'service_name'
)
現在,在AppServiceProvider我們可以通過這種方式解決依賴關係:
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
}
public function register()
{
//This specific dependency is going to be resolved only if
//the request has the service_name field stablished
if(Request::has('service_name'))
{
//Obtaining the name of the service to be used (class name)
$className = $this->resolveClassName(Request::get('service_name')));
$this->app->bind('Including\The\Namespace\For\Service', $className);
}
}
protected function resolveClassName($className)
{
$resolver = new Resolver($className);
$className = $resolver->resolveDependencyName();
return $className;
}
}
所以現在所有的責任都是針對Resolver類的,這個cl屁股基本上使用傳遞給構造器的參數,那將被用作服務接口的實現類的返回全名(命名空間):
class Resolver
{
protected $name;
public function __construct($className)
{
$this->name = $className;
}
public function resolveDependencyName()
{
//This is just an example, you can use whatever as 'service_one'
if($this->name === 'service_one')
{
return Full\Namespace\For\Class\Implementation\ServiceOne::class;
}
if($this->name === 'service_two')
{
return Full\Namespace\For\Class\Implementation\ServiceTwo::class;
}
//If none, so whrow an exception because the dependency can not be resolved
throw new ResolverException;
}
}
嗯,我真的希望這有助於一些你的。
祝好!
---------- -----------編輯
我才意識到,這不是直接使用請求數據,裏面是個好主意Laravel的集裝箱,從長遠來看真的會有一些麻煩。
最好的方法是直接註冊所有可能的實例(serviceone和servicetwo),然後直接從控制器或中間件中解析其中的一個,然後是控制器「誰決定」使用哪種服務(從所有可用的)基於來自請求的輸入。
最後它的工作原理是一樣的,但它可以讓你以更自然的方式工作。我不得不說,感謝rizqi。來自Laravel閒聊的問題頻道的用戶。
他親自爲此創建了一個黃金article。請閱讀它,因爲完全和正確地解決這個問題。
laravel registry pattern
一個很好的問題。 – simhumileco