2013-08-25 19 views
8

Próbuję tego od wielu godzin - i nie mogę znaleźć żadnych postów, które działają. Dodaję niestandardowe klasy php do katalogu producenta Symfony2.Dodawanie niestandardowej biblioteki dostawcy do autoloadowania Symfony2

Przykładowo (kopiowane inne struktury sprzedawca):

dostawcy/myLib/myLib/src/myLib/lib/Class.php

Następnie zaktualizowane composer.json głównego dodając:

"require": { 
    "mylib/mylib": "@dev" 
}, 

stworzyłem również composer.json w vendor/myLib/myLib która zawierała:

{ 
    "name": "mylib/mylib", 
    "type": "library", 
    "description": "My Libraty", 
    "keywords": ["library"], 
    "autoload": { 
     "psr-0": { "Mylib\\": "src/" } 
    }, 
    "minimum-stability": "dev" 
} 

Dodałem nazw w Class.php:

namespace MyLib\Lib; 

W jednym z moich paczek dodałem poniżej:

use MyLib\Lib\ClassName as ClassName; 
class Cms extends ClassName 
{} 

Błąd otrzymuję to:

FatalErrorException: Error: Class 'MyLib\Lib\MyClass' not found in C:\xampp\htdocs\My_CMS\src\Cms\CmsBundle\Entity\Cms.php line 13

Co robię źle?

+0

Czy po dodaniu swojej biblioteki do composer.json uruchomiłeś 'composer dump-autoload'? –

+0

Po prostu wypróbowałem to i nadal daje mi ten sam błąd :( –

Odpowiedz

4

W klasach PHP są ładowane automatycznie przez __autoload

Symfony dba o niego w jego Class Loader ale w rzeczywistości to działa w ten sam sposób. Nie ma tła skanującego wszystkie katalogi, więc musisz ręcznie dodać swoją przestrzeń nazw.

Trzeba dodać w pliku autoload.php:

$loader->add('NAMESPACE','/path/to/vendor'); 
+0

Nadal dostaję błąd po dodaniu poniższego do app/autoload.php - '$ loader-> add ('MyLib', '/ ../vendor/mylib/mylib/src/MyLib/Lib '); ' –

+1

OK - działa teraz: * $ loader-> add (' MyLib \ Lib ', realpath (__ DIR __.'/../vendor/mylib/mylib/src ')); * .. Czy literówka na ścieżce ... Wielkie dzięki :) –

+0

Możesz dodać trzecią flagę logiczną "true", jeśli chcesz dołączyć swoją przestrzeń nazw do istniejącej listy stworzonej przez kompozytora. –

9

Naprawdę należy używać pojemników z usługi, która jest w zasadzie symfony sposób załadować klas.

Oto dlaczego:

  1. Mianowicie, usługa jest nigdy zbudowane, dopóki nie jest potrzebne.
  2. Najlepsza praktyka ponownego użycia kodu.
  3. Oddzielenie każdego elementu funkcjonalności w aplikacji.
  4. Ponieważ każda usługa wykonuje tylko jedno zadanie, można łatwo uzyskać dostęp do każdej usługi i korzystać z jej funkcji w dowolnym miejscu.
  5. Każda usługa może być łatwiej testowana i konfigurowana od i oddzielona od innych funkcji aplikacji.
  6. Pomysł ten nazywany jest architekturą zorientowaną na usługi i nie jest unikalny dla Symfony ani nawet PHP.

http://symfony.com/doc/current/book/service_container.html

A Service Container (or dependency injection container) is simply a PHP object that manages the instantiation of services (i.e. objects). 

Więc w zasadzie będzie symfony obsługiwać instancji klas dla Ciebie w kontrolerze. Wszystko, co musisz zrobić, to:

Dodaj folder pod swoją ścieżkę zwanych Bibliotek -> src/AppBundle/Biblioteki

Dodaj klasę do tego folderu z nazw u góry. Mój przykład jest:

<?php 

namespace AppBundle\Libraries; 

class MyRecommendations{ 


    public function __construct(){ 

    } 

    public function init(){ 
     die("init"); 
    } 


} 

Następnie dodać plik o nazwie services.yml do swojej aplikacji. app/config/services.yml

Umieść następujący kod w to nie używać tabulacji w pliku yml

services: 
    myrecommendations: 
     class:  AppBundle\Libraries\MyRecommendations 
     #arguments: [specialparamhere] #constructor parameters here 

Następnie dodać trzecie zasobów linia: services.yml do config.yml plik.

imports: 
    - { resource: parameters.yml } 
    - { resource: security.yml } 
    - { resource: services.yml } 

Na górze kontrolera przy użyciu tylko dodać rachunku użytku

use AppBundle\Libraries\MyRecommendations; 

Teraz nazywają kod

$test = $this->get('myrecommendations'); 
      $test->init(); 

ECHO się

init 
+0

Głosuję za tą odpowiedzią, ponieważ jest to najszybsze i najbardziej zrozumiałe wyjaśnienie na temat łatwego konfigurowania usługi, którą czytałem do dziś. Dzięki, bardzo pomogło. – Lapidouce

0

Jeśli ktoś ma inny projekt wykorzystujący autolo Ader załadować swoje zajęcia, na przykład SimpleSAML i chcesz go używać w klasie w innej przestrzeni nazw:

namespace Study\UserBundle\Service; 

require_once "/full_path/simplesaml/lib/_autoload.php"; 


use SimpleSAML_Configuration; 
use SimpleSAML_Auth_Simple; 
use SimpleSAML_Auth_State; 

class SimpleSAMLLogin { 
0

Ostatnia odpowiedź jest poprawna: https://stackoverflow.com/a/27768442/2400373

pracuję dla mnie jednak jest ważna dodać, że ta jest poprawny, ale jeśli przed instalacją biblioteki automatycznie uruchomi się. W moim przypadku w Symfony 3.2.x dodałem moją bibliotekę pl composer.json:

"autoload": { 
    "psr-4": { "": "src/" }, 
    "classmap": [ "app/AppKernel.php", "app/AppCache.php","**src/AppBundle/juanitourquiza/pagopayphone/library"** ] 

A po tej instrukcji:

composer update 

Wtedy wszystko jest dobrze.

Pozdrawiam

+0

"Ostatnia odpowiedź" może ulec zmianie lub zostać usunięta. Powinieneś dołączyć link do udostępniania. (Nie jestem do końca pewien, co mówisz) – Tezra

+0

Dzięki, dodałem teraz link – juanitourquiza

Powiązane problemy