Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Снеси существующую установку композера. Возьми composer.phar, положи в некоторую папку. Рядом положи composer.bat с таким содержимым:
@php "%~dp0composer.phar" %*
Поставь эту папку в PATH.
можно попробовать удалить всю папку vendor, чтобы она сформировалась заново.
1. Не валидировать модели, а валидировать пользовательский ввод (https://github.com/laracasts/Validation)
2. Сделать в модели две переменные с правилами валидации - $createRules или $updateRules например, и изменить валидирующий код соответственно.
Ну вот в 5.0 наконец-то распрощаются с наследием Laravel3 и все будет более-менее унифицировано, в неймспейсе. Может и документацию подтянут с "смотрите как все просто можно сделать, магия!" до реальных юзкейсов разработчиков.
Laravel4+ way - это фреймворк-агностик путь, назад к корням, голому php - приложение пишется на классах, которые доступны из контроллера будучи переданными в него в аргументах конструктора (Dependency Injection) и при помощи фасадов. К сожалению, в документации это не отражено должным образом, за этим нужно идти к книгам "From Apprentice To Artisan" или "Implementing Laravel". Или к циклам про SOLID-принципы или Command-Oriented Architecture у Джеффри на https://laracasts.com/how-do-i . Последнее - весьма интересное решение по разгрузке контроллеров от кода, но очень замороченное, не для всех проектов подойдет.
Конкретно в описанном случае можно написать класс, который будет принимать на вход экземпляр модели, получать оттуда данные и возвращать переменную(ые), которую контроллер потом передает в view. Хранить этот класс в неймспейсе, который определить в composer.json (http://laravel.ru/forum/viewtopic.php?id=473), подавать аргументом в конструкторе. Но если не заморачиваться с тестируемостью и доступе к этому функционалу из командной строки, можно разместить сей функционал прямо в BaseController.
Для особенных команд можно юзать DB::statement("команда")
Решение не костыльное, но если классов планируется юзать много, можно зарегистрировать свой неймспейс и писать свои классы там, держа их в понятной иерархии папок. Неймспейс регистрируется в composer.json добавлением секции psr-0 или psr-4:
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
],
"psr-4": {
"Myapp\\": "app/Myapp"
}
Чтобы изменения подхватились надо дать команду composer dump-autoload .
Теперь в папке Myapp вы можете располагать свои классы и обращаться к ним из контроллеров/моделей/сервиспровайдеров по соответствующему неймспейсу.
Подробности гуглятся по laravel namespace , у Джеффри на http://laracasts.com все пишется в неймспейсе, можно посмотреть, вообще, можно держать там весь код приложения. В следующей версии laravel весь апплекейшн будет в неймспейсе принудительно.
Пропущен @yield() , но это и не удивительно, эту особенность шаблонизации laravel упускают многие.
Я опишу свой способ организации шаблонов. У меня шаблоны разбиты на три части.
Html дан в bootstrap3.
1. Главный лейаут приложения, app/views/_layout/main.blade.php :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="favicon.ico">
<title>@yield('title', "Дефолтный тайтл страницы")</title>
<link href="/bootstrap/css/bootstrap.css" rel="stylesheet">
<link href="/app/css/style.css" rel="stylesheet">
</head>
<body>
<header>Мой хедер с меню и т.п.</header>
@yield("container")
<footer>Мой футер</footer>
</body>
</html>
2. Вспомогательные лейауты с сайдбарами - справа, слева и без. Вот файл app/views/_layout/leftsidebar.blade.php :
@extends('_layout.main')
@section('container')
<div class="container">
<div class="row">
<div class="col-md-3">
@yield('sidebar')
</div>
<div class="col-md-9">
@yield('content')
</div>
</div>
</div>
@stop
Остальное (справа и без сайдбара) пишется по аналогии. Здесь написано, что этот файл встраивается в _layout.main , секцией container на место, забронированное для неё (@yield("container")).
Папка лейаутов у меня начинается с подчеркивания затем, чтобы она была всегда вверху списка папок во views - легче искать.
3. И, собственно, шаблон, который вызывается из контроллера во View::make(). Например, app/views/home.blade.php :
@extends('_layout.leftsidebar')
@section('title')
Тайтл конкретной страницы
@stop
@section('sidebar')
@include("sidebar.sidebar_main")
@stop
@section('content')
Hello world.
@stop
Здесь я определяю тайтл страницы, сайдбар, который будет отображаться, и вид верстки - слева будет сайдбар или справа (тогда вместо leftsidebar я напишу rightsidebar).
В секции content я собственно рисую контент, который выводит данная вьюха.
Если сайдбар постоянно один, то чтобы не писать его секцию в каждой вьюхе, его можно захардкорить лейаутах 2го уровня , поставив вместо @yield("sidebar") - @include("sidebar.sidebar_main") , т.е. путь до вьюхи сайдбара.
Соответственно, когда вызывается View::make("home") , фреймворк берет home.blade.php , запоминает определенные там section, дальше обращается к вьюхе-"родителю", которая определяется в @extends(). Там он вставляет имеющиеся секции на место @yield() и запоминает определенные там секции. Затем берет @extends() и все повторяет, пока не дойдет до вьюхи, где @extends() уже не будет. После этого он сохраняет полученный html и отдает его на выход.
Общий принцип, надеюсь, понятен.
А почему бы не поставить php5-cli ? Все убунту-серверы работают с несколькими php в системе - cli, fpm и apache - и ничего, все равно всё обновляется одной командой, конфиги тоже одинаковые можно сделать. Проблема уйдет.
PS не уверен насчет целесообразности lamp-сборок под линухом, в убунте все ставится апт-гетом: https://www.digitalocean.com/community/ … untu-14-04 . Но не настаиваю, каждый сам кузнец своего счастья.
Надо просто все всегда указывать явно и проблем не будет никогда.
1. Документация по ОРМ к счастью, в одном месте. Заходим http://laravel.com/docs/eloquent , Ctrl+F 'created_at' и под первым же вхождением видим: "If you do not wish to have these columns automatically maintained, set the $timestamps property on your model to false."
2. А как можно валидацию сделать проще ?
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails())
{
return Redirect::to('url')->withErrors($validator);
}
Если же хочешь, чтобы модели у тебя автовалидировались при сохранении (имхо, стремный момент, но практикуется), то повесь валидацию на эвент: http://www.laravel-tricks.com/tricks/au … validation
Это ошибка phpstorm, а не laravel. Попробуй поставить laravel из обычного терминала.
Blade нужен исключительно своими директивами @extends , @section , @yield и т.п. - с помощью них компонуется лейаут в laravel-style компоновки приложения, они практически незаменимы. Плюс очень удобный @include - он вставляет внешнюю вьюху и, о чудо и счастье, туда не надо передавать переменные, все переменные, которые объявлены на данный момент будут переданы туда автоматом. Юзать остальные фичи blade типа {{}} имхо нет смысла - нет автодополнения, автовыделения в IDE, ну и действительно, просто зачем, когда есть прекрасный шаблонизатор php.
По поводу документации ты прав, она сферическая и в вакууме, практические стороны, с которыми сталкивается каждый новичок там затронуты вскользь, её можно использовать только как справочник, когда фреймворк уже знаком. Разобраться же во фреймворке чисто по ней очень трудно. Но ситуацию исправляют туториалы, которых в сети просто куча.
Phpstorm на фреймворке из коробки действительно помогает мало, но стоит поставить https://github.com/barryvdh/laravel-ide-helper , то все магическим образом преображается. Работает автодополнение по всем классам и фасадам, Ctrl+B работает везде и на всем, можно смотреть исходники вглубь не залезая в документацию. Плюс генерится phpdoc для твоих моделей, так, что становится возможным даже автодополнение названия их полей - они берутся из БД. Мне лично с laravel работать в phpstorm очень удобно.
Тут еще такая особенность, что я фрилансер и работаю один. Поэтому мне не нужен простой порог вхождения, я после смерти Kohana начал искать фреймворк, на котором бы я мог остановиться уже насовсем, который гарантированно проживет долго - и между symfony и laravel выбрал второй. Для организации устоявшиеся юзкейсы по коду могут быть важнее и тут общая прагматичность yii выводит его вперед, конечно.
Можете посмотреть https://github.com/LaravelRUS/laravel.su , это пробный камушек на роль нового laravel.ru, незавершенный, но запустить можно.
Пример репозитория: https://github.com/LaravelRUS/laravel.s … stRepo.php .
Базовый репозиторий, от которого наследуются остальные: https://github.com/LaravelRUS/laravel.s … sitory.php
Контроллер: https://github.com/LaravelRUS/laravel.s … roller.php
Для валидации используется пакет laracasts/Validation (валидаторы лежат в папке Forms).
PHP лочит файл с сессиями на время запроса, поэтому в хайлоаде хранить сессии в файлах настоятельно не рекомендуют.
Драйвер сессий какой ? Если file - попробуй вместо файлов поставить что-то на БД - redis или database.
Универсальной структуры нет, иначе бы кроме неё ничего не существовало. Но общие принципы назвать, наверное, можно.
Распространенное правило - держать контроллеры тонкими, т.е. с минимум кода, функционал писать в классах, каждый из которых обладает узкой специализацией (если на вопрос "что делает этот класс" в ответе присутствует союз "и" два или три раза, то пора рефакторить). Приложение из таких классов удобно покрывать юнит-тестами, в случае добавления нового функционала вы добавляете новые классы и тесты, слабо изменяя предыдущие и сводите появление новых багов к минимуму.
Если вы планируете использовать тесты (а для хороших больших приложений они все-таки необходимы, хотя я лично так и не могу себя заставить их писать), постарайтесь не юзать фасады и оператор new - используйте DI в виде передачи параметров в конструктор и App::make().
Работу с моделями по возможности (но без фанатизма) выносите в репозитории. Т.е. контроллер вызывает метод репозитория, в котором вызывается модель (или несколько) с нужными параметрами и, если надо, результат кэшируется. Об этом можно прочитать, например, в "From apprentice to artisan" Тейлора.
Интересный метод избавления контроллера от кода предложил Джеффри Вей в своем цикле "Commands and Domain Events": https://laracasts.com/series/commands-and-domain-events , https://laracasts.com/lessons/introduci … -commander. Также в рамках этой парадигмы он пишет пример соцсеточки Larabook - https://laracasts.com/series/build-a-la … om-scratch .
Также многие рекомендуют разделять классы в приложении не по функциональности низкого уровня (в этой папке у нас контроллеры, в этой модели, тут правила валидаторов), а по логическому разделению на более высоком уровне (в этой папке у нас все, что относится к пользователям, в этой - все, что к постам, тут - к заказам, тут - к счетам, а это - общее). Пример такой архитектуры можно видеть здесь: https://github.com/Siliconsoul/FusionIn … FI/Modules . Хотя папка Modules имхо лишняя, проще все в коренном неймспейсе размещать, т.е. в данном случае FI.
Я сделал пакет, который генерит подобные модули внутри неймспейса, чтобы руками каждый раз не создавать кучу папок и прописывать все в сервис-провайдере: https://github.com/slider23/laravel-modulator
Но польза от такого разделения кода немного сомнительна. Например, роуты неудобно держать по модулям, проще все в одном файле. Но если они в разных файлах, то можно переносить модули из приложения в приложение. В общем, все это субъективно.
Также полезным времяпрепровождением будет чтение и конспектирование http://refactoring.guru
Подозреваю, народ хотел услышать, почему Laravel не годится для больших проектов
Laravel на самом деле годится для проектов любой сложности. Он же по сути тот же симфони, только по-другому скомпонован, чтобы новичкам было попроще писать. Доктрину и т.п. можно навесить и на него.
Да, я забыл упомянуть, что во views надо тоже сделать свою подпапку и лейауты страниц у фронта и бэка будут, естественно, разные. Благо, наш шаблонизатор позволяет удобно "наследоваться" вьюхам от разных источников при помощи @extend.
Artdevue, вы или не поняли топикстартера, или я не понял вас, или делаете у себя что-то очень странное. Environment предназначено для определения настроек для запуска приложения на разных серверах (у себя дома, на тестировочном и рабочем), а не для доступа в админку.
etibar, фронт и бэк в данном случае это админка / сам сайт, или клиентсайд на js / серверсайд на ларавеле ? Если первое, то как обычно - в папке контроллеров можно сделать подпапку для контроллеров админки (или в неймспейсе, если вы пишете в нем, делаете папку для бэкенда и там кладете его сервис-провайдер, модели, контроллеры, репозитории, обсерверы, презенторы и т.п.), у пользователя вводится система прав (в простейшем случае флаг is_admin в таблице users), и роуты админки оборачиваете в группу, на которую вешаете написанный вами фильтр "admin", в котором проверяете права доступа залогиненого пользователя.
А класс InvalidException у тебя есть ? Во фреймворке его нет. Попробуй кидать и ловить просто Exception.
Да, один из минусов laravel - для роутов приходится писать вот такие простыни. Я юзаю live templates в шторме, сильно ускоряет процесс написания однотипного кода.
Цикл имхо нет смысла юзать - какая разница, где писать соответствие урлов контроллерам и именам, в массиве или в роутах.
Так ошибку выдает:
У вас в config/app.php не включен Debug Mode, включите, текст ошибки будет предметнее.
В конце файла роутов поставь Route::any("{any}", "HomeController@getIndex")