Фреймворки

fixxxer

К.О.
Партнер клуба
Уже ближе. :)

В случае с eloquent поля у тебя по факту и получатся публичные, но этим не стоит злоупотреблять. :) Держи в голове, что писать $какаяТоМодель->чтоТо = что-то - это в общем случае - плохая практика.

Конструктор факт публичности полей сделать не мешает.

$post->url = Str::slug($title);
А почему это делается снаружи? Типа, в одном случае, зависящем от каких-то внешних условий, надо урлу поста делать Str::slug, а в другом - может и не надо? Вряд ли. В Eloquent можно определить сеттер, который будет делать это преобразование внутри модели (где ему и место по логике).
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
А почему плохо использовать публичные поля в моделях? Невозможно контролировать значение.
Правила ООП написаны по опыты долгой совместной работы большого количества людей.
Все знают, что в поле всегда массив. Работал себе код и работал, а тут внезапно вылезли ошибки Warning: Invalid argument supplied for foreach() .
Дебажили пол-дня, и оказалось, что кто-то забыл написать валидацию, и где-то неожиданно в поле вместо массива записался null.
На сайт заходит робот-поисковик, а не живой человек, и сайт вылетел из поиска гугла.
Чтобы такого не случалось, делаем в модели не прямое присваивание, а магический __set(), где можно написать проверку значения, и вместо ошибки выводить что-то осмысленное.
 
Последнее редактирование:

AllReady

Новичок
Полностью перезалил репозиторий. Избавился везде от DB, от регулярки. Отделил модель комментарией от модели записей. Немного переделал. Что касается запроса с join'ом немного не разобрался. Что касается конструктора, полей и т.п. не рисковал. Только при удалении комментария сделал следующее: обратился к модели комментариев, использовал конструктор чтобы передать ид комментария и получил о нем информацию:
PHP:
$comment = new Comment($id);
$thisCom = $comment->getInfoComment($id);
if ($thisCom->user_id == Auth::user()->id) {
    $comment->deleteCommentById($id);
}
По идее можно было и без конструктора, но не знаю как правильнее.
Просто интересно получается в этом подходе. Например:
$post = new Post('заголовок', 'описание');
$post->save();
Выглядит приятно и понятно. Вроде как то понимается подход, но не могу понять сути.
 

fixxxer

К.О.
Партнер клуба
PHP:
$comment = new Comment($id);
$thisCom = $comment->getInfoComment($id);
Ну вот уже ерунда какая то. Зачем создается новый комментарий, который потом зачем-то почему-то возвращает другой комментарий?

На Eloquent должно быть как-то так:

$comment = Comment::find($id);
 

AllReady

Новичок
PHP:
$comment = new Comment($id);
$thisCom = $comment->getInfoComment($id);
Ну вот уже ерунда какая то. Зачем создается новый комментарий, который потом зачем-то почему-то возвращает другой комментарий?

На Eloquent должно быть как-то так:

$comment = Comment::find($id);
Я сначала сделал без конструктора и подобной фигни, потом сделал так и забыл убрать. Я даже как то не додумался, что обычным стандартным методом find получить комментарий. Конструктор логично применять как я выше описывал ? Например при добавлении комментария, добавления поста ?
 

AmdY

Пью пиво
Команда форума
В Eloquent вообще нельзя трогать конструктор, пользуйся методами как в документации, а то уже который раз пишешь самопал.
 

AnrDaemon

Продвинутый новичок
Если конструктор трогать нельзя, почему туда граната на верёвочке не подвязана?…
 

Adelf

Administrator
Команда форума
@AllReady, ну ващет правильный ответ. большинство вопросов глупые и неинтересные и решаются гуглением.
 

AllReady

Новичок
@AllReady, ну ващет правильный ответ. большинство вопросов глупые и неинтересные и решаются гуглением.
не спорю, но если бы мне давали тут не ответы - а ссылки, я бы не разобрался. Мне буквально все на пальцах показали, осталось только со временем понять это))
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Качественных книг по OOP применительно к php-фреймворкам для начинающих просто нет.
Лучшие материалы по ООП - Паттерны проектирования, PoEAA - это высшее образование, понять их можно только с опытом.
Просто прочитать чтобы понять и научиться писать сайты - такого нет.
А если начинаешь писать и публиковать, например, на хабре - начинается шквал дерьма, потому что любое дерьмо - греет, и вылазить никому не надо.
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
В Eloquent вообще нельзя трогать конструктор, пользуйся методами как в документации, а то уже который раз пишешь самопал.
Хорошо, спасибо.
Да, я забыл, у наследников Eloquent лучше не менять сигнатуру конструктора - вот так он устроен.

