Laravel Model привязка модели подкласса - PullRequest
0 голосов
/ 17 мая 2018

У меня возникли проблемы с привязкой модели маршрута к моему подклассу Eloquent.Следующий код работает нормально:

$repo = new \App\Repositories\Eloquent\PluginRepository();
$plugin = $repo->findOrFail(1);
var_dump($plugin->type);

Вывод

object(App\PluginsTypes)#360 (26) {...}

Но когда я связываю модель, например:

route / web.php

Route::resource('plugins', 'PluginsController');

app / Http / Controllers / Admin / PluginsController.php

public function edit(PluginRepositoryInterface $plugin){
    var_dump($plugin); // object(App\Repositories\Eloquent\PluginRepository)#345 (26) {...}
    var_dump($plugin->id); // NULL
}

Так что проблема в том, чтоон не находит идентификатор, переданный в маршруте.


Код добавления в проекте Laravel:

app / Plugins.php

<?php

namespace App;

class Plugins extends Model{
    // My Eloquent Model

    /**
     * The foreignKey and ownerKey needs to be set, for the relation to work in subclass.
     */
    public function type(){
        return $this->belongsTo(PluginsTypes::class, 'plugin_type_id', 'id');
    }
}

app / Repositories / SomeRepository.php

<?php

namespace App\Repositories;

use App\Abilities\HasParentModel;

class PluginsRepository extends Plugins{
    protected $table = 'some_table';

    use HasParentModel;
}

config / app.php

'providers' => [
    ...
    App\Repositories\Providers\PluginRepositoryServiceProvider::class,
    ...
]

app / Repositories / Providers / PluginRepositoryServiceProvider.php

<?php

namespace App\Repositories\Providers;

use Illuminate\Support\ServiceProvider;

class PluginRepositoryServiceProvider extends ServiceProvider{

    /**
     * This registers the plugin repository - added in app/config/app.php
     */
    public function register(){
        // To change the data source, replace the concrete class name with another implementation
        $this->app->bind(
            'App\Repositories\Contracts\PluginRepositoryInterface',
            'App\Repositories\Eloquent\PluginRepository'
        );
    }
}

Использование следующих ресурсов:

HasParentModel Trait на GitHub

Расширение моделей в Eloquent

1 Ответ

0 голосов
/ 18 мая 2018

Я нашел ответ в документах (конечно):

https://laravel.com/docs/5.6/routing#route-model-binding в разделе Настройка логики разрешения

В моем приложении / Репозитории / Провайдеры / PluginRepositoryServiceProvider.php я добавил следующее в привязку интерфейса и теперь оно работает.

$this->app->router->bind('plugin', function ($value) {
        return \App\Repositories\Eloquent\PluginRepository::where('id', $value)->first() ?? abort(404);
});

Я, вероятно, переименую его, но он работает как шарм :) Добрый день ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...