लार्वा ब्लेड टेम्प्लेट में चर कैसे सेट करें


247

मैं लारवेल ब्लेड दस्तावेज़ीकरण पढ़ रहा हूं और बाद में उपयोग करने के लिए एक टेम्पलेट के अंदर चर कैसे निर्दिष्ट कर सकता हूं, यह पता नहीं लगा सकता। मैं ऐसा नहीं कर सकता {{ $old_section = "whatever" }}क्योंकि यह "जो भी" प्रतिध्वनित होगा और मैं ऐसा नहीं चाहता।

मैं समझता हूं कि मैं कर सकता हूं <?php $old_section = "whatever"; ?>, लेकिन यह सुरुचिपूर्ण नहीं है।

वहाँ एक बेहतर, सुंदर तरीका है कि एक ब्लेड टेम्पलेट में है?


1
इस पुल की जाँच करें: github.com/laravel/laravel/pull/866
स्पिरिट

यह अक्सर परीक्षण के लिए उपयोगी होता है, खासकर यदि आप टेम्पलेट पर काम कर रहे हैं, लेकिन कोई और PHP भाग पर काम करता है। जब आप परीक्षण कर रहे हों तो केवल घोषणा को हटाने के लिए सावधान रहें।
त्रिसि

क्या गलत है बस करने के साथ <?php $old_section = "whatever"; ?>। मुझे यह काफी पठनीय लगता है।
बजे Jaime Hablutzel

@JaimeHablutzel का जवाब, मेरी राय में, सवाल में है: यह सुरुचिपूर्ण नहीं है।
द्वितीया_

जवाबों:


122

इसे देखने के लिए हतोत्साहित किया जाता है ताकि इसके लिए कोई ब्लेड टैग न हो। यदि आप अपने ब्लेड दृश्य में ऐसा करना चाहते हैं, तो आप या तो एक php टैग खोल सकते हैं जैसा कि आपने इसे लिखा था या एक नया ब्लेड टैग पंजीकृत करें। बस एक उदाहरण:

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php ${1} ?>', $value);
});

9
विचारों में चर के कुछ उपयोग हैं। यह बहुत अच्छा लग रहा है! इस कोड को रखने के लिए एक अच्छी जगह कहां होगी?
द्वितीया_

1
आप इसे अपने एप्लिकेशन / start.php में डाल सकते हैं या यदि आपके पास इस तरह की और चीजें होंगी तो इसे एक अलग फाइल में डाल दें और वहां शामिल करें। इस तरह से लारवेल बहुत ढीले हैं, आप पतले नियंत्रक भी लगा सकते हैं। दृश्य प्रदान करने से पहले आपको केवल इन चीज़ों का विस्तार करना होगा।
TLGreg

