Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Laravel 4 использует большую часть модулей из проекта Symfony2, если так можно сказать.
Чтобы это узнать, достаточно посмотреть список используемых компонентов средствами Composer.
В частности, для управления базами данных используется компонент doctrine/dbal: 2.4.x
Включайте его в проект и пользуйтесь.
P.S. Eloquent - просто надстройка над Doctrine.
С фреймворками на Си одна проблема — нельзя залезть в код ядра. А здесь всегда можно исходники глянуть, если что-то идет не так как ожидается. И сразу поправить, и разрабам отписать.
Ну почему же, очень даже. Касательно Phalcon, там полностью открытый исходный код, скачивайте с github, анализируйте, вносите предложения.
Может быть, в этом и нет необходимости, когда сайт представляет собой набор html файлов. Но сейчас, как правило, сайты проявляют характер приложения, (наверное, поэтому и вошло в обиход именование web-приложение) и необходимо знать работу сервера с точки зрения web-приложения, т.е. работу с каталогами, куки, сессии, заголовки, технологии обработки запросов и т.д.
Например, совсем недавно был вопрос — почему после установки куки приложение его не видит, но в браузере установленный куки есть. Что и кого только не пинали — и фреймворк, и сервер, и даже провайдера… Все оказалось банально просто — просто «разработчик» не знал, как работает WEB, в частности сервер, CGI, AJAX. Вот такая история.
Или еще: смотрел недавно некий ресурс с «закрытой» базой — так там «разработчики» любезно предоставляют адрес с доступом к исходникам прямо в javascript скрипте…
При выдаче хостингом ресурса для клиента последнему «дается» каталог (директория, папка) в публичном каталоге. Допустим, ~/vasjapupkin/public_html. Это и есть ваш рабочий (основной) каталог, в котором сервер ищет скрипты. Вам нужно перенаправить сервер из этого каталога в каталог ./public, где у вас находится index.php от Laravel (в данном случае). Для этого есть mod_rewrite. Т.е. у вас должен быть .htaccess в public_html, который перенаправляет запросы в ./public, и рабочий в ./public, который перенаправляет запросы в index.php. Все это описано в документации (особенно в английской) [laravel.com]. Если есть трудности с пониманием работы сервера (Apache в данном случае), нужно почитать документацию, слава обществу, с этим трудностей нет. К тому же, если вы не знаете, как работает сервер, как вы тогда собираетесь писать сайт? Вопрос, конечно, риторический…
С такой проблемой не сталкивался и не могу придумать, что может её вызывать. index.php$1 или index.php?$1 — довольно странное решение, но раз только оно работает… А index.php у вас вписан в DirectoryIndex?
Если в изначальном .htaccess поменять index.php?$1 на index.php/$1, но без имени хоста, тоже будет No input file specified?
Я бы прошёл отладчиком и посмотрел, что делает Laravel — часто это быстрее, чем разбираться методом тыка.
Потому что тогда у вас в mod_rewrite (при index.php$1)на выходе (причем промежуточном) получиться:
вход: mysite/home/1
после RewriteRule index.phphome/1 (именно так) и пошли по кругу. в бесконечный цикл. Флаг [L] не спасет, т.к. в htacces он не работает. поэтому ловим ’500’.
{=John} В общем обошел пока эту фигню через финт ушами:
маршрут прописываю как:PHPRoute::get('home/(:any?)', function($param = null) {
return Controller::call('home@index', array($param));
});
Route::controller(Controller::detect());PHPpublic function action_index($param) {
echo "$param<br>";
}
Что же происходит на самом деле?
На самом деле в routes.php, естественно, команды (инструкции) выполняются последовательно.
Поэтому, после формирования всех маршрутов у нас есть массив последних.
Если Route::controller(Controller::detect()); указан первым маршрутом, то в массиве маршрутов первым будет маршрут вида
/home/(:any?)/(:any?)/(:any?)/(:any?)/(:any?) , где (:any?) будет повторен 5 раз, согласно переменной $segments.
Цитата из router.php
...
/**
* The number of URI segments allowed as method arguments.
*
* @var int
*/
public static $segments = 5;
...
// The number of method arguments allowed for a controller is set by a
// "segments" constant on this class which allows for the developer to
// increase or decrease the limit on method arguments.
echo "<pre>".print_r(static::$segments,true)."</pre>";
exit;
$wildcards = static::repeat('(:any?)', static::$segments);
В итоге, маршрут .home/(:any?) функцией match (там же), идентифицируется как /home/(:any?)/(:any?)/(:any?)/(:any?)/(:any?), который и выдается, после чего получаем ’404’. Все.
Вывод: или прописывать все роуты вручную, или ставить Route::controller(Controller::detect()); в конце.
Что и сделал John.
Если использовать detect, тогда всю маршрутизацию нужно согласовать с соглашениями Laravel.
И обработка Route::get(’home/(:any?)’,… только через Closure.
Да, только наследовать не сам eloquent, а auth/drivers/driver.php - там всего три функции написать. После чего подсунуть его классу Auth функцией Auth::extend. И этому драйверу указать уже свою модель. Можно, конечно, наверное и eloquent, только, думаю, наследовать driver будет идеологически вернее.
www/bundles/admin/models/adminuser.php
<?
class AdminUser extends Eloquent {
public static $timestamps = true;
public static $table = 'users';// вот здесь можно назначить другую таблицу
public function hello() {
return AdminUser::take(1)->get();
}
}
<?
Autoloader::map(array(
'AdminUser' => path('bundle').'admin/models/adminuser.php',
));
Йес, ит из! http://laravel.ru/docs/files RTFM !
Думаю, достаточно, как это не банально, воспользоваться google и Vkontakte API.
Например, здесь
http://vk.com/topic-1_24428376
url полностью передается в контроллер, в том числе wildcard.
Достаточно передать параметр обработчику, например:
Route::get('news/detail-(:num)', array('as' => 'news_detail', 'uses' => 'frontend.news@detail'));
В контроллере
class News_Controller extends Base_Controller {
...
public function action_detail($newsID)
{
return "Читаем новость с ID= ". $newsID;
}
...
}
Кстати, в документации на Laravel 2 это было, а потом как-то ""затерялось"
Свой предыдущий пост отменяю. Проверил, по крайней мере при авторизации этот метод не работает. Все-таки не даром в документации требуется наличие поля id в базах...
Добрый день.
Начал работать с Laravel. Имеется таблица:
`user_id` int
`login_name` varchar
`pwd` varchar - шифруется в md5использую:
Route::post('/login/process', function() { $user_data = array('username' => Input::get('login'), 'password' => md5(Input::get('password'))); if (Auth::attempt($user_data)) { return Redirect::to('home.index'); } else { print_r($user_data); } });
Авторизация не проходит. Как исправить?
Заранее спасибо.
<?
class User extends Eloquent {
public static $key = 'user_id';
}
Так не пробовали? Ключ id меняется на user_id, больше ничего переписывать не нужно.
Класс Eloquent наследует Laravel\Database\Eloquent\Model.
get_class_methods('user')
Array
(
[0] => __construct
[1] => fill
[2] => fill_raw
[3] => accessible
[4] => create
[5] => update
[6] => _find
[7] => all
[8] => _with
[9] => has_one
[10] => has_many
[11] => belongs_to
[12] => has_many_and_belongs_to
[13] => push
[14] => save
[15] => delete
[16] => timestamp
[17] => sync
[18] => changed
[19] => dirty
[20] => table
[21] => get_dirty
[22] => get_key
[23] => set_key
[24] => get_attribute
[25] => set_attribute
[26] => purge
[27] => to_array
[28] => __get
[29] => __set
[30] => __isset
[31] => __unset
[32] => __call
[33] => __callStatic
)
get_class_vars('user')
Array
(
[attributes] => Array
(
)
[original] => Array
(
)
[relationships] => Array
(
)
[exists] =>
[includes] => Array
(
)
[key] => id
[accessible] =>
[hidden] => Array
(
)
[timestamps] => 1
[table] =>
[connection] =>
[sequence] =>
[per_page] => 20
)
get_parent_class('user')
Laravel\Database\Eloquent\Model
Выдержка из blade.php
/**
261: * Rewrites Blade structure openings into PHP structure openings.
262: *
263: * @param string $value
264: * @return string
265: */
266: protected static function compile_structure_openings($value)
267: {
268: $pattern = '/(\s*)@(if|elseif|foreach|for|while)(\s*\(.*\))/';
269:
270: return preg_replace($pattern, '$1<?php $2$3: ?>', $value);
271: }
Так оно и есть, должно быть отдельной строкой.
Выделено из темы про бенчмарк — прим. адм.
Сегодня попробовал Laravel на Nginx + PHP-fpm без Apache — отдача идет в 4 раза быстрее. Если интересно, могу выложить инструкцию для Debian.
P.S. Заметил внезапно, что laravel.ru на Nginx 0.7.
От себя еще добавлю. Внешние ключи в MySQL (InnoDB) используются для обеспечения целостности данных. Сами же связи контролируютя моделью. Поэтому я бы посоветовал сначала определить связи в приложении, а потом, если необходимо, закрепить эти связи в базе (если используется InnoDB).
По поводу ошибки - скорее всего, у вас не достаточно определен $table->integer('iduser'), попробуйте дать ему свойства unsigned NOT NULL.
Любопытство берет свое. Протестировал специально на vps 1Ghz/256M. Взял Laravel и Zend.
В качестве теста -
<?= 'Hello, world!!!';
Тест
ab -t 30 -c 5
Результат -
Чистый PHP - 59,76
Zend - 11,38
Laravel - 14,43
Phalcon - 41,05
Но вот к чему эти тесты?
Возьмем, например, Google. По оценкам, они обрабатывают порядка 3,5 миллиарда запросов в сутки. При этом у них задействовано порядка 900000 серверов... Получается, даже если взять 30% готовность, то в среднем сервер обрабатывает 1 запрос каждые 7 секунд....
Теперь, известно, что пользователь сайта тратит на самый быстрый просмотр страницы 6 секунд. Возьмем 10 пользователей. За минуту они сделают в среднем 100 запросов, т.е. 1,67 запроса в секунду, что составляет почти 145000 запросов в сутки.
Что-то мало я видел сайтов с такой посещаемостью.
"Какую посещаемость сайта считать высокой?"
Итог: В этих тестах нет практически никакого смысла. Вопрос в удобстве использования и соответствия фреймворка поставленным задачам. А дальше - дело техники. Расчет необходимого количества серверов, базы данных и т.д.
С учетом сегодняшних средних скоростей каналов и среднего веса страниц, думаю, вполне хороший показатель выше 10 для гарантированной доставки ответа на запрос пользователя за 1,5 секунды.
У каждого фреймворка есть свои прелести и недостатки... Универсального нет.
Что касается Phalcon.
Фреймворк очень перспективный. Думаю, навеян Yaf (Там, блин, вся документация на китайском...). Но пока он еще сыроват, но при этом чертовски привлекателен. Необходимо отметить коренную переработку beta-версии по сравнению с релизом. Полностью все переделано, нужно по-новому все изучать. Так что для производства пока еще рано его использовать. К тому же, если сайт ставится на хостинг, вопрос, захочет ли хостинг ставить Phalcon.
P.S. раньше еще сравнивал Laravel vs Kohana - силы приблизительно равны с небольшим перевесом в пользу Laravel.
Но у Laravel есть одно преимущество - он, как мне кажется, интуитивно понятен сразу. Особенно после Zend
При распаковке фреймворка в рабочую папку проверьте права файлов. Может случиться так, что много файлов будут иметь биты исполнения в маске. Исправить эту ситуацию можно при помощи команды в корневой директории:
$ find . -type f -perm /u+x,g+x -iname '*' -exec chmod 644 {} \;
Если у вас, конечно, сервер на Linux.
Я тщательно просмотрел все переводы на этом сайте. Материалы сайта мне очень помогают, за что огромное спасибо. Ну и, конечно же, я абсолютно согласен с вашим предложением разместить эти материалы на сайте. Пусть всем будет легче в освоении Laravel. Что-то в нем все-таки есть притягательное. Удачи!
Сделан перевод документации Laravel в формате Markdown. Документация оформлена в виде стандартного пакета. Все находится на Github: https://github.com/oleg578/laravel-rudocs
Страницы 1