【问题标题】:How to include Smarty 3 into Laravel 4?如何将 Smarty 3 包含到 Laravel 4 中?
【发布时间】:2014-11-12 02:17:00
【问题描述】:

我是 Laravel 的新手,所以仍然习惯这些概念,但是我有大约 10 年的 Smarty 使用经验。所以我希望利用这一点(除了 Blade 似乎缺少太多我认为有用且在 Smarty 中开箱即用的功能,但无论如何,除了这个问题的重点之外)。

我一直在寻找在 Laravel 中使用 Smarty 的正确方法,尽管在 here 等一些论坛上,似乎不清楚我需要做什么才能在框架内正确使用它.更具体地说,我的问题是:

  1. 我的composer.json 中应该包含哪个 Composer 包?似乎有 this 包括 Smarty 本身,因为它被修改了(不太热衷于此)。还有here,他们还建议http://bundles.laravel.com/bundle/SmartyView。不确定是否相同,因为 laravel.com 的 bundles 子域甚至都没有出现。它曾经在几天前出现,但我不知道他们是否将其关闭,因为捆绑包现在已经过时并被包取代......不确定。还有this

  2. 我应该如何配置 Laravel 以使用 Smarty 视图而不是 Blade 视图?

  3. 鉴于 Laravel 使用 REST 风格的漂亮 URL,我应该如何包含来自 Smarty 的 CSS 和 JS 文件 视图,这样它们的路径是由 Laravel 动态设置的?在 Blade 中,您可以执行以下操作:{{ HTML::style('css/style.css') }}。我可以使用类似的东西吗?还是更好地通过调用 HTML 类从代码中设置模板变量? (我真的不喜欢在模板中调用 PHP 代码,而这些模板应该只是做表示逻辑。)

对不起,如果有些问题有点琐碎。

【问题讨论】:

  • 我认为你应该试试 Blade。我在 Smarty 模板方面也有丰富的经验,但现在我也在学习 Laravel 并使用 Blade。事实上,几乎所有模板系统都做同样的事情,其中​​一些具有比另一个更多的功能,但几乎总是足以生成所需的输出
  • @MarcinNabiałek 谢谢。我已经尝试了一点,但语法很糟糕,有时不一致,而且如此混乱和破碎(模板与布局等等),以至于网页设计师很难使用它。即使在 Dreamweaver 等工具中,Smarty 模板也几乎可以加载。
  • 请注意,刀片被放入智能手机是有原因的。你很可能不得不拆开 laravel 来实现它。
  • @castis 似乎主要原因是在 Laravel 采用大量 Symfony 组件(其中 Twig 是首选模板引擎)之前,需要一个快速简单的模板引擎,并创建了 Blade。 .. 至少从我迄今为止所做的有限研究来看。与此同时,我正在尝试packalyst.com/packages/package/latrell/smarty
  • 如果切换模板引擎会破坏 Laravel,那么 Laravel 就坏了;幸运的是,从发布的答案来看,这也是不真实的。

标签: php laravel smarty


【解决方案1】:

好的,经过更多研究,我设法将 Smarty 3 轻松集成到 Laravel 4 中。我不确定这是否是最好的方法,但它运行良好,因此欢迎 cmets 或进一步的建议。

我为 Laravel 安装了 this Smarty View 并按照说明将其添加到 app/config/app.php 中的 providers 列表中。运行php artisan config:publish latrell/smarty 命令后,配置自动创建,我准备好了。这个包似乎也使用了正确的 Smarty 库,而不是一些修改过的模板。

然后我刚刚创建了一个普通的旧 HTML 文件,在 app/views 目录中具有 .tpl 扩展名,在 app/controllers 目录中具有相应的控制器,以及在 routes.php 中的相应路由,嘿,presto,它工作顺利。

我什至修改了 BaseController 以维护一个通用的模板变量列表(例如 CSS 样式等),以便在 HTML 中注入而不在模板中放入丑陋的 PHP 代码。 (我不知道是否有更好的方法将它们从BaseController 直接设置到View,而不是期望子类在调用make 方法时将它们传递给make,但我想这是一个不同的问题。)

下面的代码供可能需要的人使用:

HelloWorld.tpl

<!doctype html>
<html lang="en">
<head>
    <title>Hello World</title>
    <meta charset="UTF-8">
    {$style}
</head>
<body>
    <div>
        <h1>Hello {$name}</h1>
    </div>
</body>
</html>

BaseController.php

class BaseController extends Controller {

    protected $template_vars = array();

    protected function addTemplateVar($key, $value)
    {
        $this->template_vars[$key] = $value;
    }

    /**
     * Setup the layout used by the controller.
     *
     * @return void
     */
    protected function setupLayout()
    {
        //not sure if I need this any more since I am using Smarty
        if ( ! is_null($this->layout))
        {
            $this->layout = View::make($this->layout);
        }

        $this->addTemplateVar("style", HTML::style("css/bootstrap.css"));
    }

}

HelloWorldController.php

class HelloWorldController extends BaseController 
{          
    public function showHelloWorld()
    {
        $this->addTemplateVar('name', 'World!');
        return View::make('helloworld', $this->template_vars);
    }
}

routes.php

Route::get('helloworld', 'HelloWorldController@showHelloWorld');

希望它对其他人有用。

【讨论】:

  • +1 表示解决方案。将来可能对某人有用
  • 请注意,Smarty 目前在 composer (packagist) 中存在问题。由于composer.json 中的错误,composer update 目前与 Smarty 3.1.20 中断。已经有一个修复,但它还没有在稳定的分支上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多