Hungry to Know

Monday, July 29, 2019

লারাভেলের কিছু সমস্যা ও সমাধান

এই পোস্ট-এর উদ্দেশ্য অবশ্য লারাভেলের ফিচারগুলো চেনানো বা লারাভেল শেখা নয়, বরং লারাভেল নিয়ে কাজ করতে গিয়ে আমাকে যেসব সাধারণ সমস্যার মুখোমুখি হতে হয় বা হয়েছে, সেগুলো একযায়গায় নিয়ে এসে রাখা। এরকম Wiki আমি আমার প্রায় সব কাজেই বানিয়ে রাখি। এটা প্রায় প্রত্যেক প্রোগ্রামার-এরই স্বভাব। কারণ প্রোগ্রামাররা অলস এবং এতে সুবিধা হচ্ছে, যেটা একবার সমাধান হয়ে গেছে সেটা মুখস্থ করে মাথায় ভরে রেখে মাথা ভারী করে রাখার কোন মানে হয় না, বরং অন্যান্য লজিক নিয়ে চিন্তাভাবনায় সময় দেয়া যায়। সব কিছু সবসময় মনে থাকে না, মনে রাখার চেষ্টাও আসলে আমি করিনা। হেটার্সরা একটু হাসাহাসি করে, কিন্তু এতে কাজের বিশেষ সুবিধা হয়। প্রথমবার একটু খাটনি হলেও, পরেরবার থেকে আর কষ্ট করতে হয় না।

গল্প অনেক হলো। কাজে নামা যাক:

সমস্যা-১: ডেভেলপমেন্ট সার্ভার পরিবর্তন করার পর নিচের মতো মেসেজ আসছে:


সমাধান: এটার সমাধান একটা আর্টিসান কমান্ড - php artisan config:cache

এছাড়া নিচের আর্টিসান কমান্ডগুলো একদম নখের অগ্রভাগে রাখতে হবে, অনেক ঝামেলা থেকে সহজে মুক্তি পাওয়া যাবে:
php artisan cache:clear
php artisan view:clear
php artisan config:cache
composer dump-autoload

সমস্যা-২: নতুন প্যাকেজ পাবলিশ করতে গেলে নিচের মতো অপশন আসছে:

সমাধান: হা!হা!হা! প্রথম যেদিন দেখি আপনার মতো আমিও খুব মজা পেয়েছি। আসলে লারাভেলে পুরোনো ভার্সনগুলোতে এমন আসতো না। তো যাইহোক, এটা কোন সমস্যা না। শুধু যে প্যাকেজটা নতুন অ্যাড করে পাবলিশ করতে চাচ্ছেন সেই অপশনটা বেছে নিন।

সমস্যা-৩: এনট্রাস্ট প্যাকেজ-এর মাইগ্রেশন করতে গেলে নিচের মতো মেসেজ আসছে:

সমাধান: এটার সমাধান এনট্রাস্ট-এর গিটহাবেই রয়েছে। সমাধানটি দিয়েছেন dokicro ভাই এবং অনেকের ভাব-ভালোবাসা পেয়েছেন! আমাদের পক্ষ থেকেও তাকে লাল গোলাপ শুভেচ্ছা!

সমস্যা-৪: নিচের মেসেজটা অনেকের অন্য যেকোন সময় আসতে পারে, তবে আমার এসেছে এনট্রাস্ট প্যাকেজ-এর কারণে:

সমাধান-১: এটার সহজ সমাধানটা নিয়ে একটু বিতর্ক আছে। তাহলো .env ফাইল-এ CACHE_DRIVER টি file এর পরিবর্তে array করে দেয়া।

