我正在尝试理解在Laravel 4中放置全局函数的最佳位置 . 例如,日期格式化 . 我不认为制作外立面是值得的,因为外墙过于模块化 . 我已经阅读了有关创建库文件夹和存储类的文章,但对于一个简单的函数来说,这似乎也很多 . 刀片模板中不应该有这样的“工具”吗?
对于类似这样的事情有哪些最佳实践?如何将其提供给Blade模板?
丑陋,懒惰和可怕的方式:在 bootstrap/start.php 结束时,添加 include('tools.php') 并将您的函数放在该新文件中 .
bootstrap/start.php
include('tools.php')
干净的方式:创建一个库 . 这样它只会在您实际使用时自动加载 .
在 app 文件夹中创建 libraries 文件夹
app
libraries
创建库文件,在其中创建一个类,并向其中添加静态函数
选项1:编辑 start/global.php 将 app_path().'/libraries' 添加到 ClassLoader::addDirectories( 数组 .
start/global.php
app_path().'/libraries'
ClassLoader::addDirectories(
选项2:编辑 composer.json 将 "app/libraries" 添加到 autoload 数组 . 运行 composer dump-autoload
composer.json
"app/libraries"
autoload
composer dump-autoload
从您的视图中调用您的类和静态函数 .
关于您的选项,引自 global.php 文件
global.php
除了使用Composer之外,您还可以使用Laravel类加载器来加载控制器和模型 . 这对于在没有Composer更新的情况下将所有类保留在“全局”命名空间中非常有用 .
您可以将两个选项组合在一起,Laravel类加载器将自动搜索已注册目录中的类(选项1,更容易),并且Composer将保留所有类的记录,但只有在您更新之后(选项2,可能会提高性能) .
我这样做的方法是在Laravel 4项目的根目录中的 /app 目录中创建一个新文件夹 . 然后将此文件夹添加到 /app/start/global.php 文件的第一个数组中,如下所示:
/app
/app/start/global.php
<?php ClassLoader::addDirectories(array( app_path().'/commands', app_path().'/controllers', app_path().'/models', app_path().'/database/seeds', app_path().'/classes', // This line is the one I've added. ));
只要新 /app/classes 文件夹中的文件夹结构遵循您的命名空间约定 . Laravel 4将自动加载此文件夹中的所有类/文件 . 这样就不需要深入研究任何作曲家文件或运行composer命令 .
/app/classes
不确定这是否是最佳做法,但它确实有效 .
如果您创建了一个名为 /app/classes/Helpers/Helper.php 的简单文件,例如:
/app/classes/Helpers/Helper.php
<?php namespace Helpers; class Helper { public static function helloWorld() { return 'Hello World'; } }
您需要做的就是致电 Helpers\Helper::helloWorld();
Helpers\Helper::helloWorld();
您也可以在 /app/config/app.php 文件中为此助手类别名 . 只需在 aliases 数组的末尾添加这样的内容:
/app/config/app.php
aliases
'Helper' => 'Helpers\Helper'
Laravel的helpers.php方法是将它添加到composer.json(https://github.com/laravel/framework/blob/master/composer.json)中的"files":
"autoload": { "classmap": [ ... ], "files": [ "app/libraries/helpers.php" ], },
我所做的是创建小类(每个类有几个方法,每个方法一行,从某些东西延伸到DRY,这是我的目标),
class ExtendedCarbon extends Carbon\Carbon { public function formatDDMMAAAA($date) { /// format and return } }
在app / libraries中将它们保存到它们并添加到composer.json:
"autoload": { "classmap": [ ... "app/libraries", ... ], },
执行
composer dump
然后只需在任何需要的地方使用它们
$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);
观看有关重构的视频:http://www.youtube.com/watch?v=DC-pQPq0acs
顺便说一下,我确信它只是一个例子,但你可能不需要帮助器来设置日期格式,因为Laravel中的所有日期都是Carbon的实例(https://github.com/briannesbitt/Carbon),它有大量的方法来格式化日期和时间 .
您也可以使用 View::share() 和闭包来实现这一点 - 我刚刚发布了这个:http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/
View::share()
增加的好处:您不需要创建额外的类,也可以保持全局命名空间清洁 .
4 回答
丑陋,懒惰和可怕的方式:在
bootstrap/start.php
结束时,添加include('tools.php')
并将您的函数放在该新文件中 .干净的方式:创建一个库 . 这样它只会在您实际使用时自动加载 .
在
app
文件夹中创建libraries
文件夹创建库文件,在其中创建一个类,并向其中添加静态函数
选项1:编辑
start/global.php
将app_path().'/libraries'
添加到ClassLoader::addDirectories(
数组 .选项2:编辑
composer.json
将"app/libraries"
添加到autoload
数组 . 运行composer dump-autoload
从您的视图中调用您的类和静态函数 .
关于您的选项,引自
global.php
文件您可以将两个选项组合在一起,Laravel类加载器将自动搜索已注册目录中的类(选项1,更容易),并且Composer将保留所有类的记录,但只有在您更新之后(选项2,可能会提高性能) .
我这样做的方法是在Laravel 4项目的根目录中的
/app
目录中创建一个新文件夹 . 然后将此文件夹添加到/app/start/global.php
文件的第一个数组中,如下所示:只要新
/app/classes
文件夹中的文件夹结构遵循您的命名空间约定 . Laravel 4将自动加载此文件夹中的所有类/文件 . 这样就不需要深入研究任何作曲家文件或运行composer命令 .不确定这是否是最佳做法,但它确实有效 .
如果您创建了一个名为
/app/classes/Helpers/Helper.php
的简单文件,例如:您需要做的就是致电
Helpers\Helper::helloWorld();
您也可以在
/app/config/app.php
文件中为此助手类别名 . 只需在aliases
数组的末尾添加这样的内容:Laravel的helpers.php方法是将它添加到composer.json(https://github.com/laravel/framework/blob/master/composer.json)中的"files":
我所做的是创建小类(每个类有几个方法,每个方法一行,从某些东西延伸到DRY,这是我的目标),
在app / libraries中将它们保存到它们并添加到composer.json:
执行
然后只需在任何需要的地方使用它们
观看有关重构的视频:http://www.youtube.com/watch?v=DC-pQPq0acs
顺便说一下,我确信它只是一个例子,但你可能不需要帮助器来设置日期格式,因为Laravel中的所有日期都是Carbon的实例(https://github.com/briannesbitt/Carbon),它有大量的方法来格式化日期和时间 .
您也可以使用
View::share()
和闭包来实现这一点 - 我刚刚发布了这个:http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/增加的好处:您不需要创建额外的类,也可以保持全局命名空间清洁 .