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

Posted

技术标签:

【中文标题】避免在 Laravel 控制器中重复代码【英文标题】:Avoid repeated code in Laravel controller 【发布时间】:2017-06-16 04:25:26 【问题描述】:

在我的 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;

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

如果有任何建议,我将不胜感激。

【问题讨论】:

【参考方案1】:

看起来您的控制器中有很多逻辑。您可以创建执行某些逻辑的更具体的类。例如,创建一个处理所有 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;

希望对您有所帮助。

【讨论】:

是的,我创建了一个 adwords 网站,该网站为我提供了其中所有广告系列的图表,以便在同一页面中观看所有广告系列。所以每个控制器都是不同的 goolge adwords 调用。但我喜欢你的想法,我想试试。谢谢【参考方案2】:

如果您使用的是 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

【讨论】:

只是出于好奇,如果不是 PHP 7 怎么办? 我的答案的第二部分应该在你导入命名空间而不是类的地方起作用。 我使用 PHP5.6,但在两种方式中,如果不是在控制器主体中,我必须在所有控制器中重复代码。谢谢@user3158900

以上是关于避免在 Laravel 控制器中重复代码的主要内容,如果未能解决你的问题,请参考以下文章

delete()在laravel 8控制器上不起作用[重复]

Laravel:如何避免时间重叠?

Laravel 8将数据从控制器发送到刀片[重复]

Laravel 使用 QueryBuilder 时如何避免页面重新加载

在 laravel 控制器中使用特征

在laravel foreach循环中传递多个变量[重复]