Laravel ਦੀ $casts property ਉਹਨਾਂ ਚੁੱਪ-ਚਾਪ ਮਿਲਣ ਵਾਲੀਆਂ ਸਹੂਲਤਾਂ ਵਿੱਚੋਂ ਇੱਕ ਹੈ ਜੋ ਬਹੁਤ ਜ਼ਿਆਦਾ ਧਿਆਨ ਖਿੱਚੇ ਬਿਨਾਂ ਤੁਹਾਡੇ ਡੇਟਾ ਨੂੰ ਸੰਭਾਲਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਬਦਲ ਦਿੰਦੀ ਹੈ। ਐਰੇ (array) ਵਿੱਚ boolean ਜਾਂ datetime ਵਰਗਾ ਬਿਲਟ-ਇਨ ਟਾਈਪ ਪਾਓ, ਅਤੇ Eloquent ਆਪਣੇ ਆਪ ਰੋਅ (raw) ਡੇਟਾਬੇਸ ਸਟ੍ਰਿੰਗਾਂ ਨੂੰ ਤੁਹਾਡੇ ਕੰਟਰੋਲਰਾਂ ਜਾਂ ਵਿਊਜ਼ (views) ਤੱਕ ਪਹੁੰਚਣ ਤੋਂ ਪਹਿਲਾਂ ਕੁਝ ਵਧੇਰੇ ਸੁਖਾਲਾ ਬਣਾ ਦਿੰਦਾ ਹੈ। ਇਹ ਤੁਹਾਡੇ ਕੋਡ ਨੂੰ ਸਾਫ਼-ਸੁਥਰਾ ਰੱਖਦਾ ਹੈ। ਪਰ ਜਿਸ ਪਲ ਤੁਸੀਂ ਉਸ ਐਰੇ ਦੇ ਅੰਦਰ ਸਿੱਧੇ ਤੌਰ 'ਤੇ ਆਪਣਾ ਕੋਈ ਹੈਲਪਰ (helper) ਕਾਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹੋ, ਫਰੇਮਵਰਕ ਰੋਕ ਲਗਾ ਦਿੰਦਾ ਹੈ। 'username' => 'encrypt_data()' ਵਰਗੀ ਚੀਜ਼ ਲਿਖਣਾ ਕੰਮ ਨਹੀਂ ਕਰੇਗਾ। Laravel ਜਾਂ ਤਾਂ ਕਿਸੇ ਨੇਟਿਵ ਕਾਸਟ ਕੀਵਰਡ (native cast keyword) ਦੀ ਉਮੀਦ ਕਰਦਾ ਹੈ ਜਾਂ ਫਿਰ ਅਜਿਹੀ ਕਲਾਸ ਦੀ ਜੋ CastsAttributes ਇੰਟਰਫੇਸ ਨੂੰ ਇੰਪਲੀਮੈਂਟ ਕਰਦੀ ਹੋਵੇ। ਇਹ ਲੋੜ ਇਸ ਲਈ ਹੈ ਕਿਉਂਕਿ ਕਾਸਟਿੰਗ ਲੇਅਰ Eloquent ਦੇ ਹਾਈਡ੍ਰੇਸ਼ਨ (hydration) ਅਤੇ ਸੀਰੀਅਲਾਈਜ਼ੇਸ਼ਨ (serialization) ਚੱਕਰ ਦੇ ਬਹੁਤ ਅੰਦਰ ਚੱਲਦੀ ਹੈ; ਇਸਨੂੰ ਇੱਕ ਅਨਿਸ਼ਚਿਤ ਫੰਕਸ਼ਨ ਸਟ੍ਰਿੰਗ ਦੀ ਬਜਾਏ ਇੱਕ ਅਜਿਹੇ ਪੂਰਵ-ਅਨੁਮਾਨਿਤ (predictable) ਆਬਜੈਕਟ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ ਜਿਸਦਾ ਇੱਕ ਸਪੱਸ਼ਟ ਇਕਰਾਰਨਾਮਾ (contract) ਹੋਵੇ।

$casts ਐਰੇ ਵਿੱਚ ਹੈਲਪਰ ਫੰਕਸ਼ਨ ਕਿਉਂ ਫੇਲ ਹੋ ਜਾਂਦੇ ਹਨ

