欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

引入 导入 自定义文件放哪儿 自定义类 自定义函数 自定义 class 文件 有大用 有大大用 有大大大用

shiping1 的头像

我们的应用里经常会有一些全局都可能会用的函数,我们应该怎么放置它会比较好呢?以下有一种推荐的方式:

1. 创建文件 app/helpers.php

<?php

// 示例函数
function foo() {
    return "foo";
}

2. 修改项目 composer.json

在项目 composer.json 中 autoload 部分里的 files 字段加入该文件即可:

{
    ...

    "autoload": {
        "files": [
            "app/helpers.php"
        ]
    }
    ...
}

然后运行:

composer dump-autoload

OK,然后你就可以在任何地方用到 app/helpers.php 中的函数了。

如果在 helpers.php  中使用了名称空间
比如  

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/7/25
 * Time: 9:50
 */
namespace App;
use App\Category;
function getCategory($id){
    $category = Category::find($id);
    return $category;
}

?>

那么 在模板文件中 调用 getCategory() 方法 就是 这样用: {{-- */ $lxwm_cateogry = \App\getCategory(16); /* --}}

仅使用 getCategory(16) 就会报 函数未定义的错




来自 http://laravel.so/tricks/e81a15277236d35feb19ad5b86427bdc
 

In app/Library I have a file called Helpers.php

<?php

namespace App\Library\Helpers;

class Helpers {
  public function truncate($text) {
    if (strlen($text) > 200) {
      preg_replace('/\s+?(\S+)?$/', '', substr($text, 0, 201));
    }
    return $text;
  }
}

In one of my views, I want to use the class:

  @foreach($data['articles'] as $article)
    <div class="container">
      <div class="article">
        <h1>{{ $article->title }}</h1>
        <p>
          <?php
            $helpers = new \App\Library\Helpers;
            echo $helpers->truncate($article->body);
          ?>
        </p>
      </div>
    </div>
  @endforeach

I get this error:

Class 'App\Library\Helpers' not found

shareimprove this question
 
   
why you not use this function in constants files ? – DsRaj May 23 '16 at 12:03
   
@DsRaj What's constant files? – frosty May 23 '16 at 12:06
   
you can define function or variable in constants file create file in config folder config/constants.php – DsRajMay 23 '16 at 12:11
正确答案

You are trying to use a namespace not a class, your class is actually App\Library\Helpers\Helpers. Using blade you can use the inject method to get your class in a view.

@inject('helpers', 'App\Library\Helpers\Helpers')

@foreach($data['articles'] as $article)
    <div class="container">
        <div class="article">
            <h1>{{ $article->title }}</h1>
            <p>{{ $helpers->truncate($article->body) }}</p>
        </div>
    </div>
@endforeach

Using inject creates a new variable of the name passed as the first argument with a value of the class passed in as the second argument. Your helpers are now available in the view.

 
   
I'm getting Class App\Library\Helpers does not exist – frosty May 23 '16 at 12:13
   
Oh I see... I fixed the namespace to App\Library, then used the inject App\Library\Helpers, now it works. – frosty May 23 '16 at 12:16
   
Glad you got it working. If you wouldn't mind accepting the answer I'd appreciate it. :-) – David Barker May 23 '16 at 12:19
   
Your answer actually didn't seem to work though... I think you should change it to what I did... but I'll accept anyway! – frosty May 23 '16 at 12:20
   
Hmm... I'm fairly certain it works according your question. If the namespace was incorrect, it wasn't reflected in your question ;-) – David Barker May 23 '16 at 12:23
 <?php
    $helpers = new App\Library\Helpers\Helpers;
    echo $helpers->truncate($article->body);
  ?>

Or fix the namespace name.

namespace App\Library;
 
   
Thanks, that helped me fix the namespace. – frosty May 23 '16 at 12:20
   
you can add class name laravel aliases on app.php 'Helper' => App\Library\Helpers::class and easy use new \Helper; – theHasanov May 23 '16 at 13:00


来自  https://stackoverflow.com/questions/37390243/use-custom-class-in-laravel-5

Ok, in laravel 4, if I want to add my own custom class, eg : library\myFunction.php then I do the following steps :

  1. add "myFunctions.php" into app/library/myFunctiosn.php

  2. at app/start/global.php , within ClassLoader::addDirectories(array( , I add app_path().'/library',

  3. And to call it within my blade view, I add the following codes

<?php
  $FmyFunctions1 = new myFunctions;
  $is_ok1=($FmyFunctions1->is_ok());   
?>
  1. The contents of app/library/myFunctions.php is :

<?php namespace App\library {

    class myFunctions {
        public function is_ok() {
            return 'myFunction is OK';
        }
    }

}
?>

And it works.

But how to do so in Laravel 5 ???

PS : I read What are the best practices and best places for laravel 4 helpers or basic functions?

And tried to add "app/library/", to the autoload array and run composer dum-autoload , but it keeps give me error :

FatalErrorException in xxxx line xx: Class 'myFunctions' not found

I'm also already trying to use :

composer update
composer dump-autoload 
php artisan dump
php artisan clear-compiled
php artisan dump-autoload
php artisan optimize
php artisan route:clear
php artisan route:scan
php artisan route:list 

But still doesn't work...

 
   
Try running composer dump-autoload instead – Richie Nov 15 '14 at 6:58
   
already and doesn't work either – Sidhi Ciang Nov 15 '14 at 7:15
   
use namespace autoloading in composer.json – itachi Nov 15 '14 at 9:49
   
already and doesn't work... – Sidhi Ciang Nov 15 '14 at 19:58
   
updated my questions – Sidhi Ciang Nov 15 '14 at 21:09

正确答案

After sometimes for trial and error, I find the answer :

There is no need for modify the composer. Just modify the blade into

<?php
  $FmyFunctions1 = new \App\library\myFunctions;
  $is_ok = ($FmyFunctions1->is_ok());
?>
shareimprove this answer
 
   
why does this give reflection error? – Gokigooooks Jan 11 '16 at 13:46

This should help you.

FYI: Basically, you could create another directory within app, and then namespace your files in there as appropriate:

app/CustomStuff/CustomDirectory/SomeClass.php.

Then, within your SomeClass.php, make sure you namespace it:

<?php namespace App\CustomStuff\CustomDirectory;

class Someclass {}

Now, you can access this class using the namespace within your classes:

use App\CustomStuff\CustomDirectory\SomeClass;

shareimprove this answer
 

来自 https://stackoverflow.com/questions/26942390/how-to-add-my-own-custom-class-in-laravel-5



 

[L5]如何在L5中添加自定义PHP类?

THEATHENA714 发表于2年前

大家好!

我正在开发一个带有自定义php课程的Laravel 4.2网站,现在我想迁移到laravel 5继续开发这个“库”。我在laravel 4.2中的方式是按照这个有用的StackOverflow的回答:http ://stackoverflow.com/a/17091089

所以基本上我创建了一个“库”文件夹在我的应用程序文件夹,一个子文件夹命名为我的WIP库(让我们称之为CustomPhpLib)。然后我在“autoload> classmap”数组中的composer.json文件中添加了“”app / library“,只要我想要(在视图中或在控制器中),我可以调用”new CustomPhpLib“,并且它可以工作。

但是我不知道如何在laravel中做到这一点。我应该把“library”文件夹放在哪里?如何自动加载?

我应该指出,我的图书馆没有命名空间。我理解命名空间,PSR和所有这些的基本原理,但我从来没有使用过这样的事情。我计划稍后再做所有这些修改,但是我想像之前的L4.2那样使它与L5一起工作。

我尝试通过创建public / CustomPhpLib并将“public / CustomPhpLib”添加到autoload> classmap数组中,但它不起作用,但是当我尝试使用类时,我会收到500错误。

任何有助于了解这个工作原理将是非常感激的。

最佳答案(由TheAthenA714选定)
别号

app/目录中使用PSR-4自动加载Laravel 5中的所有内容你可以在composer.json文件中看到这个

基本上,您可以在其中创建另一个目录app,然后适当地将文件命名空间:

app/CustomStuff/CustomDirectory/SomeClass.php

然后,在你的内部SomeClass.php,确保你命名空间:

<?php namespace App\CustomStuff\CustomDirectory;

class Someclass {}

现在,您可以使用类中的命名空间访问此类:

use App\CustomStuff\CustomDirectory\SomeClass;

别号
别号
2年前(8,550 XP)

app/目录中使用PSR-4自动加载Laravel 5中的所有内容你可以在composer.json文件中看到这个

基本上,您可以在其中创建另一个目录app,然后适当地将文件命名空间:

app/CustomStuff/CustomDirectory/SomeClass.php

然后,在你的内部SomeClass.php,确保你命名空间:

<?php namespace App\CustomStuff\CustomDirectory;

class Someclass {}

现在,您可以使用类中的命名空间访问此类:

use App\CustomStuff\CustomDirectory\SomeClass;

 
米隆
 米隆
2年前(58,855 XP)

在laravel的根目录下创建一个文件夹。假设文件夹的名称是Library然后将以下行添加到composer.json文件。

"autoload": {
    "psr-4":{
            "ePOS\\": "app/ePOS"
        }
}

然后将您的类命名为psr-4命名标准。

 
TheAthenA714

别名>非常感谢,它比我期待的更简单。一切工作正常!

 
别号
别号
2年前(8,550 XP)

没有后顾之忧,我认为这应该是从头顶开始的。

 
bgarrison25
 bgarrison25
2年前(4,750 XP)

我喜欢选择的答案,但我觉得第二个答案是更好的做法。但是我不明白如果你创建一个名为library的文件夹,那么你可以在PSR-4中使用“ePOS”:“app / ePOS”.....对我来说没有任何意义。然后再次对PSR-4来说很新

 
vineetgarg90

结帐本教程 http://www.techigniter.in/tutorials/how-to-add-custom-class-in-laravel-5/
来自  https://laracasts.com/discuss/channels/general-discussion/l5-how-to-add-custom-php-classes-in-l5



 

[L5]如何添加自己的自定义类?

LEONYU 发表于2年前

好吧,在laravel 4,如果我想添加自己的自定义类,例如:library \ myFunction.php然后我做以下步骤:

add "myFunction.php" into app/myfolder/myFunction.php
at app/start/global.php , within ClassLoader::addDirectories(array( , I add app_path().'/myfolder',
And to call it within my blade view, I add the following codes :

<?php
  $FmyFunction1 = new myFunction;
  $is_ok1=($FmyFunction1->is_ok());
?>

它在Laravel 4中有效。

但是如何在Laravel 5?

最佳答案(由leonyu选定)
bestmomo

你好,

不需要改变作曲家。只要命名空间很好玩:

<?php
  $FmyFunctions1 = new \App\library\myFunctions;
  $is_ok = ($FmyFunctions1->is_ok());
?>
the.jacob
 the.jacob
2年前(18,095 XP)

如果您的文件只是一个带有功能的文件,只需将其添加到composer.json

},
    "autoload": {
        "files": [
            "app/myfolder/myFunction.php"
        ]
    },

然后做一个作曲家转储自动加载

如果是php类,那么你应该使用psr-4自动加载

"autoload": {
        "psr-4": {
            "MyApp\\": "app/"
        },
    },

如果您不熟悉,阅读psr-4自动加载 http://www.php-fig.org/psr/psr-4/

 
bestmomo
 bestmomo
2年前(369,160 XP)

使用L5只需在应用程序中创建一个目录,如App / MyClasses,并使用命名空间(App \ MyClasses ...)来获取所有工作正常,无需其他操作,因为App在PSR-4中。

 
leonyu
leonyu
2年前(7,210 XP)

这是我的步骤:

app / library / myFunctions.php的内容如下:

<?php namespace App\library {
    class myFunctions {
        public function is_ok() {
            return 'myFunction is OK';
        }
    }
}
?>

在resources / views / test.blade.php中,我补充说:

<?php
  $FmyFunctions1 = new myFunctions;
  $is_ok = ($FmyFunctions1->is_ok());
?>

然后在“autoload”中的composer.json中:我补充说:

    "files": [
        "app/library/myFunctions.php"
    ],

并在app \ Http \ Controllers \ HomeController.php在public index()我添加:

return view('test');

但是它总是给我关于'myFunctions'的错误信息如下:

哎呀,看起来像出事了。1/1在xxxx行7中的FatalErrorException:HandleExceptions-> handleShutdown()中的xxxx行7中找不到类'myFunctions'

 
bestmomo
 bestmomo
2年前(369,160 XP)

你好,

不需要改变作曲家。只要命名空间很好玩:

<?php
  $FmyFunctions1 = new \App\library\myFunctions;
  $is_ok = ($FmyFunctions1->is_ok());
?>
 
leonyu
leonyu
2年前(7,210 XP)

它的工作,谢谢:)

 
wiesson
wiesson
2年前(3,560 XP)

它对我来说像@bestmomo说的。我为我的类创建了一个php文件,app/Libraries并添加了命名空间namespace App\Libraries;在刀片模板中,我刚刚加载了App \ Libraries \ Classname的类。

例如 <span class="glyphicon glyphicon-{{ App\Libraries\Utils::energyIcon($point->EnergyMeterTypeID) }}"></span>

 
devninja
devninja
1年前(2,505 XP)

我创建了一个类文件并将其添加到作曲家中:

        "classmap": [
            "app/Libraries",

那么做一个 dump-autoload 是这样的做法正确吗?(我在Laravel 4.2)

 
clarenswd
clarenswd
1年前(5,810 XP)

它在某些方面起作用(在我的应用程序中),我感到困惑。App \下的命名空间方法完美地工作,我可以进入我的课程,但是我有一个问题,在我的课堂里,我使用这个新的SimpleXMLElement(“....”);

然后它崩溃。有任何想法吗?

 
anizou
anizou
2周前(60 XP)

!!!!!!!! 如果自定义类在其上包含大量类,或者使用该类

$ method = new ReflectionMethod($ this-> myClass,$ methodName); 例如



来自  https://laracasts.com/discuss/channels/requests/l5-how-to-add-my-own-custom-class


普通分类: