লারাভেল - সেশন স্টোরটি অনুরোধে সেট করা হয়নি


113

আমি সম্প্রতি একটি নতুন লারাভেল প্রকল্প তৈরি করেছি এবং প্রমাণীকরণ সম্পর্কিত গাইডটি অনুসরণ করছিলাম। আমি যখন আমার লগইন বা নিবন্ধের রুটটি পরিদর্শন করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই:

ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)

আমি কোনও মূল লারাভেল ফাইল সম্পাদনা করি নি, আমি কেবলমাত্র ভিউগুলি তৈরি করেছি এবং আমার রুটস.এফপি ফাইলটিতে রুটগুলি যুক্ত করেছি

// Authentication routes
Route::get('auth/login', ['uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Route::post('auth/login', ['uses' => 'Auth\AuthController@postLogin', 'as' => 'login']);
Route::get('auth/logout', ['uses' => 'Auth\AuthController@getLogout', 'as' => 'logout']);

// Registration routes
Route::get('auth/register', ['uses' => 'Auth\AuthController@getRegister', 'as' => 'register']);
Route::post('auth/register', ['uses' => 'Auth\AuthController@postRegister', 'as' => 'login']);

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

সম্পাদনা:

অনুরোধ অনুসারে এখানে আমার রেজিস্ট্রেশন.ব্লেড.এফপি।

@extends('partials.main')

@section('title', 'Test | Register')

@section('content')
    <form method="POST" action="/auth/register">
        {!! csrf_field() !!}
        <div class="ui input">
          <input type="text" name="name" value="{{ old('name') }}" placeholder="Username">
        </div>
        <div class="ui input">
          <input type="email" name="email" value="{{ old('email') }}" placeholder="Email">
        </div>
        <div class="ui input">
          <input type="password" name="password" placeholder="Password">
        </div>
        <div class="ui input">
          <input type="password" name="password_confirmation"placeholder="Confirm Password">
        </div>
        <div>
            <button class="ui primary button" type="submit">Register</button>
        </div>
    </form>
@endsection

পোস্ট রেজিস্টার.ব্লেড.এফপি কোড
চৌদ্দ ওয়াকাস

আপনি উপরের রুটগুলিও প্রতিস্থাপন করতে পারেন। পিএইচপিকে ঠিকRoute::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController', ]);
চৌধুরী চৌধুরী ওয়াকাস

এবং আপনার একই
নামযুক্ত

@ অ্যাডমনিক পোস্ট করেছেন এবং এটি প্রতিস্থাপনের চেষ্টা করবেন।
ম্যাট্রিক

আপনার সেশন ড্রাইভার কনফিগারেশন সেট কিভাবে?
কিপজেস 10-15

উত্তর:


161

আপনার যদি সেশন স্টেট, সিএসআরএফ সুরক্ষা এবং আরও অনেক কিছু প্রয়োজন হয় তবে আপনাকে ওয়েব মিডওয়্যারটি ব্যবহার করতে হবে।

Route::group(['middleware' => ['web']], function () {
    // your routes here
});

2
আমার আসলে এটি ছিল, আমি কেবল প্রাসঙ্গিক রুটগুলি সহ অন্তর্ভুক্ত ছিলাম।
ম্যাট্রিক

আহ আমি এখন আপনাকে কী বোঝাতে চাইছি, আমি সেগুলি রুটগুলি ভিতরে সরিয়ে নিয়েছি এবং এটি কার্যকর হয়েছে। তোমাকে অনেক ধন্যবাদ!
ম্যাট্রিক

@ ম্যাট্রিক: হাই ম্যাট্রিক্স একই ত্রুটি পেয়েছে। আপনি মিডলওয়্যারের অভ্যন্তরে রুটগুলি কোথায় স্থানান্তরিত করেছেন তা ব্যাখ্যা করতে পারেন তবে এটি কোনও ত্রুটি দেখায় "কোনও সমর্থিত এনক্রিপ্টর পাওয়া যায় নি The সাইফার"।
বিপিন সিং 12

1
@ ইরভিপিনসিংহ আপনার অ্যাপ কনফিগারেশনে আপনাকে একটি 32 অক্ষর কী সেট করতে হবে। বা ব্যবহার করুনphp artisan key:generate
ক্যাস ব্লিম

2
আপনার লগইন রুটে যদি এপিআই থাকে?
জে বিয়েনভেনু

56

যদি যোগ করা হয় আপনার routes ভিতরে web middlewareকোন কারণে নেই কাজ তারপর এই যোগ করার চেষ্টা $middlewareমধ্যেKernel.php

protected $middleware = [
        //...
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];

4
জঘন্য, এটি আমার পক্ষে কাজ করেছে তবে আমি কোনও সমাধান নয়, এটি "ফিক্স" বলে খুশি নই। যাই হোক ধন্যবাদ!
রাভ

1
এটি আমার জন্য এটি স্থির করে দিয়েছে। আপনাকে ধন্যবাদ @ ওয়াইই
জোশ

1
আপনার সমাধানটি আমার সমস্যা সমাধান করে @ ওয়াইল_কারিম
বিপুল রায়

এটি আমার পক্ষে কাজ করেছে। আমি একটি প্রতিক্রিয়া ফ্রন্ট্যান্ড ব্যবহার করছি যাতে রুটের জন্য রিঅ্যাক্ট রাউটার ব্যবহার করায় রুট গ্রুপটি কাজ করে না।
প্রযুক্তিবিদরা

44

আমার ক্ষেত্রে (লারাভেল ৫.৩ ব্যবহার করে) নিম্নলিখিত 2 টি মিডলওয়্যারটি যুক্ত করে আমার এপিআই রুটে সেশন ডেটা অ্যাক্সেসের অনুমতি দিয়েছে:

  • \App\Http\Middleware\EncryptCookies::class
  • \Illuminate\Session\Middleware\StartSession::class

পুরো ঘোষণা ( $middlewareGroupsকার্নেল.এফপিতে):

'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
            'throttle:60,1',
            'bindings',
        ],

21

যদি কাস ব্লুমের উত্তর প্রয়োগ না হয় (যেমন আপনি অবশ্যই পেয়ে গেছেন web প্রযোজ্য রুটে মিডলওয়্যার ), আপনি আপনার এইচটিটিপি কার্নেলের মিডলওয়্যারের ক্রম পরীক্ষা করতে চাইতে পারেন।

ডিফল্ট অর্ডারটি Kernel.phpহ'ল:

$middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],
];