ਜਦੋਂ Eloquent ਕਿਸੇ ਮਾਡਲ ਨੂੰ ਲੋਡ ਕਰਦਾ ਹੈ, ਤਾਂ ਇਹ ਹਰੇਕ ਕਾਲਮ ਨੂੰ ਬਦਲਣ ਦਾ ਫੈਸਲਾ ਕਰਨ ਲਈ $casts ਐਰੇ ਦੀ ਜਾਂਚ ਕਰਦਾ ਹੈ। ਫਰੇਮਵਰਕ ਖਾਸ ਪ੍ਰਾਇਮੇਟਿਵਜ਼ (primitives)—string, integer, array, encrypted, ਆਦਿ—ਨੂੰ ਪਛਾਣਦਾ ਹੈ ਅਤੇ ਉਹਨਾਂ ਕਲਾਸ ਨਾਮਾਂ ਨੂੰ ਵੀ ਪਛਾਣਦਾ ਹੈ ਜੋ CastsAttributes ਨੂੰ ਇੰਪਲੀਮੈਂਟ ਕਰਦੇ ਹਨ। ਇਹ ਸਟ੍ਰਿੰਗ ਨੂੰ ਕੋਡ ਵਜੋਂ ਨਹੀਂ ਚਲਾਉਂਦਾ। ਇਸ ਲਈ 'encrypt_data()' ਨੂੰ ਇੱਕ ਅਣਜਾਣ ਕਾਸਟ ਟਾਈਪ ਵਜੋਂ ਮੰਨਿਆ ਜਾਂਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਐਰਰ (error) ਆ ਜਾਂਦੀ ਹੈ। ਭਾਵੇਂ Laravel ਇਸਨੂੰ ਪਾਰਸ (parse) ਵੀ ਕਰ ਲੈਂਦਾ, ਤਾਂ ਵੀ ਤੁਹਾਡੇ ਫੰਕਸ਼ਨ ਵਿੱਚ ਮਾਡਲ ਇੰਸਟੈਂਸ, ਐਟਰੀਬਿਊਟ ਕੀ (attribute key), ਮੌਜੂਦਾ ਮੁੱਲ, ਅਤੇ ਆਲੇ-ਦੁਆਲੇ ਦੇ ਐਟਰੀਬਿਊਟਸ ਨੂੰ ਸਹੀ ਕ੍ਰਮ ਵਿੱਚ ਪਾਸ ਕਰਨ ਦਾ ਕੋਈ ਭਰੋਸੇਮੰਦ ਤਰੀਕਾ ਨਹੀਂ ਹੋਵੇਗਾ। ਇਹ ਇੰਟਰਫੇਸ ਬਿਲਕੁਲ ਇਸੇ ਲਈ ਮੌਜੂਦ ਹੈ ਤਾਂ ਜੋ ਤੁਹਾਡੇ ਕਸਟਮ ਲੌਜਿਕ ਅਤੇ Eloquent ਦੇ ਅੰਦਰੂਨੀ ਕੰਮਾਂ ਦੇ ਵਿਚਕਾਰ ਉਸ ਤਾਲਮੇਲ ਨੂੰ ਸਟੈਂਡਰਡਾਈਜ਼ ਕੀਤਾ ਜਾ ਸਕੇ।

ਤੁਹਾਡੇ ਕੋਲ ਇਸ ਪਾੜੇ ਨੂੰ ਪੂਰਾ ਕਰਨ ਦੇ ਦੋ ਪੱਕੇ ਤਰੀਕੇ ਹਨ। ਇੱਕ ਲੰਬੇ ਸਮੇਂ ਦੇ ਮੁੜ-ਵਰਤੋਂ (reuse) ਲਈ ਹੈ। ਦੂਜਾ ਉਦੋਂ ਤੇਜ਼ੀ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ ਹੈ ਜਦੋਂ ਤੁਹਾਨੂੰ ਸਿਰਫ਼ ਇੱਕ ਸਿੰਗਲ ਮਾਡਲ ਦੇ ਅੰਦਰ ਇੱਕ ਤੇਜ਼ੀ ਨਾਲ ਪੈਚ (patch) ਦੀ ਲੋੜ ਹੋਵੇ।

ਵਿਧੀ 1: ਇੱਕ ਕਸਟਮ ਕਾਸਟ ਕਲਾਸ ਲਿਖੋ

