避免在Laravel控制器中重复代码

时间:2017-01-30 21:22:45

标签: php laravel namespaces laravel-5.3 adwords-apiv201402

在我的Laravel应用程序的每个控制器中,我使用了所有这个命名空间:

use App\User;
use App\Http\Controllers\Controller;
use Google\Auth\OAuth2;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\App;
use Google\AdsApi\AdWords\AdWordsServices;
use Google\AdsApi\AdWords\AdWordsSession;
use Google\AdsApi\AdWords\AdWordsSessionBuilder;
use Google\AdsApi\AdWords\v201609\cm\CampaignService;
use Google\AdsApi\AdWords\v201609\cm\OrderBy;
use Google\AdsApi\AdWords\v201609\cm\Paging;
use Google\AdsApi\AdWords\v201609\cm\Selector;
use Google\AdsApi\AdWords\v201609\cm\SortOrder;
use Google\AdsApi\Common\OAuth2TokenBuilder;

我需要一种方法来避免在我的控制器中重复所有这些代码。我试图将它放在一个基本控制器中,然后从中扩展所有其他控制器,但它没有用。

我会很感激任何建议。

2 个答案:

答案 0 :(得分:7)

如果您使用的是PHP 7,则可以对这些进行分组。

实施例

use Google\AdsApi\AdWords\v201609\cm\CampaignService;
use Google\AdsApi\AdWords\v201609\cm\OrderBy;
use Google\AdsApi\AdWords\v201609\cm\Paging;
use Google\AdsApi\AdWords\v201609\cm\Selector;
use Google\AdsApi\AdWords\v201609\cm\SortOrder;

变为

use Google\AdsApi\AdWords\v201609\cm\{CampaignService, OrderBy, Paging, Selector, SortOrder};

您还可以执行以下某些操作,这些内容适用于旧版本的PHP。

use Google\AdsApi\AdWords;

$adWordsServices = new AdWords\AdWordsServices;
$campaignService = new AdWords\v201609\cm\CampaignService;

这会减少您需要导入的内容,但要求您填写实例化时未导入的名称空间的剩余部分。

http://php.net/manual/en/language.namespaces.importing.php#language.namespaces.importing.group

答案 1 :(得分:1)

看起来你的控制器中有很多逻辑。您可以创建更具体的类来执行某些逻辑。 Ex创建一个处理所有GoogleApi交互的类,然后在控制器中导入该类。

app/GoogleApi/AdWords.php

<?php
namespace App\GoogleApi;

use Google\AdsApi\AdWords\AdWordsServices;
use Google\AdsApi\AdWords\AdWordsSession;
use Google\AdsApi\AdWords\AdWordsSessionBuilder;
use Google\AdsApi\AdWords\v201609\cm\CampaignService;
use Google\AdsApi\AdWords\v201609\cm\OrderBy;
use Google\AdsApi\AdWords\v201609\cm\Paging;
use Google\AdsApi\AdWords\v201609\cm\Selector;
use Google\AdsApi\AdWords\v201609\cm\SortOrder;
use Google\AdsApi\Common\OAuth2TokenBuilder;

class AdWords
{
    public function auth() 
    {
        // auth logic
    }
    // other methods
}

然后在您的控制器中,您将只有 use App\GoogleApi\AdWords

如果您使用的是PHP 7已经有了一个很好的答案,如果没有,您可以这样做:

而不是:

use Google\AdsApi\AdWords\AdWordsServices;
use Google\AdsApi\AdWords\AdWordsSession;
...

只放

use Google\AdsApi\AdWords;

然后在您的代码中使用该命名空间类:

$service = new AdWords\AdWordsServices;

希望有所帮助。