নোট যে VerifyCsrfTokenপরে আসে StartSession। যদি আপনি এগুলি একটি অন্য ক্রমে পেয়ে থাকেন তবে তাদের মধ্যে নির্ভরতাও Session store not set on request.ব্যতিক্রম ঘটতে পারে ।


আমি এটা ঠিক মত আছে। আমি এখনও বার্তা পেতে। আমি S মিডওয়্যার অ্যারেতে স্টার্টসেশন এবং শেয়ারেররফরফরসেশনটি রাখার চেষ্টাও করেছি। স্টোর / ফ্রেমওয়ার্ডও লেখার যোগ্য। (আমি ওয়্যাম্পসারভার 3 বিটিডব্লু।)
মেডি মারি

'মিডলওয়্যার' => ['ওয়েব', 'youanother.log'],
কামারো ল্যামবার্ট

3
হাঁ! আমি বোবা ছিলাম এবং ভেবেছিলাম আমি সেগুলি বর্ণানুক্রমিকভাবে পুনঃক্রম করব (কারণ ওসিডি) এবং এটি অ্যাপটিকে ভেঙে দিয়েছে। দুর্ভাগ্যক্রমে, আমি পরের দিন পর্যন্ত পরীক্ষা করিনি, এ কারণেই আমি এখানেই শেষ করেছি। কেবল রেকর্ডের জন্য, 5.3 তে "ওয়েব" মিডলওয়্যার গোষ্ঠীর জন্য ডিফল্ট অর্ডারটি হ'ল: এনক্রিপ্টকুকিজ, অ্যাডকুইয়েডকুকিজটোরেস্পোনস, স্টার্টসেশন, শেয়ারেররফরমসেশন, সাবস্টিটিউবাইন্ডিংস, ভেরিফাইক্রফটোকেন।
ইক্সালমিডা

19

একটি সমস্যা এমন হতে পারে যে আপনি নিজের নিয়ন্ত্রকের ফাংশনের অভ্যন্তরে সেশনটি অ্যাক্সেস করার চেষ্টা করেছেন __constructor()

লারাভেল 5.3+ থেকে এটি আর সম্ভব নয় কারণ এটি কোনওভাবেই কাজ করার উদ্দেশ্যে নয়, যেমন আপগ্রেড গাইডে বলা হয়েছে

