কীভাবে সিমফনি 2 অ্যাপ্লিকেশনটির মূল ডির পাবেন?


121

নিয়ামকের ভিতরে থেকে রুট অ্যাপ ডিরেক্টরিটি পাওয়ার সবচেয়ে ভাল উপায় কী? এটি কি নিয়ামকের বাইরে পাওয়া সম্ভব?

এখন এটি এটিকে (পরামিতিগুলি থেকে) একটি আর্গুমেন্ট হিসাবে পরিষেবাতে পাস করার মাধ্যমে এটি পেয়েছি:

services:

    sr_processor:
        class: Pro\Processor
        arguments: [%kernel.root_dir%]

সিমফনি 2-তে এই তথ্য পাওয়ার আরও ভাল ও সহজ উপায় কি আছে?


13
আপনার সমাধানটি সর্বোত্তম
ইনোরি

4
আপনি একটি পরিষেবা এবং একটি নিয়ামক ই মিশ্রিত করছেন
জন স্মিথ

4
আবার সিমফনি ৩.৩ এর জন্য এবং তারপরে %kernel.project_dir%আপনার প্রকল্পের মূলটি পেতে ব্যবহার করুন।
মোজাফর আলী

1
["%kernel.root_dir%"]
কোটরে আক্ষরিক

উত্তর:


220

আপডেট 2018-10-21:

এই সপ্তাহ হিসাবে, getRootDir()অবচয় ছিল। getProjectDir()পরিবর্তে মুজারাফ আলীর মন্তব্য বিভাগে প্রস্তাবিত হিসাবে ব্যবহার করুন ।

-

এটা ব্যবহার কর:

$this->get('kernel')->getRootDir();

এবং আপনি যদি ওয়েবের মূলটি চান :

$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath();

এটি কন্ট্রোলার অ্যাকশন পদ্ধতি থেকে কাজ করবে ...

সম্পাদনা: পরিষেবাগুলি হিসাবে, আমি মনে করি আপনি যেভাবে এটি করেছেন এটি যথাসম্ভব পরিষ্কার, যদিও আমি একটি যুক্তি হিসাবে সম্পূর্ণ কার্নেল পরিষেবাটি পাস করব ... তবে এটি কৌশলটিও করবে ...


3
+1 তবে সিমফনি 2-এর জন্য সঠিক নয়। পরিবর্তে ব্যবহার করুন:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
সেবাস্তিয়ান

36
এই সমাধানটি কেবল নিয়ন্ত্রকদের জন্য সঠিক। এখানে সমস্যা পরিষেবাগুলি সম্পর্কে। যাইহোক, কেন কেবল একটি পরিবর্তনশীল পেতে পুরো পাত্রে পাস ? কেবল% kernel.root_dir%
ম্যাসিমিলিয়ানো আরিওনি

2
ম্যাসিমিলিয়ানো ঠিক আছে, এবং অতিরিক্ত হিসাবে, $this->container->getParameter('kernel.cache_dir')আপনি যে সমাধানটি সরবরাহ করেছেন তার পরিবর্তে আমি
নিয়ামকগুলিতে

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

4
সিমফনি ৩.৩ অনুসারে এবং এরপরে ব্যবহার %kernel.project_dir%/web/করুন%kernel.root_dir%/../web/
মোজফর আলী


8

আপনি যদি কোড নয় এমন প্রকল্পগুলির অংশগুলি অ্যাক্সেস করতে এই পাথটি ব্যবহার করছেন (উদাহরণস্বরূপ একটি আপলোড ডিরেক্টরি, বা এসকিউএলাইট ডাটাবেস) তবে এই পথটিকে প্যারামিটারে পরিণত করা আরও ভাল হতে পারে:

parameters:
    database_path: '%kernel.root_dir%/../var/sqlite3.db'

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

আপডেট: স্থির কর্নেল.রোট_ডির ধ্রুবক ব্যবহার।


6

আপনি এগুলি ছাড়াও নিয়মিত প্রকাশটি ব্যবহার করতে পারেন:

    $directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
    $directoryPath = preg_replace("/app..../i", "", $directoryPath);
    echo $directoryPath;

2

যেহেতু সিমফনি ৩.৩ আপনি বাঁধাই করতে পারেন, পছন্দ করুন

services:
_defaults:
    autowire: true      
    autoconfigure: true
    bind:
        $kernelProjectDir: '%kernel.project_dir%'

এর পরে আপনি কোনও নিয়ামক বা পরিষেবাতে প্যারামিটার $ কার্নেলপ্রজেক্টডির ব্যবহার করতে পারেন। ঠিক যেমন

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