লারাভেল মিডলওয়্যার নিয়ামকটিতে পরিবর্তনশীল ফেরত দেয়


90

তারা কোনও পৃষ্ঠা দেখতে পাবে কিনা তা নির্ধারণ করার জন্য আমি কোনও অনুমতি চেক পরিচালনা করছি। এর মধ্যে প্রথমে কিছু মিডলওয়্যারের মাধ্যমে অনুরোধটি পাস করা জড়িত।

আমার যে সমস্যাটি হচ্ছে তা হ'ল আমি নিজেই ডেটা ভিউতে ফিরিয়ে দেওয়ার আগে মিডলওয়্যার এবং নিয়ামক হিসাবে একই ডাটাবেস কোয়েরিটিকে নকল করছি।

সেটআপের উদাহরণ এখানে;

--ways.php

Route::get('pages/{id}', [
   'as' => 'pages',
   'middleware' => 'pageUser'
   'uses' => 'PagesController@view'
]);

- পেজ ইউজারমিটলওয়্যার.এফপি (ক্লাস পেজ ইউজারমিডলওয়ার)

public function handle($request, Closure $next)
    {
        //get the page
        $pageId = $request->route('id');
        //find the page with users
        $page = Page::with('users')->where('id', $pageId)->first();
        //check if the logged in user exists for the page
        if(!$page->users()->wherePivot('user_id', Auth::user()->id)->exists()) {
            //redirect them if they don't exist
            return redirect()->route('redirectRoute');
        }
        return $next($request);
    }

- পেজসকন্ট্রোল.এফপি

public function view($id)
{
    $page = Page::with('users')->where('id', $id)->first();
    return view('pages.view', ['page' => $page]);
}

আপনি দেখতে পাচ্ছেন, Page::with('users')->where('id', $id)->first()মিডওয়্যার এবং নিয়ামক উভয় ক্ষেত্রেই পুনরাবৃত্তি হয়। আমার এক থেকে অন্যটির মধ্যে ডেটা পাস করতে হবে যাতে নকল না হয়।


আমি একই ধরণের জিজ্ঞাসা করতে যাচ্ছিলাম, আমাকে এই উত্তরটি খুঁজতে বেশ দীর্ঘ সময় নিয়েছে। এখানে আমার প্রশ্ন। আমি এটি এসইও / সন্ধানের কারণে এখানে যুক্ত করব, আশা করি ঠিক আছে: লারাভেল 5.0 - মিডলওয়্যার এবং নিয়ন্ত্রণকারী মধ্যে লোড মডেল। আমি কীভাবে ব্যবহারকারীদের মডেলটির একটি উদাহরণ লোড করব যাতে মিডলওয়্যার এবং নিয়ন্ত্রণকারী উভয় ক্ষেত্রে একই উদাহরণ (কেবল একটি ডাটাবেস ক্যোয়ারী) উপলব্ধ থাকে? কারণ মিডওয়্যারটিতে আমি ব্যবহারকারীটি অনুমোদিত কিনা তা এবং কন্ট্রোলারে আমি ব্যবহারকারী সম্পর্কে তথ্য উপস্থাপন করতে বা কোনওভাবে ব্যবহারকারীকে চালিত করতে চাইতে চাই।
এলিয়েনিনলন্ডন

উত্তর:


140

আমি বিশ্বাস করি এটি করার সঠিক উপায়টি (লারাভেল 5.x এ) বৈশিষ্ট্যগুলির সম্পত্তিতে আপনার কাস্টম ক্ষেত্রগুলি যুক্ত করা।

উত্স কোড মন্তব্যগুলি থেকে আমরা কাস্টম প্যারামিটারগুলির জন্য ব্যবহৃত বৈশিষ্ট্যগুলি দেখতে পাচ্ছি:

 /**
 * Custom parameters.
 *
 * @var \Symfony\Component\HttpFoundation\ParameterBag
 *
 * @api
 */
public $attributes;

সুতরাং আপনি নিম্নলিখিত হিসাবে এটি বাস্তবায়ন হবে;

$request->attributes->add(['myAttribute' => 'myValue']);

তারপরে আপনি কল করে বৈশিষ্ট্যটি পুনরুদ্ধার করতে পারেন:

\Request::get('myAttribute');

অথবা লারাভেল 5.5+ তে অনুরোধ অবজেক্ট থেকে

 $request->get('myAttribute');

4
তাহলে আপনি কীভাবে গ্রহনকারী নিয়ামকের মধ্যে বৈশিষ্ট্যগুলি অ্যাক্সেস করবেন?
user985366

4
কন্ট্রোলার মেথড আর্গুমেন্টে (আইওসি ধারক) অনুরোধের ক্লাস যুক্ত করুন বা স্থির শ্রেণিতে কল করুন
est

