如何在 Laravel Blade 模板中编写 PHP 代码?

Posted

技术标签:

【中文标题】如何在 Laravel Blade 模板中编写 PHP 代码?【英文标题】:How to write PHP code inside of Laravel Blade template? 【发布时间】:2018-03-31 01:34:10 【问题描述】:

我正在为一个在 Laravel 中完成的网站编写代码,我知道不建议在 Blade 模板中编写 php 代码,但在这种情况下我的时间有限。

@php
   if($_POST["submit"])
        $name = $_POST["name"];
        $email = $_POST["email"];

        $missingName = "<p><strong>Please eneter your name.</strong></p>";
        $invalidEmail = "<p><strong>Invalid Email.</strong></p>";


        if($name)
            $name = filter_var($name, FILTER_SANITIZE_STRING);
        else

            $errors .= $missingName;
        


          $email = filter_var($email, FILTER_SANITIZE_EMAIL);
          $email = filter_var($email, FILTER_VALIDATE_EMAIL);
         if(filter_var($email, FILTER_VALIDATE_EMAIL))

          else
              $errors .= $invalidEmail;
          
        if($errors)
            $resultMessage = '<div  class="alert alert-danger">' . $errors .'</div>';
        else

            $to = "leads@relevant.systems";
            $subject = "DijiJock update request form.";
            $message = "<html>
                         <body>
                         <h2 style='color:black'>DijiJock update request form.</h2>
                <p style='color:green'>Name: $name</p>
                <p style='color:green'>Email: $email</p>
                <p style='color:black'>$name has requested DijiJock updates, please forward all updates to $email.</p>
                         </body>
                       </html>";
            $headers = "Content-type: text/html";


            if(mail($to, $subject, $message, $headers))
                $resultMessage = '<div  class="alert alert-success">Thank you for the meesage!</div>';

            else
                $resultMessage = '<div  class="alert alert-warning">Email not sent! Please try again later.</div>';
            
        
        echo $resultMessage;
                 
@endphp

中间的PHP代码不起作用?

【问题讨论】:

看来我有正确的标签,但我收到错误“未定义的索引:提交” 试试这个 if(isset($_POST["submit"]))。您可能会在尚未提交的页面加载上点击未定义。 您应该将此代码放在控制器中,而不是 .blade 文件中... if($_POST["submit"]) 更改为 if($_SERVER['REQUEST_METHOD'] == 'POST') 将解决此问题,但您应该在控制器中包含此类代码,而不是您的视图。 【参考方案1】:

(这里更好的实现controller中的action,可以做一个helper类,通过service provider绑定,使用)

在某些情况下,将 PHP 代码嵌入到视图中很有用。您可以使用 Blade @php 指令在模板中执行纯 PHP 块:

@php
    //
@endphp

与以下内容完全相同:

<?php

?>

如果您需要共享全局变量,最好的方法是使用 View facade 的方法 share(),并在 上执行此操作服务提供商。 https://laravel.com/docs/5.7/views#passing-data-to-views

用例的例子:布局的嵌套结构 => 用短名称保存全局变量,指向树遍历的更大名称(+ 当我们改变结构时易于维护,只做一次)。前任:

namespace App\Providers;

use Illuminate\Support\Facades\View;

class ViewGlobaleVarServiceProvider extends ServiceProvider

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
     // \/\/\/\/\/\/\/\/  <====== !
        View::share('sysAdmDashPgContainerHeader', 'system.admin.dashboard.partials.pageContainer.partials._header');
    

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    
        //
    

这里我创建了一个新的ServiceProvider,你可以使用现有的,比如AppServiceProvider

如果要执行的操作取决于控制器调用,最好在控制器上实现,如果它是特定于视图的(内部逻辑)。那么@php @endphp 是实现这一目标的好方法。

也用于共享变量知道我们可以简单地在布局视图中使用@php @phpend(它将在所有包含的部分和扩展它的对象上可用)。所以你知道@include 和@yield,@extend 的本质。然而,这不是最佳实践或推荐。推荐使用上面的辅助 View::share()。

另一种编写代码的方法是创建自己的指令

查看文档:https://laravel.com/docs/5.7/blade#extending-blade 这是我需要的一个很好的例子(多参数作为关联数组传递 + 有一些细节):https://***.com/a/53218523/7668448

(注意你只需要在服务提供者上创建一个函数,并且你有自己的指令,)

那么全球共享功能呢? 创建和使用全局帮助器。通过创建一个包含所有帮助程序(函数)的文件。然后使用 composer** 自动加载**。或者通过服务提供者绑定一个include_once

作曲家自动加载:https://***.com/a/49549907/7668448

通过服务提供者绑定:https://***.com/a/32422699/7668448

【讨论】:

【参考方案2】:

使用控制器和刀片视图方法。

Mail::send('emails.YOUR_BLADE_FILE', ['user' => $user, 'request' => $request], function ($message) use ($user, $request) 
     $message->to('EMAIL_ACCOUNT', 'EMAIL_USER_NAME');         
     $message->subject('EMAIL SUBJECT');
);

尝试使用此功能。这很简单,也很干净。

【讨论】:

以上是关于如何在 Laravel Blade 模板中编写 PHP 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 的 Blade 模板中链接到一个宁静的资源?

如何在 Blade 模板(Laravel v8)中获取 url 参数

如何在 laravel 4 的 Blade.php 模板中使用静态函数?

Laravel 5 - 所有模板中都可用的全局 Blade 视图变量

如何在 Laravel Blade 模板中设置变量

如何在 Laravel Blade 模板中添加 input type="number"?