何处将非控制器或模型方法放在Laravel App中

时间:2016-12-12 21:40:24

标签: php laravel laravel-5.3

我有一个PHP Laravel应用程序,它具有EmailTokenUrlLogin的Elequent模型,以及一个通过访问URL中带有标记值的URL来登录用户的控制器。

我希望有一个函数可以创建一个新的Model / DB记录来为用户生成令牌,并且能够从我的应用程序中的任何其他Controller或Model调用此函数。

现在我在登录控制器中有它但是我对此不满意,因为它需要一个POST请求来发布所有必需的函数参数,或者需要一个带有长复杂参数URL的GET请求。

所以我希望generateShortLifeEmailTokenUrl($user_id, $email, $expireType, $expireNumber = '')以下的功能能够在app中的某个地方生活,我可以从任何地方调用它。

如下所示的函数最好位于何处以及如何使其可以从其他模型和控制器调用?

public function generateShortLifeEmailTokenUrl($user_id, $email, $expireType, $expireNumber = '')
{
    if(Auth::user()->isAdmin){

        // generate a new token
        // ... other logic here......

        // create model and DB record and return the created token value
        $emailTokenUrlLoginData = new EmailTokenUrlLogin;
        $emailTokenUrlLoginData->user_id = $user_id;
        $emailTokenUrlLoginData->email = $email;
        $emailTokenUrlLoginData->token = $createToken();
        $emailTokenUrlLoginData->expireType = $expireType;
        $emailTokenUrlLoginData->expireNumber = $expireNumber;
        $emailTokenUrlLoginData->save();

        // return generated token
        return $emailTokenUrlLoginData->token;            
    }

}

3 个答案:

答案 0 :(得分:1)

如果您正在使用此功能,可以create global helper

if (! function_exists('generateShortLifeEmailTokenUrl')) {
    function generateShortLifeEmailTokenUrl($user_id, $email, $expireType, $expireNumber = '')
    {
        ....
    }
}

将其放入helpers.php并将其添加到composer.json以加载帮助程序:

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

答案 1 :(得分:1)

这实际上取决于您希望代码的复杂程度。

如果你真的需要在一个控制器动作中使用它,你可以将代码放在那里。或者,您可以在该控制器上创建一个执行该作业的私有方法。高级程序员会认为这是一种不好的做法,但对于小型应用程序来说这已经足够了。

Alexeys对全球功能的建议也有效,但被认为是更糟糕的做法,因为它是全球性的。如果你将所有函数都设置为全局函数,那么你的全局作用域和命名空间将充满不相关的东西,这些东西最终会相互妨碍。同样,对于小型应用程序,您可能会很好。

现在,如果您对更好的做法感到好奇:关键字是服务依赖注入。这不是我要在这里解释的,但网上有很多资源可以帮助你理解这些概念是如何运作的,以及它们带来的好处。

Laravel已经建立了对依赖注入的支持,你可以在documentation中阅读所有相关信息。

答案 2 :(得分:1)

将其放入特征中,并将特征绑定到需要它的任何其他类。您不需要以这种方式公开它,并且可以在任何需要的地方访问它。 Trait方法被编译到类中,就像有本机类方法一样,但可以根据需要在类中进行否决。

请参阅:http://php.net/manual/en/language.oop5.traits.php

Trait EmailTokenTrait {
    protected function generateShortLifeEmailTokenUrl($user_id, $email, $expireType, $expireNumber = '')
{
    ...
}

将特质绑定到任何类别:

<?php
namespace \some\namespace;

class SomeClass {

    use \EmailTokenTrait;

    protected function someFunction() {
        $token = $this->generateShortLifeEmailTokenUrl($user_id, $email, $expireType);
    }
}

然后自动加载特征。

"autoload": {
    ....
    "files": [
        "app/traits/EmailTokenTrait.php"
    ]
},