laravel 4助手或基本function的最佳实践和最佳场所是什么?
所以我想要了解在laravel 4中放置全局函数的最佳位置。例如:date格式。 我不认为build立一个门面是值得的,门面太模块化。 我已经阅读了关于创build一个库文件夹和存储类的文章,但是对于一个简单的函数来说,这也看起来很重要。 而且,刀片模板中不应该有像这样的“工具”吗?
什么是这样的最佳做法? 我该如何将它提供给刀片模板?
丑陋,懒惰和可怕的方式:在bootstrap/start.php
结束时,添加一个include('tools.php')
并将你的函数放在这个新文件中。
干净的方式:创build一个库。 这样,只有在实际使用它时才会自动加载。
- 在
app
文件夹内创build一个libraries
文件夹 - 创build你的库文件,在其中创build一个类,并添加静态函数
- 选项1 :编辑
start/global.php
将app_path().'/libraries'
到ClassLoader::addDirectories(
array。 - 选项2 :编辑
composer.json
,将"app/libraries"
添加到autoload
数组中。 运行composer dump-autoload
- 从你的视图调用你的类和静态函数。
关于你的选项,从global.php
文件引用
除了使用Composer外,您还可以使用Laravel类加载器加载您的控制器和模型。 这对于在不更新Composer的情况下将所有类保留在“全局”名称空间中非常有用。
你可以组合两个选项,Laravel类加载器将自动search注册目录中的类( 选项1 ,更简单),Composer将保留所有类的logging,但只有在更新后( 选项2可能会提高性能)。
我这样做的方法是在你的Laravel 4项目的根目录下的/app
目录中创build一个新文件夹。 然后将此文件夹添加到/app/start/global.php
文件的第一个数组中, /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 php文件或运行composer php命令。
不知道这是否是最好的做法,但肯定是有效的。
如果你创build了一个叫做/app/classes/Helpers/Helper.php
的简单文件,例如:
<?php namespace Helpers; class Helper { public static function helloWorld() { return 'Hello World'; } }
所有你需要做的就是调用Helpers\Helper::helloWorld();
你也可以在你的/app/config/app.php
文件中使用这个助手类。 只要将这样的内容添加到aliases
数组的末尾:
'Helper' => 'Helpers\Helper'
Laravel的helpers.php方法是将它添加到composer.json( https://github.com/laravel/framework/blob/master/composer.json )中的“文件”中:
"autoload": { "classmap": [ ... ], "files": [ "app/libraries/helpers.php" ], },
我所做的是创build小类(每个类有几个方法,每个方法只有一行,所有东西都是从DRY延伸出来的,这是我的目标),
class ExtendedCarbon extends Carbon\Carbon { public function formatDDMMAAAA($date) { /// format and return } }
将它们保存到应用程序/库中,并添加到composer.json中:
"autoload": { "classmap": [ ... "app/libraries", ... ], },
执行
composer dump
然后只要在需要的地方使用它们
$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);
观看有关重构的video: http : //www.youtube.com/watch?v = DC-pQPq0acs
顺便说一下,我确信这仅仅是一个例子,但是你可能不需要帮助者来格式化date,因为Laravel中的所有date都是Carbon的实例( https://github.com/briannesbitt/Carbon ),它有加载格式date和时间的方法。
你也可以使用View::share()
和closures来实现这一点 – 我刚刚发布了这个: http : //www.develophp.org/2014/07/laravel-4-blade-helper-functions/
增加的好处:你不需要创build一个额外的类,并保持全局名称空间干净。