【问题标题】:Building Model Using Factory Laravel使用工厂 Laravel 构建模型
【发布时间】:2018-09-03 00:42:37
【问题描述】:

我正在尝试使用 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;
    }
}

我知道我正在尝试将存储库注入模型,并且我知道情况应该相反,但是我的逻辑依赖于这种情况。感谢您的帮助。

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    <?php
    namespace App\Facades;
    
    
    use Illuminate\Support\Facades\Facade;
    
    class Translate extends Facade
    {
    
        protected static function getFacadeAccessor()
        {
            return 'Translate';
        }
    
    }
    

    如下使用服务提供者单例实例化我的类

    <?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];
    

    【讨论】:

      猜你喜欢
      • 2017-03-21
      • 2019-06-21
      • 2017-04-23
      • 2017-04-11
      • 2023-02-04
      • 2020-03-09
      • 2021-12-27
      • 2018-06-13
      • 2016-09-29
      相关资源
      最近更新 更多