সিমফনি 2-তে বর্তমান ব্যবহারকারীর প্রতিনিধিত্বকারী সত্তাটি কীভাবে পাব?


136

আমি সিমফনি সুরক্ষা সেটআপ ব্যবহার করছি। সবকিছু ঠিকঠাক কাজ করে তবে একটি গুরুত্বপূর্ণ জিনিস কীভাবে করতে হয় তা আমি জানি না:

দ্বিগুণ, আমি বর্তমান ব্যবহারকারীর তথ্যে এটি পৌঁছে দিতে পারি:

Welcome, {{ app.user.username }}

অথবা সাদৃশ্যপূর্ণ

আমি কীভাবে নিয়ামকটিতে এই একই তথ্য অ্যাক্সেস করব? বিশেষত, আমি বর্তমান ব্যবহারকারীর সত্তাটি পেতে চাই যাতে আমি এটিকে অন্য সত্তায় (এক থেকে এক ম্যাপিং) এ সম্পর্কিতভাবে সঞ্চয় করতে পারি।

আমি সত্যিই এটি আশা করি ছিল

$this->get('security.context')->getToken()->getUser()

কিন্তু এটি কাজ করে না। এটি আমাকে এক ধরণের শ্রেণি দেয়

Symfony\Component\Security\Core\User\User

এবং আমি এক ধরণের চাই

Acme\AuctionBundle\Entity\User

যা আমার সত্তা ....


উত্তর:


209

সিমফনি 4+, 2019+ পদ্ধতির

সিমফনি 4-তে (সম্ভবত 3.3 এছাড়াও, তবে 4-এ কেবল বাস্তব-পরীক্ষিত) আপনি নিয়ামকটিতে অটো-ওয়্যারিংয়েরSecurity মাধ্যমে পরিষেবাটি ইনজেক্ট করতে পারেন :

<?php

use Symfony\Component\Security\Core\Security;

class SomeClass
{
    /**
     * @var Security
     */
    private $security;

    public function __construct(Security $security)
    {
       $this->security = $security;
    }

    public function privatePage() : Response
    {
        $user = $this->security->getUser(); // null or UserInterface, if logged in
        // ... do whatever you want with $user
    }
}

সিমফনি 2- অ্যাপ্রোচ

যেমন @ কেটোলিস বলেছেন, আপনাকে প্রথমে আপনার কনফিগার করতে হবে /app/config/security.yml

তারপরে

$user = $this->get('security.token_storage')->getToken()->getUser();
$user->getUsername();

প্রশংসনীয় হওয়া উচিত!

$userআপনার ব্যবহারকারী অবজেক্ট! আপনার এটি আবার জিজ্ঞাসা করার প্রয়োজন নেই।

Sf2 ডকুমেন্টেশনsecurity.yml থেকে আপনার সরবরাহকারী সেট আপ করার উপায়টি সন্ধান করুন এবং আবার চেষ্টা করুন।

শুভকামনা!


আমার যদি পিএইচপি টেম্পলেটটিতে ব্যবহারকারীর সত্তার প্রয়োজন হয়?
ডোমিংগো এসএল

@ ডোমিংগো এসএল অফিসিয়াল ডকুমেন্টেশন থেকে নীচের লিঙ্কটি দেখুন: symfony.com/doc/master/book/…
ক্রিশ্চিয়ান ডউস

5
সিমফনি ২.6 থেকে, সুরক্ষা.কমটেক্সট পরিষেবাটি অবজ্ঞা করা হয়েছে এবং দুটি নতুন পরিষেবাদিতে বিভক্ত করা হয়েছে: সিকিউরিটি.অর্থাইজেশন_চেকার এবং সিকিউরিটি. টোকেন_ স্টোরেজ। আপনি এখানে বর্তমান ব্যবহারকারীর আনার সঠিক
উপায়টি

আমি Symfony 5.1.2 এবং উপর আছি $user = $this->security->getUser();, $userসবসময় nullকিনা বা লগ করা আমার জন্য।
নিক রোল্যান্ডো

ওহ দেখে মনে হচ্ছে কারণ এটি আমি ইভেন্ট সাবস্ক্রাইবারে করছি এবং এটি এখনও অনুরোধের প্রথম দিকে করা হয়নি।
নিক রোল্যান্ডো

62

ভাল অভ্যাস

সিমফনি ২.১ থেকে ডকুমেন্টেশন অনুসারে কেবল এই শর্টকাটটি ব্যবহার করুন:

$user = $this->getUser();

উপরে এখনও Symfony 3.2 কাজ এবং এই জন্য একটি শর্টকাট হল:

$user = $this->get('security.token_storage')->getToken()->getUser();

security.token_storageসেবা Symfony 2.6 চালু করা হয়। সিমফনি ২.6 এর আগে আপনাকে পরিষেবার getToken()পদ্ধতিটি ব্যবহার করতে হবে security.context

উদাহরণ : এবং আপনি যদি সরাসরি ব্যবহারকারী নামটি চান:

$username = $this->getUser()->getUsername();

যদি ভুল ব্যবহারকারীর শ্রেণির ধরণ

ব্যবহারকারী একটি বস্তু হবে এবং be বস্তুর শ্রেণিটি আপনার ব্যবহারকারী সরবরাহকারীর উপর নির্ভর করবে ।


6

থ্রেডটি কিছুটা পুরানো তবে আমি মনে করি এটি সম্ভবত কারও সময় বাঁচাতে পারে ...

