Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny][Laravel] namespace i użycie
Forum PHP.pl > Forum > PHP > Frameworki
Randallmaster
Cześć,

Może jest to moja nie wiedza odnośnie OOP, ale zależy mi też aby zrobić to poprawnie w Laraverze.

mam taki układ controllerów:

/controllers
---PagesController
---/Pages
-------DefaultController

plik DefaultController:

  1. <?php
  2.  
  3. namespace App\Http\Controllers\Pages;
  4.  
  5. use Illuminate\Http\Request;
  6.  
  7. use App\Http\Requests;
  8. use App\Http\Controllers\Controller;
  9. use App\Http\Controllers\PagesController;
  10.  
  11. /**
  12.  * Class DefaultController
  13.  * @package App\Http\Controllers\Pages
  14.  */
  15. class DefaultController extends PagesController
  16. {
  17. /**
  18.   * Create default edit view
  19.   * @return mixed
  20.   */
  21. public function createDefaultView() //
  22. {
  23. $viewPortlet = view('pages.edit');
  24. $settingsPortlet = [
  25. 'setRedricted' => '',
  26. 'setClass' => '',
  27. 'setTitle' => '',
  28. 'setTitleHelper' => '',
  29. 'setActionButtons' => '',
  30. ];
  31. return $this->createPortlet($settingsPortlet, $viewPortlet);
  32. }
  33. }


1. W jaki sposób w PagesController wywołać funkcję: createDefaultView?, wiem że jak dodam że jest to funkcja statyczna to mi zadziała: DefaultController::createDefaultView(), czy w przypadku Laravela powinno się robić to inaczej? Można jeszcze w inny sposób dostać się do tej funkcji nie używając static?

2. Jak funkcję createPortlet wywołać z Controllera głównego bo tam też ona się znajduje? //w controller.php jest jako public function createPortlet()

Z góry dziękuję za pomoc

/////////////
wszystko działa jeżeli funkcje pozamieniam na statyczne, ale czy to tak może być?
Pyton_000
1. Nie wywołasz metody dziecka z rodzica.
Albo musisz tworzyć instancje 'DefaultController' albo przekazać go jako dependency injection

2. Skoro dziedziczy po PagesController to zapewne tamten dziedziczy po Controller, więc tak jak masz.

Nie za bardzo rozumiem i widzę co chcesz osiągnąć, bo struktura katalogowo plikowa jest kiepska
Randallmaster
Pyton_000 dzięki za odpowiedź.

Są jakieś standardy które mówią jak prowadzić strukturę plików? Może mógłbyś coś polecić.

Co chcę osiągnąć.

'pages/edit' będzie dzieliła się na 5 tabsów, i te 5 tabsów chciałem rozbić na 5 różnych klas po 1 do każdego z taba. no i jedna główna classa czyli PagesController. Jak powinno wyglądać katalogowanie plików w takim przypadku?
Pyton_000
Nie ma standardów. Układa się katalogi raczej w logiczne całości żeby miało ręce i nogi.

Co masz na myśli 5 tabsów? Panadol? Apap? Czy może te od Goździkowej biggrin.gif

Opisz co to ma robić, jakie są założenia to coś wymyślimy.
Randallmaster
Panadol i Apap nie smile.gif może coś mocniejszego smile.gif generalnie jak wpiszesz Tabs i wyświetlisz grafikę w Google to pokaże to co robięsmile.gif dokładnie "pages/edit" ma tabsy z 5 poziomami uprawnień czyli na jednej stronie bedzie 5 stron umiesCzonych w podstronach. Do każdej podstrony chce wykonać osobna klasę z controllerem
Pyton_000
Dobra ja już nie wnikam.

- createPortlet() wydziel do jakiejś innej klasy która będzie odpowiedzialna za tworzenie czegoś takiego z parametrów. Nie ma sensu pchanie wszystkiego do głównego kontrolera.
- DefaultController nie musi w tym momencie dziedziczyć już po PagesController, wystarczy po Controller
- Teraz w PagesController musisz odpalić sobie generowanie tych zakładek. Obiekty możesz przekazać jako parametry w konstruktorze klasy lub parametry metody:

  1. <?php
  2.  
  3. /**
  4. *
  5. */
  6. class PagesController extends Controller
  7. {
  8.  
  9. protected $controller1;
  10.  
  11. protected $controller2;
  12.  
  13. function __construct(Tabs1Controller $controller1, Tabs2Controller $controller2)
  14. {
  15.  
  16. $this->controller1 = $controller1;
  17. $this->controller2 = $controller2;
  18. }
  19.  
  20. // LUB
  21.  
  22. public function generateTabs(Tabs1Controller $controller1, Tabs2Controller $controller2)
  23. {
  24. $tab1 = $controller1->createDefaultView();
  25. }
  26. }


Oczywiście nie zapomnieć o namespace
Randallmaster
Popraw mnie jeżeli źle zrozumiałem i zrobiłem poniższy przykład

  1. <?php
  2.  
  3. namespace App\Http\Controllers;
  4.  
  5. use App\Http\Controllers\Controller;
  6. use App\Http\Controllers\Pages\DefaultController;
  7. use App\Http\Controllers\Pages\PermissionController
  8.  
  9. class PagesController extends Controller
  10. {
  11.  
  12. protected $default;
  13.  
  14. protected $permission;
  15.  
  16. function __construct(DefaultController $default, PermissionController $permission)
  17. {
  18.  
  19. $this->default = $default;
  20. $this->permission = $permission;
  21. }
  22.  
  23. // CZY
  24.  
  25. public function generateTabs()
  26. {
  27. $tab1 = DefaultController::createDefaultView();
  28. }
  29. }


Jeżeli zrobiłem to poprawnie, odpowiedz mi co jest wydajniejsze. Pierwszy przykład z tworzeniem instancji w konstruktorze czy funkcja statyczna + abstract class? Wydaje mi się że raczej funkcja statyczyna + (zmiana klasy na abstrakcyjną), ponieważ znajdować się tam będą funkcję podstawowe dla PagesController?
Pyton_000
Wiesz, ja bym całkowicie olał te "podklasy" i to co one robią zostawił w głównym kontrolerze, a logikę zamieścił w jakimś repozytorium (Repositories).

Albo zamiast "tabów" oddielne kontrolery które będą odpalane samodzielnie. I wtedy odpalasz sobie np. PermissionsController który dziedziczy po PagesController (a ten po Controller) i tam sobie dłubiesz. Rzeczy w spólne będziesz miał w PagesController a indywidualne w konkretnej klasie.
Randallmaster
Dzięki wielkie za pomoc, ostatnie pytanie orientacyjne smile.gif, Repozytorium tworzyć w strukturze APP, czy lepiej w Illuminate za pomocą provides Facade?

i tak na szybko:
po co tworzyć : protected $permission;
jak i tak odwołuję się $this->permission->createDefaultView();
/raczej jest to w tej sytuacji nie potrzebne?
Pyton_000
Żeby było ładnie. Pola się deklaruje (ułatwia to później czytanie)
Repozytorium ja trzymam w app/Repositories/
Randallmaster
Dzięki za pomoc smile.gif
nrm
wstrzykiwanie kontrolerów do kontrolerów? To jakaś incepcja? wink.gif

Randallmaster
tak na 4 poziomie smile.gif jest już problem bo bączek nie chce upaść tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.