使用Factory Laravel建立模型

时间:2018-03-24 12:50:36

标签: laravel-5 ioc-container laravel-eloquent service-provider

我正在尝试使用服务提供商构建/使用因子模型,但我似乎错过了一两步才能使其工作。

以下是我的服务提供商

class TranslationProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {

        $this->app->bind(TranslatableModel::class, function($app){
            $translation =  \App::make(Repository::class);
            $model =  (new TranslatableModel())->setTranslationRepository($translation);
            return $model;
        });

    }

    public function register()
    {
    }
}

这是我的TranslatableModel

class TranslatableModel extends Model
{
    use Translatable, TranslationTrait;

    /** @var \App\Repositories\Translation\Repository $translationRepository */
    public $translationRepository;

    public function __construct(array $attributes = array())
    {
        parent::__construct($attributes);
    }

    public function setTranslationRepository(Repository $repo)
    {
        $this->translationRepository = $repo;

        return $this;
    }
}

我知道我正在尝试将一个Repository注入模型中,我知道情况应该是相反的,但我的逻辑依赖于这种情况。感谢您的帮助。

由于

1 个答案:

答案 0 :(得分:1)

在模型中使用\ App :: make(Repository :: class)的问题将导致闭包上的序列化500错误。

解决方法是为它创建服务提供者和Facade,如下所示。

<?php
namespace App\Facades;


use Illuminate\Support\Facades\Facade;

class Translate extends Facade
{

    protected static function getFacadeAccessor()
    {
        return 'Translate';
    }

}

使用服务提供者singleton实例化我的类,如下所示

<?php

namespace App\Providers;

use App\Repositories\Translation\Repository;
use Illuminate\Support\ServiceProvider;

class TranslationProvider extends ServiceProvider
{

    public function register()
    {
        $this->app->singleton('Translate', function() {
            return \App::make(Repository::class);
        });
    }
}

现在在我的TransalatableModel中,我将使用Facade引用Translate Repository,如下所示:

@Translate::translateText($this->short_description, 'en', 'ar')[0];