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