#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 плохо структурирован, у вас проблемы 🙂 На самом деле у вас проблемы, так как вы начали работать над таким проектом 🙂