view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
它们基本上是文本格式化函数。我应该如何定义全局可用的辅助函数,例如fooFormatText()
?
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
它们基本上是文本格式化函数。我应该如何定义全局可用的辅助函数,例如fooFormatText()
?
这是我创建的一个bash shell脚本,可以快速生成Laravel 5门面。
在Laravel 5安装目录下运行此脚本。
make_facade.sh -f <facade_name> -n '<namespace_prefix>'
例子:
make_facade.sh -f helper -n 'App\MyApp'
Facades
和Providers
。./app/MyApp/Facades/Helper.php
./app/MyApp/Facades/HelperFacade.php
./app/MyApp/Providers/HelperServiceProvider.php
===========================
Finished
===========================
Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',
请在'config/app.php'中更新提供商和别名列表
运行composer -o dumpautoload
"./app/MyApp/Facades/Helper.php" 的原始代码如下:
<?php
namespace App\MyApp\Facades;
class Helper
{
//
}
现在只需在"./app/MyApp/Facades/Helper.php"中添加你的方法。
这是我在添加了一个Helper函数后,"./app/MyApp/Facades/Helper.php"的样子。
<?php
namespace App\MyApp\Facades;
use Request;
class Helper
{
public function isActive($pattern = null, $include_class = false)
{
return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
}
}
This is how it would be called:
===============================
{!! Helper::isActive('help', true) !!}
#!/bin/bash
display_syntax(){
echo ""
echo " The Syntax is like this:"
echo " ========================"
echo " "$(basename $0)" -f <facade_name> -n '<namespace_prefix>'"
echo ""
echo " Example:"
echo " ========"
echo " "$(basename $0) -f test -n "'App\MyAppDirectory'"
echo ""
}
if [ $# -ne 4 ]
then
echo ""
display_syntax
exit
else
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
while [[ $# > 0 ]]
do
key="$1"
case $key in
-n|--namespace_prefix)
namespace_prefix_in="$2"
echo ""
shift # past argument
;;
-f|--facade)
facade_name_in="$2"
shift # past argument
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
fi
echo Facade Name = ${facade_name_in}
echo Namespace Prefix = $(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
echo ""
}
function display_start_banner(){
echo '**********************************************************'
echo '* STARTING LARAVEL MAKE FACADE SCRIPT'
echo '**********************************************************'
}
# Init the Vars that I can in the beginning
function init_and_export_vars(){
echo
echo "INIT and EXPORT VARS"
echo "===================="
# Substitution Tokens:
#
# Tokens:
# {namespace_prefix}
# {namespace_prefix_lowerfirstchar}
# {facade_name_upcase}
# {facade_name_lowercase}
#
namespace_prefix=$(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
namespace_prefix_lowerfirstchar=$(echo ${namespace_prefix_in} | sed -e 's#\\#/#g' -e 's/^\(.\)/\l\1/g')
facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u\1/')
facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower($0)}')
# Filename: {facade_name_upcase}.php - SOURCE TEMPLATE
source_template='<?php
namespace {namespace_prefix}\Facades;
class {facade_name_upcase}
{
//
}
'
# Filename: {facade_name_upcase}ServiceProvider.php - SERVICE PROVIDER TEMPLATE
serviceProvider_template='<?php
namespace {namespace_prefix}\Providers;
use Illuminate\Support\ServiceProvider;
use App;
class {facade_name_upcase}ServiceProvider extends ServiceProvider {
public function boot()
{
//
}
public function register()
{
App::bind("{facade_name_lowercase}", function()
{
return new \{namespace_prefix}\Facades\{facade_name_upcase};
});
}
}
'
# {facade_name_upcase}Facade.php - FACADE TEMPLATE
facade_template='<?php
namespace {namespace_prefix}\Facades;
use Illuminate\Support\Facades\Facade;
class {facade_name_upcase}Facade extends Facade {
protected static function getFacadeAccessor() { return "{facade_name_lowercase}"; }
}
'
}
function checkDirectoryExists(){
if [ ! -d ${namespace_prefix_lowerfirstchar} ]
then
echo ""
echo "Can't find the namespace: "${namespace_prefix_in}
echo ""
echo "*** NOTE:"
echo " Make sure the namspace directory exists and"
echo " you use quotes around the namespace_prefix."
echo ""
display_syntax
exit
fi
}
function makeDirectories(){
echo "Make Directories"
echo "================"
mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
}
function createSourceTemplate(){
source_template=$(echo "${source_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create Source Template:"
echo "======================="
echo "${source_template}"
echo ""
echo "${source_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}.php
}
function createServiceProviderTemplate(){
serviceProvider_template=$(echo "${serviceProvider_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create ServiceProvider Template:"
echo "================================"
echo "${serviceProvider_template}"
echo ""
echo "${serviceProvider_template}" > ./${namespace_prefix_lowerfirstchar}/Providers/${facade_name_upcase}ServiceProvider.php
}
function createFacadeTemplate(){
facade_template=$(echo "${facade_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create Facade Template:"
echo "======================="
echo "${facade_template}"
echo ""
echo "${facade_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}Facade.php
}
function serviceProviderPrompt(){
echo "Providers: ${namespace_prefix_in}\Providers\\${facade_name_upcase}ServiceProvider,"
}
function aliasPrompt(){
echo "Alias: '"${facade_name_upcase}"' => '"${namespace_prefix_in}"\Facades\\${facade_name_upcase}Facade',"
}
#
# END FUNCTION DECLARATIONS
#
###########################
## START RUNNING SCRIPT ##
###########################
display_start_banner
init_and_export_vars
makeDirectories
checkDirectoryExists
echo ""
createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo " Finished TEST"
echo "==========================="
echo ""
echo "Add these lines to config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""
创建一个简单的辅助函数,用于连接两个字符串
在/app/Helpers/MyFuncs.php
路径下创建一个新文件 MyFuncs.php
,并添加以下代码:
<?php
namespace App\Helpers; // 在App命名空间下定义Helpers命名空间。
class MyFuncs { // 定义辅助类MyFuncs。
// 定义一个静态函数,接受两个字符串参数,并返回它们的连接字符串
public static function full_name($first_name,$last_name) {
return $first_name . ', '. $last_name;
}
}
服务提供者用于自动加载类。我们需要定义一个服务提供者,它将加载/app/Helpers
目录中的所有帮助类。
运行以下Artisan命令:
php artisan make:provider HelperServiceProvider
文件将被创建在/app/Providers/HelperServiceProvider.php
。打开/app/Providers/HelperServiceProvider.php
并添加以下代码:
<?php
namespace App\Providers; // defines the namespace provider
use Illuminate\Support\ServiceProvider; // imports the ServiceProvider class namespace
// defines a class HelperServiceProvider that extends the ServiceProvider class
class HelperServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{ // loops through all the files in /app/Helpers directory and loads them.
foreach (glob(app_path().'/Helpers/*.php') as $filename){
require_once($filename);
}
}
}
现在我们需要注册HelperServiceProvider
并为我们的帮助程序创建别名。
打开/config/app.php
文件
找到提供程序数组变量
添加以下行
App\Providers\HelperServiceProvider::class,
找到别名数组变量
添加以下行
'MyFuncs' => App\Helpers\MyFuncs::class,
使用我们的自定义助手保存更改。
我们将创建一个路由,调用我们的自定义助手函数,打开/app/routes.php
添加以下路由定义
Route::get('/func', function () {
return MyFuncs::full_name("John","Doe");
});
这里:
return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class
**
** create new helper
<?php
namespace App\Helpers;
use Illuminate\Database\Eloquent\Collection;
class StatusHelper
{
protected static $_status = [
1=> [
'value' => 1,
'displayName' => 'Active',
],
2 => [
'value' => 2,
'displayName' => 'Inactive',
],
3 => [
'value' => 3,
'displayName' => 'Delete',
],
];
public static function getStatusesList()
{
$status = (new Collection(self::$_status))->pluck('displayName', 'value')->toArray();
return $status;
}
}
用于控制器和任何视图文件
use App\Helpers\StatusHelper;
class ExampleController extends Controller
{
public function index()
{
$statusList = StatusHelper::getStatusesList();
return view('example.index', compact('statusList'));
}
}
namespace App\Helper
class Helpers
{
}
"autoload": {
"classmap": [
"database/seeds",
"database/factories",
"database","app/Helper/Helpers.php"
],
"psr-4": {
"App\\": "app/"
},
"files": ["app/Helper/Helpers.php"]
},
在控制器中使用
use App\Helper\Helpers
在视图中使用 更改config->app.php文件
'aliases' => [
...
'Helpers' => 'App\Helper\Helpers'
],
呼叫视图
<?php echo Helpers::function_name(); ?>
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Http/helpers.php"
],
"psr-4": {
"App\\": "app/"
}
},
composer dump-autoload
编写自定义帮助程序的最佳实践为:
1)在项目根目录的app
目录下创建一个名为Helpers的文件夹(只是为了分离和结构化代码)。
2)在该文件夹中编写psr-4文件或普通php文件。
如果PHP文件采用psr-4格式,则将自动加载,否则请在位于项目根目录中的composer.json中添加以下行:
在autoload
键内,创建一个名为files
的新键以在自动加载时加载文件,在files
对象中添加从app目录开始的路径,这是一个示例。
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
},
"files": [
"app/Helpers/customHelpers.php"
]
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
提示:如果文件未加载,请尝试运行 composer dump-autoload
。
<?php
namespace App\library
{
class hrapplication{
public static function libData(){
return "Data";
}
}
}
?>
2)在我们的刀版上完成这些操作之后
$FmyFunctions = new \App\FolderName\classsName;
echo $is_ok = ($FmyFunctions->libData());
就是这样,它运行良好。
我知道回答这个问题已经很晚了,但是这个问题每天都会发生在所有初级开发者身上,所以为了简单明了,请按照以下步骤操作:
** 将你的辅助函数分组到类中(为了在blade中使用这些函数,只需将它们设置为静态函数),并将所有类放置在Laravel配置文件夹app.php的别名中。
'aliases' => [
"YourClassName" => App\Support\YourClassName,
]
require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add
app\Helpers\function.php
class Helper() {
public function uppercasePara($str) {
return '<p>' .strtoupper($str). '<p>;
}
}
然后你可以在 Blade 模板中像这样简单地调用它:
@inject('helper', \App\Libraries\Helper)
{{ $helper->drawTimeSelector() }}
如果您不想使用@inject,那么只需将“uppercasePara”函数设置为静态,并在Blade模板中嵌入调用,如下所示:
{{ \App\Libraries\Helper::drawTimeSelector() }}
不需要别名。Laravel会自动解析具体的类。
composer.json
文件中添加文件是没用的,因为 psr-4 自动加载会起到作用。 - Arcesilas