ਜੇਕਰ ਇੱਕੋ ਜਿਹਾ ਟ੍ਰਾਂਸਫੋਰਮੇਸ਼ਨ ਕਈ ਫੀਲਡਾਂ 'ਤੇ ਲਾਗੂ ਹੁੰਦਾ ਹੈ ਜਾਂ ਕਈ ਮਾਡਲਾਂ ਵਿੱਚ ਫੈਲਿਆ ਹੋਇਆ ਹੈ, ਤਾਂ ਇੱਕ ਸਮਰਪਿਤ (dedicated) ਕਾਸਟ ਕਲਾਸ ਇੱਕ ਬਿਹਤਰ ਚੋਣ ਹੈ। ਇਹ ਆਪਣੀ ਵੱਖਰੀ ਫਾਈਲ ਵਿੱਚ ਰਹਿੰਦੀ ਹੈ, ਇਸਨੂੰ ਵੱਖਰੇ ਤੌਰ 'ਤੇ ਯੂਨਿਟ-ਟੈਸਟ (unit-test) ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਅਤੇ ਇਹ ਤੁਹਾਡੇ ਮਾਡਲਾਂ ਨੂੰ ਵਾਰ-ਵਾਰ ਲਿਖਣ ਵਾਲੇ ਬੋਝ (boilerplate) ਤੋਂ ਮੁਕਤ ਰੱਖਦੀ ਹੈ।

app/Casts/CustomEncrypt.php ਬਣਾ ਕੇ ਸ਼ੁਰੂ ਕਰੋ। ਨਾਮਸਪੇਸ (namespace) ਤੁਹਾਡੇ ਆਟੋਲੋਡਿੰਗ ਸੈੱਟਅੱਪ ਨਾਲ ਮੇਲ ਖਾਣਾ ਚਾਹੀਦਾ ਹੈ, ਆਮ ਤੌਰ 'ਤੇ App\Casts। ਕਲਾਸ ਨੂੰ Illuminate\Contracts\Database\Eloquent\CastsAttributes ਨੂੰ ਇੰਪਲੀਮੈਂਟ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ, ਜੋ ਤੁਹਾਨੂੰ ਦੋ ਮੈਥਡ (methods) ਪਰਿਭਾਸ਼ਿਤ ਕਰਨ ਲਈ ਮਜਬੂਰ ਕਰਦਾ ਹੈ: get ਅਤੇ set

<?php

namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Database\Eloquent\Model;

class CustomEncrypt implements CastsAttributes
{
    public function get(Model $model, string $key, mixed $value, array $attributes): mixed
    {
        return decrypt_data($value);
    }

    public function set(Model $model, string $key, mixed $value, array $attributes): mixed
    {
        return encrypt_data($value);
    }
}

ਮੈਥਡ ਦੇ ਸਿਗਨੇਚਰ (signatures) ਮਹੱਤਵਪੂਰਨ ਹਨ। Eloquent ਹਰੇਕ ਮੈਥਡ ਵਿੱਚ ਚਾਰ ਆਰਗੂਮੈਂਟਸ ਪਾਸ ਕਰਦਾ ਹੈ। $model ਉਹ ਇੰਸਟੈਂਸ ਹੈ ਜਿਸ ਨੂੰ ਭਰਿਆ ਜਾਂ ਸੇਵ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ, ਜੋ ਤੁਹਾਨੂੰ ਦੂਜੇ ਫੀਲਡਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ ਜੇਕਰ ਤੁਹਾਡਾ ਲੌਜਿਕ ਉਹਨਾਂ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। $key ਉਹ ਕਾਲਮ ਦਾ ਨਾਮ ਹੈ ਜਿਸ ਨੂੰ ਇਸ ਸਮੇਂ ਕਾਸਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। $value ਡੇਟਾਬੇਸ ਤੋਂ get 'ਤੇ ਆ ਰਹੀ ਰੋਅ (raw) ਸਟ੍ਰਿੰਗ ਜਾਂ null ਹੈ, ਜਾਂ set 'ਤੇ ਯੂਜ਼ਰ ਦੁਆਰਾ ਦਿੱਤਾ ਗਿਆ ਮੁੱਲ ਹੈ। $attributes ਉਸ ਰੋਅ ਲਈ ਕਾਲਮਾਂ ਦਾ ਪੂਰਾ ਰੋਅ (raw) ਐਰੇ ਹੈ। ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਚਾਰੋਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ, ਪਰ ਇੰਟਰਫੇਸ ਉਹਨਾਂ ਦੀ ਮੰਗ ਕਰਦਾ ਹੈ।

ਉੱਪਰ ਦਿੱਤੇ get ਮੈਥਡ ਵਿੱਚ, decrypt_data($value) ਉਦੋਂ ਚੱਲਦਾ ਹੈ ਜਦੋਂ Eloquent ਡੇਟਾਬੇਸ ਤੋਂ ਰੋਅ ਨੂੰ ਫੈਚ (fetch) ਕਰ ਲੈਂਦਾ ਹੈ ਅਤੇ ਮੁੱਲ ਤੁਹਾਡੇ ਮਾਡਲ 'ਤੇ ਪਹੁੰਚਣ ਤੋਂ ਪਹਿਲਾਂ। set ਮੈਥਡ ਵਿੱਚ, encrypt_data($value) INSERT ਜਾਂ UPDATE ਤੋਂ ਪਹਿਲਾਂ ਚੱਲਦਾ ਹੈ, ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹੋਏ ਕਿ ਡੇਟਾਬੇਸ ਕਦੇ ਵੀ ਪਲੇਨਟੈਕਸਟ (plaintext) ਨਾ ਦੇਖੇ।

ਇਸ ਨੂੰ ਜੋੜਨ ਲਈ, ਆਪਣੇ ਮਾਡਲ ਦੇ $casts ਐਰੇ ਦੇ ਅੰਦਰ ਕਲਾਸ ਦਾ ਹਵਾਲਾ ਦਿਓ:

protected $casts = [
    'username' => CustomEncrypt::class,
    'password' => CustomEncrypt::class,
];

ਕਿਉਂਕਿ ਤੁਸੀਂ ਕਲਾਸ ਕੰਸਟੈਂਟ (class constant) ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੇ ਹੋ, ਇਸ ਲਈ ਆਟੋਲੋਡਰ ਬਾਕੀ ਦਾ ਕੰਮ ਸੰਭਾਲ ਲੈਂਦਾ ਹੈ। ਜੇਕਰ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਐਨਕ੍ਰਿਪਸ਼ਨ ਸਕੀਮ ਬਦਲਣ ਦੀ ਲੋੜ ਪੈਂਦੀ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਸਿਰਫ਼ ਇੱਕ ਫਾਈਲ ਨੂੰ ਐਡਿਟ ਕਰਦੇ ਹੋ, ਅਤੇ ਹਰ ਮੈਪਡ ਫੀਲਡ ਦਾ ਵਿਵਹਾਰ ਤੁਰੰਤ ਬਦਲ ਜਾਂਦਾ ਹੈ। ਜਦੋਂ ਤੁਸੀਂ ਕਈ ਟੇਬਲਾਂ ਵਿੱਚ ਸੰਵੇਦਨਸ਼ੀਲ ਡੇਟਾ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਰਹੇ ਹੁੰਦੇ ਹੋ, ਤਾਂ ਇਹ ਕੇਂਦਰੀਕਰਨ (centralization) ਬੇਮਿਸਾਲ ਹੈ।

ਵਿਧੀ 2: ਐਕਸੈਸਰ (Accessor) ਅਤੇ ਮਿਊਟੇਟਰ (Mutator) ਦੀ ਵਰਤੋਂ ਕਰੋ

ਕਈ ਵਾਰ ਤੁਸੀਂ ਅਜਿਹੇ ਟ੍ਰਾਂਸਫੋਰਮੇਸ਼ਨ ਲਈ ਨਵੀਂ ਫਾਈਲ ਨਹੀਂ ਚਾਹੁੰਦੇ ਜੋ ਸਿਰਫ਼ ਇੱਕ ਜਗ੍ਹਾ 'ਤੇ ਮਹੱਤਵਪੂਰਨ ਹੁੰਦੀ ਹੈ। Laravel ਦੀ Attribute ਕਲਾਸ ਤੁਹਾਨੂੰ PHP 8+ closure ਸਿੰਟੈਕਸ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸਿੱਧੇ ਮਾਡਲ 'ਤੇ get ਅਤੇ set ਲੌਜਿਕ ਪਰਿਭਾਸ਼ਿਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।

use Illuminate\Database\Eloquent\Casts\Attribute;

protected function username(): Attribute
{
    return Attribute::make(
        get: fn ($value) => decrypt_data($value),
        set: fn ($value) => encrypt_data($value),
    );
}

