Тема: Питання щодо mvc(php)

Всім привіт) Я не так давно почав вивчати мову php і ось настав той момент, коли я зустрів mvc та почав його ретельно розбирати, вцілому як він працює я більш-менш розібрався, та я не розумію деяких нюансів. Той, що найбільше мене турбує це те, як можна на одній сторінці відображати одразу декілька action одного controller. Чи взагалі таке можливо? Оскільки до цього мені доводилося все в один action записувати, а це, як я розумію неправильно. Тобто, наприклад, у мене в контроллері User є один action який бере дані з моделі щодо створення нового юзера і щодо його редактування. Розумію, що питання може бути не зовсім розумне, але на даний момент мені досить важко у цьому розібратися, підскажіть будь ласка) Усім дякую)

2

Re: Питання щодо mvc(php)

Ну, відображення декількох акшинів трохи неправильнє рішення.
Поняття акшин трохи не таке як, із того що ви написали, акшин це не є суто "ще одна" прослойка між базою із фронтендом, в акшині якраз і криється вся бізнесова логіка.

Наприклад, акшин для створення його юзера user/add, в ньому повинна бути збережена логіка перевірки та валідності необхідних полів і після чого, якщо все ок, то передавати дані безпосередньо моделі.

Така сама логіка для акшина user/view, тут повинна бути описана логіка витягнення даних, які необхідні для фронтенду, тобто тут можуть бути дані не лише із моделі user, а ще і наприклад із моделі group, або ще якась,якась, якась інфа

(function(){
  console.log("called anonymously");
})()
Подякували: anatoliiyusiuk1

3 Востаннє редагувалося bvn (16.12.2016 00:04:05)

Re: Питання щодо mvc(php)

Взагалі не зрозумів запитання. Навіщо на одній сторінці відображати одразу декілька екшенів? Є таке поняття, як роутинг - визначення [модуля/]контролера/екшена які треба визвати для конкретного uri запиту. Тож в основному діє такий принцип: одна сторінка - один екшн.

Чому в основному, а не чітко і абсолютно? Бо можна уявити собі ще наявність ajax-запитів, які йдуть з тієї ж сторінки, але до інших екшенів і, найбільш імовірно, навіть до інших контролерів.

Подякували: mike, anatoliiyusiuk, Sensetivity3

4

Re: Питання щодо mvc(php)

@anatoliiyusiuk на одній сторінці можна відображати дані із різних віджетів. А для редагуватті/додавання можна використовувати один action

http://symfony.com/doc/current/create_f … index.html рекомендую ;)

Ось приклад екшину:

    /**
     * Система автоматично підтягує користувача дял цього екшина.
     *
     * Для прикладу є url /user/edit/?user=ivan
     * З бази даних витягнеться юзер у якого id=ivan
     */
    public function actionEdit(Request $request, UserModel $user = null) {
      $user = $user ?? new UserModel();

      $form = new UserEditForm($user);
      $form->handle($request);

      if ($form->isValid()) {
        $form->fillUser($user);
        $user->save();
        return new Redirect('/user/edit/?user=' . $user->id);
      }

      return $this->render('userEdit.html', [
        'user'=>$user,
        'form'=>$form,
      ]);
    }

5

Re: Питання щодо mvc(php)

mike написав:

... в акшині якраз і криється вся бізнесова логіка.

Приклад того, як НЕ треба робити MVC.

Дані + бізнес логіка (домен) -> модель
Логіка аплікації (отримання даних юзера і тд) -> контролер

Подякували: bvn, anatoliiyusiuk2

6 Востаннє редагувалося iovchynnikov (21.12.2016 20:39:52)

Re: Питання щодо mvc(php)

bvn написав:

Взагалі не зрозумів запитання. Навіщо на одній сторінці відображати одразу декілька екшенів? Є таке поняття, як роутинг - визначення [модуля/]контролера/екшена які треба визвати для конкретного uri запиту. Тож в основному діє такий принцип: одна сторінка - один екшн.

Чому в основному, а не чітко і абсолютно? Бо можна уявити собі ще наявність ajax-запитів, які йдуть з тієї ж сторінки, але до інших екшенів і, найбільш імовірно, навіть до інших контролерів.

TS певне йшлося про компоненти/віджети. Тобто:

1) AccountController#loginAction() -> <loginBoxView/>
2) PoolController#resultsAction() -> <poolResultsBoxView/>
3) IndexController#homepageAction() -> <mainPageView/> що робить include <loginBoxView/> & <poolResultsBoxView/>

Подякували: bvn1

7

Re: Питання щодо mvc(php)

iovchynnikov написав:

TS певне йшлося про компоненти/віджети. Тобто:

1) AccountController#loginAction() -> <loginBoxView/>
2) PoolController#resultsAction() -> <poolResultsBoxView/>
3) IndexController#homepageAction() -> <mainPageView/> що робить include <loginBoxView/> & <poolResultsBoxView/>

Ааааа... Ну, це частково від реалізації залежить. В моєму улюбленому фреймворці (FuelPHP) є така цікава штука, як Presenter (або раніше це називалося, як ViewModel), на мій погляд, річ як раз зручна для створення віджетів.

Сама в собі вона несе логіку, схожу до контролера. В середині можуть бути розміщені звернення до моделей. Подібно до контролера вона має відповідну секцію серед представлень. А от викликати це щастя можна, як з контролера, так і з представлення певної сторінки чи шаблону. Тож для віджетів підходить, краще нікуди.

8

Re: Питання щодо mvc(php)

bvn написав:
iovchynnikov написав:

TS певне йшлося про компоненти/віджети. Тобто:

1) AccountController#loginAction() -> <loginBoxView/>
2) PoolController#resultsAction() -> <poolResultsBoxView/>
3) IndexController#homepageAction() -> <mainPageView/> що робить include <loginBoxView/> & <poolResultsBoxView/>

Ааааа... Ну, це частково від реалізації залежить. В моєму улюбленому фреймворці (FuelPHP) є така цікава штука, як Presenter (або раніше це називалося, як ViewModel), на мій погляд, річ як раз зручна для створення віджетів.

Сама в собі вона несе логіку, схожу до контролера. В середині можуть бути розміщені звернення до моделей. Подібно до контролера вона має відповідну секцію серед представлень. А от викликати це щастя можна, як з контролера, так і з представлення певної сторінки чи шаблону. Тож для віджетів підходить, краще нікуди.

В кейку є така сама штука - CellView

Подякували: bvn1