it-swarm.asia

كيفية تعيين المتغيرات في Laravel قالب شفرة

أقرأ Laravel Blade documentation ولا يمكنني معرفة كيفية تعيين المتغيرات داخل قالب للاستخدام لاحقًا. لا أستطيع أن أفعل {{ $old_section = "whatever" }} لأن ذلك سوف يردد "أيا كان" ولا أريد ذلك.

أنا أفهم أنه يمكنني القيام <?php $old_section = "whatever"; ?> ، ولكن هذا ليس أنيقًا.

هل هناك طريقة أفضل وأنيقة للقيام بذلك في قالب Blade؟

199
duality_

لا يشجع على القيام به في طريقة عرض لذلك لا توجد علامة شفرة لذلك. إذا كنت تريد القيام بذلك في عرض الشفرة ، يمكنك إما فتح علامة php كما كتبتها أو تسجيل علامة شفرة جديدة. مجرد مثال:

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

LARAVEL 5.5 وما فوق

لم يعد توجيه شفرةphp يقبل العلامات المضمّنة. بدلاً من ذلك ، استخدم الشكل الكامل للتوجيه:

@php
$i = 1
@endphp

LARAVEL 5.2 AND UP

يمكنك فقط استخدام:

@php ($i = 1)

أو يمكنك استخدامه في بيان كتلة:

@php
$i = 1
@endphp

LARAVEL 5

تمديد بليد مثل هذا:

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

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

ثم قم بأحد الإجراءات التالية:

حل سريع: إذا كنت كسولًا ، فما عليك سوى وضع الكود في وظيفة boot () الخاصة بـ AppServiceProvider.php.

حل لطيف: إنشاء مزود الخدمة الخاصة. راجع https://stackoverflow.com/a/28641054/2169147 حول كيفية تمديد الشفرة في Laravel 5. إنه عمل أكثر قليلاً بهذه الطريقة ، ولكنه تمرين جيد حول كيفية استخدام موفري :)

LARAVEL 4

يمكنك فقط وضع الكود أعلاه في الجزء السفلي من app/start/global.php (أو أي مكان آخر إذا كنت تشعر أنه أفضل).


بعد التغييرات المذكورة أعلاه ، يمكنك استخدام:

@define $i = 1

لتحديد متغير.

283
Pim

في laravel-4 ، يمكنك استخدام بناء جملة تعليق القالب لتحديد/تعيين المتغيرات.

بناء جملة التعليق هو {{-- anything here is comment --}} ويتم تقديمه بواسطة شفرة محرك كـ

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

لذلك مع القليل من الحيلة يمكننا استخدامها لتحديد المتغيرات ، على سبيل المثال

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

سيتم تقديمه بواسطة شفرة كـ <?php /* */$i=0;/* */ ?> الذي يحدد المتغير بالنسبة لنا. دون تغيير أي سطر من التعليمات البرمجية.

110
Trying Tobemyself

هناك حل بسيط لا يتطلب منك تغيير أي كود ، ويعمل في Laravel 4 أيضًا.

يمكنك فقط استخدام عامل تعيين (=) في التعبير الذي تم تمريره إلى عبارة @if ، بدلاً من (على سبيل المثال) عامل التشغيل مثل ==.

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

ثم يمكنك استخدامه في أي مكان يمكنك استخدام أي متغير آخر

{{ $variable }}

الجانب السلبي الوحيد هو أن مهمتك سوف تبدو مثل خطأ لشخص لا يدرك أنك تقوم بذلك كحل بديل.

45
BTMPL

Ya'll جعلها معقدة للغاية.

مجرد استخدام php عادي

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

donesies.

(أو https://github.com/alexdover/blade-set تبدو جميلة مستقيمة للغاية)

نحن جميعًا "نخرق" النظام عن طريق تعيين متغيرات في طرق العرض ، فلماذا يجعل "الاختراق" أكثر تعقيدًا ثم يجب أن يكون؟

تم اختباره في Laravel 4.

فائدة أخرى هي أن تسليط الضوء على بناء الجملة يعمل بشكل صحيح (كنت أستخدم hack التعليقات من قبل وكان من المريع قراءتها)

20
Sabrina Leggett

يمكنك ضبط المتغيرات في محرك Blade Templating بالطرق التالية:

1. عام PHP كتلة
إعداد المتغير: <?php $hello = "Hello World!"; ?>
الإخراج: {{$hello}}

2. Blade PHP Block
إعداد المتغير: @php $hello = "Hello World!"; @endphp
الإخراج: {{$hello}}

18
Prince Ahmed

منذ Laravel 5.2.23 ، لديك التوجيه php Blade ، والذي يمكنك استخدامه في السطر المضمن أو ككتلة كتلة:

@php($old_section = "whatever")

أو

@php
    $old_section = "whatever"
@endphp
17
Daan

في Laravel 4:

إذا كنت تريد الوصول إلى المتغير في جميع طرق العرض ، وليس فقط القالب الخاص بك ، View::share فهي طريقة رائعة ( مزيد من المعلومات في هذه المدونة ).

فقط أضف ما يلي في app/controllers/BaseController.php

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

والآن $myvar ستكون متاحة لجميع طرق العرض الخاصة بك - بما في ذلك القالب الخاص بك.

لقد استخدمت هذا لتعيين عناوين URL للأصول الخاصة بالبيئة لصوري.

12
Justin

يمكنك تعيين متغير في ملف العرض ، ولكن سيتم طباعته تمامًا كما تقوم بتعيينه. على أي حال ، هناك حل بديل. يمكنك ضبط المتغير داخل قسم غير مستخدم. مثال:

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

ثم {{ $yourVar }} ستطبع Your value في أي مكان تريده ، لكنك لن تحصل على الإخراج عند حفظ المتغير.

تحرير: تسمية القسم مطلوب وإلا سيتم طرح استثناء.

12
Vasile Goian

وفجأة لن يظهر شيء. من تجربتي ، إذا كان عليك أن تفعل شيئًا كهذا ، فقم بتحضير html في طريقة نموذج أو القيام ببعض إعادة تنظيم الكود الخاص بك في المصفوفات أو شيء ما.

لا يوجد أبدًا سوى طريق واحد.

{{ $x = 1 ? '' : '' }}
8
Michael J. Calkins

سأقوم بتمديد الإجابة التي قدمها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')
6
Carson Evans

يمكنك استخدام الحزمة التي نشرتها: https://github.com/sineld/bladeset

ثم يمكنك بسهولة تعيين المتغير الخاص بك:

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")
4
Sinan Eldem

في Laravel 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()
    {
        // ...
    }
}
4
Justin