ਇੱਥੇ ਮੈਥਡ ਦਾ ਨਾਮ ਉਸ ਕਾਲਮ ਜਾਂ ਐਟਰੀਬਿਊਟ ਨਾਲ ਮੇਲ ਖਾਣਾ ਚਾਹੀਦਾ ਹੈ ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਟਾਰਗੇਟ ਕਰ ਰਹੇ ਹੋ। ਜਦੋਂ Eloquent ਡੇਟਾਬੇਸ ਤੋਂ username ਨੂੰ ਪੜ੍ਹਦਾ ਹੈ, ਤਾਂ ਇਹ ਰੋਅ (raw) ਮੁੱਲ ਨੂੰ get closure

ਦੋਵਾਂ ਵਿੱਚੋਂ ਚੋਣ ਕਰਨਾ

ਇੱਕ ਕਸਟਮ ਕਾਸਟ ਕਲਾਸ (custom cast class) ਦੀ ਵਰਤੋਂ ਉਦੋਂ ਕਰੋ ਜਦੋਂ ਤੁਸੀਂ ਮੁੜ ਵਰਤੋਂ (reuse), ਟੈਸਟਿੰਗ, ਅਤੇ ਮਾਡਲਾਂ ਨੂੰ ਹਲਕਾ ਰੱਖਣ ਬਾਰੇ ਚਿੰਤਤ ਹੋਵੋ। ਇਹ ਦੂਜੇ ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਸੰਕੇਤ ਦਿੰਦਾ ਹੈ ਕਿ ਇਹ ਤਬਦੀਲੀ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਵਿੱਚ ਇੱਕ ਮਹੱਤਵਪੂਰਨ ਸੰਕਲਪ ਹੈ, ਨਾ ਕਿ ਸਿਰਫ਼ ਇੱਕ ਵਾਰੀ ਦਾ ਜੁਗਾੜ।

ਐਕਸੈਸਰ (accessor) ਦੀ ਵਰਤੋਂ ਉਦੋਂ ਕਰੋ ਜਦੋਂ ਲੌਜਿਕ (logic) ਸੱਚਮੁੱਚ ਸੀਮਤ, ਪ੍ਰਯੋਗਸ਼ੀਲ ਹੋਵੇ, ਜਾਂ ਇਸਦੀ ਸੰਭਾਵਨਾ ਘੱਟ ਹੋਵੇ ਕਿ ਇਹ ਮੌਜੂਦਾ ਸਪ੍ਰਿੰਟ (sprint) ਤੋਂ ਬਾਅਦ ਵੀ ਵਰਤਿਆ ਜਾਵੇਗਾ। ਇਹ ਤੁਹਾਨੂੰ ਕੋਡਬੇਸ ਵਿੱਚ ਛੋਟੀਆਂ ਫਾਈਲਾਂ ਖਿੰਡਾਏ ਬਿਨਾਂ ਤੇਜ਼ੀ ਨਾਲ ਕੰਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਬਸ ਇੱਕ ਕਾਸਟ ਕਲਾਸ ਵਿੱਚ ਰੀਫੈਕਟਰ (refactor) ਕਰਨ ਲਈ ਤਿਆਰ ਰਹੋ ਜਦੋਂ ਉਹੀ ਪੈਟਰਨ ਦੂਜੀ ਜਾਂ ਤੀਜੀ ਵਾਰ ਦਿਖਾਈ ਦੇਵੇ।

ਧਿਆਨ ਵਿੱਚ ਰੱਖਣ ਯੋਗ ਵਿਹਾਰਕ ਵੇਰਵੇ

ਕਸਟਮ ਕਾਸਟਸ ਸ਼ਕਤੀਸ਼ਾਲੀ ਹੁੰਦੇ ਹਨ, ਪਰ ਉਹ ਅਜਿਹਾ ਵਿਵਹਾਰ ਲਿਆਉਂਦੇ ਹਨ ਜੋ ਜੇਕਰ ਤੁਸੀਂ ਧਿਆਨ ਨਾ ਦੇ ਰਹੇ ਹੋਵੋ ਤਾਂ ਤੁਹਾਨੂੰ ਹੈਰਾਨ ਕਰ ਸਕਦਾ ਹੈ। ਪਹਿਲਾਂ, ਯਾਦ ਰੱਖੋ ਕਿ get ਉਹ ਸਭ ਕੁਝ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ ਜੋ ਡਾਟਾਬੇਸ ਨੇ ਵਾਪਸ ਕੀਤਾ ਹੈ, ਜਿਸ ਵਿੱਚ null ਵੀ ਸ਼ਾਮਲ ਹੈ। ਜੇਕਰ decrypt_data null ਇਨਪੁਟ ਨੂੰ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ, ਤਾਂ ਇਸ ਤੋਂ ਬਚਣ ਲਈ ਸੁਰੱਖਿਆ ਦਾ ਪ੍ਰਬੰਧ ਕਰੋ:

public function get(Model $model, string $key, mixed $value, array $attributes): mixed
{
    return is_null($value) ? null : decrypt_data($value);
}

ਦੂਜਾ, ਕਾਸਟਸ (casts) ਐਰੇ (array) ਅਤੇ JSON ਸੀਰੀਅਲਾਈਜ਼ੇਸ਼ਨ (serialization) ਦੌਰਾਨ ਚੱਲਦੇ ਹਨ। ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਮਾਡਲ ਨੂੰ API ਰਿਸੋਰਸ ਵਜੋਂ ਵਾਪਸ ਕਰਦੇ ਹੋ ਜਾਂ toArray() ਨੂੰ ਕਾਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਕਾਸਟ get ਲੌਜਿਕ ਅਜੇ ਵੀ ਲਾਗੂ ਹੁੰਦਾ ਹੈ। ਆਮ ਤੌਰ 'ਤੇ ਤੁਸੀਂ ਇਹੀ ਚਾਹੁੰਦੇ ਹੋ, ਪਰ ਜੇਕਰ ਤੁਸੀਂ ਡੀਕ੍ਰਿਪਟ ਕੀਤੇ ਮੁੱਲਾਂ (decrypted values) ਨੂੰ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰ ਰਹੇ ਹੋ ਅਤੇ ਉੱਪਰ ਵਾਧੂ ਵਿਜ਼ੀਬਿਲਟੀ ਕੰਟਰੋਲ (visibility controls) ਲਗਾਉਣ ਦੀ ਲੋੜ ਹੈ, ਤਾਂ ਇਸ ਨੂੰ ਯਾਦ ਰੱਖਣਾ ਜ਼ਰੂਰੀ ਹੈ।

ਤੀਜਾ, ਅਤੇ ਸਭ ਤੋਂ ਮਹੱਤਵਪੂਰਨ, ਕਾਸਟਿੰਗ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਬਾਅਦ ਹੁੰਦੀ ਹੈ। ਤੁਸੀਂ ਤਬਦੀਲ ਕੀਤੀ ਗਈ ਵੈਲਯੂ ਦੇ ਵਿਰੁੱਧ ਕੁਐਰੀ (query) ਨਹੀਂ ਕਰ ਸਕਦੇ। User::where('username', 'john_doe')->first() ਵਰਗੀ ਕੁਐਰੀ ਸਿੱਧਾ john_doe ਸਟ੍ਰਿੰਗ ਨੂੰ ਡਾਟਾਬੇਸ ਵਿੱਚ ਭੇਜਦੀ ਹੈ। ਇਹ ਕਦੇ ਵੀ ਤੁਹਾਡੇ ਡੀਕ੍ਰਿਪਟ ਲੌਜਿਕ ਵਿੱਚੋਂ ਨਹੀਂ ਲੰਘਦੀ। ਜੇਕਰ ਕਾਲਮ 'ਐਨਕ੍ਰਿਪਟਡ ਐਟ ਰੈਸਟ' (encrypted at rest) ਹੈ, ਤਾਂ ਉਹ ਕੁਐਰੀ ਕੁਝ ਵੀ ਨਹੀਂ ਲੱਭੇਗੀ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਖੁਦ ਐਨਕ੍ਰਿਪਟਡ ਸਾਈਫਰਟੈਕਸਟ (ciphertext) ਦੇ ਵਿਰੁੱਧ ਸਰਚ ਨਹੀਂ ਕਰਦੇ। ਆਪਣੇ ਡਾਟਾਬੇਸ ਐਕਸੈਸ ਪੈਟਰਨਾਂ ਦੀ ਯੋਜਨਾ ਉਸੇ ਅਨੁਸਾਰ ਬਣਾਓ, ਕਿਉਂਕਿ ਕਾਸਟਸ ਨੇਟਿਵ ਡਾਟਾਬੇਸ ਫੰਕਸ਼ਨਾਂ ਜਾਂ ਇੰਡੈਕਸਡ ਪਲੇਨਟੈਕਸਟ ਕਾਲਮਾਂ ਦਾ ਵਿਕਲਪ ਨਹੀਂ ਹਨ।

