Symfony2 টুইগ টেম্পলেটগুলিতে কীভাবে কনফিগার প্যারামিটার পাবেন


170

আমার একটি সাইফনি 2 টিভিগ টেম্পলেট রয়েছে। আমি এই টুইগ টেম্পলেটটিতে একটি কনফিগার প্যারামিটারের মান আউটপুট করতে চাই (একটি সংস্করণ নম্বর)। অতএব আমি কনফিগার প্যারামিটারটিকে এর মতো সংজ্ঞায়িত করেছি:

parameters:
    app.version: 0.1.0

আমি কন্ট্রোলারগুলিতে এই কনফিগার প্যারামিটারটি ব্যবহার করতে সক্ষম তবে এটি আমার টুইগ টেমপ্লেটে কীভাবে পাবেন তা সম্পর্কে আমার কোনও ধারণা নেই।

উত্তর:


406

আপনি কনফিগারেশনের ট্যুইগ গ্লোবাল বিভাগে প্যারামিটার বিকল্প ব্যবহার করতে পারেন :

প্যারামিটার কনফিগারেশন:

parameters:
    app.version: 0.1.0

টুইগ কনফিগারেশন:

twig:
    globals:
        version: '%app.version%'

ট্যুইগ টেম্পলেট:

{{ version }}

এই পদ্ধতিটি আপনাকে ContainerAwareক্লাসেও প্যারামিটারটি ব্যবহার করার অনুমতি দেওয়ার সুবিধা প্রদান করে:

$container->getParameter('app.version');

ভাল উত্তর. সংযোজন: যেহেতু সিমফনি 3.1 একটি ভেরিয়েবল উদ্ধৃত করা আবশ্যক: "% app.version%"
বিজেজে

@ বিজেজে: উদ্ধৃতিগুলি অন্তর্ভুক্ত করতে আপডেট হয়েছে, কারণ এটি পুরানো সংস্করণগুলিতেও কাজ করবে।
রাইল

2
এটি অবশ্যই গ্রহণযোগ্য উত্তর হওয়া উচিত। ধন্যবাদ!
সিরিল

191

সহজেই, আপনি আপনার কনফিগারেশন ফাইলটিতে সংজ্ঞা দিতে পারেন:

twig:
    globals:
        version: "0.1.0"

এবং এটির সাথে আপনার টেমপ্লেটে অ্যাক্সেস করুন

{{ version }}

অন্যথায় এটি আপনার প্যারামিটারগুলি প্রকাশ করার জন্য একটি ট্যুইগ এক্সটেনশন সহ একটি উপায় হতে হবে।


28
@ রিল বুঝিয়ে দেওয়ার মত এটি পরামিতিগুলিতে সেট করা আরও ভাল।
মিঃগ্লাস 21

89

আপনি বিল্ট ইন সার্ভিস প্যারামিটার সিস্টেমের সুবিধাও নিতে পারেন, যা আপনাকে মানটি আলাদা করতে বা পুনরায় ব্যবহার করতে দেয়:

# app/config/parameters.yml
parameters:
    ga_tracking: UA-xxxxx-x

# app/config/config.yml
twig:
    globals:
        ga_tracking: "%ga_tracking%"

এখন, ভেরিয়েবল ga_tracking সমস্ত টুইগ টেম্পলেটগুলিতে পাওয়া যায়:

<p>The google tracking code is: {{ ga_tracking }}</p>

নিয়ামকদের ভিতরে প্যারামিটারটি উপলব্ধ:

$this->container->getParameter('ga_tracking');

আপনি একটি গ্লোবাল টুইগ ভেরিয়েবল (Symfony2.2 +) হিসাবে একটি পরিষেবাও সংজ্ঞায়িত করতে পারেন:

# app/config/config.yml
twig:
    # ...
    globals:
        user_management: "@acme_user.user_management"

http://symfony.com/doc/current/templating/global_variables.html

আপনি যে বিশ্বব্যাপী ভেরিয়েবলটি সেট করতে চান তা যদি আরও জটিল হয় - কোনও বস্তু বলুন - তবে আপনি উপরের পদ্ধতিটি ব্যবহার করতে সক্ষম হবেন না। পরিবর্তে, আপনাকে একটি টুইগ এক্সটেনশন তৈরি করতে হবে এবং getGlobals পদ্ধতিতে প্রবেশকারীগুলির মধ্যে একটি হিসাবে গ্লোবাল ভেরিয়েবলটি ফিরিয়ে আনতে হবে।


