সিমফনি 2-তে বান্ডিলের সাথে সম্পর্কিত ফাইলগুলি অ্যাক্সেস করা


83

একটি সিমফনি 2 অ্যাপের রাউটিং কনফিগারেশনে আমি এই জাতীয় কোনও ফাইলটি উল্লেখ করতে পারি:

somepage:
    prefix: someprefix
    resource: "@SomeBundle/Resources/config/config.yml"

কোনও নিয়ামক বা অন্যান্য পিএইচপি কোডের মধ্যে বান্ডেলের সাথে সম্পর্কিত কোনও ফাইল অ্যাক্সেস করার কোনও উপায় আছে কি? বিশেষত, আমি একটি ফাইল পার্স করার জন্য একটি সিমফনি \ উপাদান \ ইয়ামল \ পার্সার অবজেক্টটি ব্যবহার করার চেষ্টা করছি এবং আমি সেই ফাইলটি একেবারে উল্লেখ করতে চাই না। মূলত, আমি এটি করতে চাই:

$parser = new Parser();
$config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") );

আমি সিমফনি \ উপাদান onent ফাইন্ডার \ ফাইন্ডার ক্লাসটি পরীক্ষা করে দেখেছি, তবে আমি মনে করি না এটি আমি যা খুঁজছি। কোন ধারনা? অথবা হতে পারে আমি এটি করার আরও ভাল উপায়টিকে সম্পূর্ণরূপে উপেক্ষা করছি?

উত্তর:


180

প্রকৃতপক্ষে, একটি পরিষেবা রয়েছে যা আপনি এর জন্য ব্যবহার করতে পারেন, কার্নেল ( $this->get('kernel'))। এটি একটি পদ্ধতি বলা হয় locateResource()

উদাহরণ স্বরূপ:

$kernel = $container->getService('kernel');
$path = $kernel->locateResource('@AdmeDemoBundle/path/to/file/Foo.txt');

4
ঠিক আমি খুঁজছেন ছিল কি! $ এটি-> ('কার্নেল') -> সনাক্তকৃত রিসোর্স ("@ সোমারবান্ডেল / রিসোর্সেস / কনফিগারেশন / কনফিগারেশন.আইএমএল"); // নিখুঁতভাবে কাজ করেছে
থমাস কেলি

9
@ টমথেন ৫: এর ব্যতিক্রমগুলি নিশ্চিত করে নিন। এই পদ্ধতিটি ছুঁড়ে দেয় \InvalidArgumentException, যদি ফাইলটি খুঁজে পাওয়া যায় না বা নামটি বৈধ নয়, এবং \RuntimeExceptionযদি নামটিতে অবৈধ / অনিরাপদ অক্ষর থাকে।
কেজিলেডেন

4
আপনাকে কেবল +1 এর চেয়ে বেশি দিতে পছন্দ করবে।
ফ্লু 10

কোন মতবাদ সত্তার অভ্যন্তরে আপনি এই পদ্ধতিটি কীভাবে ব্যবহার করবেন (যা আমি মনে করি না) কার্নেলের অ্যাক্সেস (বা হওয়া উচিত)?
মাইকেল.লুমলি

4
@ মোরস্লামিনা ফাজির উত্তর দেখুন।
টেক

78

থমাস কেলির উত্তরটি ভাল (এবং কাজ করে!) তবে আপনি যদি নির্ভরতা ইনজেকশন ব্যবহার করছেন এবং / অথবা আপনার কোডটি সরাসরি কার্নেলের সাথে বেঁধে রাখতে চান না, আপনি ফাইললোকেটর শ্রেণি / পরিষেবাটি ব্যবহার করা ভাল better

$fileLocator = $container->get('file_locator');
$path = $fileLocator->locate('@MyBundle/path/to/file.txt')

$fileLocatorএকটি উদাহরণ হতে হবে \Symfony\Component\HttpKernel\Config\FileLocator$pathফাইলের সম্পূর্ণ, পরম পথ হবে।