ਕਸਟਮ ਕਾਸਟ ਕਲਾਸਾਂ ਛੋਟੀਆਂ ਕੌਂਫਿਗਰੇਸ਼ਨਾਂ ਲਈ ਵੀ ਵਧੀਆ ਹੁੰਦੀਆਂ ਹਨ। ਜੇਕਰ ਤੁਹਾਨੂੰ ਕੰਸਟ੍ਰਕਟਰ ਆਰਗੂਮੈਂਟਸ (constructor arguments) ਦੀ ਲੋੜ ਹੈ—ਸ਼ਾਇਦ ਕੋਈ ਸਾਈਫਰ ਮੋਡ (cipher mode) ਜਾਂ ਫਾਰਮੈਟ ਸਟ੍ਰਿੰਗ ਪਾਸ ਕਰਨਾ—ਤਾਂ Laravel $casts ਐਰੇ ਰਾਹੀਂ 'field' => CustomEncrypt::class . ':arg' ਵਰਗੇ ਐਕਸਪ੍ਰੈਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਉਹਨਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ, ਹਾਲਾਂਕਿ ਇਹ ਇੱਥੇ ਦੱਸੇ ਗਏ ਬੁਨਿਆਦੀ ਸੈੱਟਅੱਪ ਤੋਂ ਇੱਕ ਕਦਮ ਅੱਗੇ ਹੈ।

ਅਸਲ ਸਿੱਖਿਆ

$casts ਵਿੱਚ ਸਿੱਧੇ ਤੌਰ 'ਤੇ ਹੈਲਪਰ ਫੰਕਸ਼ਨਾਂ ਨੂੰ ਪਾਉਣ ਦੇ ਵਿਰੁੱਧ ਪਾਬੰਦੀ ਕੋਈ ਮਨਮਾਨੀ ਦਫ਼ਤਰੀ ਕਾਰਵਾਈ ਨਹੀਂ ਹੈ। ਇਹ ਤੁਹਾਨੂੰ ਅਜਿਹੇ ਕੋਡ ਵੱਲ ਵਧਾਉਂਦਾ ਹੈ ਜੋ ਸਪੱਸ਼ਟ, ਟੈਸਟ ਕਰਨ ਯੋਗ ਅਤੇ ਮੁੜ ਵਰਤੋਂ ਯੋਗ ਹੈ। ਕਸਟਮ ਕਾਸਟ ਕਲਾਸਾਂ ਖਿੰਡੇ ਹੋਏ ਇਨਲਾਈਨ ਲੌਜਿਕ ਨੂੰ ਭਰੋਸੇਮੰਦ ਕੰਪੋਨੈਂਟਾਂ ਵਿੱਚ ਬਦਲ ਦਿੰਦੀਆਂ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਡੁਪਲੀਕੇਸ਼ਨ ਤੋਂ ਬਿਨਾਂ ਵੱਖ-ਵੱਖ ਮਾਡਲਾਂ ਵਿੱਚ ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹੋ। ਐਕਸੈਸਰ ਉਦੋਂ ਤੇਜ਼, ਸਥਾਨਕ ਸੁਧਾਰਾਂ ਲਈ ਰਾਹ ਖੋਲ੍ਹੇ ਰੱਖਦੇ ਹਨ ਜਦੋਂ ਇੱਕ ਵੱਖਰੀ ਫਾਈਲ ਬਣਾਉਣਾ ਬਹੁਤ ਜ਼ਿਆਦਾ ਕੰਮ (ceremony) ਲੱਗਦਾ ਹੈ। ਦੋਵਾਂ ਵਿੱਚ ਮਾਹਰ ਬਣੋ, ਸਮੱਸਿਆ ਦੇ ਘੇਰੇ ਦੇ ਅਧਾਰ 'ਤੇ ਚੋਣ ਕਰੋ, ਅਤੇ ਤੁਹਾਡਾ Eloquent ਲੇਅਰ ਐਪਲੀਕੇਸ਼ਨ ਦੇ ਵਧਣ ਤੋਂ ਬਾਅਦ ਵੀ ਪੜ੍ਹਨਯੋਗ ਰਹੇਗਾ।