जब हम artisan tinker
का उपयोग करते हैं, और एक सुवक्ता मॉडल ऑब्जेक्ट का संदर्भ देते हैं, तो आरईपीएल स्वचालित रूप से मॉडल की विशेषताओं को प्रिंट करता है, ठीक उसी तरह जैसे यह हमारे द्वारा संदर्भित किसी भी मानक ऑब्जेक्ट के सार्वजनिक गुणों को प्रिंट करता है:
>>> (object) ['hello' => 'world']
=> {
+"hello": "world",
}
>>> App\User::first()
=> App\User {
id: 1,
name: "...",
}
मेरे लिए जो कम स्पष्ट है वह यह है कि इन आभासी विशेषताओं को यहां प्रदर्शित करने के लिए कैसे बनाया जा सकता है, जैसे कि वे पहले से ही कक्षा के सार्वजनिक गुणों के रूप में परिभाषित थे। मैं समझता हूं कि मॉडल के लिए अधिकांश विशेषता असाइनमेंट को आंतरिक रूप से HasAttributes
विशेषता द्वारा नियंत्रित किया जाता है, लेकिन यहां तक कि वहां देखकर, मैं अभी भी नहीं देखता कि लारवेल लेखक इस व्यवहार को कैसे प्राप्त करने में सक्षम थे।
मैंने इस तरह की कक्षा बनाने की कोशिश की है:
class Bunch implements Arrayable, ArrayAccess, Jsonable, JsonSerializable { ... }
लेकिन वर्किंग ऐरे एक्सेस और toArray
विधि के साथ भी, जब मैं इसे सीधे artisan tinker
से संदर्भित करता हूं:
>>> $b = new Bunch()
=> Bunch {}
>>> $b->one = 1
=> 1
>>> $b['one']
=> 1
>>> $b
=> Bunch {}
हम उस प्रतिनिधित्व को कैसे बदल सकते हैं जो आरईपीएल इस तरह से किसी ऑब्जेक्ट को प्रिंट करते समय उपयोग करता है?
2 जवाब
टिंकर में मॉडल की विशेषताओं को प्रदर्शित करने का तरीका निर्धारित करने वाला कोड टिंकर कोड में है, मॉडल में नहीं:
कैस्टर Symfony VarDumper घटक का हिस्सा हैं जिसका उपयोग PsySH। टिंकर PsySH के ऊपर बनाया गया है।
टिंकर अपने कंसोल कमांड क्लास में कैस्टर को कक्षाओं में मैप करता है:
यह कक्षाओं के मानचित्रण को उनके कलाकारों को लौटाता है:
/**
* Get an array of Laravel tailored casters.
*
* @return array
*/
protected function getCasters()
{
$casters = [
'Illuminate\Support\Collection' => 'Laravel\Tinker\TinkerCaster::castCollection',
'Illuminate\Support\HtmlString' => 'Laravel\Tinker\TinkerCaster::castHtmlString',
'Illuminate\Support\Stringable' => 'Laravel\Tinker\TinkerCaster::castStringable',
];
if (class_exists('Illuminate\Database\Eloquent\Model')) {
$casters['Illuminate\Database\Eloquent\Model'] = 'Laravel\Tinker\TinkerCaster::castModel';
}
if (class_exists('Illuminate\Foundation\Application')) {
$casters['Illuminate\Foundation\Application'] = 'Laravel\Tinker\TinkerCaster::castApplication';
}
return $casters;
}
यह कलाकारों को VarDumper पर सेट करता है:
$config->getPresenter()->addCasters(
$this->getCasters()
);
यदि आप टिंकर में प्रदर्शित होने वाले मॉडल से अतिरिक्त गुण जोड़ना चाहते हैं, तो आप $जोड़ता है मॉडल पर प्रॉपर्टी:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = ['is_admin'];
}
डेटाबेस कनेक्शन सेट अप का उपयोग करके वाक्पटु स्वचालित रूप से मॉडल विशेषताओं को भरता है।
नए सवाल
php
PHP एक व्यापक रूप से उपयोग किया जाता है, उच्च-स्तरीय, गतिशील, वस्तु-उन्मुख, और व्याख्या की गई स्क्रिप्टिंग भाषा मुख्य रूप से सर्वर-साइड वेब विकास के लिए डिज़ाइन की गई है। PHP भाषा के बारे में सवालों के लिए इस्तेमाल किया।
$casters['App\Bunch'] = 'App\Bunch::castBunch';
जोड़ने से मैं अपने कस्टम वर्ग के आरईपीएल प्रतिनिधित्व को संभालने के लिए एक कस्टम विधि को परिभाषित कर सकता हूं। बहुत - बहुत धन्यवाद!