Service d'accès de contrôle et/ou de template Twig
Avertissement: je commence petit à petit à entrer dans Symfony et avoir encore un peu de mal à comprendre comment l'architecture des œuvres.
Actuellement j'ai mis en place différents Faisceaux (de Services, de droit?) que devrait livrer de sortie différents pour les différents itinéraires. Jusqu'à présent, je suis autour de l'ajout d'un simple template Twig qui charge les feuilles de style et scripts via Assetics et Twig-blocs. Maintenant, j'ai ajouté un autre Bundle qui interroge les données via un Buzz à partir d'un emplacement distant, ce qui a bien fonctionné comme un script autonome, mais je n'arrive pas à contourner l'impression de sortie dans un template Twig.
L'architecture du script d'origine est comme suit (le nom fait plus générique):
- Vendeurs -
abstract
classe qui sert de base pour tous à distance de la demande de lots. - ServiceABC -
abstract
classe qui étend la classeVendors
et définit la gestion d'Erreur et de sortie de préparation pour la ABC service. - ClientXYZ -
final
classe qui étend la classeService_ABC
, définit la sortie de l'analyse et la normalisation des données renvoyées.
Cet ensemble a obtenu un services.yml
fichier:
# ~/MyApp/Bundle/ServiceABCBundle/Resources/config/services.yml
parameters:
service_abc_manager.class: MyApp\Bundle\ServiceABCBundle\Models\Service_ABC
location_manager.class: MyApp\Bundle\ServiceABCBundle\Models\Clients\ClientLocation
monitor_manager.class: MyApp\Bundle\ServiceABCBundle\Models\Clients\ClientMonitor
services:
service_abc_manager:
abstract: true
location_manager:
class: %location_manager.class%
parent: service_abc_manager
monitor_manager:
class: %monitor_manager.class%
parent: service_abc_manager
les Noms ont été changés pour en faciliter la référence - les Fautes de frappe par accident possible.
Maintenant mon problème/question est, que je n'ai pas vraiment passer derrière la Symfony2 concept de la façon de trouver la sortie dans le modèle.
namespace MyApp\Bundle\ServiceABCBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use MyApp\Bundle\ServiceABCBundle\Models\Clients\ClientLocation;
class DefaultController extends Controller
{
public function indexAction()
{
$services = array();
$services[] = $this->container->has('service_abc_manager');
$services[] = $this->container->has('location_manager');
$services[] = $this->container->has('client_location');
$services[] = $this->container->has('ClientLocation');
var_dump( $services );
$client = new ClientLocation();
var_dump( $client );
$response = $this->render(
'Service_ABC:Default:index.html.twig'
);
# $response->setCharset( 'utf-8' );
# $response->headers->set( 'Content-Type', 'text/html' );
return $response;
}
}
La sortie de la première array()
nommé $services
est toujours false
et la $client = new ClientLocation();
déclenche une Exception que le nom de la classe n'a pas été trouvé.
Comment puis-je avoir accès à ces Services/Bundle(pièces)/Classes? Et comment puis-je rendre à la sortie d'un modèle?
Mise à jour
Après j'ai ajouté à l'arborescence complète de la définition de Configuration()->getConfigTreeBuilder()
, je suis en mesure de voir les définitions à la CLI:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'myapp_service_abc' );
$rootNode
->children()
->scalarNode('service_abc_manager')->end()
->scalarNode('location_manager')->end()
->scalarNode('monitor_manager')->end()
->end()
;
return $treeBuilder;
}
}
La commande CLI php app/console config:dump-reference myapp_service_abc
me donne le résultat suivant:
myapp_service_abc:
service_abc_manager: ~
location_manager: ~
monitor_manager: ~
Je peux ainsi voir que la config de données a été chargé, quand je var_dump( $loader );
à l'intérieur de MyAppServiceABCExtension
juste après $loader->load( 'services.yml' );
a été appelé.
Le résultat est le suivant:
object(Symfony\Component\DependencyInjection\Loader\YamlFileLoader)
protected 'container' =>
object(Symfony\Component\DependencyInjection\ContainerBuilder)
private 'definitions' =>
array
'service_abc_manager' =>
object(Symfony\Component\DependencyInjection\Definition)
'location_manager' =>
object(Symfony\Component\DependencyInjection\DefinitionDecorator)
private 'parent' => string 'service_abc_manager'
//etc.
La problème reste elle-même: Il y a encore un FALSE
valeur de retour à l'intérieur de DefaultController()->indexAction()
quand je var_dump( $this->container->has( 'service_abc_manager' );
. J'ai ainsi essayé var_dump( $this->container->has( 'location_manager' );
et var_dump( $this->container->has( 'myapp.service_abc_manager' );
avec le même résultat.
OriginalL'auteur kaiser | 2013-04-29
Vous devez vous connecter pour publier un commentaire.
Vous ne devez pas appeler vos services de la brindille de fichier, mais à partir du contrôleur.
Le rôle du contrôleur est de :
Ne pas faire appel à vos services en utilisant quelque chose comme
$client = new ClientLocation();
, mais d'appeler à l'aide le conteneur de services. Cela vous permettra de prendre toute la puissance de l'injection de dépendance offerts par Symfony2.Votre contrôleur va ressembler :
À partir de votre fichier twig, vous serez en mesure d'utiliser le
stuffs
variable :{{ stuffs }}
si votre variable est un terminal ( une chaîne de caractères, un nombre... ){{ stuffs.attribute }}
si votre variable est un objet ou un tableauÀ propos de votre fichier de services, je suis un peu confus, parce que votre architecture n'a pas l'air d'être le standard de Symfony2 :
Pourquoi votre
services.yml
fichier n'est pas dans lasrc/MyApp/SomethingBundle/Resources/config/
répertoire?Si vous ne l'avez pas déjà lu, je vous suggère de jeter un oeil à la Symfony2 : La Grande Image de la documentation, qui est la meilleure façon de commencer avec Symfony2.
$this->container->get('location_manager');
travail sihas()
retourne déjàfalse
? En fait j'ai essayé comme ceci et Symfony continue à me dire que la classe n'existe pas alors que je peux cliquer sur dans mon IDE... Peut-être le problème, c'est que les paquets sont additionnés dans un espace de noms unique? Devront inspecter ce un et de revenir à la présentation de rapports. Et oui, j'ai lu la documentation très attentivement, surtout dans le "la grande image".Je suppose que les services.fichier yml n'est pas chargé. Essayez d'ajouter une faute de frappe en elle pour être sûr qu'il est chargé, de mettre votre "Paquet" dans src/ filder... difficile de voir quel est le problème, on dirait vraiment que vous n'avez pas utilisé les outils de ligne de commande pour générer vos faisceaux.
Les paquets ont été ajoutés via la CLI avec
generate:bundle
. Lorsque j'ajoute des fautes de frappe, j'obtiens une Exception levée. Quand j'ajouteapp/console config:dump-reference MyApp\ServiceABC
dans la CLI, je reçoismyapp_service_abc []
en retour. Donc je suppose que je suis quelque chose de mal dans laDependencyInjection\Configuration.php
fichier avec l'TreeBuilder::root()
et la (non existant) arbre définition (dois-je définir explicitement?) ou quelque chose avec un certain manque nœud racine dansservices.yml
.J'ai écrit une mise à jour pour vous montrer mes progrès. Ne peut toujours pas accéder au service dans l'
indexAction()
.Btw: Mon
service.yml
fichier est à l'intérieur du standard de Symfony2 dossier:~/MyApp/Bundle/ServiceABCBundle/Resources/config/services.yml
.OriginalL'auteur Alain Tiemblo