লারাভেলের পূর্ববর্তী সংস্করণগুলিতে আপনি সেশন ভেরিয়েবলগুলি বা আপনার নিয়ামকের কনস্ট্রাক্টরটিতে প্রমাণীকৃত ব্যবহারকারী অ্যাক্সেস করতে পারবেন। এটি ফ্রেমওয়ার্কের একটি সুস্পষ্ট বৈশিষ্ট্য হওয়ার উদ্দেশ্যে কখনও করা হয়নি। লারাভেল 5.3 এ, আপনি আপনার নিয়ামকের কনস্ট্রাক্টরে সেশন বা অনুমোদনপ্রাপ্ত ব্যবহারকারী অ্যাক্সেস করতে পারবেন না কারণ মিডলওয়্যারটি এখনও চালানো হয়নি।

আরও পটভূমি তথ্যের জন্য টেলর তার প্রতিক্রিয়া পড়ুন।

কার্যসংক্রান্ত

আপনি যদি এখনও এটি ব্যবহার করতে চান তবে আপগ্রেড গাইডে বর্ণিত হিসাবে আপনি গতিশীলভাবে মিডলওয়্যার তৈরি করতে পারেন এবং এটি কনস্ট্রাক্টরে চালাতে পারেন:

বিকল্প হিসাবে, আপনি আপনার নিয়ামকের নির্মাত্রে সরাসরি একটি ক্লোজার ভিত্তিক মিডলওয়্যার সংজ্ঞায়িত করতে পারেন। এই বৈশিষ্ট্যটি ব্যবহার করার আগে, নিশ্চিত হয়ে নিন যে আপনার অ্যাপ্লিকেশনটি লারাভেল 5.3.4 বা তার বেশি চলছে:

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class ProjectController extends Controller
{
    /**
     * All of the current user's projects.
     */
    protected $projects;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;

            return $next($request);
        });
    }
}

1
__ কনস্ট্রাক্টর () পয়েন্টটি ব্যাখ্যা করার জন্য ধন্যবাদ। আমার ধারণাগুলি পরিষ্কার করেছেন।
আশীষ চৌধুরী

16

লারাভেল [৫.৪]

আমার সমাধানটি ছিল বিশ্বব্যাপী সেশন সহায়ক: সেশন ()

এর কার্যকারিতা $ অনুরোধ-> সেশন () এর চেয়ে কিছুটা শক্ত ।

লেখা :

session(['key'=>'value']);

ঠেলা :

session()->push('key', $notification);

পুনরুদ্ধার করা :

session('key');

যখন আমরা একটি নিয়ামকটিতে সেশন ভেরিয়েবল লিখি এবং অন্য একটি নিয়ামক হিসাবে ব্যবহার করি তখন এটি কার্যকর হয় না :(
কমলেশ

3

আমার ক্ষেত্রে আমি নিম্নলিখিত 4 টি লাইন $ মিডওয়্যারের গ্রুপগুলিতে যুক্ত করেছি (অ্যাপ্লিকেশন / এইচটিটিপি / কার্নেল.এফপিতে):

'api' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
    'throttle:60,1',
    'bindings',
],

গুরুত্বপূর্ণ: 'থ্রোটল' এবং 'বাইন্ডিংস' এর আগে চারটি নতুন লাইন যুক্ত করতে হবে!

অন্যথায় একটি "সিএসআরএফ টোকেন মিলছে না" ত্রুটি বাড়বে। অর্ডারটি গুরুত্বপূর্ণ তা খুঁজে পেতে আমি বেশ কয়েক ঘন্টা ধরে লড়াই করেছি।

এটি আমার API এ সেশন অ্যাক্সেসের অনুমতি দিয়েছে। কুকি / সেশন জড়িত থাকাকালীন আমি সিএসআরএফকেও যত্নবান হওয়া দরকার বলে আমি ভেরিফাইক্রফটোকেন যুক্ত করেছি added


আপনি যদি লারাভেল দিয়ে এপিএস লিখছেন তবে এটি আপনার উত্তর খুঁজছেন: বা যুক্ত করুন -> রাষ্ট্রবিহীন () -> পুনঃনির্দেশ ()
ববি এক্স



0

আপনি যদি সিএসআরএফ প্রবেশ ব্যবহার করেন 'before'=>'csrf'

তোমার ক্ষেত্রে Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);

আরও তথ্যের জন্য দেখুন লারাভেল 5 ডকুমেন্টেশন সুরক্ষা সুরক্ষা রুটগুলি


0

এটি ল্যারাভেল ডকুমেন্টেশনে নেই, এটি অর্জনে আমার এক ঘন্টা হয়েছে:

