J'ai deux contrôleurs SubmitPerformanceController
et PrintReportController
.
Dans PrintReportController
j'ai une méthode appelée getPrintReport
.
Comment accéder à cette méthode dans SubmitPerformanceController
?
Vous pouvez accéder à votre méthode de contrôleur comme ceci:
app('App\Http\Controllers\PrintReportController')->getPrintReport();
Cela fonctionnera, mais c'est mauvais en termes d'organisation du code (n'oubliez pas d'utiliser le bon espace de noms pour votre PrintReportController
)
Vous pouvez étendre le PrintReportController
donc SubmitPerformanceController
héritera de cette méthode
class SubmitPerformanceController extends PrintReportController {
// ....
}
Mais cela héritera également de toutes les autres méthodes de PrintReportController
.
La meilleure approche sera de créer un trait
(par exemple dans app/Traits
), d'y implémenter la logique et de dire à vos contrôleurs de l'utiliser:
trait PrintReport {
public function getPrintReport() {
// .....
}
}
Dites à vos contrôleurs d'utiliser cette caractéristique:
class PrintReportController extends Controller {
use PrintReport;
}
class SubmitPerformanceController extends Controller {
use PrintReport;
}
Les deux solutions font SubmitPerformanceController
pour avoir une getPrintReport
méthode afin que vous puissiez l'appeler $this->getPrintReport();
depuis le contrôleur ou directement comme route (si vous l'avez mappée dans le routes.php
)
Vous pouvez en savoir plus sur les traits ici .
app('App\Http\Controllers\PrintReportController')->getPrintReport();
peut être transformé enapp(PrintReportController::class')->getPrintReport()
. Solution propre pour moi.Si vous avez besoin de cette méthode dans un autre contrôleur, cela signifie que vous devez la résumer et la rendre réutilisable. Déplacez cette implémentation dans une classe de service (ReportingService ou quelque chose de similaire) et injectez-la dans vos contrôleurs.
Exemple:
Faites de même pour les autres contrôleurs pour lesquels vous avez besoin de cette implémentation. Atteindre les méthodes de contrôleur d'autres contrôleurs est une odeur de code.
la source
Services
dossier si le projet n'est pas volumineux, soit un dossier de fonctionnalités appeléReporting
s'il s'agit d'un projet plus grand et utilise uneFolders By Feature
structure.Méthode compatible Laravel 5
Remarque: cela ne mettra pas à jour l'URL de la page.
Il est préférable d'appeler la Route à la place et de la laisser appeler le contrôleur.
la source
Tu ne devrais pas. C'est un anti-pattern. Si vous avez une méthode dans un contrôleur à laquelle vous devez accéder dans un autre contrôleur, c'est un signe que vous devez re-factoriser.
Envisagez de refactoriser la méthode dans une classe de service, que vous pouvez ensuite instancier dans plusieurs contrôleurs. Donc, si vous devez proposer des rapports d'impression pour plusieurs modèles, vous pouvez faire quelque chose comme ceci:
la source
la source
Tout d'abord, demander une méthode d'un contrôleur à un autre contrôleur est EVIL. Cela causera de nombreux problèmes cachés dans le cycle de vie de Laravel.
Quoi qu'il en soit, il existe de nombreuses solutions pour y parvenir. Vous pouvez sélectionner l'une de ces différentes manières.
Cas 1) Si vous souhaitez appeler en fonction des classes
Voie 1) La manière simple
Mais vous ne pouvez pas ajouter de paramètres ou d'authentification de cette manière.
Méthode 2) Divisez la logique du contrôleur en services.
Vous pouvez ajouter des paramètres et quelque chose avec ça. La meilleure solution pour votre vie de programmation. Vous pouvez faire à la
Repository
placeService
.Cas 2) Si vous souhaitez appeler en fonction des itinéraires
Méthode 1) Utilisez le
MakesHttpRequests
trait utilisé dans les tests unitaires d'application.Je recommande cela si vous avez une raison particulière de créer ce proxy, vous pouvez utiliser tous les paramètres et en-têtes personnalisés . Ce sera également une demande interne dans laravel. (Fake HTTP Request) Vous pouvez voir plus de détails sur la
call
méthode ici .Cependant, ce n'est pas non plus une «bonne» solution.
Méthode 2) Utilisez le client guzzlehttp
C'est la solution la plus terrible que je pense. Vous pouvez également utiliser tous les paramètres et en-têtes personnalisés . Mais ce serait faire une demande externe http supplémentaire. Le serveur Web HTTP doit donc être en cours d'exécution.
Enfin, j'utilise la voie 1 du cas 2. J'ai besoin de paramètres et
la source
la source
Vous pouvez utiliser une méthode statique dans PrintReportController, puis l'appeler à partir de SubmitPerformanceController comme ceci;
la source
Cette approche fonctionne également avec la même hiérarchie de fichiers Controller:
la source
Ici, le trait émule entièrement le contrôleur en cours d'exécution par le routeur laravel (y compris le support des middlewares et l'injection de dépendances). Testé uniquement avec la version 5.4
Ensuite, ajoutez-le simplement à votre classe et exécutez le contrôleur. Notez que l'injection de dépendances sera affectée à votre route actuelle.
la source
app()->make(......)
est égal àapp(......)
donc c'est plus court.Vous pouvez accéder au contrôleur en l'instanciant et en appelant doAction: (mis
use Illuminate\Support\Facades\App;
avant la déclaration de classe du contrôleur)Notez également qu'en faisant cela, vous n'exécuterez aucun des middlewares déclarés sur ce contrôleur.
la source
Réponse tardive, mais je le cherche depuis un certain temps. C'est désormais possible de manière très simple.
Sans paramètres
Avec des paramètres
Docs: https://laravel.com/docs/5.6/responses#redirecting-controller-actions
Dans la version 5.0, il fallait tout le chemin, maintenant c'est beaucoup plus simple.
la source