【问题标题】:Laravel automatic resolution with parametersLaravel 带参数自动解析
【发布时间】:2023-03-08 16:55:01
【问题描述】:

我有这样的课:

class PostValidator 
{
     public function __construct(Validator $validator, $data) 
     {
          $this->validator = $validator;
          $this->data = $data;
     }
}

我阅读了有关 IoC 自动解析的 Laravel 文档,它给出了一个示例:

class FooBar {

    public function __construct(Baz $baz)
    {
        $this->baz = $baz;
    }

}

$fooBar = App::make('FooBar');

是否可以仅在没有App::bind(带闭包)的情况下使用App::make 来实例化我的类,上面还传递参数$data

【问题讨论】:

    标签: laravel laravel-4 ioc-container


    【解决方案1】:

    不,你不能那样做。

    这个想法是你只将依赖项传递给构造函数,显然data 不是一个。 Validator 处理数据,但不依赖于数据。

    改为对数据使用 setter。

    class PostValidator 
    {
         public function __construct(Validator $validator)
         {
              $this->validator = $validator;
         }
    
         public function setData($data)
         {
              $this->data = $data;
         }
    }
    

    并简单地显式调用它:

    $validator = App::make('PostValidator');
    $validator->setData($data);
    
    // or in the controller, which is what you're doing most likely
    public function __construct(PostValidator $validator)
    {
      $this->validaotr = $validator;
    }
    
    public function update($id)
    {
      $data = Input::only([ input that you need ]);
    
      $this->validator->setData($data);
    
      // run the validation
      ...
    }
    

    编辑:根据评论,这是第二个参数 $parameters 所做的:

    // Foo class with Eloquent Models as dependencies
    public function __construct(User $user, Category $category, Post $post)
    {
     $this->user = $user;
     $this->category = $category;
     $this->post = $post;
    }
    

    然后 IoC 容器会将依赖关系解析为新实例化的模型:

    $foo = App::make('Foo');
    $foo->user; // exists = false
    $foo->category; // exists = false
    $foo->post; // exists = false
    

    但如果你愿意,你可以这样做:

    $user = User::first();
    $cat = Category::find($someId);
    
    $foo = App::make('Foo', ['category' => $cat, 'user' => $user]);
    $foo->user; // exists = true, instance you provided
    $foo->category; // exists = true, instance you provided
    $foo->post; // exists = false, newly instantiated like before
    

    【讨论】:

    • 感谢您的回答。也许另一件事,App::make 允许我们传递第二个参数,它是做什么用的?
    • 如果需要,它用于提供具体实例 - 检查编辑。
    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 2018-10-27
    • 2015-12-25
    • 2016-12-23
    • 1970-01-01
    • 2014-06-16
    • 2019-01-30
    • 2017-02-02
    相关资源
    最近更新 更多