避免在 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控制器上不起作用[重复]