সমাধান-২: .env ফাইল-এ CACHE_DRIVER টি file এর পরিবর্তে memcached করে দেয়া। তবে এক্ষেত্রে PHP-র php memcached extension টি সার্ভারে ইন্সটল থাকতে হবে। (গাইডলাইন: https://serverpilot.io/docs/how-to-install-the-php-memcache-extension)

সমস্যা-৫: নিচের পুরোনো প্রজেক্টগুলো লারাভেলের নতুন ভার্সনে আনলে মাইগ্রেশন করার সময় নিচের মতো মেসেজ আসছে:

সমাধান-১: মাইগ্রেশন ফাইলে টেবিল স্কিমাগুলোর উপরে নিম্নলিখিত লাইনটি বসিয়ে নিলে আপাতত কাজ চলে যাবে। তবে এটাই বেস্ট ওয়ে কিনা বিতর্ক আছে।
Schema::defaultStringLength(191);
সমাধান-২: আরেকটি পথ হতে পারে- app/providers/AppServiceProvider.php নিচের মতো আপডেট করে নেয়া:
use Illuminate\Support\Facades\Schema;
public function boot() {
          Schema::defaultStringLength(191);
}
(বি:দ্র: সমাধান-২ টাই বেশি ব্যবহার হতে দেখছি। অতএব এটাই অ্যাপ্লাই করা ভালো।)

সমাধান-৩: সমাধানটা হচ্ছে /config/database.php -তে mysql engine => null কে engine => 'InnoDB' করে নিতে হবে। বিশেষ করে কোন প্যাকেজ ইন্সটল করার সময় এরর দিলে এবং সমাধান-2 প্রয়োগ করার পরেও যদি ‘key was too long' এরর দেয় তাহলে engine পরিবর্তন করা যেতে পারে।

সমস্যা-৬: পুরোনো প্রজেক্টগুলো লারাভেলের নতুন ভার্সনে আনলে (কিংবা অন্য কারণে) নিচের মতো মেসেজ আসতে পারে:

সমাধান: সমাধানটা নিচে দিলাম, কিন্তু আমার খুব একটা পছন্দ হয় নাই। থাক, আপাতত কাজ চলুক...

সমস্যা-৭: যদি নিচের মতো বিশাল কোন মেসেজ দেখা যায়, তবে আনন্দে দুটো ডিগবাজি দিতে পারেন। কারণ সমাধান খুব সহজ, সাথে বোনাস হিসেবে পিএইচপির চমৎকার কিছু বিষয় জানতে পারবেন। সেটা হলো Trait, এর কলিশন (collision) ও অ্যালাইসিং(aliasing)।

সমাধান: মডেল App\User.php -তে যাওয়া যাক-

ওখানে দেখেন দুটো Trait ইউজ করা আছে-

class User extends Authenticatable implements MustVerifyEmail {
....
use EntrustUserTrait;
use SoftDeletes;
....
}

এই দুইজনই restore নামক একটা তালগাছ (মেথড) নিয়ে টানাটানি লাগিয়েছে! কিন্তু এখানে ব্যপারটা ওই তালগাছের প্রবাদ বাক্যের মতো অতটা কঠিন না। এখানে আসলে তালগাছ আছে দুটো, কিন্তু নাম একই। তাই User ক্লাস বুঝতে পারছে না কোনটা কার। আর একই ক্লাসে তো একই নামে দুটো মেথড থাকতে পারে না, তাই না? তাই এখন এমন এক ব্যবস্থা করতে হবে যেন মেথড দুটিকে আলাদাভাবে চেনা যায়। 
class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;
    use EntrustUserTrait { restore as private restoreA; }
    use SoftDeletes { restore as private restoreB; }
    public function restore()
    {
        $this->restoreA();
        $this->restoreB();
    }
}

ব্যস, তালগাছ ভাগাভাগি হয়ে গেলো! Magical, isn't it? এবার ম্যাজিকের ব্যাখ্যা, মানে ট্রেইট নিয়ে কিছু কথা - পড়তে এখানে ক্লিক করুন


💥💥💥💥💥


© A.S.M. Shahriar Zahan | www.zahantech.com

লাস্ট আপডেট: ১১ এপ্রিল, ২০২১

No comments:

Post a Comment