Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Проще всего сделать папки для каждого сайта, а папку vendor внутри каждого сайта формировать не композером, а ставить симлинк на единую папку, которую где-нить держать.
Можно создать папку app/Models , скопировать туда модели из L4 и прописать эту папку в classload в composer.json
"autoload": {
"classmap": [
"database",
"app/Models"
],
В руководстве по обновлению с L4 до L5 написано же.
Так же пожно поступать с остальными классами, в которых лень неймспейс прописывать.
В Кохане как раз было сделано неграмотно. Правильно из соображений безопасности - это делать document root несовпадающим с корневой папкой фреймворка. Привыкайте.
ServiceWrapper - это для примера приведено. В данном случае имеется в виду, что надо указывать полные пути до классов.
Фасады сделаны главным образом для новичков, которые фреймворк видят в первый раз и при работе копипастят код из доки. Если каждый раз писать, что надо в аргумент конструктора передать нужный класс, сделать переменную в классе контроллера, и обращаться к ней из метода контроллера - человек закроет страницу и вернется на codeigniter. А если написать что-то типа "используйте Input::get()" - продолжит читать. Из-за дружелюбия к новичкам Laravel и приобрал такую популярность.
Сессию пробовал менять с file на например database или redis, в config/session.php ? Папка app/storage и подпапки в ней открыты для записи ?
$user->fill(['email'=>"john@foo.com", 'other'=>"..."]);
Только надо чтобы эти поля были в $fillable модели.
Где объявить - в своем сервис-провайдере, конструкторе BaseController, от которого наследуются остальные контроллеры, или в app/start/global.php.
Как передать во все вьюхи - View::share('menu', $menu);
Вкратце - хранить в своей неймспейс-папке, обращаться через внедрение при помощи Dependency Injection или через фасады.
Поподробнее.
Создаете папку app/Acme (Acme обозначает "произвольное имя") и говорите фреймворку, что в ней будете держать классы согласно стандарта, например, psr-0, добавляя в composer.json следующее:
"autoload": {
"classmap": [
...
],
"psr-0": {
"Acme": "app/"
}
},
Пишете свои классы в этой папке, прописывая всем им неймспейсы, совпадающие, в данном случае, с файловым путём. Рекомендуется прочитать про паттерны программирования (или хотя бы погуглить что такое репозитории), хорошим стартом будет купить месячную подписку на http://laracasts.com
Используете их в других классах, указывая их в качестве аргументов к конструктору:
<?php
use Acme\Post\PostRepository;
class PostController extends BaseController {
private $postRepository;
public function __construct(PostRepository $postRepository)
{
$this->postRepository = $postRepo;
}
public function show($slug)
{
$post = $this->postRepository->getBySlug($slug);
return View::make("post/view_post", compact("post"));
}
}
Так как почти все свои классы Laravel достает из IoC-контейнера, на вход конструктора контроллера он все подаст что надо.
Можно вместо DI юзать фасады, и в примере выше в show() писать $post = PostRepository::getBySlug($slug); , но фасады в частности плохи тем, что у вас не будет работать автодополнение в IDE. Как делать фасады, исчерпывающе написано в документации - http://laravel.com/docs/4.2/facades .
Если функции и классы используются во многих ваших проектах, то можно выделить их в пакет и подтягивать их композером с гитхаба как и все остальные пакеты - http://laravel.com/docs/4.2/packages .
Задача делится на две части - фронтэндовую (как в браузере получать от бэкенда сообщения и отображать уведомления) и бэкендовую (как понимать, что событие настало). Если вы хотите, чтобы все происходило в реалтайме, то в рамках первой задачи вам надо определиться, как именно реализовать в джаваскрипте - периодически пинговать бэкенд в setInterval или поднимать вебсокет-соединение. Во втором варианте на в бэкенд-части вам придется поднимать демона, держащего вебсокет-соединения, пакет brainsocket.brainboxmedia()ca поможет в этом.
Laravel5 использовать нельзя - он в альфе, даже не в бете. Баги там вряд ли есть, просто он активно переписывается и дописывается. В итоге к релизу L5 у вас будет приложение на непонятном фреймворке, и придется апдейтиться до релизного L5. Так какой смысл рисковать, пишите на 4.2.
Там три разных метода описано, вы какой использовали ?
Держать сессии в БД (http://laravel.com/docs/4.2/session#database-sessions) и считать там количество строк со значением last_activity больше некоторого (час например, оно там в секундах).
Вы неправильно называете связи. Комментарии надо называть comments() , а контакты - contacts() - их же Many, несколько, и возвращается коллекция объектов, а не один объект. На работу это не влияет, но на понимание кода - влияет сильно. Вот вы, например, попались на эту семантическую ловушку в самом начале, когда запросили сие:
$posts = Post::all();
foreach($posts as $post) {
echo $post->comment->id;
}
$post->comment - это не один объект, у которого есть id, это коллекция. Если бы оно называлось comments , вы бы это заметили, и сделали по нему foreach().
По теме - все банально.
$company = Company::find($id); // ну или, если вы тут запрашиваете несколько компаний, добавьте with("contacts") чтобы запросов в базу было меньше
foreach($company->contacts as $contact){
echo $contact->name;
echo $contact->telephone;
}
Еще я почти в каждом подобном обсуждении привожу ссылку на мегаполезную, с моей точки зрения, ссылку про то, что на самом деле представляют собой модели в MVC - http://habrahabr.ru/post/175465/ (TL&DR - они представляют собой собственно ваше php-приложение целиком, а не только общение с бд.)
В Laravel все то же самое, это справедливо для всех фреймворков. Приложение нужно писать в своих неймспейс-классах, каждый класс должен иметь по возможности узкий функционал. Модели, кстати, это те же классы, вообще весь код писать там вместо контроллеров тоже неразумно.
Немного непонятно в чем проблема. Сделайте несколько VirtualHost директив:
<VirtualHost *:80>
ServerName "site1.app"
DocumentRoot "D:/Dropbox/work/site1/public/"
</VirtualHost>
<VirtualHost *:80>
ServerName "site2.dev"
DocumentRoot "D:/Dropbox/work/site2/public/"
</VirtualHost>
<VirtualHost *:80>
ServerName "site3.app"
DocumentRoot "D:/Dropbox/work/site3.app/public/"
</VirtualHost>
И соответственно в hosts пропишите
127.0.0.1 site1.app
127.0.0.1 site2.dev
127.0.0.1 site3.app
По вопросам в конце.
1. Можно и передавать модель в контроллер, но мне не кажется, что это какая-то особенная удобность. От подобной магии, которая экономит пару строчек кода, но накладывает определенные ограничения, я стараюсь сторониться.
2. Нет, так как для хранения состояния у нас есть стандартные модели. Вообще, у нас для абстракции от БД у нас есть паттерн ActiveRecord и поэтому имплементировать Repository прям в точном виде и юзать только его, мне кажется, излишним. Репозитории, конечно, удобны и нужны для аггломераци методов получения данных из модели/моделей и методов операций с сущностями, но забывать из-за этого, что у нас есть потрясающий Eloquent и не прикасаться к нему, как к чумному, мне кажется - это стрелять в ногу.
В данном конкретном случае я бы сделал так, как в последнем примере кода, т.е. передал в репозиторий экземпляр модели. Events тут не нужны (они вообще мало где нужны, имхо, или мне просто не попадалось задач под них).
Народ, а что вы такое ужасное делаете ? Зачем "post-install-cmd" и прочее ? Качаете архив с http://getbootstrap.com, распаковываете в public/bootstrap , в шаблоне подключаете оттуда css и js, как сказано в мануале.
В принципе, если ожидается ОЧЕНЬ большой траф, то подобная схема денормализации базы оправдана.
Я не специалист в андроиде, надо найти, где находится этот файл (lighttpd.conf) и соответственно отредактировать, добавив свой домен.
Да, и если этот метод называется author в запросе добавляем, если я не ошибаюсь, ->with("lastcomments.author") . Попробуй.
Делаем в модели Post следующую реляцию:
public function lastcomments()
{
return $this->hasMany('Comment')->orderBy('created_at','DESC')->limit(3);
}
И в запросе постов юзаем ->with('lastcomments')
Например, $posts = Post::where("user_id", $user_id)->where("is_draft", 0)->with("lastcomments")->get();
В итоге тут будет два запроса - один вынет все посты с заданным условием, второй - все 3 последних комментария у полученных постов. В $post->lastcomments будет коллекция из 3х последних комментариев у поста.
А в чем проблема ? В терминах sql вышеописанное записывается как "ORDER BY created_at DESC LIMIT 3" . Теперь берется документация и пишется scope для модели в терминах ларавеловского query builder.
в bitserver в качестве веб-сервера стоит lighttpd, надо ему объяснить, как обрабатывать урлы в laravel
https://github.com/daylerees/laravel-we … httpd.conf
Ну как, не все. Еще надо добавить 'Barryvdh\Elfinder\ElfinderServiceProvider' в app/config/app.php . В инструкции, собственно, все написано.