লারাভেল অনুরোধ :: সমস্ত () স্ট্যাটিকালি কল করা উচিত নয়


90

লারাভেলে, আমি আমার নিয়ামকের $input = Request::all();একটি store()পদ্ধতিতে কল করার চেষ্টা করছি , তবে আমি নিম্নলিখিত ত্রুটিটি পেয়ে যাচ্ছি:

অসামঞ্জস্যপূর্ণ প্রেক্ষাপট থেকে Illuminate\Http\Request::all()ধরে ধরে স্থিতিবিহীন পদ্ধতিটিকে স্ট্যাটিকালি বলা উচিত নয়$this

এটিকে সংশোধন করার সর্বোত্তম উপায় নির্ধারণে কোনও সহায়তা? (আমি একটি ল্যারেস্ট অনুসরণ করছি)


@ পেট্রিকাস, দুঃখিত, আমার 5 বলা উচিত ছিল
মূস

দেখে মনে হচ্ছে আপনি মুখোমুখি ব্যবহার করছেন না। use Illuminate\Http\Request;আপনার নিয়ামক একটি বিবৃতি আছে ?
প্যাট্রিকাস

@ পেট্রিকাস, আমার কাছে `ব্যবহার আলোকিত \ এইচটিটিপি p অনুরোধ আছে; আমার নিয়ামকের শীর্ষে বিবৃতি।
মুজ

4
@ পেট্রিকাস আমার কাছে Illuminate\Http\Requestযদিও / প্যাকেজটি নেই। আমাকে কি আলাদা করে ডাউনলোড করতে হবে?
মুজ

Illuminateপ্যাকেজ Laravel / ফ্রেমওয়ার্ক প্যাকেজের অংশ হিসাবে অন্তর্ভুক্ত করা হয়। আপনি যদি /vendor/laravel/framework/src/Illuminate/...
লারাভেল

উত্তর:


223

ত্রুটি বার্তাটি কলটি Requestসম্মুখের দিকে না যাওয়ার কারণে ।

পরিবর্তন

use Illuminate\Http\Request;

প্রতি

use Request;

এবং এটি কাজ শুরু করা উচিত।

কনফিগারেশন / অ্যাপ.এফপি ফাইলে আপনি ক্লাসের এলিয়াসগুলির একটি তালিকা পেতে পারেন। সেখানে, আপনি দেখতে পাবেন যে বেস ক্লাসটি ক্লাসের Requestসাথে এলিয়াস হয়ে গেছে Illuminate\Support\Facades\Request। কারণ এই, ব্যবহার করা Requestএকটি namespaced ফাইলে ছদ্মরূপ, আপনি বেস বর্গ ব্যবহার করতে নির্দিষ্ট করতে হবে: use Request;

সম্পাদনা করুন

এই প্রশ্নটি যেহেতু কিছুটা ট্র্যাফিক পেয়েছে বলে মনে হচ্ছে, লারাভেল 5 আনুষ্ঠানিকভাবে প্রকাশ হওয়ার পরে আমি উত্তরটি কিছুটা আপডেট করতে চেয়েছিলাম।

যদিও উপরেরটি এখনও প্রযুক্তিগতভাবে সঠিক এবং কার্যকর হবে, use Illuminate\Http\Request;বিবৃতিটিকে নতুন কন্ট্রোলার টেম্পলেটে অন্তর্ভুক্ত করা হয়েছে যাতে ফ্যাকডের উপর নির্ভরশীল বনাম নির্ভরতা ইনজেকশন ব্যবহারের দিকে বিকাশকারীদের ধাক্কা দিতে সহায়তা করে।

অনুরোধ অবজেক্টটি কনস্ট্রাক্টারে ইনজেক্ট করার সময় (বা পদ্ধতিগুলি যেমন লারাভেল ৫-তে পাওয়া যায়), এটি সেই Illuminate\Http\Requestঅবজেক্টটি যা ইনজেকশন করা উচিত, এবং সামনের দিকে নয় Request

সুতরাং, অনুরোধ সম্মুখের সাথে কাজ করতে কন্ট্রোলার টেম্পলেটটি পরিবর্তনের পরিবর্তে প্রদত্ত কন্ট্রোলার টেম্পলেটটি দিয়ে কাজ করা এবং নির্ভরতা ইনজেকশন (কনস্ট্রাক্টর বা পদ্ধতিগুলির মাধ্যমে) ব্যবহার করার দিকে এগিয়ে যাওয়ার পরামর্শ দেওয়া হয়।

পদ্ধতির মাধ্যমে উদাহরণ

<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller {

    /**
     * Store a newly created resource in storage.
     *
     * @param  Illuminate\Http\Request  $request
     * @return Response
     */
    public function store(Request $request) {
        $name = $request->input('name');
    }
}

নির্মাণকারীর মাধ্যমে উদাহরণ

<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller {

    protected $request;

    public function __construct(Request $request) {
        $this->request = $request;
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store() {
        $name = $this->request->input('name');
    }
}

4
উত্তরটি সঠিক, তবে অগ্রাধিকারের বাইরে আমি আলোকসজ্জা \ সমর্থন \ মুখোমুখি \ অনুরোধটি ব্যবহার করব; কারণ ব্যক্তিগতভাবে আমি মনে করি যে লারাভেলের অভ্যাসটি মূল নেমস্পেসের সাথে সমস্ত কিছু আলাদা করে রাখার অভ্যাসটি প্রথমে নামের স্থানের বিপরীতে। এটি এপিআই ডকুমেন্টেশনগুলি উত্পন্ন করা আরও শক্ত করে তোলে কারণ এপিগেন / পিএইচপিডোক "অনুরোধ" শ্রেণিটি সন্ধান করতে পারবেন না।
delatbabel

4
আসলে, আপনাকে কারিগর মেক: কন্ট্রোলারের বয়লারপ্লেট পরিবর্তন করার দরকার নেই। আপনি যদি পদ্ধতিটিতে ইনজেকশন না দিয়ে অনুরোধটি ব্যবহার করতে চান তবে কেবল $ ইনপুট = \ অনুরোধ :: সমস্ত () ব্যবহার করুন (লক্ষ্য করুন \)। আপনি যদি পাবলিক মাইফানশন (অনুরোধ $ অনুরোধ () {$ ইনপুট = $ অনুরোধ-> সমস্ত () ব্যবহার করার চেয়ে ইঞ্জেকশনটি ব্যবহার করতে চান} অথবা এটি কনস্ট্রাক্টারে ইনজেক্ট করুন এবং একটি শ্রেণি ভেরিয়েবলকে বরাদ্দ করুন
shock_gone_wild

4
আমি ব্যবহার করার Request::all();সময় কেন ব্যবহার করতে পারি না use Illuminate\Http\Request; ?
SA__

@ এসএ__ অনুরোধ :: সমস্ত () একটি মুখোমুখি উপায়। সুতরাং আপনার use Illuminate\Support\Facades\Request; পরিবর্তেuse Illuminate\Http\Request;
থাবাং

@redA- র অনুরোধ :: কীভাবে রূপান্তর করার উপায় আছে সমস্ত () সরাসরি উপায়ে ব্যবহার করার জন্য (এবং সম্মুখের শ্রেণীর মাধ্যমে নয়)?
সিড

6

লারাভেলের ম্যাজিক ইনজেকশন ব্যবহার করে নিয়ামকটিতে অনুরোধ অবজেক্টটি ইনজেক্ট করুন এবং তারপরে অ-স্থিতিশীলভাবে ফাংশনটি অ্যাক্সেস করুন। লারাভেল স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে ক্লাসে কংক্রিট নির্ভরতা ইনজেক্ট করবে

class MyController() 
{

   protected $request;

   public function __construct(\Illuminate\Http\Request $request)
   {
       $this->request = $request;
   }

   public function myFunc()
   {
       $input = $this->request->all();
   }

}

5

ব্যবহার request()পরিবর্তে সাহায্যকারী। আপনার useবিবৃতি সম্পর্কে চিন্তা করতে হবে না এবং এই ধরণের সমস্যাটি আবার ঘটবে না।

$input = request()->all();

সরল


4

মুখোমুখি হ'ল একটি অনুরোধ শ্রেণি, এটি সম্পূর্ণ পথ দিয়ে অ্যাক্সেস করুন:

$input = \Request::all();

লারাভেল 5 থেকে আপনি এটিকে request()ফাংশনের মাধ্যমেও অ্যাক্সেস করতে পারবেন :

$input = request()->all();

3

আমি ভেবেছিলাম যে এখানে কী ঘটছে তার কিছুটা ব্যাখ্যা দেওয়ার জন্য ভবিষ্যতের দর্শকদের পক্ষে এটি কার্যকর হবে।

Illuminate\Http\Requestশ্রেণী

লারাভেলের Illuminate\Http\Requestক্লাসের একটি পদ্ধতি রয়েছে যার নাম রয়েছে all(বাস্তবে allপদ্ধতিটি এমন একটি বৈশিষ্ট্যে সংজ্ঞায়িত করা হয় যা Requestশ্রেণিটি ব্যবহার করে, বলা হয় Illuminate\Http\Concerns\InteractsWithInput)। allলেখার সময় পদ্ধতির স্বাক্ষরটি দেখে মনে হচ্ছে:

public function all($keys = null)

এই পদ্ধতিটি সংজ্ঞায়িত করা হয়নি staticএবং তাই আপনি যখন কোনও স্থিতিক প্রসঙ্গে পদ্ধতিটিকে কল করার চেষ্টা করেন, অর্থাত Illuminate\Http\Request::all()আপনি ওপির প্রশ্নে ত্রুটিটি প্রদর্শিত হবে। allপদ্ধতি একটি দৃষ্টান্ত পদ্ধতি ও তথ্য যে একটি দৃষ্টান্ত উপস্থিত সঙ্গে পুলিশ যে Requestএই ভাবে এটি আহ্বান, যাতে কোন জ্ঞান করে তোলে, বর্গ।

মুখোমুখি

লারাভেলের একটি মুখোমুখি বিকাশকারীদের আইওসি পাত্রে আইটেম অ্যাক্সেস করার সুবিধাজনক উপায় এবং সেই সমস্ত বিষয়গুলিতে কল করার পদ্ধতি সরবরাহ করে। একটি ডেভেলপার একটি পদ্ধতি "স্ট্যাটিক্যালি" এর মতো একটি ছদ্মরূপ কল করতে পারেন Request::all(), কিন্তু প্রকৃত পদ্ধতি কল বাস্তব Illuminate\Http\Request বস্তুর না স্ট্যাটিক।

একটি মুখোমুখি প্রক্সিটির মতো কাজ করে - এটি আইওসি পাত্রে থাকা কোনও বস্তুকে বোঝায় এবং স্ট্যাটিক পদ্ধতি কলটি সেই বস্তুর (অ স্থিরভাবে) পাস করে। উদাহরণস্বরূপ, Illuminate\Support\Facades\Requestসম্মুখ মুখটি ধরুন, এটি দেখতে এটির মতো দেখাচ্ছে:

class Request extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'request';
    }
}

হুডের নীচে, বেস Illuminate\Support\Facades\Facadeক্লাসটি কিছু পিএইচপি যাদু ব্যবহার করে, যথা __callStatic:

  • কোনও স্ট্রাইক পদ্ধতি কলের জন্য শুনুন, allকোনও পরামিতি ছাড়াই
  • কী দ্বারা ফিরে ব্যবহার আইওসি ধারক থেকে নিম্নাবস্থিত বস্তুর দখল getFacadeAccessor, এই ক্ষেত্রে একটি Illuminate\Http\Requestবস্তুর
  • এটি পুনরুদ্ধার করা বস্তুর উপর স্থিতিশীলভাবে প্রাপ্ত পদ্ধতিটিকে गतिशीलভাবে কল করুন, এক্ষেত্রে allউদাহরণ হিসাবে অ-স্থিতিকরূপে বলা হয় Illuminate\Http\Request

এই কারণেই, @ পেট্রিকাস তার উত্তরটিতে উল্লিখিত হিসাবে, সম্মুখস্থকে উল্লেখ করার জন্য use/ আমদানির বিবৃতি পরিবর্তন করে , ত্রুটিটি আর নেই, কারণ পিএইচপি সম্পর্কিত, allযথাযথভাবে একটি উদাহরণ হিসাবে ডাকা হয়েছিল Illuminate\Http\Request

এলিয়াসিং

এলিয়াসিং হ'ল আরেকটি বৈশিষ্ট্য যা লারাভেল সুবিধার জন্য সরবরাহ করে। এটি কার্যকরভাবে ওরফে ক্লাস তৈরি করে কাজ করে যা রুট নেমস্পেসের সম্মুখিন দিকে নির্দেশ করে। কীটির config/app.phpনীচে যদি আপনি আপনার ফাইলটি একবার দেখুন aliases, আপনি স্টেক্স ক্লাসে স্ট্রিংয়ের ম্যাপিংয়ের একটি দীর্ঘ তালিকা পাবেন। উদাহরণ স্বরূপ:

'aliases' => [

    'App' => Illuminate\Support\Facades\App::class,
    'Artisan' => Illuminate\Support\Facades\Artisan::class,
    'Auth' => Illuminate\Support\Facades\Auth::class,
    // ...
    'Request' => Illuminate\Support\Facades\Request::class,

লারাভেল আপনার কনফিগারেশনের উপর ভিত্তি করে আপনার জন্য এই উপন্যাস ক্লাস তৈরি করে এবং এটি আপনাকে মূল নামস্থানে উপলব্ধ কনফিগারগুলি ( aliasesকনফিগারেশনের স্ট্রিং কীগুলি দ্বারা উল্লেখ করা হয় ) এমনভাবে ব্যবহার করতে দেয় যেন আপনি নিজেই মুখোমুখি ব্যবহার করছেন:

use Request:

class YourController extends Controller
{
    public function yourMethod()
    {
        $input = Request::all();

        // ...
    }
}

নির্ভরতা ইনজেকশন উপর একটি নোট

লারাভেলে এখনও ফেসেড এবং এলিয়জিং সরবরাহ করা হলেও এটি সম্ভব এবং সাধারণত নির্ভরতা ইনজেকশন রুটে যেতে উত্সাহিত করা হয়। উদাহরণস্বরূপ, একই ফলাফল অর্জন করতে কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করা:

use Illuminate\Http\Request;

class YourController extends Controller
{
    protected $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function yourMethod()
    {
        $input = $this->request->all();

        // ...
    }
}

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


1
use Illuminate\Http\Request;
public function store(Request $request){
   dd($request->all());
}

প্রসঙ্গে বলা একই

use Request;
public function store(){
   dd(Request::all());
}

1

এছাড়াও আপনি যখন api.php ফাইলে নিম্নলিখিত লাইব্রেরি আমদানি করেন তা ঘটে। রুট ক্লাস না পাওয়ার জন্য এটি আমদানির জন্য কিছু আইডিইর পরামর্শে এটি ঘটে ।

শুধু এটি এবং সমস্ত কিছু ঠিকঠাক কাজ করে ফেলুন।

use Illuminate\Routing\Route;

হালনাগাদ:

মনে হয় আপনি এই লাইব্রেরিটি যুক্ত করলে এটি ত্রুটির দিকে পরিচালিত করবে না

use Illuminate\Support\Facades\Route;

এটি আমার পক্ষে কাজ করেছে, তবে আমি এখনও আইডিই যুক্তিটি আমার জন্য প্রযোজ্য হবে না কেন, কারণ আমি যেভাবে প্রকল্পটি উত্পন্ন করেছি এবং আমি vscode ব্যবহার করি।
অ্যাল্ডো ওকেওয়্যার

0

এমনকি use Illuminate\Http\Request;আমার নিয়ামকের শীর্ষে লাইন রেখেও আমি এই সমস্যার মুখোমুখি হয়েছি। আমার চুল টানতে থাকুন যতক্ষণ না বুঝেছিলাম যে আমি এর $request::ip()বদলে করছি $request->ip()। আপনি যদি সারা রাত না ঘুমিয়ে থাকেন এবং অর্ধ-খোলা চোখ দিয়ে সকাল 6 টায় কোডটির দিকে তাকিয়ে থাকেন তবে আপনার সাথে ঘটতে পারে।

আশা করি এটি কাউকে রাস্তায় নামতে সহায়তা করবে।


0

আমি এটিকে একটি স্কোপ সংজ্ঞা দিয়ে কাজ করি

পাবলিক ফাংশন পগার (\ আলোকসজ্জা \ এইচটিটিপি \ অনুরোধ $ অনুরোধ) {//


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