2017-01-30 12 views
3

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

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

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

ответ

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

+0

просто из любопытства, что, если это не PHP 7? – davejal

+0

Вторая часть моего ответа должна работать тогда, когда вы импортируете пространство имен, а не класс. – user3158900

+0

Я использую PHP5.6, но в двух направлениях я должен повторить код во всех моих контроллерах, если не в начале, в теле контроллера. Спасибо @ user3158900 –

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; 

Надеюсь, что помогает.

+0

Yeh Я делаю сайт adwords, который дает мне диаграммы всех моих кампаний в нем, чтобы посмотреть все их на одной странице. поэтому каждый контроллер имеет разный вызов adwords. но мне нравится ваша идея, и я хочу попробовать. Спасибо –

+0

Проверьте мой обновленный ответ, возможно, поможет. – Mirceac21

+0

такой же первый ответ. благодаря –