Wywołanie funkcji z controllera A w controllerze B [Laravel]

0

Cześć,
próbuję napisać pierwszą aplikację wykorzystując Laravela i pojawił się problem, na rozwiązanie którego nie mam pomysłu. Mianowicie mam zrobionego klasycznego CRUDa i działa on na dajmy na to modelu A. Do tego mam model B z innymi polami, w którym występuje jedynie id modelu A i chciałbym, żeby te dwie tabele były tym polem ze sobą powiązane. Dodatkowo w modelu A występuje parametr liczbowy określający ile nowych elementów powinno zostać utworzonych w tabeli modelu B. Czyli jeśli parametr będzie dajmy na to równy 3, to chciałbym, żeby w tabeli B utworzone zostały 3 nowe elementy. W jaki sposób taki efekt najłatwiej uzyskać? Myślałem, żeby ten parametr liczbowy przekazać do funkcji w controllerze modelu B.

1

Jesteś świadom, że możesz tworzyć swoje inne klasy, a nie tylko te, które są klasami opisanymi w dokumentacji?

0

W sumie to możesz użyć traita i skorzystać z niego w obu kontrolerach.

0

Ok, poczytam na temat traita. Generalnie cały problem polega na tym, że jak sobie tworzę elementy w tabeli A, to chciałbym jednocześnie, żeby dodawały się elementy do tabeli B z modelu B - być może jest do tego jeszcze jakieś inne podejście, prostsze i bardziej sensowne?

1

W sumie to co robisz wg mnie nadawałoby się do ekstrakcji do jakiejś metody w serwisie. Tam będzie przekazywał dane z kontrolera i wykonywał zapytanie do tabeli A i B. Będziesz mógł tam wykorzystać metody do zapisu z modelu A i z modelu B.

0
  1. w kontrolerze nie powinno się używać metod prywatnych
  2. do metody kontrolera możesz wstrzyknąć więcej niz jeden model
  3. jeśli potrzebujesz napisać metodę w kontrolerze na więcej niż te 30-40 linii to lepiej utworzyć osobną klase która obsłuży to a ty w kontrolerze tylko wywołasz metodę z tej klasy.
0

A wywołaj sobie tak:

app('App\Http\Controllers\jakisKontrollerB')->twojaMetoda();
0

Skoro w laraverze mozesz tak zrobic jak napsialem to znaczy ze nie jest to zla praktyka. Moze to wlasnie jest dobre rozwiazanie. Kto ci wmowil ze tak jest zle ? bo kto tak powiedzial?

Ja prdl...

Nie chciałbym robić Ci CRki, bo by mnie chyba szlag trafił z takim podejściem...

1

@serek pamiętam taką osobę, potrafiła na scrumie się kłócić o takie rzeczy z TL :D Popracował miesiąc. Potem jeszcze pisał groźby do TL, że to jego wina, że wyleciał :D

1

Kiedyś mówili że

<a onclik="function()">haha</a>

Więc od tego odeszli, ale pojawił się Angular i nagle wszyscy znowu do tego wrócili troche pod inna nazwą i nagle jest ok, jeszcze to chwalą. Tak jak wy. Teraz piszecie ,że to źle nie mając pojęcia czemu i czy tak jest ale tak gdzieś ktoś powiedział. Ale jak za chwile napiszą, że tak jest najlepiej to będziecie mówić że to dobrze. hyhyhy Takie Hipokryzja IT :D jakby miał takich szefów to sam bym odszedł bo by mnie szlag trafił z podejściem panów najmądrzejszych co nic nie wiedzą.

1

@fporzo: z bardzo prostego powodu - sprawdź sobie do czego służy kontroler a będziesz wiedział czemu to jest złe.

Powiedz gdzie pracujesz, będziemy wszyscy mogli dopisać kolejny januszsoft do listy omijanych firm.

0

Gdyby ktoś zapytał jak najlepiej wywołać metode z innego kontrolera w drugim to bym powiedział że napisać klase, użyć helpera albo zrobić Trait.
Opcja

app('App\Http\Controllers\InnyController')->metoda();

jest zła bo burzy organizację kodu i przestrzeni nazw ale nie jest zła pod względem wydajności. Nie martw się sam stosowałem tę metodę na chwile by coś tylko sprawdzić a potem przenosiłem kod gdy musiałem poprawiać kwiatki po kimś tam kto odszedł z firmy. Wasz problem jest taki ,że uważacie się za lepszych i zamiast pomóc to krytykujecie nie podając powodu. Takie zwykłe Skrypt Kiddi :)

0

a co to jest CRka ?

Ty tak na serio?

0

To klasa obsługująca wiadomości z najnowszego projektu

<?php

namespace App\Http\Controllers;

use App\Message;
use Illuminate\Http\Request;

class MessageController extends Controller
{
    public function index()
    {
        return view('message.index')
            ->with('messages', Message::where('user_id', Auth()->user()->id)
            ->orderBy('id', 'desc')
            ->paginate(env('MESSAGE_PAGINATE')));
    }
    
    public function view($id = 0)
    {
        $message = Message::find($id);
        if (!empty($message)) {
            if ($message->status_id == 65)
                $message->markAsOpened();
            return view('message.view')->with('message', $message);
        }
        
        return redirect()->back();
    }
    
    public function delete($id = 0)
    {
        Message::where('id', $id)->where('user_id', Auth()->user()->id)->delete();
        return redirect()->route('message.index');
    }
}

A to pivot z kategoriami w eloquent oczywiście

<?php
namespace App\Pivots;
    
use Illuminate\Database\Eloquent\Relations\Pivot;

class CategoryDictGroup extends Pivot {
    
    public function category()
    {
        return $this->belongsTo('App\Category');
    }
    
    public function dictGroup()
    {
        return $this->belongsTo('App\DictGroup');
    }
    
    public function dict()
    {
        return $this->hasManyThrough('App\Dict', 'App\DictGroup');
    }
   
}

@mr_jaro Wątpie by ktoś tak doświadczony jak ty miał kłopot z moim kodem.

1

Kłopot może nie, ale spokojnie każdy robiący Ci CR wyłapałby takie coś jak np.:

if ($message->status_id == 65)
     $message->markAsOpened();
return view('message.view')->with('message', $message);
  1. Zawsze powinieneś używać klamer, nawet jeśli to 1 linijka w ifie.

  2. Przed return powinien być enter.

return $this->belongsTo('App\Category');

To pewnie spokojnie można zamienić na:

return $this->belongsTo(Category::class);
  1. W jednej klasie masz klamrę otwierającą klasę na końcu linijki, a w innej masz w nowej linijce
  2. Niepotrzebne puste linijki po klamrze otwierającej i przed zamykającą.
  3. Raz masz enter przed namespace, a raz nie masz.
  4. Jeśli używasz PHP 7, to warto dodawać typowanie.
  5. ID statusu powinno być w const.

Nie są to błędy jako tako, ale dobrze się jest jednak trzymać jakichś reguł.

0

Skoro w laraverze mozesz tak zrobic jak napsialem to znaczy ze nie jest to zla praktyka. Moze to wlasnie jest dobre rozwiazanie. Kto ci wmowil ze tak jest zle ? bo kto tak powiedzial ? Nazwisko. Powielasz tylko to co mowili inni i myslisz ze masz racje.

To, że coś możesz zrobić, nie oznacza, że jest to dobre. Problem nie jest w tym, że chcesz wywołać jakąś metodę controllera z innego miejsca. Problem jest dużo, dużo wcześniej, a to, co chcesz zrobić, to jego skutek.

Problem pojawia się, w momencie, w którym zapakowałeś do controllera logikę, którą chcesz ponownie użyć. Pogwałciłeś SRP i masz za swoje. Controller powinien być tylko odpowiedzialny za przyjęcie żądania i wygenerowanie stosownej do danego przypadku użycia odpowiedzi. A powinno tak być nie dlatego, że ktoś tak sobie wymyślił, tylko jest to praktyczne. Gdybyś miał ładnie podzielone odpowiedzialności, to byś się nie zastanawiał jak tu wywołać ręcznie controller, tylko użyłbyś jakiejś instancji klasy, która ma metodę robiącą to co potrzebujesz i która jest niezależna od kontekstu HTTP.

0

Ale to ja ustalam standadry i te są jak najbradziej poprawne. Twój CR musi udawac ze cos robi wiec czepialby sie o wszystko. Kod jest wysmienity wiec musiales sie czepnac o pierdoły nic nieznaczace

Dobrze, że pracujesz sam. Inaczej by Twoich kolegów z pracy szlag trafił z takim podejściem. No i powodzenia, jeśli ktoś inny niż Ty taki kod musiałby przejąć.

0

To są ogólnie przyjęte standardy w php, zwą się PSR i są to podstawy o które pytali mnie nawet przy rekrutacji na juniora 5 lat temu. Co więcej nie musisz tego robić sam, bo jest coś takiego jak csfixer i naprawia on wszystko sam. https://github.com/FriendsOfPHP/PHP-CS-Fixer

1

No dobra, jeden wniosek:

title

1 użytkowników online, w tym zalogowanych: 0, gości: 1