2015-12-10 1 views
3

Je possède ce code dans une fonction (php class):file_get_contents avec Lumen

$theFile = '/test/test.xml'; // these are in the public folder 
dd(file_get_contents($theFile)); 

Si je vais à mydomain.local/test/test.xml, je reçois le code xml de travail.

Mais avec file_get_contents, je reçois cette erreur:

file_get_contents(/test/test.xml): failed to open stream: No such file or directory 

Comment résoudre ce problème?

+0

'file_get_contents()' exécuté relativement à votre script php (et vous ne m violon uch où le vrai code est exécuté correctement, comment fonctionne laravel) si vous aviez ce chemin. utilisez 'base_path(). '/ test/test.xml'. –

+0

@Tezla cela ne fonctionne pas – Zl3n

+0

dang, pourquoi ne lisez-vous pas les [docs] (http://laravel.com/docs/5.1/helpers#method-public-path), il est dans le chemin public que vous pourriez 'public_path ('test/test.xml')'. juste pour être sûr, pour «dd» ce code et regarder le chemin - si c'est correct, c'est votre réponse. sinon, bonne chance :) - et évidemment, mon commentaire précédent ne marchera pas, je suppose que le répertoire de test était sur la racine avec 'app',' config', ..., 'vendor'. –

Répondre

1

Lumen n'a pas le public_path() que vous connaissez peut-être dans Laravel pour accéder facilement à un fichier public. La méthode la plus simple pour la réimplémenter serait d'ajouter un paquet appelé irazasyed/larasupport à votre projet qui ajoute divers helpers manquants (y compris public_path()) ainsi que d'ajouter la commande de publication de fournisseur qui manque à Lumen.

Alternativement, si vous ne souhaitez pas ajouter un paquet tiers suffit de créer un fichier dans votre répertoire d'applications appelé helpers.php puis au sein de votre fichier composer.json ajouter ce qui suit dans la partie « autoload » et exécuter composer dump-autoload pour actualiser le cache du chargeur automatique:

"files": [ 
    "app/helpers.php" 
], 

Ensuite, au sein helpers.php ajouter le contenu suivant:

<?php 
if (!function_exists('public_path')) { 
    /** 
    * Get the path to the public folder. 
    * 
    * @param string $path 
    * @return string 
    */ 
    function public_path($path = '') 
    { 
     return env('PUBLIC_PATH', base_path('public')) . ($path ? '/' . $path : $path); 
    } 
} 
+1

Excellente réponse! J'ai opté pour la solution [irazasyed] (https://packagist.org/packages/irazasyed/larasupport) qui est plus sûre à mon avis – Zl3n

+0

@ Zl3n comment savez-vous que c'est plus sûr? Il pourrait utiliser la même chose. Je suppose que cela fait à peu près la même chose [ici] (https://github.com/irazasyed/larasupport/blob/master/src/helpers.php) –

+0

Je ne me souviens pas pourquoi mais maintenant je ne travaille que sur Laravel – Zl3n

2

Vous transmettez un chemin absolu à la fonction relative au répertoire de base du serveur. Ce n'est pas nécessaire le même répertoire de base pour l'URL. Essayez de passer un chemin relatif au script en cours d'exécution.