Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel4/PHP模型(或任何模型)扩展了多个类_Php_Oop_Laravel_Laravel 4 - Fatal编程技术网

Laravel4/PHP模型(或任何模型)扩展了多个类

Laravel4/PHP模型(或任何模型)扩展了多个类,php,oop,laravel,laravel-4,Php,Oop,Laravel,Laravel 4,我发现一些有用的包扩展了Eloquent的功能,例如:Sentry,Revisionable。 现在我明白了,您不能扩展多个类,有一些方法可以作为代理,或者只是以某种方式使用另一个类作为属性 创建从多个软件包中获益的模型的最佳实践是什么?我们有一些选择: 依赖项注入: use ExternalClass; class Model extends Eloquent { private $external; public function __construct(Externa

我发现一些有用的包扩展了Eloquent的功能,例如:Sentry,Revisionable。 现在我明白了,您不能扩展多个类,有一些方法可以作为代理,或者只是以某种方式使用另一个类作为属性

创建从多个软件包中获益的模型的最佳实践是什么?

我们有一些选择:

依赖项注入:

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);
    }
}
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);
    }
}
您不必向模型传递类,Laravel将尝试为您实例化并注入该类

编辑

你不必重写所有的方法,看看这个神奇的方法
\u调用
?每当在类中找不到方法时,PHP就会自动激发该方法,因此您可以使用它将该调用转发到外部类

结束编辑

特性:(这是PHP5.4+)

您还可以使用存储库模式:

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);
    }
}
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);
    }
}
还有一些其他的,但是你的项目会告诉你什么是最好的

编辑

请注意,您必须了解uu call magic方法,因为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);
    }
}
我们有一些选择:

依赖项注入:

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);
    }
}
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);
    }
}
您不必向模型传递类,Laravel将尝试为您实例化并注入该类

编辑

你不必重写所有的方法,看看这个神奇的方法
\u调用
?每当在类中找不到方法时,PHP就会自动激发该方法,因此您可以使用它将该调用转发到外部类

结束编辑

特性:(这是PHP5.4+)

您还可以使用存储库模式:

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);
    }
}
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);
    }
}
还有一些其他的,但是你的项目会告诉你什么是最好的

编辑

请注意,您必须了解uu call magic方法,因为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);
    }
}

PHP5.4的特点是什么?(我在当前项目中使用5.3)依我的经验,依赖注入或/或存储库模式已经导致了最易维护的应用程序。是的,所以你不能使用Traits,但我认为Traits是用于其他类型的用法。:)所以基本上,使用依赖注入,我必须重写所有的方法。。。事实上,propsNot只是添加了一个神奇的方法,可以节省大量的重写?(我在当前项目中使用5.3)依我的经验,依赖注入或/或存储库模式已经导致了最易维护的应用程序。是的,所以你不能使用Traits,但我认为Traits是用于其他类型的用法。:)所以基本上,使用依赖注入,我必须重写所有的方法。。。而不是真的,只是编辑添加了一个神奇的方法,可以节省大量的重写。