我们有一些选择:
依赖注入:
use ExternalClass;
class Model extends Eloquent {
private $external;
public function __construct(ExternalClass $external)
{
$this->external = $external;
}
public function doWhatever()
{
return $this->external->do();
}
public function __call($name, $arguments)
{
return call_user_func_array(array($this->external,$name), $arguments);
}
}
Run Code Online (Sandbox Code Playgroud)
您不必将类传递给模型,Laravel将尝试实例化并为您注入该类.
编辑
而且你不必重写所有方法,看到这个神奇的方法__call?每当在您的类中找不到方法时,它将由PHP自动触发,因此您可以使用它将该调用转发到您的外部类.
最终编辑
特征:(这是PHP 5.4+)
class Model extends Eloquent {
use MyTraits;
public function doWhatever()
{
return $this->do();
}
}
trait MyTraits {
public function do()
{
/// this metho will be available in your class
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用存储库模式:
class DataRepository {
private $user;
private $external;
public function __construct(User $user, ExternalClass $external)
{
$this->user = $user;
$this->external = $external;
}
public function allUsers()
{
return $this->user->all();
}
public function doWhatever()
{
return $this->external->do($this->user);
}
}
Run Code Online (Sandbox Code Playgroud)
还有其他一些,但你的项目将真正告诉你什么是最好的.
编辑
请注意,您必须了解__call魔术方法,因为Laravel还使用它来提供动态方法,whereColumnname()并且您可能会因使用它而面临破坏风险.但这也是你可以通过更多代码来规避的事情:
public function __call($name, $arguments)
{
// If the method is not one of your package ones, try execute an Eloquent (parent) one
if ( ! in_array($name, ['methodA', 'methodB', 'methodC']))
{
return parent::__call($name, $arguments);
}
else
{
return call_user_func_array(array($this->external,$name), $arguments);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
944 次 |
| 最近记录: |