19
केवल मूल का उपयोग {?करने के बजाय इस अतिरिक्त कोड को जोड़ने के लिए तर्क क्या है <??
जस्टिन

1
यदि इसे करने के लिए हतोत्साहित किया जाता है, तो क्या निम्नलिखित करने के लिए अधिक "उचित" तरीका है? मेरे पास एक साइट है जहां शीर्षक को मुख्य ऐप दृश्य में {{$ शीर्षक}} के रूप में प्रस्तुत किया गया है, जिसमें एक सबसिस्टम है, जिसे पृष्ठ संख्या को शीर्षक ("एप्लीकेशन फॉर्म पेज {{$ पेज}}") और पेज पर जोड़ना होगा। मैं दृश्य में $ पृष्ठ पास कर रहा हूं (जिसका उपयोग दृश्य के भीतर किया जाता है)। मैं प्रत्येक नियंत्रक कॉल में शीर्षक का निर्माण नहीं करना चाहता, मैं सिर्फ पृष्ठ संख्या को देखना चाहता हूं - बस किसी दिन मैं आधार शीर्षक बदलना चाहता हूं। मैं उपयोग कर रहा हूँ <? Php $ शीर्षक = ...?> अब, लेकिन क्या अधिक सही तरीका है?
jdavidbakr

4
चर को नियंत्रक से पारित किया जाना चाहिए, आपके विचार में इनलाइन घोषित नहीं किया जाना चाहिए। यदि वैश्विक टेम्प्लेट को एक चर की आवश्यकता है, तो आप इसे एक सेवा प्रदाता में स्थापित कर सकते हैं stackoverflow.com/a/36780419/922522 । यदि पृष्ठ विशिष्ट टेम्प्लेट को एक चर की आवश्यकता है, तो @yield का उपयोग करें और इसे उस बच्चे के दृश्य से पास करें जिसमें नियंत्रक है। laravel.com/docs/5.1/blade#template-inheritance
जस्टिन

361

LARAVEL 5.5 और यूपी

@ एफपी ब्लेड निर्देश अब इनलाइन टैग स्वीकार नहीं करता है। इसके बजाय, निर्देश के पूर्ण रूप का उपयोग करें:

@php
$i = 1
@endphp

LARAVEL 5.2 और यूपी

आप बस उपयोग कर सकते हैं:

@php ($i = 1)

या आप इसे एक ब्लॉक स्टेटमेंट में उपयोग कर सकते हैं:

@php
$i = 1
@endphp

लारवल ५

ब्लेड को इस तरह बढ़ाएँ:

/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @define $variable = "whatever"
| </code>
|--------------------------------------------------------------------------
*/

\Blade::extend(function($value) {
    return preg_replace('/\@define(.+)/', '<?php ${1}; ?>', $value);
});

फिर निम्न में से एक करें:

त्वरित समाधान: यदि आप आलसी हैं, तो AppServiceProvider.php के बूट () फ़ंक्शन में कोड डालें।

अच्छा समाधान: स्वयं का सेवा प्रदाता बनाएँ। Laravel 5 में ब्लेड का विस्तार कैसे करें पर https://stackoverflow.com/a/28641054/2169147 देखें । यह इस तरह से थोड़ा अधिक काम है, लेकिन प्रोवाइडर्स का उपयोग कैसे करें पर एक अच्छा व्यायाम :)

LARAVEL 4

आप बस ऊपर दिए गए कोड को ऐप के नीचे / start / Global.php (या यदि आपको लगता है कि बेहतर है) किसी अन्य स्थान पर रख सकते हैं।


उपरोक्त परिवर्तनों के बाद, आप उपयोग कर सकते हैं:

@define $i = 1

एक चर को परिभाषित करने के लिए।


5
अच्छा! कृपया ध्यान दें कि आप अपने कार्यान्वयन के साथ किसी भी php स्टेटमेंट को निष्पादित कर सकते हैं। मैं इसका नाम बदलकर @php जैसा करूंगा। बहुत काम ...
igaster

बहुत सही, igaster। आप चाहें तो 'डिफाइन' को 'php' में बदल सकते हैं, लेकिन जो आपके टेम्प्लेट में php को ओवर-यूज़ करने के लिए नुकसान को खोलता है :)
Pim

1
धन्यवाद @ C.delaFonteijne, यदि आप नेमस्पेसिंग (और आपको चाहिए) का उपयोग कर रहे हैं, तो वास्तव में \ _ की जरूरत है। मैंने ऊपर कोड में \ _ को जोड़ा है।
पेम

1
कृपया ध्यान दें कि लारवेल 5.2 के बाद से लगभग आपका सटीक कार्यान्वयन मानक है । आप @php(@i = 1)इसे एक ब्लॉक स्टेटमेंट (इसके साथ करीब @endphp) में उपयोग कर सकते हैं या कर सकते हैं
डैन

1
मैं यह नहीं देखता कि कैसे "@ एफपी" "@ फेंफ" "<? Php" ">?" से अधिक सुंदर है। यह अब भी कुछ वर्ण है! क्या यह सिर्फ इसलिए है क्योंकि यह अन्य ब्लेड निर्देशों की तरह "@" से शुरू होता है? हम डेवलपर्स कुछ जुनूनी-बाध्यकारी गुच्छा हैं! ;-)
OMA

116

में , आप चर को परिभाषित / निर्धारित करने के लिए टेम्पलेट टिप्पणी वाक्यविन्यास का उपयोग कर सकते हैं।