যদিও file_locatorপরিষেবাটি নিজেই কার্নেল ব্যবহার করে, এটি অনেক কম নির্ভরতা (আপনার নিজের প্রয়োগের বিকল্প হিসাবে নেওয়া, পরীক্ষার দ্বিগুণ ব্যবহার ইত্যাদি) easier

নির্ভরতা ইনজেকশন সহ এটি ব্যবহার করতে:

# services.yml

services:
    my_bundle.my_class:
        class: MyNamespace\MyClass
        arguments:
            - @file_locator

# MyClass.php

use Symfony\Component\Config\FileLocatorInterface as FileLocator;

class MyClass
{
    private $fileLocator;

    public function __construct(FileLocator $fileLocator)
    {
        $this->fileLocator = $fileLocator;
    }

    public function myMethod()
    {
        $path = $this->fileLocator->locate('@MyBundle/path/to/file.txt')
    }
}

ভাল পয়েন্ট, তবে ফাইললোকেটর কার্নেল ইন্টারফেসটি ইনজেকশন দেয়, তাই মূলত, আপনি কার্নেলের পরিবর্তে ফাইললোকেটর ইনজেকশন দিলে আপনি এর চেয়ে ভাল আর কিছুই করতে পারেন :)
তোমাজাহলিন

10
আমি আপনার বিষয়টি দেখতে পাচ্ছি, এবং আমি এটি ভেবেছিলাম। তবে সমস্যাটি "কোন কোডটি লোড করা / সম্পাদন করা হয়?" নয়, তবে "কোন কোডের MyClassউপর নির্ভর করে?" বর্তমান FileLocatorবাস্তবায়ন ব্যবহার করে KernelInterface, তবে ভবিষ্যতে যদি পরিবর্তন হয় তবে এগুলি MyClassসম্পর্কে জানার দরকার নেই। এছাড়াও, এটি এখন আরও স্পষ্ট যা MyClassআসলে কী প্রয়োজন (এবং এটি অন্যান্য কার্নেলের বৈশিষ্ট্যগুলির সাথে মিলিত করার জন্য কম প্রলোভন)। সব বলার পরে, কনস্ট্রাক্টরের সম্ভবত Symfony\Component\Config\FileLocatorInterfaceতার চেয়ে বেশি প্রয়োজন Symfony\Component\HttpKernel\Config\FileLocator। তারপরে আপনি নিজের লিখতে পারেন।
fazy

4
এটি আরও ভাল উত্তর
এনডিএম

6

আপনি নিজের অ্যাপ্লিকেশনটির ফোল্ডারটি $container->getParameter('kernel.root_dir')পেতে appএবং আপনার ডিরেক্টরিটি ডিরেক্টরিতে ব্রাউজ করতে পারেন।


বান্ডেল যে কোনও ডিরেক্টরিতে থাকতে পারে। স্বাভাবিক উদাহরণ: src/Acme/Bundle/MyBundle, src/Acme/MyBundle, vendor/acme/my-bundle/srcএবং তাই।
মারিয়াস বালিয়েটিস

3

আপনি যদি অবস্থিত কোনও ফাইলে এটি করতে চান তবে আপনি বর্তমান ফাইলটির পুরো পথটি পেতে src/.../SomeBundle/...ব্যবহার করতে পারেন __DIR__। তারপরে Resources/...সেই পথে আপনার পথ সংযুক্ত করুন

$foo = __DIR__.'/Resources/config/config.yml';

@ অরুডি "কেবল অর্থ প্রদানের পরিকল্পনার সাথে নিবন্ধিত ব্যবহারকারীরা বিধি বর্ণনার সম্পূর্ণ অ্যাক্সেস পেতে পারেন This
প্রিফেল্ড

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

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

আপনি যদি প্রস্তাবগুলি অনুসরণ করেন তবে আপনি পথটিকে উপহাস করতে পারেন বা পরীক্ষার উদ্দেশ্যে এটি খেলতে পারেন। আমি যদি ইংরেজী নেটিভ নই তবে এই পিএইচপি ধ্রুবকগুলিকে ব্যবহারযোগ্য হিসাবে ব্যবহার করা ভাল নয়, সাইমফনি 2 এর মতো কাঠামোতে অনেক কম।
রুডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.