আমি "সংরক্ষণ করুন" পদ্ধতিটি ব্যবহার না করা পর্যন্ত আমার অধিবেশন স্থায়ী হয়নি ...

$request->session()->put('lang','en_EN');
$request->session()->save();

0

লারাভেল 5.3+ ওয়েব মিডলওয়্যার গ্রুপটি রুটসোসাইজপ্রোভিডার দ্বারা স্বয়ংক্রিয়ভাবে আপনার রুটগুলি / ওয়েব.এফপি ফাইলগুলিতে প্রয়োগ করা হবে।

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

অনুরোধ হিসাবে ব্যবহার করুন

public function show(Request $request){

}

পরিবর্তে

public function __construct(Request $request){

}

0

লারাভেল অভয়ারণ্যের সাথে আমি এই ত্রুটিটি পাচ্ছিলাম। আমি কার্নেল.এফপি- \Illuminate\Session\Middleware\StartSession::class,apiমিডলওয়্যার গ্রুপে যুক্ত করে এটি ঠিক করেছি , তবে পরে আমি এই "কাজ" পেয়েছি কারণ আমার প্রমাণীকরণের রুটের api.phpপরিবর্তে যুক্ত করা হয়েছিল web.php, তাই লারাভেল ভুল লেখক প্রহরীটি ব্যবহার করছিল।

আমি এই রুটগুলি এখানে সরিয়ে নিয়েছি web.php এবং তারপরে তারা AuthenticatesUsers.phpবৈশিষ্ট্যের সাথে সঠিকভাবে কাজ শুরু করে:

Route::group(['middleware' => ['guest', 'throttle:10,5']], function () {
    Route::post('register', 'Auth\RegisterController@register')->name('register');
    Route::post('login', 'Auth\LoginController@login')->name('login');

    Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
    Route::post('password/reset', 'Auth\ResetPasswordController@reset');

    Route::post('email/verify/{user}', 'Auth\VerificationController@verify')->name('verification.verify');
    Route::post('email/resend', 'Auth\VerificationController@resend');

    Route::post('oauth/{driver}', 'Auth\OAuthController@redirectToProvider')->name('oauth.redirect');
    Route::get('oauth/{driver}/callback', 'Auth\OAuthController@handleProviderCallback')->name('oauth.callback');
});

Route::post('logout', 'Auth\LoginController@logout')->name('logout');

আমার কাছে আরও একটি অদ্ভুত ত্রুটি থাকার পরে আমি সমস্যাটি বের করেছিলাম RequestGuard::logout()

এটি আমাকে উপলব্ধি করে তোলে যে আমার কাস্টম এথ রুটগুলি প্রমাণীকরণের ব্যবহারকারীদের বৈশিষ্ট্য থেকে কলগুলি পদ্ধতিগুলিকে কল করছে তবে আমি Auth::routes()এটি সম্পাদন করতে ব্যবহার করছি না। তখন আমি বুঝতে পেরেছি লারাভেল ডিফল্টরূপে ওয়েব গার্ড ব্যবহার করে এবং এর অর্থ রুটগুলি অবশ্যই হওয়া উচিত routes/web.php

স্যাঙ্কটাম এবং একটি ডিকোপলড ভ্যূ এসপিএ অ্যাপ্লিকেশনটির সাথে আমার সেটিংস এখন দেখতে দেখতে এটি:

Kernel.php

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        EnsureFrontendRequestsAreStateful::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'throttle:60,1',
    ],
];

দ্রষ্টব্য: লারাভেল সান্টাম এবং একই ডোমেন ভ্যূ এসপিএর সাহায্যে আপনি সেশন কুকির জন্য কেবলমাত্র কুকি ব্যবহার করেন এবং সিএসআরএফ-এর জন্য অনিরাপত্ত কুকি মনে webরাখেন , সুতরাং আপনি রক্ষীর জন্য প্রহরীটি ব্যবহার করুন এবং অন্য সমস্ত সুরক্ষিত, জেএসওএন-ফেরত রুট ব্যবহার করা উচিত auth:sanctumমিডলওয়্যার।

কনফিগ / auth.php

'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],

...

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

তারপর আপনি এই ধরনের এই, যেখানে সমালোচকদের, যেমন ইউনিট পরীক্ষা থাকতে পারে Auth::check(), Auth::user()এবং Auth::logout()সংক্ষিপ্ত কনফিগ এবং সর্বোচ্চ ব্যবহারের সঙ্গে প্রত্যাশিত কাজ হিসাবে AuthenticatesUsersএবংRegistersUsers বৈশিষ্ট্যগুলো।

