2016-05-26 5 views
1

Есть ли способ в Laravel 5, чтобы вызвать маршруты внутри/программно из приложения? Я нашел много уроков для Laravel 4, но я не могу найти информацию для версии 5.Laravel 5: Внутренние вызовы маршрутов

+0

Вы спрашиваете, как вы можете использовать свои собственные маршруты в своем приложении? И.Е. внутри контроллера получить результат маршрута? Являются ли эти конечные точки JSON? – Ohgodwhy

+0

Вам не обязательно. Вы можете создать экземпляр своего контроллера и вызвать метод – geckob

+0

@ Geckob отправил правильный ответ. Из любопытства, зачем вам это нужно? – jfadich

ответ

3

Фактически вы можете вызвать контроллер, который связывается с этим маршрутом, вместо того, чтобы «вызывать» маршрут внутри.

Например:

routes.php

Route::get('/getUser', '[email protected]'); 

UserController.php

class UserController extends Controller { 

    public function getUser($id){ 

     return \App\User::find($id); 

    }; 
} 

Вместо вызова /getUser маршрут, вы можете позвонить [email protected] вместо этого.

$ctrl = new \App\Http\Controllers\UserController(); 
$ctrl->getUser(1); 

Это то же самое, как calling маршрут внутри страны, если это то, что вы имеете в виду. Надежда, что помогает

+1

Как это работает для маршрутов, которые ищут входные данные? т. е. маршрут POST. – vcardillo

+0

Любые мысли, @geckob? – vcardillo

+0

@vcardillo То же самое. Но передайте некоторые параметры функции, чтобы имитировать post bosy – geckob

3

Вы можете попробовать что-то вроде этого:

// GET Request 
$request = Request::create('/some/url/1', 'GET'); 
$response = Route::dispatch($request); 

// POST Request 
$request = Request::create('/some/url/1', 'POST', Request::all()); 
$response = Route::dispatch($request); 
-1

Ни один из этих ответов не работает для меня: они либо не принимает параметры запроса, или не может использовать экземпляр существующего приложения() (необходимый для config & .env vars).

Я хочу называть маршруты внутренне, потому что я пишу консольные команды для интерфейса с API моего приложения.

Вот что я сделал, что хорошо работает для меня:

<?php // We're using Laravel 5.3 here. 

namespace App\Console; 

use App\MyModel; 
use App\MyOtherModel; 
use App\Http\Controllers\MyController; 
use Illuminate\Console\Command; 

class MyCommand extends Command 
{ 
    protected $signature = 'mycommand 
          {variable1} : First variable 
          {variable2} : Another variable'; 

    public function handle() 
    { 
     // Set any required headers. I'm spoofing an AJAX request: 
     request()->headers->set('X-Requested-With', 'XMLHttpRequest'); 

     // Set your query data for the route: 
     request()->merge([ 
      'variable1' => $this->argument('variable1'), 
      'variable2' => $this->argument('variable2'), 
     ]); 

     // Instantiate your controller and its dependencies: 
     $response = (new MyController)->put(new MyModel, new MyOtherModel); 

     // Do whatever you want with the response: 
     var_dump($response->getStatusCode()); // 200, 404, etc. 
     var_dump($response->getContent()); // Entire response body 

     // See what other fun stuff you can do!: 
     var_dump(get_class_methods($response)); 
    } 
} 

Ваш контроллер/Маршрут будет работать точно так, как если бы вы назвали его помощью curl. Повеселись!

0

Использование Laravel 5.5, этот метод работает для меня:

$req = Request::create('/my/url', 'POST', $params); 
$res = app()->handle($req); 
$responseBody = $res->getContent(); 
// or if you want the response to be json format 
// $responseBody = json_decode($res->getContent(), true); 

Источник: https://laracasts.com/discuss/channels/laravel/route-dispatch

* Примечание: может быть, вы будете иметь проблемы, если маршрут вы пытаетесь получить доступ к имеет и вы не предоставляете правильные учетные данные. , чтобы избежать этого, обязательно установите правильные заголовки, чтобы запрос обрабатывался нормально (например, Authorisation bearer ...).

Смежные вопросы