区分Web路由与API路由的呼叫?

时间:2017-04-13 04:46:30

标签: laravel laravel-5 laravel-5.3

在我的web.php文件中,我的路线如下:

Route::get('/', 'HomeController@getFeed');

在我的api.php文件中,我的路径如下:

Route::get('feeds', 'HomeController@getFeed');

请注意,它们都调用相同的方法getFeed()

有没有办法区分呼叫来自网络路由与控制器方法中的API路由?我需要能够返回两个不同的响应,一个用于Web路由,另一个用于API路由。

以下是HomeController.php类:

class HomeController extends Controller
{
    public function getFeed() {
        $user = Auth::user();

        // How to check if call is from web route or API route?
        // Need to return two different responses for each scenario.
    }
}

感谢。

6 个答案:

答案 0 :(得分:2)

来自api.php的所有路由都自动以' api /'为前缀。 所以你可以使用他下面的代码来检查

    if (Request::is('api*')) {
        echo "request from api route";
        exit();
    }else{
        echo "request from web";
        exit();
    }

答案 1 :(得分:1)

更换此行
    Route :: get(' feeds',' HomeController @ getFeed'); 同     Route :: get(' api / feeds',' HomeController @ getFeed');

表示在所有api路由中添加api前缀。

它将帮助您确定哪条路线来自api,哪条路线不来。

检查您是否可以使用以下代码

if (Request::is('api*')) {
    echo "request from api route";
    exit();
}else{
    echo "request from web";
    exit();
}

答案 2 :(得分:1)

我使用\Request::is('api/*')

if(\Request::is('api/*'))
   return 'API';
else
   return 'Non-API';

或者,您也可以使用路线名称进行检查;

if(\Request::route()->getName() == 'APIFeed')
   return 'API';
else
   return 'Non-API';

确保设置路线名称;

web.php

Route::get('feeds', 'HomeController@getFeed')->name('WebFeed');

api.php

Route::get('feeds', 'HomeController@getFeed')->name('APIFeed');

答案 3 :(得分:0)

您可以使用

$currentRoute = Illuminate\Routing\Router::getCurrentRoute(); // Returns a Route
$currentRoute->uri(); // returns the uri of the cureent route 

https://laravel.com/api/5.4/Illuminate/Routing/Router.html#method_getCurrentRoute

https://laravel.com/api/5.4/Illuminate/Routing/Route.html

希望这会有所帮助。 :)

答案 4 :(得分:0)

在你的鞋子里,我会创建3个控制器来处理请求,就像Niraj提出的那样,通过api路由前缀单独的路由/ api /

class HomeController extends Controller
{
  public function getFeed(entrypoint) {
    $user = Auth::user();
    // do the common magic here ...
  }
}


class WebHomeController extends HomeController 
{
    public function getFeed() {
        feed = this.getFeed();
        // do the crazy web magic here ...
    }
}

class APIHomeController extends HomeController 
{
    public function getFeed() {
        feed = this.getFeed();
        // do the crazy api magic here ...
    }
}

Route::get('feeds', 'WebHomeController@getFeed'); 
Route::get('api/feeds', 'APIHomeController@getFeed');

答案 5 :(得分:0)

这是从子控制器访问父方法的方式

class WebHomeController extends HomeController 
{
    //get parent methods and protected variables
    public function __construct()
    {
        parent::__construct();
    }
    
    public function getFeed() {
        //access parent method
        $p = $this->getFeed();
        
        feed = this.getFeed();
        // do the crazy web magic here ...
    }
}