এখানে আমার লগইন ইউনিট পরীক্ষাগুলির কয়েকটি রয়েছে:

TestCase.php

/**
 * Creates and/or returns the designated regular user for unit testing
 *
 * @return \App\User
 */
public function user() : User
{
    $user = User::query()->firstWhere('email', 'test-user@example.com');

    if ($user) {
        return $user;
    }

    // User::generate() is just a wrapper around User::create()
    $user = User::generate('Test User', 'test-user@example.com', self::AUTH_PASSWORD);

    return $user;
}

/**
 * Resets AuthManager state by logging out the user from all auth guards.
 * This is used between unit tests to wipe cached auth state.
 *
 * @param array $guards
 * @return void
 */
protected function resetAuth(array $guards = null) : void
{
    $guards = $guards ?: array_keys(config('auth.guards'));

    foreach ($guards as $guard) {
        $guard = $this->app['auth']->guard($guard);

        if ($guard instanceof SessionGuard) {
            $guard->logout();
        }
    }

    $protectedProperty = new \ReflectionProperty($this->app['auth'], 'guards');
    $protectedProperty->setAccessible(true);
    $protectedProperty->setValue($this->app['auth'], []);
}

LoginTest.php

protected $auth_guard = 'web';

/** @test */
public function it_can_login()
{
    $user = $this->user();

    $this->postJson(route('login'), ['email' => $user->email, 'password' => TestCase::AUTH_PASSWORD])
        ->assertStatus(200)
        ->assertJsonStructure([
            'user' => [
                ...expectedUserFields,
            ],
        ]);

    $this->assertEquals(Auth::check(), true);
    $this->assertEquals(Auth::user()->email, $user->email);
    $this->assertAuthenticated($this->auth_guard);
    $this->assertAuthenticatedAs($user, $this->auth_guard);

    $this->resetAuth();
}

/** @test */
public function it_can_logout()
{
    $this->actingAs($this->user())
        ->postJson(route('logout'))
        ->assertStatus(204);

    $this->assertGuest($this->auth_guard);

    $this->resetAuth();
}

আমি লারাভেল প্রমাণীকরণের বৈশিষ্ট্যগুলিতে registeredauthenticatedপদ্ধতিগুলিকে ওভাররাইড করেছিলাম যাতে তারা কেবলমাত্র 204 বিকল্পগুলির পরিবর্তে ব্যবহারকারী অবজেক্টটি ফিরিয়ে দেয়:

public function authenticated(Request $request, User $user)
{
    return response()->json([
        'user' => $user,
    ]);
}

protected function registered(Request $request, User $user)
{
    return response()->json([
        'user' => $user,
    ]);
}

লেখক বৈশিষ্ট্যের জন্য বিক্রেতা কোডটি দেখুন। আপনি এগুলিকে অপছন্দ করতে পারেন, এবং উপরোক্ত দুটি পদ্ধতি ব্যবহার করতে পারেন।

  • বিক্রেতা / Laravel / UI / প্রমাণীকরণ-ব্যাকএন্ড / RegistersUsers.php
  • বিক্রেতা / Laravel / UI / প্রমাণীকরণ-ব্যাকএন্ড / AuthenticatesUsers.php

লগইন করার জন্য এখানে আমার ভ্যূ এসপিএর ভিউক্স ক্রিয়া রয়েছে:

async login({ commit }, credentials) {
    try {
        const { data } = await axios.post(route('login'), {
            ...credentials,
            remember: credentials.remember || undefined,
        });

        commit(FETCH_USER_SUCCESS, { user: data.user });
        commit(LOGIN);

        return commit(CLEAR_INTENDED_URL);
    } catch (err) {
        commit(LOGOUT);
        throw new Error(`auth/login# Problem logging user in: ${err}.`);
    }
},

async logout({ commit }) {
    try {
        await axios.post(route('logout'));

        return commit(LOGOUT);
    } catch (err) {
        commit(LOGOUT);

        throw new Error(`auth/logout# Problem logging user out: ${err}.`);
    }
},

লারাভেল সেন্টটাম + একই-ডোমেন ভ্যূ এসপিএ + লেখক ইউনিটটি আমার মান অনুসারে কাজ করার জন্য এক সপ্তাহের বেশি সময় নিয়েছে, তাই আশা করি এখানে আমার উত্তরটি ভবিষ্যতে অন্যদের সময় বাঁচাতে সহায়তা করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.