5
এটি সেরা সমাধানের মতো দেখায় কারণ এটি সিস্টেমের সমস্ত জ্ঞানকে একসাথে রাখে।
জোনিস গ্রুজিস

19

সিমফনি 2 (এর parameters.ymlপরিবর্তে ব্যবহার করে parameters.ini) এর নতুন সংস্করণগুলিতে আপনি কী-মান জোড়ার পরিবর্তে বস্তু বা অ্যারে সঞ্চয় করতে পারেন, যাতে আপনি আপনার গ্লোবালগুলি এভাবে পরিচালনা করতে পারেন:

config.yml (শুধুমাত্র একবার সম্পাদিত):

# app/config/config.yml
twig:
  globals:
    project: %project%

parameters.yml:

# app/config/parameters.yml
project:
  name:       myproject.com
  version:    1.1.42

এবং তারপরে একটি দ্বিগুণ ফাইলের মধ্যে আপনি ব্যবহার করতে পারেন {{ project.version }}বা {{ project.name }}

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


16

উপরোক্ত উত্তরগুলি সঠিক এবং কার্যকর কাজ করে। আমি অন্যভাবে ব্যবহার করেছি।

config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: app.yml }
    - { resource: app_twig.yml }

app.yml

parameters:
  app.version:           1.0.1

app_twig.yml

twig:
  globals:
    version: %app.version%

ভিতরে নিয়ামক:

$application_version = $this->container->getParameter('app.version');
// Here using app.yml

ভিতরে টেমপ্লেট / টুইগ ফাইল:

Project version {{ version }}!
{#  Here using app_twig.yml content.  #}
{#  Because in controller we used $application_version  #}

নিয়ামক আউটপুট ব্যবহার করতে:

নিয়ন্ত্রক:

public function indexAction() {
        $application_version = $this->container->getParameter('app.version');
        return array('app_version' => $application_version);
    }

টেমপ্লেট / টুইগ ফাইল:

Project version {{ app_version }}

আমি আরও ভাল বোঝার জন্য বিভিন্ন উল্লেখ করেছি।


1
হ্যাঁ দুর্দান্ত, এই উত্তরটি খুব ভালভাবেই দুটি উপায় ব্যাখ্যা করে: নিয়ামকের মধ্য দিয়ে চলে যাওয়া এবং এটি একটি বৈশ্বিক দ্বৈত ভেরিয়েবল হিসাবে পাস করা! +1
গটলিয়েব নটসনাবল

12

একটি টুইগ এক্সটেনশনের সাহায্যে আপনি একটি parameterটুইগ ফাংশন তৈরি করতে পারেন :

{{ parameter('jira_host') }}

TwigExtension.php:

class TwigExtension extends \Twig_Extension
{
    public $container;

    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('parameter', function($name)
            {
                return $this->container->getParameter($name);
            })
        ];
    }


    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'iz';
    }
}

service.yml:

  iz.twig.extension:
    class: IzBundle\Services\TwigExtension
    properties:
      container: "@service_container"
    tags:
      - { name: twig.extension }

এর জন্য ধন্যবাদ, আমি উদ্বিগ্ন ছিলাম আমাকে পরামিতি ফাইল থেকে পাতাগুলি দ্বিগুণ করতে হবে glo
জো ইয়াহছুচি

দুর্দান্ত, তবে এটি কোনও প্যারামিটারের জন্য এক্সটেনশনে অযৌক্তিক ওভারলোড পুরো কন্টেইনারটি নয়?
লাজডেক মারেক

আমি সিম্ফনি 2 এর সাথে বিশ্বাস করি, আপনি ধারক প্যারামিটারগুলি ইনজেক্ট করতে পারবেন না (যা এখন সিমফনি 4/5 দিয়ে সম্ভব)
টমাস ডিকাক্স

1

$this->getParameter('app.version')পরমকে পাতলা করার জন্য আপনি কেবল নিয়ামককে আবদ্ধ করতে পারেন এবং তারপরে এটি রেন্ডার করতে পারেন।


-3

কনফাইং.আইএমএল-তে

# app/config/config.yml
twig:
  globals:
    version: '%app.version%'

টুইগ ভিউতে

# twig view
{{ version }}

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