Преобразование старого (4.2) laravel с несколькими источниками данных в новый источник данных на основе API для одного

#php #laravel #laravel-4

#php #laravel #laravel-4

Вопрос:

У меня есть более старое приложение Laravel, которое имеет 7 разных баз данных в app/config/database.php файл, тип баз данных даже не соответствует 4 различным типам mysql, pgsql, sqlite и sqlsrv. SQL Server заменяется API на основе JSON. В приложении 159 контроллеров и 212 моделей (не включая ничего, чего нет в соответствующих каталогах).

Хотя я создал несколько приложений с более новыми версиями Laravel, я избежал многих вещей ORM для контроля и удобства чтения, и мне трудно прочитать часть этого кода и придумать решение для замены SQL Server без перезаписи всего.

Вот пример:

MembershipController.php

 <?php
use netauthorizeapicontractv1 as AnetAPI;
use netauthorizeapicontroller as AnetController;

class MembershipsController extends BaseController {

    /**
     * Show the form for creating a new membership
     *
     * @return Response
     */
    public function create() {
        
        $products = Product::lists('title', 'id');
        $divisions = Division::lists('name', 'id');
        $this->layout = View::make('memberships.create', compact('products', 'divisions'));
        $this->layout->title = 'New Membership';

        // add breadcrumb to current page
        $this->layout->breadcrumb = array(
            array(
                'title' => 'Dashboard',
                'link' => 'dashboard',
                'icon' => 'glyphicon-home',
            ),
            array(
                'title' => 'All Memberships',
                'link' => 'dashboard/memberships',
                'icon' => 'glyphicon-plus',
            ),
            array(
                'title' => 'New Membership',
                'link' => 'dashboard/memberships/create',
                'icon' => 'glyphicon-plus',
            ),

        );
    }
}
 

Product.php Модель

 <?php


class Product extends Eloquent {
  protected $connection = 'sqlsrv';

    // Add your validation rules here
    public static $rules = [
        'division_id' => 'required',
        'title' => 'required',
        'sku' => 'required',
        'short_description' => 'required',
        'description' => 'required',
        'daily' => 'required',
        'term' => 'required',
        'price' => 'required',
        'appfee' => 'required',
        'family' => 'required'
    ];
    
public function getDateFormat() {
        return 'Y-m-d H:i:s';
    }
    // Don't forget to fill this array
    protected $guarded = ['id'];
    //public $timestamps = true;

     public function options()
    {
        return $this->belongsToMany('Option', 'product_options')->withPivot('enabled', 'price', 'id');
    }

    public function division(){
        return $this->belongsTo('Division', 'division_id');
    }

    public function msa(){

        return $this->hasOne('MSA', 'msa_version');
    }
    
}
 

Я знаю, что Laravel автоматически запрашивает базу данных SQLServer и использует заголовок и идентификатор для составления списка, но я не вижу, где выполняется вызов dbase, чтобы я мог «подключить» его, чтобы преобразовать его в вызов API.

В этом приложении есть сотни подобных вызовов, и я пытаюсь найти лучший способ преобразовать все эти вызовы, которые направлялись в sqlsrv, чтобы теперь перейти к API.

Как мне запретить модели использовать ORM вместо того, чтобы вводить вызов API в модель для получения данных?

Любые предложения были бы полезны, поскольку я даже не уверен, с чего начать.

Комментарии:

1. Что вы подразумеваете под заменой на API? вы получаете данные из API?

2. В настоящее время приложение получает данные из нескольких баз данных. Использование Eloquent и ORM. Одна из баз данных заменяется API, который имеет номера наборов данных вместо имен таблиц, хотя поля те же.

Ответ №1:

Я не думаю, что это возможно без пользовательской реализации, подобной этой: https://github.com/jenssegers/laravel-mongodb

Вы также можете проверить это:

Я не уверен, подходит ли что-нибудь из этого к вашему случаю, но это хорошая отправная точка.

Комментарии:

1. Я видел все три из этих пакетов и использую пакет jensseger в другом проекте. К сожалению, я не уверен, как использовать их в этом случае, поскольку мне нужно предотвратить все взаимодействия ORM на всех новых моделях, поскольку в API есть различия, такие как, хотя имена полей совпадают, имена таблиц нет. В приведенном выше примере таблица, которая была «products», теперь tbl3254, а API не RESTful, для каждого вызова требуется полезная нагрузка, указывающая таблицу и параметры.

2. @Lance сначала начните с действительно базовой реализации — просто чтобы заменить Eloquent, создайте класс, подобный EloquentToApi, затем замените «extends Eloquent» на «extends EloquentToApi» и реализуйте метод по методу 🙂 Я не уверен, сколько времени вы можете потратить на это, но если ваш API плохо структурирован, у вас проблемы 🙂 На самом деле у вас проблемы, так как вы начали работать над таким проектом 🙂