【问题标题】:Factories in Laravel?Laravel 的工厂?
【发布时间】:2017-05-29 22:23:25
【问题描述】:

看来你可以在 Laravel 中编写工厂。

根据文献: https://laravel.com/docs/5.3/database-testing#writing-factories

出现与模型/数据库相关的工厂。

是否可以为非模型相关编写工厂?

例如两个类:

class Car {
  public function drive() { }
} 

Class Bike {
 public function ride() { }
}

而不是使用(new Car)->drive(),我想使用TransportFactory 来对类进行分类。

【问题讨论】:

  • 如果我理解正确,您正在寻找Mockeries
  • @apokryfos 不,我不想嘲笑。我想使用像 Transport::build('car')->drive(); 这样的工厂模式,我想知道 Laravel 是否支持这样的东西。
  • 汽车是否有依赖关系,或者它会直接评估为(new Car)->drive()
  • @I'll-Be-Back 如果您的意思是工厂模式,那么不,您必须自己实现。 Laravel 使用 Service Container,它的工作方式不同,但提供了相似(如果不是更好)的结果。但是请注意,您链接到的工厂并不是您认为的那样。那是为了数据库测试。

标签: php laravel laravel-5.3


【解决方案1】:

我们可以按照以下方式创建像Transport::build('car')->drive(); 这样的工厂模式。

//Create a class for the dynamic object
class Transport{
    public static function build($vehicle)
    {
        return new $vehicle;
    }
}

//Normal class
class Car {
  public function drive() {

  }
}

//call factory class for dynamic object
Transport::build('Car')->drive();

【讨论】:

    【解决方案2】:

    我会做这样的事情

    class Transport
    {
        public static function build($vehicle)
        {
            return new $vehicle;
        }
    }
    
    interface Vehicle
    {
        public function drive();
    }
    
    class Car implements Vehicle
    {
        public function drive()
        {
            // the way a car drives
        }
    }
    
    class Bike implements Vehicle
    {
        public function drive()
        {
            // the way a bike drives
        }
    }
    
    class Something
    {
        public function someFunc()
        {
            Transport::build('Car')->drive();
        }
    }
    

    这里没有 drive()ride()CarBike 类的单独方法,我只是添加了 drive() 方法。然后BikeCar 绑定到Vehicle 合约。

    那么我们只需将CarBike 传递给Transport::build('Car')->drive();

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2020-07-14
      • 2021-01-22
      • 2018-02-14
      相关资源
      最近更新 更多