Смысл конструктора модели в том, чтобы передать туда все необходимые поля, без которых модель не имеет смысла. Допустим, в нашем приложении пост без его заголовка, текста и автора бессмысленен.

Раз не можем переопределить конструктор - сделаем "именнованный конструктор" - то есть статический метод, возвращающий новый инстанс класса, где он объявлен, и назовем, например, create:

PHP:
namespace Application\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model {

    protected $table = 'posts';

    public static function create($user_id, $title, $contents) {
         $self = new self();
         $self->user_id = $user_id;
         $self->title = $title;
         $self->contents = $contents;
         return $self;
    }

}
Таблицу posts с нужными полями мы делаем миграцией.

Вот пример работы с моделью из контроллера:

PHP:
namespace Application\Http\Controllers;

use Illuminate\Contracts\Auth\Guard;
use Application\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Contracts\View\Factory as ViewFactory;

class PostController extends Controller {

    public function createNewPost(Guard $auth, Request $request) {
         // напрямую с реквестом, каэш, не очень, но для примера сойдет, обработку ошибок тоже опустим
         $user = $auth->user();
         $post = Post::create($user->getId(), $request->input('title'), $request->input('contents'));
         $post->save();
         // отдаем что надо - редирект или json-ответ
    }

    public function getPostById(ViewFactory $view, $post_id) {
        $post = Post::findOrFail($post_id); 
        // если пост не найден, findOrFail бросит ModelNotFoundException,
        //  его можно глобально словить и выдать 404, либо, при необходимости,
        //  обработать прямо тут через try-catch
        return $view->make('show_post', ['post' => $post]);
    }

}
 
Последнее редактирование:

AllReady

Новичок
Качественных книг по OOP применительно к php-фреймворкам для начинающих просто нет.
Лучшие материалы по ООП - Паттерны проектирования, PoEAA - это высшее образование, понять их можно только с опытом.
Просто прочитать чтобы понять и научиться писать сайты - такого нет.
А если начинаешь писать и публиковать, например, на хабре - начинается шквал дерьма, потому что свое дерьмо греет, и проблемы лучше игнорировать.
А что скажете по поводу "PHP: объекты, шаблоны и методики программирования. 4-е издание. Мэтт Зандстра" ?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Я не читаю все книги, но почти вся документация по фреймворкам, заметки в блогах - или мусор, или "хренак, хренак - и в production". Большинству нужно быстро решить текущую задачу, и все.

Я пытался писать документацию для yii, предлагал хорошие архитектурные решения - так морозились, тормозили, хоть все в итоге так и сделали, но только через несколько лет, когда идеи перестали казаться чужими. Результат закономерен - обсуждаем laravel.
 
Последнее редактирование:

AllReady

Новичок
Да, я забыл, у наследников Eloquent лучше не менять сигнатуру конструктора - вот так он устроен.

Смысл конструктора модели в том, чтобы передать туда все необходимые поля, без которых модель не имеет смысла. Допустим, в нашем приложении пост без его заголовка, текста и автора бессмысленен.

Раз не можем переопределить конструктор - сделаем "именнованный конструктор" - то есть статический метод, возвращающий новый инстанс класса, где он объявлен, и назовем, например, create:
Спасибо. Потихоньку начинаю вникать... почитал про Active Record, снова прошелся по теме. Спасибо за подробности. Так же про findOrFail почитал, посмотрел как отловить ошибку и что делать в этом случае..
 

AmdY

Пью пиво
Команда форума
По laravel и не только есть прекрасный скринкаст https://laracasts.com/, там куча теории по программированию, и примеры с фреймворком, и лучшие практики
 

fixxxer

К.О.
Партнер клуба
По laravel и не только есть прекрасный скринкаст https://laracasts.com/, там куча теории по программированию, и примеры с фреймворком, и лучшие практики
Фасады и валидация в контроллере - это лучшие практики, что ли? :) Или там потом объясняют, что так не надо? Лень все смотреть, прокликал за минуту рандомно.
 

AmdY

Пью пиво
Команда форума
@fixxxer там чувак как раз показывает что это плохая практика. Если смотркть всё по очереди, очень хорошая картина складывается в голове.
 
Сверху