如何根据laravel中的类型实例化类?
How to instantiate classes based on type in laravel?
所以我有一个 BaseValuation
抽象 class 及其实现示例 FooValuation
和 BarValuation
.
我想根据使用输入实例化 Foo
或 Bar
实现。所以我自己创建了一个简单的 class,叫做 Valuation
,它只是这样做的:
<?php
namespace App\Valuation;
class Valuation
{
public $class;
public function __construct($id, $type = 'basic')
{
$class = 'App\Valuation\Models\' . ucfirst($type) . 'Valuation';
$this->class = new $class($id);
}
public function make()
{
return $this->class;
}
}
使用这个我可以简单地做 (new App\Valuation\Valuation($id, $type))->make()
我会根据用户的要求得到想要的实现。
但我知道 laravel 的容器功能强大,必须允许我以某种方式执行此操作,但我不明白这将如何完成。有人有什么想法吗?
您可以将 class 绑定到任何字符串,通常这是在服务提供商中完成的。
$this->app->bind('string', SomethingValuation::class);
然后你可以用App::make('string')
实例化它。
我认为当您将单个实现(具体)绑定到接口(抽象)而不是绑定多个 classes 时,这更有价值。
您也可以只允许 Laravel 通过调用 App::make(\Full\Path::class)
为您实例化 class。
两者都允许您将模拟注入具有相同名称的容器以进行测试。
所以我有一个 BaseValuation
抽象 class 及其实现示例 FooValuation
和 BarValuation
.
我想根据使用输入实例化 Foo
或 Bar
实现。所以我自己创建了一个简单的 class,叫做 Valuation
,它只是这样做的:
<?php
namespace App\Valuation;
class Valuation
{
public $class;
public function __construct($id, $type = 'basic')
{
$class = 'App\Valuation\Models\' . ucfirst($type) . 'Valuation';
$this->class = new $class($id);
}
public function make()
{
return $this->class;
}
}
使用这个我可以简单地做 (new App\Valuation\Valuation($id, $type))->make()
我会根据用户的要求得到想要的实现。
但我知道 laravel 的容器功能强大,必须允许我以某种方式执行此操作,但我不明白这将如何完成。有人有什么想法吗?
您可以将 class 绑定到任何字符串,通常这是在服务提供商中完成的。
$this->app->bind('string', SomethingValuation::class);
然后你可以用App::make('string')
实例化它。
我认为当您将单个实现(具体)绑定到接口(抽象)而不是绑定多个 classes 时,这更有价值。
您也可以只允许 Laravel 通过调用 App::make(\Full\Path::class)
为您实例化 class。
两者都允许您将模拟注入具有相同名称的容器以进行测试。