मैं इस प्रश्न पर ठोकर खाई और इसका मेरा जवाब था।
मैंने DatabaseConnection
. नामक एक वर्ग बनाया है :
class DatabaseConnection extends Model
{
static $instances=array();
protected $database;
protected $connection;
public function __construct($options = null)
{
// Set the database
$database = $options['database'];
$this->database = $database;
// Figure out the driver and get the default configuration for the driver
$driver = isset($options['driver']) ? $options['driver'] : Config::get("database.default");
$default = Config::get("database.connections.$driver");
// Loop through our default array and update options if we have non-defaults
foreach($default as $item => $value)
{
$default[$item] = isset($options[$item]) ? $options[$item] : $default[$item];
}
$capsule = new Capsule;
$capsule->addConnection($default);
$capsule->setEventDispatcher(new Dispatcher(new Container));
$capsule->setAsGlobal();
$capsule->bootEloquent();
// Create the connection
$this->connection = $capsule->getConnection();
DatabaseConnection::$instances[] = $capsule;
return $this->connection;
}
}
इसलिए, जब भी मैं एक नियंत्रक में होता हूं जो उप-डेटाबेस की तालिकाओं में हेरफेर करता है, तो मैं बस इस तरह से जाता हूं:
public function RandomActionInMyController()
{
$db_connection = new DatabaseConnection(['database' => 'name_of_db']);
$someModel = new Model/Model::find()..// Basically anything
return myreturnstuff;
}
अतिरिक्त बोनस :
स्थिर विशेषता का उपयोग $instances
मेरे DatabaseConnection
में आसानी से उपयोग के लिए मेरे नवीनतम डेटाबेस कनेक्शन को पुनः प्राप्त करने के लिए उबलता है।
उदाहरण के लिए, यदि मैं कभी इसे पुनः प्राप्त करना चाहता हूं, तो इसे
. जैसे फ़ंक्शन में लपेटा जाएगाfunction CurrentOrLatestDbConnection()
{
if( !empty(DatabaseConnection::$instances) )
{
return end(DatabaseConnection::$instances)->getConnection()->getDatabaseName();
}
}
नोट :
यदि आप Unknown class 'Container'
. जैसी त्रुटियों का सामना करते हैं या Capsule
या उस तरह का कुछ भी, सुनिश्चित करें कि आपने मेरे द्वारा प्रदान किए गए प्रश्न लिंक की जांच की है, और use
. का उपयोग करें ठीक से बयान।
आगामी उत्तरों के बारे में :
मुझे ऐसा लगता है कि यह डेटाबेस कनेक्शन नियंत्रक की कार्रवाई के ब्रैकेट के भीतर रहता है, इसलिए जब मैं किसी अन्य क्रिया पर आगे बढ़ता हूं जो कोई कनेक्शन निर्दिष्ट नहीं करता है, तो यह स्वचालित रूप से केंद्रीय डेटाबेस में वापस आ जाता है।
जिसने मुझे यह सोचने पर मजबूर कर दिया है कि उप-डेटाबेस से डेटाबेस कनेक्शन को पूरे फ़ंक्शन के लिए 'वैश्विक' तरीके से सेट करने का एक तरीका होना चाहिए, जैसे कि मिडलवेयर या कुछ और।
मुझे इस तरह की चीज़ को लागू करते हुए एक उत्तर देखना अच्छा लगेगा।
अपडेट करें :
मैं इसे करने का एक बेहतर तरीका लेकर आया हूं।
मुझे लगता है कि आप मेरे जैसे ही हैं, प्रत्येक नियंत्रक के अनुसार सशर्त रूप से डेटाबेस बदलना चाहते हैं ... कहें, आपके प्रत्येक नियंत्रक को तर्क के लिए एक अलग डेटाबेस की आवश्यकता है।
इसे हल करने के लिए हम 'मिडलवेयर्स' का उपयोग करेंगे।
सबसे पहले, यह समझाने के लिए कि हम क्या करने जा रहे हैं..
हम नियंत्रक (और यहां तक कि कार्रवाई) के नाम की जांच करने जा रहे हैं और फिर उचित डेटाबेस सेट करें जिसे हम सेट करना चाहते हैं।
-
अपनी कमांड-लाइन पर जाएं, टाइप करें:
php artisan make:middleware SetDatabaseConnectionMiddleware
तैयार बॉयलरप्लेट के साथ मिडलवेयर बनाने के लिए।
या, यदि आप इसे कठिन तरीके से पसंद करते हैं, तो अपने ऐप_नाम/ऐप/एचटीपी/मिडलवेयर पर जाएं और मैन्युअल रूप से एक बनाएं।
-
अपनी हेल्पर मेथड्स फ़ाइल पर जाएँ (यदि आपके पास पहले से एक है, यदि नहीं, तो यार एक बना लें!)
function getControllerAndActionName() { $action = app('request')->route()->getAction(); $controller = class_basename($action['controller']); list($controller, $action) = explode('@', $controller); return ['action' => $action, 'controller' => $controller]; }
यह आपके पास क्रिया नाम और नियंत्रक नाम दोनों के साथ एक सरणी लौटाएगा, यदि आप केवल नियंत्रक के नाम को प्रतिबंधित रूप से वापस करना चाहते हैं, तो बेझिझक 'action' => $action
निकालें कोड से।
- आपके मिडलवेयर के अंदर, यह इस तरह दिखेगा:
namespace App\Http\Middleware;
use Closure;
use DatabaseConnection;
class SetProperDatabase
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$database_name = '';
$controllerAndActionName = getControllerAndActionName();
$controller_name = $controllerAndActionName['controller'];
$action_name = $controllerAndActionName['action'];
if($controller_name == 'my_controller_nameController')
{
$database_name = 'your_proper_database_name';
}
else
{
$database_name = 'other_db';
}
$database_connection = new DatabaseConnection(['database' => $database_name']);
return $next($request);
}
}
4.अब, जब आपने अपना मिडलवेयर ठीक से बना लिया है, तो आइए हम आपके ऐप को बताएं कि इसे कहां और किस नाम से खोजना है।
- अपने app_name/app/Http/Kernel.php पर जाएं
-
आपके
$routeMiddleware
. में चर, इस पंक्ति को जोड़ें'set_proper_database' => \App\Http\Middleware\SetProperDatabase::class,
इस तरह हम इसे कॉल करना जानते हैं।
-
अंत में, इसे सेट करना।
- अपने
Controller.php
पर जाएं (एब्सट्रैक्ट क्लास जिसमें से आपके सभी कंट्रोलर इनहेरिट करते हैं)
public function __construct()
{
$this->middleware('set_proper_database');
}
- अपने
और यह आपके लिए करना चाहिए।
यदि आपके कोई और प्रश्न हैं, तो कृपया बेझिझक टिप्पणी करें।
// संसाधन:
3.आगे मिडलवेयर दस्तावेज़ीकरण नोट :मैं अपनी स्टाइलिंग और कोड इंडेंटिंग से संबंधित कुछ संस्करण की सराहना करता हूं, क्योंकि ऐसा लगता है कि मैंने यहां अपने कोड को ठीक से स्टाइल करने के लिए संघर्ष किया लेकिन व्यर्थ में, मेरे द्वारा उपयोग किए गए इंडेंट का कोई प्रभाव नहीं पड़ा।