जब हम 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 {}

हम उस प्रतिनिधित्व को कैसे बदल सकते हैं जो आरईपीएल इस तरह से किसी ऑब्जेक्ट को प्रिंट करते समय उपयोग करता है?

3
Chris Whalen 30 जुलाई 2020, 06:24

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'];
}
1
Brion Finlay 2 अप्रैल 2021, 01:43
हां! यह पूरी तरह से वही है जिसकी मुझे तलाश थी। $casters['App\Bunch'] = 'App\Bunch::castBunch'; जोड़ने से मैं अपने कस्टम वर्ग के आरईपीएल प्रतिनिधित्व को संभालने के लिए एक कस्टम विधि को परिभाषित कर सकता हूं। बहुत - बहुत धन्यवाद!
 – 
Chris Whalen
3 अप्रैल 2021, 02:19

डेटाबेस कनेक्शन सेट अप का उपयोग करके वाक्पटु स्वचालित रूप से मॉडल विशेषताओं को भरता है।

-1
Pierre Label 30 जुलाई 2020, 11:02