Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [LR] Zmienna (obiekt) globalny
markonix
post
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


W aplikacji oprócz standardowej sesji użytkownika jest tez wybór odpowiedniego zasobu (coś jak w gmail można się przełączać między subkontami).
Zmienna $activeAccess jest mi potrzebna w wielu miejscach, jest to obiekt zawierający istotne szczegóły.

Generalnie to działa, korzystam ze sposobu znanego mi z CI - korzystam z BaseControllera po którym dziedziczą kontrolery.
I to fajnie działa, w tym kontrolerze mogę też zmienną udostępnić do widoków za pomocą share().

Jest tylko z tym podejściem jeden problem - widoczność zaczyna się i kończy na kontrolerach. Ta zmienna przydałaby się mi się w innych np. w Requests, Middleware'ach, a także w Policies (choć tu ją mogę przekazywać w metodzie za pomocą helpera przykładowo $this->authorize('view', [$resource, $this->activeAccess]);. Teraz np. przy walidacji muszę kombinować i przekazywać to za pomocą ukrytych pól. Wydawało by się, że sesja była dobrym rozwiązaniem ale nie widzę tego, nie lubię takich rzeczy tam pchać, zwłaszcza całych obiektów.

Jakieś sugestie na lepsze umiejscowienie?


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


A czemu nie DI?
Go to the top of the page
+Quote Post
markonix
post
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Cóż, nie myślałem o tym zupełnie, DI raczej mi się kojarzy z wstrzykiwaniem potrzebnych klas do działania konkretnego fragmentu kodu np. w kontrolerze ładujemy repozytorium.
Nie myślałem o tym activeAccess jako o takie klasie, która jest jakim takim "state" aplikacji (czyli inaczej zmienną sesyjną).

Ale z ciekawości spróbuje.

No nie powiem, chyba to działa. Bałem się, że w takiej wstrzykniętej klasie nie będę miał dostępu do tego czego potrzebuje (sesji, zalogowanego użytkownika itp.) ale nie ma z tym problemu.
Plusem jest, że rozdzieliłem troszkę logikę ustalania tego aktywnego dostępu (bo to się opiera o kilka rzeczy - sesje, ciacho, db + jakaś wstępna autoryzacja) do tej osobnej klasy.

Ostatecznie to wygląda tak:

To sobie zostawiłem w moim bazowym kontrolerze aby zachować kompatybilność z obecnym kodem:
<!--Geshi:480696:php--><pre class="php-brief" style="font-family:monospace;"><div class="head">
  1. [topic=0]ype</span><span class="sy0">;</span></div><li class="li1"><div class="de1"> <span class="br0">}</span></div><li class="li2"><div class="de2"> </div><li class="li1"><div class="de1"> <span class="coMULTI">/**</span></div><li class="li2"><div class="de2"><span class="coMULTI">  * @return int</span></div><li class="li1"><div class="de1"><span class="coMULTI">  */</span></div><li class="li2"><div class="de2"> <span class="kw2">public</span> <span class="kw2">function</span> getResourceId<span class="br0">(</span><span class="br0">)</span></div><li class="li1"><div class="de1"> <span class="br0">{</span></div><li class="li2"><div class="de2"> <span class="kw1">return</span> <span class="co1">// tu id w zależności od typu zasobu;</span></div><li class="li1"><div class="de1"> <span class="br0">}</span></div><li class="li2"><div class="de2"> </div><li class="li1"><div class="de1"> <span class="coMULTI">/**</span></div><li class="li2"><div class="de2"><span class="coMULTI">  * @return string</span></div><li class="li1"><div class="de1"><span class="coMULTI">  */</span></div><li class="li2"><div class="de2"> <span class="kw2">public</span> <span class="kw2">function</span> getAccessId<span class="br0">(</span><span class="br0">)</span></div><li class="li1"><div class="de1"> <span class="br0">{</span></div><li class="li2"><div class="de2"> <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">accessObject</span><span class="sy0">-></span><span class="me1">access_id</span><span class="sy0">;</span></div><li class="li1"><div class="de1"> <span class="br0">}</span></div><li class="li2"><div class="de2"> </div><li class="li1"><div class="de1"> <span class="coMULTI">/**</span></div><li class="li2"><div class="de2"><span class="coMULTI">  * @return string</span></div><li class="li1"><div class="de1"><span class="coMULTI">  */</span></div><li class="li2"><div class="de2"> <span class="kw2">public</span> <span class="kw2">function</span> getAccessCode<span class="br0">(</span><span class="br0">)</span></div><li class="li1"><div class="de1"> <span class="br0">{</span></div><li class="li2"><div class="de2"> <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">accessObject</span><span class="sy0">-></span><span class="me1">access_code</span><span class="sy0">;</span></div><li class="li1"><div class="de1"> <span class="br0">}</span></div><li class="li2"><div class="de2"> </div><li class="li1"><div class="de1"><span class="br0">}</span></div>
  2. [/list]<div class="foot">[PHP] [url="./Pobierz-Plik-480697.html"]plaintext[/url] </div></pre><!--/Geshi:480697:php-->
  3.  
  4. no i magiczne DI
  5.  
  6. [php] /**
  7.   * Get the validation rules that apply to the request.
  8.   *
  9.   * @param ActiveAccess $activeAccess
  10.   * @return array
  11.   */
  12. public function rules(ActiveAccess $activeAccess)
  13. {
  14. $activeAccess->getResourceId();
  15. // i można użyć bieżącego ID
  16. }


Minus jak widzę to póki co podwójny narzut na to samo - tzn. wykonanie zapytań które są w ActiveAccess. Nie wiem czy Singleton by mógł tu pomóc worriedsmiley.gif
Z Singletonem w LR jakoś nie idzie:


  1. $this->app->singleton('Session\ActiveAccess', function ($app) {
  2. return new ActiveAccess();
  3. });


Kod się generalnie nie wykonuje gdy wstrzykuję klasę ActiveAccess :/

edit: Masakra z tym forum, rozpierdzieliło cały kod... Nie mam ochoty tego 3 raz już poprawiać..

Ten post edytował markonix 28.11.2017, 17:47:03


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Ale co się nie wykonuje. Ustaliłes jako singleton swoją klasę i ją zainicjowałeś. Więc kod powinien się 1x wykonać
Go to the top of the page
+Quote Post
markonix
post
Post #5





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


  1. $this->app->singleton('Session\ActiveAccess', function ($app) {
  2. dd('tutaj');
  3. return new ActiveAccess();
  4. });


Tzn. nie działa ten "hook". Być, może ten kod daje w złym miejscu, próbuje w AppServiceProvider.

Zrobiłem sobie dump w konstruktorze tej nowej klasy dump(rand(0,999)) i póki co wykonuje się 2 razy - w tym moim bazowym kontrolerze i przy walidacji requestu (no i będzie się wykonywał w innych miejscach, gdziekolwiek to dodam przy obsłudze requestu więc chciałbym to zoptymalizować).

Chyba mam:

  1. $this->app->singleton(ActiveAccess::class, ActiveAccess::class);


Ten post edytował markonix 28.11.2017, 18:08:19


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Zrób tak:

  1. $this->app->singleton(ActiveSession::class, function() {
  2. return new ActiveSession();
  3. });


importując namespace

PS. Możesz też i tak:

Kod
$this->app->singleton(ActiveSession::class);


Ten post edytował Pyton_000 28.11.2017, 18:31:38
Go to the top of the page
+Quote Post
markonix
post
Post #7





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Moje krótsze ale generalnie o to mniej więcej się rozchodziło smile.gif

Dobra, wygrałeś. Twój edit jest jeszcze krótszy i też działa biggrin.gif

Ten post edytował markonix 28.11.2017, 18:32:54


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 03:35