I understand that I need to create a route and assign a controller to that route, this controller should do all the logic in processign the data retrieved from the external website, however I feel that retrieving the data should be on another controller (maybe a Helper Controller?).
I feel your thinking is too constrained by the MVC pattern. This is a common problem when you are learning about MVC (it's a problem I had). Most tutorials will give you the impression that everything is either a model, view, or controller. Often they also suggest that each "thing" is made from one model, one view, and one controller. That is highly misleading.
Here's how I think of it:
First you need a route. Your routes file(s) is like a "map" of your application. It shows you all the possible places visitors can go. Having this high-level overview is useful.
Each route sends you to a controller action. Think of controllers like "directing traffic". Often a single controller will handle traffic coming in from several routes.
Controllers should not be too concerned about the details of how something is done. It's good to keep your controllers short. You can achieve this by using other classes in your controllers.
Sometimes these classes are models, but often they would be something else. Often we call them "service classes". For example, you are retrieving data from an external website using Guzzle. You could create a ContentRetriever class that handles this task:
namespace App\Services
use GuzzleHttp\Client;
class ContentRetriever {
public function __construct()
{
$this->client = new Client;
}
public function get($url)
{
// In reality this might be many lines of code
return $this->$client->request('GET', $url);
}
// More methods here...
}
...then you can just use this in your controller:
use App\Services\ContentRetriever;
class SomeController extends Controller {
public function __construct(ContentRetriever $retriever)
{
$this->retriever = $retriever;
}
public function showContent($url)
{
$content = $this->retriever->get($url);
return view('showContent', compact('content'));
}
}
Notice that we've kept implementation details out of the controller. The controller uses the ContentRetriever service without needing to know how it works.