Избегайте повторного кода в контроллере Laravel

В каждом контроллере в моем приложении 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;

Мне нужен способ избежать повторения всего этого кода в моем контроллере. Я попытался поместить его в базовый контроллер, а затем расширить все остальные контроллеры, но это не сработало.

Буду благодарен за любые предложения.

3

Решение

Если вы используете 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

7

Другие решения

Похоже, у вас много логики в ваших контроллерах. Вы можете создать более конкретные классы, которые выполняют определенную логику. Например, создайте класс, который обрабатывает все взаимодействия 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;

Надеюсь, это поможет.

1

По вопросам рекламы [email protected]