আমি মূল প্রশ্নের মতো একই সমস্যার মধ্যে দৌড়েছি, টাইপটি সিমফনি \ উপাদান onent সুরক্ষা \ মূল \ ব্যবহারকারী \ ব্যবহারকারী হিসাবে দেখানো হয়েছে

শেষ পর্যন্ত দেখা গেল যে আমি মেমরি ব্যবহারকারীর ব্যবহার করে লগ ইন করেছি

আমার সিকিউরিটি.আইএমএল দেখতে এমন কিছু দেখাচ্ছে

security:
    providers:
        chain_provider:
            chain:
                providers: [in_memory, fos_userbundle]
        fos_userbundle:
            id: fos_user.user_manager
        in_memory:
            memory:
                users:
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                    admin: { password: adminpass, roles: [ 'ROLE_ADMIN', 'ROLE_SONATA_ADMIN' ] }

ইন_ মেমোরি ব্যবহারকারীর ধরনটি সর্বদা সিমফনি \ উপাদান \ সুরক্ষা \ মূল \ ব্যবহারকারী \ ব্যবহারকারী যদি আপনি নিজের সত্তা ব্যবহার করতে চান তবে সেই সরবরাহকারীর ব্যবহারকারীর ব্যবহার করে লগ ইন করুন।

ধন্যবাদ, এইচজে


4

সিমফনি> = ৩.২-তে ডকুমেন্টেশনে বলা হয়েছে:

কন্ট্রোলারে বর্তমান ব্যবহারকারীকে পাওয়ার বিকল্প বিকল্পটি হ'ল ইউজারআইন্টারফেসের সাথে নিয়ন্ত্রক যুক্তিটি টাইপ-ইঙ্গিত দেওয়া (এবং লগ-ইন করা optionচ্ছিক হলে এটি বাতিল করতে ডিফল্ট):

use Symfony\Component\Security\Core\User\UserInterface\UserInterface;

public function indexAction(UserInterface $user = null)
{
    // $user is null when not logged-in or anon.
}

এটি কেবলমাত্র অভিজ্ঞ বিকাশকারীদের জন্যই সুপারিশ করা হয় যারা সিমফনি বেস নিয়ন্ত্রক থেকে প্রসার না করে এবং কন্ট্রোলারট্রেটও ব্যবহার করেন না। অন্যথায়, getUser () শর্টকাট ব্যবহার করা চালিয়ে যাওয়ার পরামর্শ দেওয়া হচ্ছে।

এটি সম্পর্কে ব্লগ পোস্ট


ইভেন্টসউসক্রাইবারে বর্তমান ব্যবহারকারী পেতে চেষ্টা করার ফলে এটি আমাকে অনেক সাহায্য করেছিল: __ কনস্ট্রাক্টে পরম হিসাবে আমাকে (সুরক্ষা $ সুরক্ষা) অটোয়ার করতে হয়েছিল তখন $ সুরক্ষা-> গেট ইউজার () এবং ভয়েলি ব্যবহার করতে হয়েছিল!
tsadiq


-36

ঠিক আছে, প্রথমে আপনার নিয়ামক পদক্ষেপের মতো সেশন থেকে আপনার ব্যবহারকারীর নামটির অনুরোধ করতে হবে:

$username=$this->get('security.context')->getToken()->getUser()->getUserName();

তারপরে ডিবিতে একটি কোয়েরি করুন এবং নিয়মিত ডিকিএল লাইক সহ আপনার অবজেক্টটি পান

$em = $this->get('doctrine.orm.entity_manager');    
"SELECT u FROM Acme\AuctionBundle\Entity\User u where u.username=".$username;
$q=$em->createQuery($query);
$user=$q->getResult();

$ ব্যবহারকারীর এখন এই ব্যবহারকারীর নামটি ব্যবহারকারীকে ধরে রাখা উচিত (আপনি অবশ্যই অন্যান্য ক্ষেত্রগুলিও ব্যবহার করতে পারেন)

... তবে আপনার সুরক্ষা সরবরাহকারীর মতো উপযুক্ত ক্ষেত্রটি ব্যবহার করার জন্য আপনাকে প্রথমে আপনার /app/config/security.yml কনফিগারেশনটি কনফিগার করতে হবে:

security:
 provider:
  example:
   entity: {class Acme\AuctionBundle\Entity\User, property: username}

আশাকরি এটা সাহায্য করবে!


ওয়েল মার্টিন আপনি হয় ব্যবহারকারী বা ব্যবহারকারী নাম চান। সিদ্ধান্ত আপনার. আপনার প্রয়োজনীয় জিনিসটি পাওয়া আপনার দায়িত্ব। এবং যেমনটি আপনি বলেছিলেন আপনি নিয়মিত ব্যবহারকারী চাইছেন না তবে অ্যাকমে নেমস্পেস ব্যবহারকারী।
কেটোলিস

6
"আপনি Acme থেকে নির্বাচন করুন \ নিলামবান্ডেল \ সত্তা \ ব্যবহারকারী আপনি যেখানে u.username =" $ ব্যবহারকারী নাম; = আপনি প্যারামেট্রাইজড কোয়েরি ব্যবহার করা উচিত!
CappY

1
$this->get('security.context')->getToken()->getUser()নিজেই আপনাকে ব্যবহারকারীর বস্তুতে লগ ইন করে। আপনাকে এটি আবার জিজ্ঞাসা করতে হবে না। আসলে আপনি কোন সংস্করণটি ব্যবহার করছেন?
জিত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.