Laravel 5.7服务容器| DI /将参数传递给控制器​​中的方法

时间:2019-01-03 19:25:58

标签: php laravel

我在寻找一种优雅的解决方案以将参数注入控制器方法方面遇到困难。我想将工厂移到服务容器中,因为对于没有经验的程序员而言,代码更加复杂。我试图使用服务容器的bindMethod将参数注入到控制器函数中,但尚未成功。

有人知道如何做到这一点吗?

我试图将参数注入控制器方法的代码

Laravel AppServiceProvider

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $container = app();
        $container->bindMethod('TestController@index', function ($controller, $container) {
            return $controller->index('TestData');
        });
    }
}

控制器

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
    public function index($test)
    {
        // do something with the implementations.
    }
}

我要实现的目标示例

当前情况(简体)。

public function index()
{
    $car = CarFactory::get();
    $food = FoodFactory::get();
}

我希望它看起来像这样:

public function index($car, $food)
{
    // do something with the implementations.
}

提前谢谢!

2 个答案:

答案 0 :(得分:1)

可以使用工厂向服务容器注入特定接口的实现。您可以使用bind方法做到这一点。

<?php

namespace App\Providers;

use App\ExampleImplementation;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(
            'App\IExample',
            function() {
                return (new factory())->make();
            }
        );
    }
}

我正在研究这是一种从控制器中删除工厂的实用方法。

谢谢大家!

答案 1 :(得分:0)

您可以在构造函数中做到这一点:

private $carFactory;

public function __construct(CarFactory $carFactory){
  $this->carFactory = $carFactory;
}

然后随时使用$this->carFactory

进行访问