8
$ myAttribute = \ অনুরোধ :: পান ('myAttribute');
শন সি

4
বাহ, এই সমাধানটি খুব পরিষ্কার দেখাচ্ছে!
স্কেলিনগারহ্ট

4
আপনি $request->request->add(['myAttribute' => 'myValue']);যাদু $request->myAttribute
গিটার

33

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

আপনার মিডলওয়্যারগুলিতে, আপনার Pageউদাহরণটি নিবন্ধ করুন :

app()->instance(Page::class, $page);

তারপরে ঘোষণা করুন যে আপনার নিয়ামকের একটি Pageউদাহরণ প্রয়োজন:

class PagesController 
{
    protected $page;

    function __construct(Page $page) 
    {
        $this->page = $page;
    }
}

লারাভেল স্বয়ংক্রিয়ভাবে নির্ভরতা সমাধান করবে Pageএবং আপনার মিডলওয়্যারের সাথে আবদ্ধ যে উদাহরণটি দিয়ে আপনার নিয়ামকটি ইনস্ট্যান্ট করবে।


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

4
@ আরিয়ান অ্যাকোস্টা দয়া করে, আপনি কি নিজের পথ দিয়ে উত্তরটি বিস্তারিত বর্ণনা করতে পারেন? আমি বলতে চাইছি, নির্ভরতা ইঞ্জেকশনটি কীভাবে ব্যবহার করতে হয় এবং এটি মিডওয়্যারের সাথে কীভাবে যুক্ত।
জেকার্লোসআর

4
পছন্দ করেছেন ধারণাটি হ'ল একটি কাস্টম সার্ভিস কনটেইনার শ্রেণি থাকবে যা আপনাকে মিডলওয়্যার এবং নিয়ামকের মধ্যে পাস করতে হবে এমন তথ্য অভ্যন্তরীণ বৈশিষ্ট্য হিসাবে রাখে। আপনি যদি সেই পরিষেবা কনটেইনারটিকে $ এই-> অ্যাপ্লিকেশন-> সিঙ্গেলটন (...) দিয়ে সিঙ্গলটন হিসাবে নিবন্ধন করেন তবে প্রতিবার আপনি যখন এটি ইনজেক্ট করবেন তখন সর্বদা একই ঘটনা হবে। সুতরাং, মূলত আপনি প্রথমে এটি মিডওয়্যারের মধ্যে ইনজেকশনের মাধ্যমে (কেবল এটি একটি যুক্তি হিসাবে প্রয়োজনীয় করে), তারপরে ডেটাটি ভিতরে রেখে, এবং শেষ পর্যন্ত এটি এমন নিয়ামকের প্রয়োজন যেখানে আপনি ডেটা অ্যাক্সেস করতে পারবেন। লারাভেলডডকস দেখুন / ৫.৪/২ কন্টেইনার শুভকামনা
আরিয়ান অ্যাকোস্টা

4
এটি একটি দুর্দান্ত উত্তর ... ঝরঝরে! :)
Pietro

4
মন্তব্য: __ কনস্ট্রাক্টারে এটি কাজ করে না, কারণ মিডলওয়্যার নিয়ন্ত্রণকারীর কনস্ট্রাক্টরের পরে লোড হয়। তবে আপনি নিয়ামকের যে কোনও ক্রিয়ায় ডিআই ব্যবহার করতে পারেন।
সেরিহি টোপলনেটস্কিই

19

লারাভেল> = 5 এ আপনি মিডওয়্যারটি ব্যবহার করতে পারেন $request->merge:

public function handle($request, Closure $next)
{

    $request->merge(array("myVar" => "1234"));

    return $next($request);
}

এবং নিয়ামক মধ্যে:

public function index(Request $request)
{

    $myVar = $request->instance()->query('myVar');
    ...
}

11
আপনি কেন ব্যবহারের Request::instance()চেয়ে স্থিতিশীলভাবে অ্যাক্সেস করবেন $request?
jjok


8

লারাভেল 5.3.x এর জন্য উপরের মন্তব্যের একটিতে যেমন উল্লেখ করা হয়েছে