टिप्पणी सिंटैक्स है {{-- anything here is comment --}}और इसके द्वारा प्रस्तुत किया गया है इंजन के रूप में

<?php /* anything here is comment */ ?>

इसलिए छोटी चाल के साथ हम इसका उपयोग चर को परिभाषित करने के लिए कर सकते हैं, उदाहरण के लिए

{{-- */$i=0;/* --}}

द्वारा प्रदान किया जाएगा जैसा <?php /* */$i=0;/* */ ?>कि हमारे लिए वैरिएबल सेट करता है। कोड की कोई भी लाइन बदले बिना।


2
@ कोशिश-टोबेमेसे 1 | नहीं सर्वोत्तम प्रथाओं रास्ता है, लेकिन सही के साथ की तरह टेम्पलेट्स में कोड के त्वरित हैकिंग के लिए इनलाइन शैलियों एचटीएमएल के लिए।
मार्कस हॉफमैन

121
मैं इस हैक को करने की अनुशंसा नहीं करूंगा क्योंकि कोई भी इस कोड को देखने के बाद आपसे घृणा करने वाला है।
जस्टिन

2
जस्टिन से सहमत हैं, टिप्पणी टैग टिप्पणी के लिए हैं, टिप्पणी के भीतर असहजता और कुछ और करना शुरू करना मुसीबत के लिए पूछ रहा है
लियोन

27
यह सादे ol 'php<?php $i=0; ?>
gyo

3
क्या php टैग का उपयोग करने के बजाय यह करने की बात है ?? यह पठनीय नहीं है (एक टिप्पणी की तरह दिखता है), अधिक टाइपिंग की आवश्यकता होती है, और पार्सिंग सिस्टम के अपडेट के साथ टूट सकता है। यहां तक ​​कि अगर इसमें एक बिंदु है, तो इसका जवाब नहीं है कि एक ब्लेड टेम्पलेट में एक चर को कैसे परिभाषित किया जाए। मतदाताओं के साथ क्या गलत है पता नहीं, शायद उन्होंने यह 'geeky' पाया? meh ...
सुपर'

52

एक सरल समाधान है जिसमें आपको किसी भी कोड को बदलने की आवश्यकता नहीं है, और यह लारवेल 4 में भी काम करता है।

आप बस एक असाइनमेंट ऑपरेटर ( =) को एक @ifबयान में दिए गए एक्सप्रेशन (उदाहरण के लिए) जैसे ऑपरेटर के बजाय उपयोग करते हैं ==

@if ($variable = 'any data, be it string, variable or OOP') @endif

फिर आप इसे किसी भी अन्य चर का उपयोग कर सकते हैं

{{ $variable }}

केवल नकारात्मक पक्ष यह आपके काम करेंगे देखने के लिए किसी को जानकारी नहीं है करने के लिए एक गलती है कि तुम एक समाधान के रूप यह कर रहे हैं।


27

मैं इसे बहुत जटिल बना रहा हूँ।

बस सादे php का उपयोग करें

<?php $i = 1; ?>
{{$i}}

donesies।

(या https://github.com/alexdover/blade-set काफ़ी सुंदर लग रहा है)

हम सभी तरह के "हैकिंग" सिस्टम को विचारों में परिवर्तन करके स्थापित कर रहे हैं, इसलिए "हैक" को और अधिक जटिल क्यों बनाया जाए?

लारावेल 4 में परीक्षण किया गया।

एक अन्य लाभ यह है कि सिंटैक्स हाइलाइटिंग ठीक से काम करता है (मैं पहले टिप्पणी हैक का उपयोग कर रहा था और यह पढ़ने के लिए भयानक था)


21

आप ब्लेड टेंपलेटिंग इंजन में वेरिएबल्स सेट कर सकते हैं निम्नलिखित तरीके:

1. सामान्य PHP ब्लॉक
सेटिंग चर: <?php $hello = "Hello World!"; ?>
आउटपुट: {{$hello}}

2. ब्लेड PHP ब्लॉक
सेटिंग वैरिएबल: @php $hello = "Hello World!"; @endphp
आउटपुट: {{$hello}}


19

Laravel 5.2.23 के बाद से, आपके पास @php ब्लेड निर्देश है , जिसे आप इनलाइन या ब्लॉक स्टेटमेंट के रूप में उपयोग कर सकते हैं:

@php($old_section = "whatever")

या

@php
    $old_section = "whatever"
@endphp

15

आप व्यू फ़ाइल में एक वैरिएबल सेट कर सकते हैं, लेकिन इसे सेट करते ही प्रिंट हो जाएगा। वैसे भी, एक वर्कअराउंड है। आप एक अप्रयुक्त अनुभाग के अंदर चर सेट कर सकते हैं। उदाहरण:

@section('someSection')
  {{ $yourVar = 'Your value' }}
@endsection

इसके बाद आप इसे कहीं भी {{ $yourVar }}प्रिंट Your valueकर सकते हैं, लेकिन जब आप वेरिएबल को सेव करेंगे तो आपको आउटपुट नहीं मिलेगा।

संपादित करें: अनुभाग का नामकरण आवश्यक है अन्यथा एक अपवाद फेंक दिया जाएगा।


अप्रभावित संपत्ति को शामिल करने के लिए कुछ और काम करने की आवश्यकता नहीं है: Illuminate \ View \ Factory :: $ startSection (देखें: /home/vagrant/Code/dompetspy/resources/views/reviews/index.blade.php)
MaXi32

14

लारवेल 4 में:

यदि आप अपने सभी विचारों में ही नहीं बल्कि अपने टेम्पलेट में भी वैरिएबल को एक्सेस करना चाहते हैं, तो View::shareयह एक बेहतरीन तरीका है ( इस ब्लॉग पर अधिक जानकारी )।

बस एप्लिकेशन / नियंत्रक / BaseController.php में निम्नलिखित जोड़ें

class BaseController extends Controller
{
  public function __construct()
  {                   
    // Share a var with all views
    View::share('myvar', 'some value');
  }
}

और अब $myvarआपके सभी विचारों के लिए उपलब्ध होगा - आपके टेम्पलेट सहित।

मैंने अपनी छवियों के लिए पर्यावरण विशिष्ट संपत्ति URL सेट करने के लिए इसका उपयोग किया।


1
यह वही है जो मैं ढूंढ रहा था: डेटाबेस पर डुप्लिकेट कॉल से बचने का शानदार तरीका!
clod986

यह Laravel 5 में एक विकल्प नहीं लगता है?
गोडार्ड

@Goddard आप अभी भी कर सकते हैं। सिंटैक्स हालांकि बदल गया है: stackoverflow.com/a/36780419/922522
जस्टिन

8

और अचानक कुछ भी दिखाई नहीं पड़ेगा। मेरे अनुभव से, अगर आपको ऐसा कुछ करना है तो html को मॉडल के तरीके से तैयार करें या सरणियों या कुछ में अपने कोड का कुछ पुनर्गठन करें।

सिर्फ 1 रास्ता कभी नहीं होता।

{{ $x = 1 ? '' : '' }}

11
मॉडल में HTML तैयार करें? यह सबसे बदसूरत बात है।
द्वितीया_

@duality_ आप अपने विचार में परिवर्तनशील घोषित कर रहे हैं। मैंने कहा कि आप शायद अपना कोड गलत आयोजित कर रहे हैं। Lrn 2 वास्तुकार।
माइकल जे। कैलकिंस

3
निश्चित बात है, माइकल ... वे चरों के रूप में चर नहीं हैं $users = ..., लेकिन लाइनों के साथ कुछ $css_class = ..., इसलिए कड़ाई से डिजाइन चर जो मॉडल या नियंत्रक से संबंधित नहीं हैं, जैसा कि वे डिजाइनर द्वारा निर्धारित किया जाता है।
द्वितीया_

2
यदि आपको उस मार्ग पर जाने की आवश्यकता है, तो मैं अधिक सरल और सुरुचिपूर्ण समाधान पसंद करता हूं: {{''; $ x = 1}}
डैनियल


6

मैं @Pim द्वारा दिए गए उत्तर का विस्तार करने जा रहा हूं।

इसे अपने AppServiceProvider के बूट विधि में जोड़ें

<?php
/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @set(name, value)
| </code>
|--------------------------------------------------------------------------
*/

Blade::directive('set', function($expression) {
    list($name, $val) = explode(',', $expression);
    return "<?php {$name} = {$val}; ?>";
});

इस तरह आप किसी भी php अभिव्यक्ति को लिखने की क्षमता को उजागर नहीं करते हैं।

आप इस निर्देश का उपयोग कर सकते हैं जैसे:

@set($var, 10)
@set($var2, 'some string')

5

लारवेल में 5.1, 5.2 :

https://laravel.com/docs/5.2/views#sharing-data-with-all-views

आपको अपने एप्लिकेशन द्वारा प्रदान किए गए सभी विचारों के साथ डेटा का एक टुकड़ा साझा करने की आवश्यकता हो सकती है । आप ऐसा कर सकते हैं दृश्य कारखाने के शेयर विधि का उपयोग कर। आमतौर पर, आपको सेवा प्रदाता के बूट विधि के भीतर कॉल को साझा करने के लिए रखना चाहिए। आप उन्हें AppServiceProvider में जोड़ने या उन्हें घर पर एक अलग सेवा प्रदाता बनाने के लिए स्वतंत्र हैं।

फ़ाइल संपादित करें: /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

class AppServiceProvider extends ServiceProvider
{        
    public function boot()
    {
        view()->share('key', 'value');
    }

    public function register()
    {
        // ...
    }
}


3

मेरे सुरुचिपूर्ण तरीके के लिए निम्नलिखित की तरह है

{{ ''; $old_section = "whatever"; }}

और बस अपने $old_sectionचर प्रतिध्वनि ।

{{ $old_section }}

3

यदि आपके पास PHP 7.0 है:

सरल और सबसे प्रभावी तरीका असाइनमेंट के साथ है ब्रैकेट के अंदर

नियम सरल है: क्या आप एक से अधिक बार अपने चर का उपयोग करते हैं? फिर इसे पहली बार घोषित करें कि इसका उपयोग कोष्ठक के भीतर किया गया है, शांत रहें और इसे जारी रखें।

@if(($users = User::all())->count())
  @foreach($users as $user)
    {{ $user->name }}
  @endforeach
@else
  There are no users.
@endif

और हां, मुझे पता है @forelse , यह सिर्फ एक डेमो है।

चूँकि अब आपके चरों को घोषित कर दिया गया है और जब उनका उपयोग किया जाता है, तो किसी भी ब्लेड वर्कअराउंड की आवश्यकता नहीं है।


2

मुझे नहीं लगता कि आप कर सकते हैं - लेकिन फिर, इस तरह के तर्क को संभवतः आपके नियंत्रक में संभाला जाना चाहिए और पहले से निर्धारित दृश्य में पारित किया जाना चाहिए।


6
कुछ चर विचारों के लिए कड़ाई से हैं। $previous_group_name, $separator_printedइत्यादि
द्वितीया_

2
यदि यह केवल विचारों के लिए है, तो आपको इसे केवल नियंत्रक से दृश्य में पास करना चाहिए। यदि आप इसे सभी विचारों के लिए उपलब्ध चाहते हैं, तो मेरे उत्तर का उपयोग करके देखें app/controllers/BaseController.php
जस्टिन

1
मैं अपने सभी $ डेटा को देखने के लिए कई सरणियों का उपयोग कर रहा हूं
होज़ मर्करी

2

ब्लेड टेम्प्लेट में चर असाइन करें, यहां समाधान हैं

हम <?php ?>ब्लेड पेज में टैग का उपयोग कर सकते हैं

<?php $var = 'test'; ?>
{{ $var }

या

हम विशेष वाक्य रचना के साथ ब्लेड टिप्पणी का उपयोग कर सकते हैं

{{--*/ $var = 'test' /*--}}
{{ $var }}

1

टिप्पणियों को हैक करना बहुत ही पठनीय तरीका नहीं है। साथ ही संपादक इसे एक टिप्पणी के रूप में रंगेंगे और कोई इसे कोड के माध्यम से देखने पर याद कर सकता है।

कुछ इस तरह की कोशिश करो:

{{ ''; $hello = 'world' }}

इसमें संकलित होगा:

<?php echo ''; $hello = 'world'; ?>

... और असाइनमेंट करें और कुछ भी प्रतिध्वनित न करें।


1

कंट्रोलर में वेरिएबल को डिफाइन करने के लिए प्रैक्टिस करना बेहतर है और फिर यूज़ compact()या ->with()मेथड को देखने के लिए पास करें ।

अन्यथा #TLGreg ने सबसे अच्छा जवाब दिया।



1

मैं एक कुंजी को एक मूल्य निर्दिष्ट करने और अपने विचार में कई बार उपयोग करने का एक तरीका ढूंढ रहा था। इस स्थिति के लिए, आप @section{"key", "value"}पहले स्थान पर उपयोग कर सकते हैं और फिर @yield{"key"}अपने दृश्य या उसके बच्चे में अन्य स्थानों पर मूल्य को आउटपुट करने के लिए कॉल कर सकते हैं।


0

मेरी राय में नियंत्रक में तर्क रखना बेहतर होगा और इसे उपयोग करने के लिए इसे पास करना होगा। 'व्यू :: मेक' पद्धति का उपयोग करके इसे दो तरीकों में से एक किया जा सकता है। मैं वर्तमान में Laravel 3 का उपयोग कर रहा हूं, लेकिन मुझे पूरा यकीन है कि यह Laravel 4 में उसी तरह है।

public function action_hello($userName)
{
    return View::make('hello')->with('name', $userName);
}

या

public function action_hello($first, $last)
{
    $data = array(
        'forename'  => $first,
        'surname' => $last
    );
    return View::make('hello', $data);
}

'के साथ' विधि श्रृंखला योग्य है। आप तब ऊपर का उपयोग करेंगे जैसे:

<p>Hello {{$name}}</p>

अधिक जानकारी यहाँ:

http://three.laravel.com/docs/views

http://codehappy.daylerees.com/using-controllers


प्रस्तुति का तर्क सबसे अच्छा माना जाता है। कभी-कभी, आपको दृश्य के भीतर से एक चर बनाने की आवश्यकता होती है। दिनांक को प्रारूपित करना। $format='Y-m-d H:i:s';इस तरह से आप उस प्रारूप को दृश्य में पुन: उपयोग कर सकते हैं। यह निश्चित रूप से नियंत्रक में नहीं है। उस सवाल के जवाब में कहा ... <?php ?>टैग्स में कुछ भी गलत नहीं है ।
ग्रेवी

0

मेरे पास एक समान प्रश्न था और मैंने पाया कि व्यू कम्पोजर्स के साथ सही समाधान क्या है

व्यू कंपोज़र्स आपको हर बार एक निश्चित दृश्य कहे जाने वाले वेरिएबल को सेट करने की अनुमति देते हैं, और वे विशिष्ट दृश्य या संपूर्ण व्यू टेम्प्लेट हो सकते हैं। वैसे भी, मुझे पता है कि यह सवाल का सीधा जवाब नहीं है (और 2 साल बहुत देर से) लेकिन यह ब्लेड के साथ एक दृश्य के भीतर चर सेट करने की तुलना में अधिक सुंदर समाधान की तरह लगता है।

View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
    $view->with(array('bodyClass' => 'admin'));
});

0

लार्वा 5 आप आसानी से ऐसा कर सकते हैं। निचे देखो

{{--*/ @$variable_name = 'value'  /*--}}

0

आप नीचे दिखाए अनुसार विस्तार विधि का उपयोग करके ब्लेड का विस्तार कर सकते हैं।

Blade::extend(function($value) {
    return preg_replace('/\@var(.+)/', '<?php ${1}; ?>', $value);
});

इसके बाद वैरिएबल को इनिशियलाइज़ करें।

@var $var = "var"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.