أما بالنسبة لطريقة أناقة يشبه ما يلي

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

وفقط صدى متغير $old_section الخاص بك.

{{ $old_section }}
3
Set Kyar Wa Lar

لا أعتقد أنه يمكنك ذلك - ولكن مرة أخرى ، من المحتمل أن يتم التعامل مع هذا النوع من المنطق في وحدة التحكم الخاصة بك وتمريره إلى طريقة العرض المحددة بالفعل.

2
Darren Craig

عيّن متغيرًا إلى قالب الشفرة ، وإليك الحلول

يمكننا استخدام علامة <?php ?> في صفحة الشفرة

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

OR

يمكننا استخدام تعليق الشفرة مع بناء جملة خاص

{{--*/ $var = 'test' /*--}}
{{ $var }}
2
Nikunj K.

إذا كان لديك PHP 7.0:

الطريقة البسيطة والأكثر فاعلية هي تعيين داخل الأقواس .

القاعدة بسيطة: هل تستخدم المتغير الخاص بك أكثر من مرة؟ ثم أعلن ذلك لأول مرة يتم استخدامه داخل الأقواس ، والحفاظ على الهدوء والمتابعة.

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

ونعم ، أنا أعلم عن @forelse ، فهذا مجرد عرض.

نظرًا لأن المتغيرات الخاصة بك يتم التصريح عنها الآن عند استخدامها ، فلن تكون هناك حاجة لأي حلول للشفرة.

2
Jonathan

كنت أبحث عن طريقة لتعيين قيمة لمفتاح واستخدامه عدة مرات في رأيي. في هذه الحالة ، يمكنك استخدام @section{"key", "value"} في المقام الأول ثم استدعاء @yield{"key"} لإخراج القيمة في أماكن أخرى في العرض الخاص بك أو التابعة لها.

1
Hafez Divandari

القرصنة التعليقات ليست وسيلة للقراءة للغاية للقيام بذلك. كما سيقوم المحررون بتلوينها كتعليق وقد يفوتك أحدهم عند الاطلاع على الكود.

جرب شيئا مثل هذا:

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

سيتم تجميع إلى:

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

... والقيام بالمهمة وليس صدى أي شيء.

1
rotaercz

laravel 5 يمكنك القيام بذلك بسهولة. انظر أدناه

{{--*/ @$variable_name = 'value'  /*--}}
1
tapos ghosh

من الأفضل التدرب على تحديد المتغير في وحدة التحكم ثم تمرير للعرض باستخدام طريقة compact() أو ->with().

خلاف ذلك أعطى #TLGreg أفضل إجابة.

1
Mandeep Gill

هناك امتداد جيد جدًا لـ Blade ملحقات جذرية/شفرة . بعد إضافته ، يمكنك استخدامset (variable_name ، variable_value)

@set(var, 33)
{{$var}}
1
belov91

كان لدي سؤال مماثل ووجدت ما أعتقد أنه الحل الصحيح مع View Composers

يتيح لك "عرض الملحنين" ضبط المتغيرات في كل مرة يتم فيها استدعاء عرض معين ، ويمكن أن تكون طرق عرض محددة ، أو قوالب عرض كاملة. على أي حال ، أنا أعلم أنها ليست إجابة مباشرة على السؤال (وبعد مرور عامين على فوات الأوان) ولكن يبدو أنه حل أكثر رشاقة من وضع المتغيرات في طريقة عرض بشفرة.

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

في رأيي ، سيكون من الأفضل الحفاظ على المنطق في وحدة التحكم ونقله إلى طريقة العرض للاستخدام. يمكن القيام بذلك بإحدى طريقتين باستخدام طريقة "View :: make". أنا أستخدم حاليًا 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

0
Robert Brisita

يعمل في جميع إصدارات النصل.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
0
Bakhtawar GIll

يمكنك تمديد الشفرة باستخدام طريقة التمديد كما هو موضح أدناه ..

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

بعد ذلك تهيئة المتغيرات على النحو التالي.

@var $var = "var"
0
Lakitha Dias