$request->attributes->add(['key => 'value'] ); 

কাজ করে না। মিডলওয়্যারের কাজ করে তবে ভেরিয়েবলটি সেট করা

$request->attributes->set('key', 'value');

আমি আমার কন্ট্রোলারে এটি ব্যবহার করে ডেটা আনতে পারি

$request->get('key');

6

আমি নিশ্চিত যে মিডলওয়্যার থেকে কোনও নিয়ামকের কাছে ডেটা পাঠানো সম্ভব হলে লারাভেল ডকুমেন্টেশনে থাকত।

কটাক্ষপাত আছে এই এবং এই , এটা সাহায্য করতে পারে।

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

সুতরাং, আপনার মিডওয়্যারের মধ্যে আপনার কাছে থাকতে পারে:

$request->myAttribute = "myValue";

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

4
@ অ্যালেক্স হ্যাঁ, আমি মনে করি যদি এটি নিয়মিত কোডের প্রতিটি অংশ যা প্রতিটি নিয়ামক ক্রিয়ায় কার্যকর করে তবে মিডলওয়্যার হিসাবে এটি প্রয়োগ করা খারাপ ধারণা নয়।
নোমান উর রেহমান

5

এটি খুব সহজ:

মিডলওয়্যার কোডটি এখানে:

public function handle($request, Closure $next)
{

    $request->merge(array("customVar" => "abcde"));

    return $next($request);
}

এবং এখানে নিয়ামক কোডটি রয়েছে:

$request->customVar;

2

যদি আপনার ওয়েবসাইটটিতে সিমিএস পৃষ্ঠাগুলি রয়েছে যা ডাটাবেস থেকে আনা হচ্ছে এবং লারাভেল অ্যাপ্লিকেশনের সমস্ত পৃষ্ঠায় শিরোনাম এবং পাদচরণ ব্লকে তাদের শিরোনামগুলি দেখাতে চান তবে মিডলওয়্যার ব্যবহার করুন। আপনার মিডলওয়্যারের কোড নীচে লিখুন:

namespace App\Http\Middleware;

use Closure;

use Illuminate\Support\Facades\DB;

public function handle($request, Closure $next)
{    

$data = DB::table('pages')->select('pages.id','pages.title')->where('pages.status', '1')->get();

\Illuminate\Support\Facades\View::share('cms_pages', $data);

return $next($request);

}

তারপরে আপনার হেডার.ব্ল্যাড.পিএফ এবং পাদদেশ.ব্লেড.পিপি এবং সেমি পৃষ্ঠাগুলির লিঙ্কগুলি যুক্ত করতে কোডের নীচে লিখুন:

<a href="{{ url('/') }}">Home</a> | 

@foreach ($cms_pages as $page) 

<a href="{{ url('page/show/'.$page->id) }}">{{ $page->title }}</a> | 

@endforeach

<a href="{{ url('contactus') }}">Contact Us</a>

সকলকে অনেক ধন্যবাদ এবং কোডটি উপভোগ করুন :)


1

আমি ইংরেজি বলতে পারি না, তাই ... সম্ভাব্য ত্রুটির জন্য দুঃখিত।

আপনি এটির জন্য আইওসি বাইন্ডিং ব্যবহার করতে পারেন। আপনার মিডলওয়্যারটিতে আপনি পৃষ্ঠাটি বন্ধনের জন্য এটি করতে পারেন:

\App::instance('mi_page_var', $page);

এর পরে, আপনার নিয়ামকটিতে আপনি সেই দৃষ্টান্তটি কল করুন:

$page = \App::make('mi_page_var');

অ্যাপ :: উদাহরণটি ক্লাসটির পুনরায় উদাহরণ দেয় না, পরিবর্তে প্রাকদিকভাবে বাধ্যতামূলক দমনটি ফিরিয়ে দেয়।


1

আমি অনুরোধ-অবজেক্টের সাথে এর সাথে মানগুলি যোগ করতে সক্ষম হয়েছি:

$request->attributes->set('key', 'value');

এবং এগুলির সাথে একটি পরে বিন্দুতে ফিরে:

$request->attributes->get('key');

এটি সম্ভব কারণ ল্যারাভেলস অনুরোধটি সিমফোনিস অনুরোধকে প্রসারিত করে যা কাস্টম প্যারামিটারগুলি ধারণ করার উদ্দেশ্যে তৈরি প্যারামিটার ব্যাগের " $ গুণাবলী " টাইপ করে

আমি মনে করি পরবর্তী মিডলওয়্যার, নিয়ন্ত্রক বা অন্য যে কোনও জায়গায় যেখানে অনুরোধ-অবজেক্টে অ্যাক্সেস করা সম্ভব সেখানে ডেটা পাস করার জন্য এটি সর্বোত্তম অনুশীলন হওয়া উচিত।

লারাভেল 5.6 দিয়ে পরীক্ষিত , তবে সম্ভবত অন্যান্য সংস্করণগুলির সাথেও কাজ করছে।


1

$requestঅ্যারেটি যাতে আমরা কেবল অ্যারেতে মান এবং কী যুক্ত করতে পারি এবং $requestকন্ট্রোলারে এই কীটি দিয়ে পাই ।

$request['id'] = $id;

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